github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/client/pluginmanager/group_test.go (about) 1 package pluginmanager 2 3 import ( 4 "context" 5 "sync" 6 "testing" 7 "time" 8 9 "github.com/hashicorp/nomad/helper/testlog" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestPluginGroup_RegisterAndRun(t *testing.T) { 14 t.Parallel() 15 require := require.New(t) 16 17 var hasRun bool 18 var wg sync.WaitGroup 19 wg.Add(1) 20 manager := &MockPluginManager{RunF: func() { 21 hasRun = true 22 wg.Done() 23 }} 24 25 group := New(testlog.HCLogger(t)) 26 require.NoError(group.RegisterAndRun(manager)) 27 wg.Wait() 28 require.True(hasRun) 29 } 30 31 func TestPluginGroup_Shutdown(t *testing.T) { 32 t.Parallel() 33 require := require.New(t) 34 35 var stack []int 36 var stackMu sync.Mutex 37 var runWg sync.WaitGroup 38 var shutdownWg sync.WaitGroup 39 group := New(testlog.HCLogger(t)) 40 for i := 1; i < 4; i++ { 41 i := i 42 runWg.Add(1) 43 shutdownWg.Add(1) 44 manager := &MockPluginManager{RunF: func() { 45 stackMu.Lock() 46 defer stackMu.Unlock() 47 defer runWg.Done() 48 stack = append(stack, i) 49 }, ShutdownF: func() { 50 stackMu.Lock() 51 defer stackMu.Unlock() 52 defer shutdownWg.Done() 53 idx := len(stack) - 1 54 val := stack[idx] 55 require.Equal(i, val) 56 stack = stack[:idx] 57 }} 58 require.NoError(group.RegisterAndRun(manager)) 59 runWg.Wait() 60 } 61 group.Shutdown() 62 shutdownWg.Wait() 63 require.Empty(stack) 64 65 require.Error(group.RegisterAndRun(&MockPluginManager{})) 66 } 67 68 func TestPluginGroup_WaitForFirstFingerprint(t *testing.T) { 69 t.Parallel() 70 require := require.New(t) 71 72 managerCh := make(chan struct{}) 73 manager := &MockPluginManager{ 74 RunF: func() {}, 75 WaitForFirstFingerprintCh: managerCh, 76 } 77 78 // close immediately to beat the context timeout 79 close(managerCh) 80 81 group := New(testlog.HCLogger(t)) 82 require.NoError(group.RegisterAndRun(manager)) 83 84 ctx, cancel := context.WithTimeout(context.Background(), time.Minute) 85 defer cancel() 86 87 groupCh, err := group.WaitForFirstFingerprint(ctx) 88 require.NoError(err) 89 90 select { 91 case <-groupCh: 92 case <-time.After(100 * time.Millisecond): 93 t.Fatal("expected groupCh to be closed") 94 } 95 } 96 97 func TestPluginGroup_WaitForFirstFingerprint_Timeout(t *testing.T) { 98 t.Parallel() 99 require := require.New(t) 100 101 managerCh := make(chan struct{}) 102 manager := &MockPluginManager{ 103 RunF: func() {}, 104 WaitForFirstFingerprintCh: managerCh, 105 } 106 107 group := New(testlog.HCLogger(t)) 108 require.NoError(group.RegisterAndRun(manager)) 109 110 ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond) 111 defer cancel() 112 113 groupCh, err := group.WaitForFirstFingerprint(ctx) 114 115 select { 116 case <-groupCh: 117 case <-time.After(100 * time.Millisecond): 118 t.Fatal("expected groupCh to be closed due to context timeout") 119 } 120 require.NoError(err) 121 }