github.com/Jeffail/benthos/v3@v3.65.0/lib/buffer/parallel/memory_test.go (about) 1 package parallel 2 3 import ( 4 "fmt" 5 "math/rand" 6 "sync" 7 "testing" 8 "time" 9 10 "github.com/Jeffail/benthos/v3/lib/message" 11 "github.com/Jeffail/benthos/v3/lib/types" 12 ) 13 14 func TestMemoryBasic(t *testing.T) { 15 n := 100 16 17 block := NewMemory(100000) 18 19 for i := 0; i < n; i++ { 20 if _, err := block.PushMessage(message.New( 21 [][]byte{ 22 []byte("hello"), 23 []byte("world"), 24 []byte("12345"), 25 []byte(fmt.Sprintf("test%v", i)), 26 }, 27 )); err != nil { 28 t.Error(err) 29 } 30 } 31 32 for i := 0; i < n; i++ { 33 m, ackFunc, err := block.NextMessage() 34 if err != nil { 35 t.Error(err) 36 return 37 } 38 if m.Len() != 4 { 39 t.Errorf("Wrong # parts, %v != %v", m.Len(), 4) 40 } else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(3).Get()); expected != actual { 41 t.Errorf("Wrong order of messages, %v != %v", expected, actual) 42 } 43 if _, err := ackFunc(true); err != nil { 44 t.Error(err) 45 } 46 } 47 } 48 49 func TestMemoryNearLimit(t *testing.T) { 50 n, iter := 50, 5 51 52 block := NewMemory(2285) 53 54 for j := 0; j < iter; j++ { 55 for i := 0; i < n; i++ { 56 if _, err := block.PushMessage(message.New( 57 [][]byte{ 58 []byte("hello"), 59 []byte("world"), 60 []byte("12345"), 61 []byte(fmt.Sprintf("test%v", i)), 62 }, 63 )); err != nil { 64 t.Error(err) 65 return 66 } 67 } 68 69 for i := 0; i < n; i++ { 70 m, ackFunc, err := block.NextMessage() 71 if err != nil { 72 t.Error(err) 73 return 74 } 75 if m.Len() != 4 { 76 t.Errorf("Wrong # parts, %v != %v", m.Len(), 4) 77 } else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(3).Get()); expected != actual { 78 t.Errorf("Wrong order of messages, %v != %v", expected, actual) 79 } 80 if _, err := ackFunc(true); err != nil { 81 t.Error(err) 82 } 83 } 84 } 85 } 86 87 func TestMemoryLoopingRandom(t *testing.T) { 88 n, iter := 50, 5 89 90 block := NewMemory(8000) 91 92 for j := 0; j < iter; j++ { 93 for i := 0; i < n; i++ { 94 b := make([]byte, rand.Int()%100) 95 for k := range b { 96 b[k] = '0' 97 } 98 if _, err := block.PushMessage(message.New( 99 [][]byte{ 100 b, 101 []byte(fmt.Sprintf("test%v", i)), 102 }, 103 )); err != nil { 104 t.Error(err) 105 } 106 } 107 108 for i := 0; i < n; i++ { 109 m, ackFunc, err := block.NextMessage() 110 if err != nil { 111 t.Error(err) 112 return 113 } 114 if m.Len() != 2 { 115 t.Errorf("Wrong # parts, %v != %v", m.Len(), 4) 116 return 117 } else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(1).Get()); expected != actual { 118 t.Errorf("Wrong order of messages, %v != %v", expected, actual) 119 return 120 } 121 if _, err := ackFunc(true); err != nil { 122 t.Error(err) 123 } 124 } 125 } 126 } 127 128 func TestMemoryLockStep(t *testing.T) { 129 n := 10000 130 131 block := NewMemory(1000) 132 133 wg := sync.WaitGroup{} 134 wg.Add(1) 135 136 go func() { 137 defer wg.Done() 138 for i := 0; i < n; i++ { 139 m, ackFunc, err := block.NextMessage() 140 if err != nil { 141 t.Error(err) 142 } 143 if m.Len() != 4 { 144 t.Errorf("Wrong # parts, %v != %v", m.Len(), 4) 145 return 146 } else if expected, actual := fmt.Sprintf("test%v", i), string(m.Get(3).Get()); expected != actual { 147 t.Errorf("Wrong order of messages, %v != %v", expected, actual) 148 return 149 } 150 if _, err := ackFunc(true); err != nil { 151 t.Error(err) 152 } 153 } 154 }() 155 156 go func() { 157 for i := 0; i < n; i++ { 158 if _, err := block.PushMessage(message.New( 159 [][]byte{ 160 []byte("hello"), 161 []byte("world"), 162 []byte("12345"), 163 []byte(fmt.Sprintf("test%v", i)), 164 }, 165 )); err != nil { 166 t.Error(err) 167 } 168 } 169 }() 170 171 wg.Wait() 172 } 173 174 func TestMemoryAck(t *testing.T) { 175 block := NewMemory(1000) 176 177 block.PushMessage(message.New([][]byte{ 178 []byte("1"), 179 })) 180 block.PushMessage(message.New([][]byte{ 181 []byte("2"), 182 })) 183 184 m, ackFunc, err := block.NextMessage() 185 if err != nil { 186 t.Error(err) 187 } else { 188 if expected, actual := "1", string(m.Get(0).Get()); expected != actual { 189 t.Fatalf("Wrong message contents, %v != %v", expected, actual) 190 } 191 if _, err := ackFunc(false); err != nil { 192 t.Error(err) 193 } 194 } 195 196 m, ackFunc, err = block.NextMessage() 197 if err != nil { 198 t.Error(err) 199 } else { 200 if expected, actual := "1", string(m.Get(0).Get()); expected != actual { 201 t.Fatalf("Wrong message contents, %v != %v", expected, actual) 202 } 203 if _, err := ackFunc(true); err != nil { 204 t.Error(err) 205 } 206 } 207 208 m, ackFunc, err = block.NextMessage() 209 if err != nil { 210 t.Error(err) 211 } else { 212 if expected, actual := "2", string(m.Get(0).Get()); expected != actual { 213 t.Fatalf("Wrong message contents, %v != %v", expected, actual) 214 } 215 if _, err := ackFunc(true); err != nil { 216 t.Error(err) 217 } 218 } 219 220 block.Close() 221 222 if _, err = block.PushMessage(message.New(nil)); err != types.ErrTypeClosed { 223 t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed) 224 } 225 if _, _, err = block.NextMessage(); err != types.ErrTypeClosed { 226 t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed) 227 } 228 } 229 230 func TestMemoryClose(t *testing.T) { 231 block := NewMemory(1000) 232 233 for i := 0; i < 10; i++ { 234 block.PushMessage(message.New([][]byte{ 235 []byte("hello world"), 236 })) 237 } 238 239 wg := sync.WaitGroup{} 240 wg.Add(1) 241 242 go func() { 243 block.CloseOnceEmpty() 244 wg.Done() 245 }() 246 247 <-time.After(time.Millisecond * 100) 248 for i := 0; i < 10; i++ { 249 m, ackFunc, err := block.NextMessage() 250 if err != nil { 251 t.Error(err) 252 } else { 253 if expected, actual := "hello world", string(m.Get(0).Get()); expected != actual { 254 t.Errorf("Wrong message contents, %v != %v", expected, actual) 255 } 256 _, _ = ackFunc(true) 257 /* 258 // TODO: Fix up batched shutdown 259 if _, err := ackFunc(true); err != nil { 260 t.Error(err) 261 } 262 */ 263 } 264 } 265 266 if _, _, err := block.NextMessage(); err != types.ErrTypeClosed { 267 t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed) 268 } 269 270 wg.Wait() 271 } 272 273 func TestMemoryCloseWithPending(t *testing.T) { 274 block := NewMemory(1000) 275 276 for i := 0; i < 10; i++ { 277 block.PushMessage(message.New([][]byte{ 278 []byte("hello world"), 279 })) 280 } 281 282 wg := sync.WaitGroup{} 283 wg.Add(1) 284 285 go func() { 286 block.CloseOnceEmpty() 287 wg.Done() 288 }() 289 290 <-time.After(time.Millisecond * 100) 291 for i := 0; i < 10; i++ { 292 m, ackFunc, err := block.NextMessage() 293 if err != nil { 294 t.Error(err) 295 } else { 296 if expected, actual := "hello world", string(m.Get(0).Get()); expected != actual { 297 t.Errorf("Wrong message contents, %v != %v", expected, actual) 298 } 299 if i < 9 { 300 if _, err := ackFunc(true); err != nil { 301 t.Error(err) 302 } 303 } 304 } 305 } 306 307 if _, _, err := block.NextMessage(); err != types.ErrTypeClosed { 308 t.Errorf("Wrong error returned: %v != %v", err, types.ErrTypeClosed) 309 } 310 311 wg.Wait() 312 } 313 314 func TestMemoryRejectLargeMessage(t *testing.T) { 315 tMsg := message.New(make([][]byte, 1)) 316 tMsg.Get(0).Set([]byte("hello world this message is too long!")) 317 318 block := NewMemory(10) 319 320 _, err := block.PushMessage(tMsg) 321 if exp, actual := types.ErrMessageTooLarge, err; exp != actual { 322 t.Errorf("Unexpected error: %v != %v", exp, actual) 323 } 324 }