github.com/hernad/nomad@v1.6.112/drivers/shared/eventer/eventer_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package eventer 5 6 import ( 7 "context" 8 "sync" 9 "testing" 10 "time" 11 12 "github.com/hernad/nomad/ci" 13 "github.com/hernad/nomad/helper/testlog" 14 "github.com/hernad/nomad/plugins/drivers" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestEventer(t *testing.T) { 19 ci.Parallel(t) 20 require := require.New(t) 21 22 ctx, cancel := context.WithCancel(context.Background()) 23 defer cancel() 24 e := NewEventer(ctx, testlog.HCLogger(t)) 25 26 events := []*drivers.TaskEvent{ 27 { 28 TaskID: "a", 29 Timestamp: time.Now(), 30 }, 31 { 32 TaskID: "b", 33 Timestamp: time.Now(), 34 }, 35 { 36 TaskID: "c", 37 Timestamp: time.Now(), 38 }, 39 } 40 41 ctx1, cancel1 := context.WithCancel(context.Background()) 42 defer cancel1() 43 consumer1, err := e.TaskEvents(ctx1) 44 require.NoError(err) 45 ctx2 := (context.Background()) 46 consumer2, err := e.TaskEvents(ctx2) 47 require.NoError(err) 48 49 var buffer1, buffer2 []*drivers.TaskEvent 50 var wg sync.WaitGroup 51 wg.Add(2) 52 go func() { 53 defer wg.Done() 54 var i int 55 for event := range consumer1 { 56 i++ 57 buffer1 = append(buffer1, event) 58 if i == len(events) { 59 return 60 } 61 } 62 }() 63 go func() { 64 defer wg.Done() 65 var i int 66 for event := range consumer2 { 67 i++ 68 buffer2 = append(buffer2, event) 69 if i == len(events) { 70 return 71 } 72 } 73 }() 74 75 for _, event := range events { 76 require.NoError(e.EmitEvent(event)) 77 } 78 79 wg.Wait() 80 require.Exactly(events, buffer1) 81 require.Exactly(events, buffer2) 82 } 83 84 func TestEventer_iterateConsumers(t *testing.T) { 85 ci.Parallel(t) 86 require := require.New(t) 87 88 e := &Eventer{ 89 events: make(chan *drivers.TaskEvent), 90 ctx: context.Background(), 91 logger: testlog.HCLogger(t), 92 } 93 94 ev := &drivers.TaskEvent{ 95 TaskID: "a", 96 Timestamp: time.Now(), 97 } 98 99 ctx1, cancel1 := context.WithCancel(context.Background()) 100 consumer, err := e.TaskEvents(ctx1) 101 require.NoError(err) 102 require.Equal(1, len(e.consumers)) 103 104 var wg sync.WaitGroup 105 wg.Add(1) 106 go func() { 107 defer wg.Done() 108 ev1, ok := <-consumer 109 require.Exactly(ev, ev1) 110 require.True(ok) 111 }() 112 e.iterateConsumers(ev) 113 wg.Wait() 114 115 go func() { 116 cancel1() 117 e.iterateConsumers(ev) 118 }() 119 ev1, ok := <-consumer 120 require.False(ok) 121 require.Nil(ev1) 122 require.Equal(0, len(e.consumers)) 123 }