mihomo/common/singledo/singledo_test.go

70 lines
1.1 KiB
Go
Raw Normal View History

package singledo
import (
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"go.uber.org/atomic"
)
func TestBasic(t *testing.T) {
single := NewSingle(time.Millisecond * 30)
foo := 0
2021-10-10 23:44:09 +08:00
shardCount := atomic.NewInt32(0)
2022-03-16 12:10:13 +08:00
call := func() (any, error) {
foo++
2019-12-10 16:26:15 +08:00
time.Sleep(time.Millisecond * 5)
return nil, nil
}
var wg sync.WaitGroup
2020-04-30 20:13:27 +08:00
const n = 5
wg.Add(n)
for i := 0; i < n; i++ {
go func() {
_, _, shard := single.Do(call)
if shard {
shardCount.Inc()
}
wg.Done()
}()
}
wg.Wait()
assert.Equal(t, 1, foo)
assert.Equal(t, int32(4), shardCount.Load())
}
func TestTimer(t *testing.T) {
single := NewSingle(time.Millisecond * 30)
foo := 0
2022-03-16 12:10:13 +08:00
call := func() (any, error) {
foo++
return nil, nil
}
single.Do(call)
time.Sleep(10 * time.Millisecond)
_, _, shard := single.Do(call)
assert.Equal(t, 1, foo)
assert.True(t, shard)
}
2020-04-30 20:13:27 +08:00
func TestReset(t *testing.T) {
single := NewSingle(time.Millisecond * 30)
foo := 0
2022-03-16 12:10:13 +08:00
call := func() (any, error) {
2020-04-30 20:13:27 +08:00
foo++
return nil, nil
}
single.Do(call)
single.Reset()
single.Do(call)
assert.Equal(t, 2, foo)
}