github.com/askholme/packer@v0.7.2-0.20140924152349-70d9566a6852/packer/hook_test.go (about)

     1  package packer
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  // A helper Hook implementation for testing cancels.
    10  type CancelHook struct {
    11  	sync.Mutex
    12  	cancelCh chan struct{}
    13  	doneCh   chan struct{}
    14  
    15  	Cancelled bool
    16  }
    17  
    18  func (h *CancelHook) Run(string, Ui, Communicator, interface{}) error {
    19  	h.Lock()
    20  	h.cancelCh = make(chan struct{})
    21  	h.doneCh = make(chan struct{})
    22  	h.Unlock()
    23  
    24  	defer close(h.doneCh)
    25  
    26  	select {
    27  	case <-h.cancelCh:
    28  		h.Cancelled = true
    29  	case <-time.After(1 * time.Second):
    30  	}
    31  
    32  	return nil
    33  }
    34  
    35  func (h *CancelHook) Cancel() {
    36  	h.Lock()
    37  	close(h.cancelCh)
    38  	h.Unlock()
    39  
    40  	<-h.doneCh
    41  }
    42  
    43  func TestDispatchHook_Implements(t *testing.T) {
    44  	var _ Hook = new(DispatchHook)
    45  }
    46  
    47  func TestDispatchHook_Run_NoHooks(t *testing.T) {
    48  	// Just make sure nothing blows up
    49  	dh := &DispatchHook{}
    50  	dh.Run("foo", nil, nil, nil)
    51  }
    52  
    53  func TestDispatchHook_Run(t *testing.T) {
    54  	hook := &MockHook{}
    55  
    56  	mapping := make(map[string][]Hook)
    57  	mapping["foo"] = []Hook{hook}
    58  	dh := &DispatchHook{Mapping: mapping}
    59  	dh.Run("foo", nil, nil, 42)
    60  
    61  	if !hook.RunCalled {
    62  		t.Fatal("should be called")
    63  	}
    64  	if hook.RunName != "foo" {
    65  		t.Fatalf("bad: %s", hook.RunName)
    66  	}
    67  	if hook.RunData != 42 {
    68  		t.Fatalf("bad: %#v", hook.RunData)
    69  	}
    70  }
    71  
    72  func TestDispatchHook_cancel(t *testing.T) {
    73  	hook := new(CancelHook)
    74  
    75  	dh := &DispatchHook{
    76  		Mapping: map[string][]Hook{
    77  			"foo": []Hook{hook},
    78  		},
    79  	}
    80  
    81  	go dh.Run("foo", nil, nil, 42)
    82  	time.Sleep(100 * time.Millisecond)
    83  	dh.Cancel()
    84  
    85  	if !hook.Cancelled {
    86  		t.Fatal("hook should've cancelled")
    87  	}
    88  }