2013-05-11 02:15:13 -04:00
|
|
|
package packer
|
|
|
|
|
2013-05-11 13:27:07 -04:00
|
|
|
import (
|
|
|
|
"cgl.tideland.biz/asserts"
|
2013-08-30 20:26:51 -04:00
|
|
|
"sync"
|
2013-05-11 13:27:07 -04:00
|
|
|
"testing"
|
2013-08-30 20:26:51 -04:00
|
|
|
"time"
|
2013-05-11 13:27:07 -04:00
|
|
|
)
|
|
|
|
|
2013-08-30 20:26:51 -04:00
|
|
|
// A helper Hook implementation for testing cancels.
|
|
|
|
type CancelHook struct {
|
|
|
|
sync.Mutex
|
|
|
|
cancelCh chan struct{}
|
|
|
|
doneCh chan struct{}
|
|
|
|
|
|
|
|
Cancelled bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *CancelHook) Run(string, Ui, Communicator, interface{}) error {
|
|
|
|
h.Lock()
|
|
|
|
h.cancelCh = make(chan struct{})
|
|
|
|
h.doneCh = make(chan struct{})
|
|
|
|
h.Unlock()
|
|
|
|
|
|
|
|
defer close(h.doneCh)
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-h.cancelCh:
|
|
|
|
h.Cancelled = true
|
|
|
|
case <-time.After(1 * time.Second):
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (h *CancelHook) Cancel() {
|
|
|
|
h.Lock()
|
|
|
|
close(h.cancelCh)
|
|
|
|
h.Unlock()
|
|
|
|
|
|
|
|
<-h.doneCh
|
|
|
|
}
|
|
|
|
|
2013-05-12 20:15:03 -04:00
|
|
|
func TestDispatchHook_Implements(t *testing.T) {
|
|
|
|
assert := asserts.NewTestingAsserts(t, true)
|
|
|
|
|
|
|
|
var r Hook
|
2013-08-30 20:26:51 -04:00
|
|
|
c := &DispatchHook{}
|
2013-05-12 20:15:03 -04:00
|
|
|
|
|
|
|
assert.Implementor(c, &r, "should be a Hook")
|
|
|
|
}
|
|
|
|
|
2013-05-11 13:27:07 -04:00
|
|
|
func TestDispatchHook_Run_NoHooks(t *testing.T) {
|
|
|
|
// Just make sure nothing blows up
|
2013-08-30 20:26:51 -04:00
|
|
|
dh := &DispatchHook{}
|
2013-05-12 20:30:30 -04:00
|
|
|
dh.Run("foo", nil, nil, nil)
|
2013-05-11 13:27:07 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestDispatchHook_Run(t *testing.T) {
|
|
|
|
assert := asserts.NewTestingAsserts(t, true)
|
|
|
|
|
2013-08-30 20:03:55 -04:00
|
|
|
hook := &MockHook{}
|
2013-05-11 13:27:07 -04:00
|
|
|
|
|
|
|
mapping := make(map[string][]Hook)
|
|
|
|
mapping["foo"] = []Hook{hook}
|
2013-08-30 20:26:51 -04:00
|
|
|
dh := &DispatchHook{Mapping: mapping}
|
2013-05-12 20:30:30 -04:00
|
|
|
dh.Run("foo", nil, nil, 42)
|
2013-05-11 13:27:07 -04:00
|
|
|
|
2013-08-30 20:03:55 -04:00
|
|
|
assert.True(hook.RunCalled, "run should be called")
|
|
|
|
assert.Equal(hook.RunName, "foo", "should be proper event")
|
|
|
|
assert.Equal(hook.RunData, 42, "should be correct data")
|
2013-05-11 02:15:13 -04:00
|
|
|
}
|
2013-08-30 20:26:51 -04:00
|
|
|
|
|
|
|
func TestDispatchHook_cancel(t *testing.T) {
|
|
|
|
hook := new(CancelHook)
|
|
|
|
|
|
|
|
dh := &DispatchHook{
|
|
|
|
Mapping: map[string][]Hook{
|
|
|
|
"foo": []Hook{hook},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
go dh.Run("foo", nil, nil, 42)
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
dh.Cancel()
|
|
|
|
|
|
|
|
if !hook.Cancelled {
|
|
|
|
t.Fatal("hook should've cancelled")
|
|
|
|
}
|
|
|
|
}
|