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  }