github.com/Jeffail/benthos/v3@v3.65.0/internal/checkpoint/type_test.go (about)

     1  package checkpoint
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestSequential(t *testing.T) {
    10  	c := New()
    11  	assert.Equal(t, nil, c.Highest())
    12  	assert.EqualValues(t, 0, c.Pending())
    13  
    14  	res1 := c.Track(1, 1)
    15  	res2 := c.Track(2, 1)
    16  	res3 := c.Track(3, 1)
    17  	assert.Equal(t, nil, c.Highest())
    18  	assert.EqualValues(t, 3, c.Pending())
    19  
    20  	v := res1()
    21  	assert.Equal(t, 1, v)
    22  	assert.Equal(t, 1, c.Highest())
    23  	assert.EqualValues(t, 2, c.Pending())
    24  
    25  	v = res2()
    26  	assert.Equal(t, 2, v)
    27  	assert.Equal(t, 2, c.Highest())
    28  	assert.EqualValues(t, 1, c.Pending())
    29  
    30  	v = res3()
    31  	assert.Equal(t, 3, v)
    32  	assert.Equal(t, 3, c.Highest())
    33  	assert.EqualValues(t, 0, c.Pending())
    34  
    35  	res4 := c.Track(4, 1)
    36  	assert.EqualValues(t, 1, c.Pending())
    37  
    38  	v = res4()
    39  	assert.Equal(t, 4, v)
    40  	assert.Equal(t, 4, c.Highest())
    41  	assert.EqualValues(t, 0, c.Pending())
    42  }
    43  
    44  func TestOutOfSync(t *testing.T) {
    45  	c := New()
    46  	assert.Equal(t, nil, c.Highest())
    47  
    48  	res1 := c.Track(1, 1)
    49  	res2 := c.Track(2, 1)
    50  	res3 := c.Track(3, 1)
    51  	res4 := c.Track(4, 1)
    52  	assert.Equal(t, nil, c.Highest())
    53  
    54  	v := res2()
    55  	assert.Equal(t, nil, v)
    56  	assert.Equal(t, nil, c.Highest())
    57  
    58  	v = res1()
    59  	assert.Equal(t, 2, v)
    60  	assert.Equal(t, 2, c.Highest())
    61  
    62  	v = res3()
    63  	assert.Equal(t, 3, v)
    64  	assert.Equal(t, 3, c.Highest())
    65  
    66  	v = res4()
    67  	assert.Equal(t, 4, v)
    68  	assert.Equal(t, 4, c.Highest())
    69  }
    70  
    71  func TestSequentialLarge(t *testing.T) {
    72  	c := New()
    73  	var resolves []func() interface{}
    74  
    75  	for i := 0; i < 1000; i++ {
    76  		resolves = append(resolves, c.Track(i, 1))
    77  	}
    78  	for i := 0; i < 1000; i++ {
    79  		v := resolves[i]()
    80  		assert.Equal(t, i, v)
    81  		assert.Equal(t, i, c.Highest())
    82  	}
    83  }
    84  
    85  func TestSequentialChunks(t *testing.T) {
    86  	c := New()
    87  	chunkSize := 100
    88  	for i := 0; i < 10; i++ {
    89  		var resolves []func() interface{}
    90  
    91  		for j := 0; j < chunkSize; j++ {
    92  			offset := i*chunkSize + j
    93  			resolves = append(resolves, c.Track(offset, 1))
    94  		}
    95  
    96  		for j := 0; j < chunkSize; j++ {
    97  			offset := i*chunkSize + j
    98  			v := resolves[j]()
    99  			assert.Equal(t, offset, v)
   100  			assert.Equal(t, offset, c.Highest())
   101  		}
   102  	}
   103  }
   104  
   105  func TestSequentialReverseLarge(t *testing.T) {
   106  	c := New()
   107  	var resolves []func() interface{}
   108  
   109  	for i := 0; i < 1000; i++ {
   110  		resolves = append(resolves, c.Track(i, 1))
   111  	}
   112  	for i := 999; i >= 0; i-- {
   113  		v := resolves[i]()
   114  		if i == 0 {
   115  			assert.Equal(t, 999, v)
   116  			assert.Equal(t, 999, c.Highest())
   117  		} else {
   118  			assert.Equal(t, nil, v)
   119  			assert.Equal(t, nil, c.Highest())
   120  		}
   121  	}
   122  }
   123  
   124  func TestSequentialRandomLarge(t *testing.T) {
   125  	c := New()
   126  	resolves := make([]func() interface{}, 1000)
   127  	indexes := map[int]struct{}{}
   128  	for i := 0; i < 1000; i++ {
   129  		resolves[i] = c.Track(i, 1)
   130  		indexes[i] = struct{}{}
   131  	}
   132  	for i := range indexes {
   133  		delete(indexes, i)
   134  		v := resolves[i]()
   135  		if len(indexes) == 0 {
   136  			assert.Equal(t, 999, v)
   137  			assert.Equal(t, 999, c.Highest())
   138  		} else {
   139  			assert.Equal(t, v, c.Highest())
   140  			if v != nil {
   141  				for k := range indexes {
   142  					assert.False(t, k < v.(int))
   143  					assert.False(t, k < c.Highest().(int))
   144  				}
   145  			}
   146  		}
   147  	}
   148  }
   149  
   150  func BenchmarkChunked100(b *testing.B) {
   151  	b.ReportAllocs()
   152  	c := New()
   153  	chunkSize := 100
   154  	N := b.N / chunkSize
   155  	for i := 0; i < N; i++ {
   156  		resolves := make([]func() interface{}, chunkSize)
   157  
   158  		for j := 0; j < chunkSize; j++ {
   159  			offset := i*chunkSize + j
   160  			resolves[j] = c.Track(offset, 1)
   161  		}
   162  
   163  		for j := 0; j < chunkSize; j++ {
   164  			offset := i*chunkSize + j
   165  			v := resolves[j]()
   166  			if offset != v {
   167  				b.Errorf("Wrong value: %v != %v", offset, v)
   168  			}
   169  		}
   170  	}
   171  }
   172  
   173  func BenchmarkChunkedReverse100(b *testing.B) {
   174  	b.ReportAllocs()
   175  	c := New()
   176  	chunkSize := 100
   177  	N := b.N / chunkSize
   178  	for i := 0; i < N; i++ {
   179  		resolves := make([]func() interface{}, chunkSize)
   180  
   181  		for j := 0; j < chunkSize; j++ {
   182  			offset := i*chunkSize + j
   183  			resolves[j] = c.Track(offset, 1)
   184  		}
   185  
   186  		for j := chunkSize - 1; j >= 0; j-- {
   187  			v := resolves[j]()
   188  			var exp interface{}
   189  			if i > 0 {
   190  				exp = (i * chunkSize) - 1
   191  			}
   192  			if j == 0 {
   193  				exp = ((i + 1) * chunkSize) - 1
   194  			}
   195  			if exp == 0 {
   196  				exp = nil
   197  			}
   198  			if exp != v {
   199  				b.Errorf("Wrong value: %v != %v", exp, v)
   200  			}
   201  		}
   202  	}
   203  }
   204  
   205  func BenchmarkChunkedReverse1000(b *testing.B) {
   206  	b.ReportAllocs()
   207  	c := New()
   208  	chunkSize := 1000
   209  	N := b.N / chunkSize
   210  	for i := 0; i < N; i++ {
   211  		resolves := make([]func() interface{}, chunkSize)
   212  
   213  		for j := 0; j < chunkSize; j++ {
   214  			offset := i*chunkSize + j
   215  			resolves[j] = c.Track(offset, 1)
   216  		}
   217  
   218  		for j := chunkSize - 1; j >= 0; j-- {
   219  			v := resolves[j]()
   220  			var exp interface{}
   221  			if i > 0 {
   222  				exp = (i * chunkSize) - 1
   223  			}
   224  			if j == 0 {
   225  				exp = ((i + 1) * chunkSize) - 1
   226  			}
   227  			if exp == 0 {
   228  				exp = nil
   229  			}
   230  			if exp != v {
   231  				b.Errorf("Wrong value: %v != %v", exp, v)
   232  			}
   233  		}
   234  	}
   235  }
   236  
   237  func BenchmarkSequential(b *testing.B) {
   238  	b.ReportAllocs()
   239  	c := New()
   240  	resolves := make([]func() interface{}, b.N)
   241  	for i := 0; i < b.N; i++ {
   242  		resolves[i] = c.Track(i, 1)
   243  	}
   244  	for i := 0; i < b.N; i++ {
   245  		v := resolves[i]()
   246  		if i != v {
   247  			b.Errorf("Wrong value: %v != %v", i, v)
   248  		}
   249  	}
   250  }