github.com/Jeffail/benthos/v3@v3.65.0/internal/batch/combined_ack_func_test.go (about) 1 package batch 2 3 import ( 4 "context" 5 "errors" 6 "sync" 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestCombinedAckFunc(t *testing.T) { 13 var ackCalled int 14 var ackErr error 15 combined := NewCombinedAcker(func(c context.Context, e error) error { 16 ackCalled++ 17 ackErr = e 18 return nil 19 }) 20 21 assert.NoError(t, ackErr) 22 assert.Equal(t, 0, ackCalled) 23 24 first := combined.Derive() 25 second := combined.Derive() 26 third := combined.Derive() 27 28 assert.NoError(t, ackErr) 29 assert.Equal(t, 0, ackCalled) 30 31 assert.NoError(t, first(context.Background(), nil)) 32 assert.NoError(t, ackErr) 33 assert.Equal(t, 0, ackCalled) 34 35 assert.NoError(t, second(context.Background(), nil)) 36 assert.NoError(t, ackErr) 37 assert.Equal(t, 0, ackCalled) 38 39 assert.NoError(t, third(context.Background(), nil)) 40 assert.NoError(t, ackErr) 41 assert.Equal(t, 1, ackCalled) 42 43 // Call multiple times 44 assert.NoError(t, first(context.Background(), nil)) 45 assert.NoError(t, ackErr) 46 assert.Equal(t, 1, ackCalled) 47 48 assert.NoError(t, second(context.Background(), nil)) 49 assert.NoError(t, ackErr) 50 assert.Equal(t, 1, ackCalled) 51 52 assert.NoError(t, third(context.Background(), nil)) 53 assert.NoError(t, ackErr) 54 assert.Equal(t, 1, ackCalled) 55 } 56 57 func TestCombinedAckError(t *testing.T) { 58 var ackCalled int 59 var ackErr error 60 combined := NewCombinedAcker(func(c context.Context, e error) error { 61 ackCalled++ 62 ackErr = e 63 return nil 64 }) 65 66 testErr := errors.New("test error") 67 68 assert.NoError(t, ackErr) 69 assert.Equal(t, 0, ackCalled) 70 71 first := combined.Derive() 72 second := combined.Derive() 73 third := combined.Derive() 74 75 assert.NoError(t, ackErr) 76 assert.Equal(t, 0, ackCalled) 77 78 assert.NoError(t, first(context.Background(), nil)) 79 assert.NoError(t, ackErr) 80 assert.Equal(t, 0, ackCalled) 81 82 assert.NoError(t, second(context.Background(), testErr)) 83 assert.NoError(t, ackErr) 84 assert.Equal(t, 0, ackCalled) 85 86 assert.NoError(t, third(context.Background(), nil)) 87 assert.Equal(t, testErr, ackErr) 88 assert.Equal(t, 1, ackCalled) 89 90 // Call multiple times 91 assert.NoError(t, first(context.Background(), nil)) 92 assert.Equal(t, testErr, ackErr) 93 assert.Equal(t, 1, ackCalled) 94 95 assert.NoError(t, second(context.Background(), nil)) 96 assert.Equal(t, testErr, ackErr) 97 assert.Equal(t, 1, ackCalled) 98 99 assert.NoError(t, third(context.Background(), nil)) 100 assert.Equal(t, testErr, ackErr) 101 assert.Equal(t, 1, ackCalled) 102 } 103 104 func TestCombinedAckErrorSync(t *testing.T) { 105 var ackCalled bool 106 combined := NewCombinedAcker(func(c context.Context, e error) error { 107 ackCalled = true 108 return nil 109 }) 110 111 var derivedFuncs []AckFunc 112 for i := 0; i < 1000; i++ { 113 derivedFuncs = append(derivedFuncs, combined.Derive()) 114 } 115 116 startChan := make(chan struct{}) 117 var wg sync.WaitGroup 118 for i := 0; i < 10; i++ { 119 wg.Add(1) 120 i := i 121 go func() { 122 defer wg.Done() 123 <-startChan 124 125 for j := 0; j < 100; j++ { 126 assert.NoError(t, derivedFuncs[(i*100)+j](context.Background(), nil)) 127 } 128 }() 129 } 130 131 close(startChan) 132 wg.Wait() 133 134 assert.True(t, ackCalled) 135 }