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  }