github.com/lingyao2333/mo-zero@v1.4.1/core/executors/bulkexecutor_test.go (about) 1 package executors 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestBulkExecutor(t *testing.T) { 12 var values []int 13 var lock sync.Mutex 14 15 executor := NewBulkExecutor(func(items []interface{}) { 16 lock.Lock() 17 values = append(values, len(items)) 18 lock.Unlock() 19 }, WithBulkTasks(10), WithBulkInterval(time.Minute)) 20 21 for i := 0; i < 50; i++ { 22 executor.Add(1) 23 time.Sleep(time.Millisecond) 24 } 25 26 lock.Lock() 27 assert.True(t, len(values) > 0) 28 // ignore last value 29 for i := 0; i < len(values); i++ { 30 assert.Equal(t, 10, values[i]) 31 } 32 lock.Unlock() 33 } 34 35 func TestBulkExecutorFlushInterval(t *testing.T) { 36 const ( 37 caches = 10 38 size = 5 39 ) 40 var wait sync.WaitGroup 41 42 wait.Add(1) 43 executor := NewBulkExecutor(func(items []interface{}) { 44 assert.Equal(t, size, len(items)) 45 wait.Done() 46 }, WithBulkTasks(caches), WithBulkInterval(time.Millisecond*100)) 47 48 for i := 0; i < size; i++ { 49 executor.Add(1) 50 } 51 52 wait.Wait() 53 } 54 55 func TestBulkExecutorEmpty(t *testing.T) { 56 NewBulkExecutor(func(items []interface{}) { 57 assert.Fail(t, "should not called") 58 }, WithBulkTasks(10), WithBulkInterval(time.Millisecond)) 59 time.Sleep(time.Millisecond * 100) 60 } 61 62 func TestBulkExecutorFlush(t *testing.T) { 63 const ( 64 caches = 10 65 tasks = 5 66 ) 67 68 var wait sync.WaitGroup 69 wait.Add(1) 70 be := NewBulkExecutor(func(items []interface{}) { 71 assert.Equal(t, tasks, len(items)) 72 wait.Done() 73 }, WithBulkTasks(caches), WithBulkInterval(time.Minute)) 74 for i := 0; i < tasks; i++ { 75 be.Add(1) 76 } 77 be.Flush() 78 wait.Wait() 79 } 80 81 func TestBuldExecutorFlushSlowTasks(t *testing.T) { 82 const total = 1500 83 lock := new(sync.Mutex) 84 result := make([]interface{}, 0, 10000) 85 exec := NewBulkExecutor(func(tasks []interface{}) { 86 time.Sleep(time.Millisecond * 100) 87 lock.Lock() 88 defer lock.Unlock() 89 result = append(result, tasks...) 90 }, WithBulkTasks(1000)) 91 for i := 0; i < total; i++ { 92 assert.Nil(t, exec.Add(i)) 93 } 94 95 exec.Flush() 96 exec.Wait() 97 assert.Equal(t, total, len(result)) 98 } 99 100 func BenchmarkBulkExecutor(b *testing.B) { 101 b.ReportAllocs() 102 103 be := NewBulkExecutor(func(tasks []interface{}) { 104 time.Sleep(time.Millisecond * time.Duration(len(tasks))) 105 }) 106 for i := 0; i < b.N; i++ { 107 time.Sleep(time.Microsecond * 200) 108 be.Add(1) 109 } 110 be.Flush() 111 }