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 }