tkcashgame_v4/pkg/cache/rockscache/batch_cover_test.go

126 lines
2.8 KiB
Go

package rockscache
import (
"context"
"errors"
"fmt"
"math/rand"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
var (
n = int(rand.Int31n(20) + 10)
)
func TestDisableForBatch(t *testing.T) {
idxs := genIdxs(n)
keys := genKeys(idxs)
getFn := func(idxs []int) (map[int]string, error) {
return nil, nil
}
rc := NewClient(nil, NewDefaultOptions())
rc.Options.DisableCacheDelete = true
rc.Options.DisableCacheRead = true
_, err := rc.FetchBatch2(context.Background(), keys, 60, getFn)
assert.Nil(t, err)
err = rc.TagAsDeleted2(context.Background(), keys[0])
assert.Nil(t, err)
}
func TestErrorFetchForBatch(t *testing.T) {
idxs := genIdxs(n)
keys := genKeys(idxs)
fetchError := errors.New("fetch error")
fn := func(idxs []int) (map[int]string, error) {
return nil, fetchError
}
clearCache()
rc := NewClient(rdb, NewDefaultOptions())
_, err := rc.FetchBatch(keys, 60, fn)
assert.ErrorIs(t, err, fetchError)
rc.Options.StrongConsistency = true
_, err = rc.FetchBatch(keys, 60, fn)
assert.ErrorIs(t, err, fetchError)
}
func TestEmptyExpireForBatch(t *testing.T) {
testEmptyExpireForBatch(t, 0)
testEmptyExpireForBatch(t, 10*time.Second)
}
func testEmptyExpireForBatch(t *testing.T, expire time.Duration) {
idxs := genIdxs(n)
keys := genKeys(idxs)
fn := func(idxs []int) (map[int]string, error) {
return nil, nil
}
fetchError := errors.New("fetch error")
errFn := func(idxs []int) (map[int]string, error) {
return nil, fetchError
}
clearCache()
rc := NewClient(rdb, NewDefaultOptions())
rc.Options.EmptyExpire = expire
_, err := rc.FetchBatch(keys, 60, fn)
assert.Nil(t, err)
_, err = rc.FetchBatch(keys, 60, errFn)
if expire == 0 {
assert.ErrorIs(t, err, fetchError)
} else {
assert.Nil(t, err)
}
clearCache()
rc.Options.StrongConsistency = true
_, err = rc.FetchBatch(keys, 60, fn)
assert.Nil(t, err)
_, err = rc.FetchBatch(keys, 60, errFn)
if expire == 0 {
assert.ErrorIs(t, err, fetchError)
} else {
assert.Nil(t, err)
}
}
func TestPanicFetchForBatch(t *testing.T) {
idxs := genIdxs(n)
keys := genKeys(idxs)
fn := func(idxs []int) (map[int]string, error) {
return nil, nil
}
fetchError := errors.New("fetch error")
errFn := func(idxs []int) (map[int]string, error) {
panic(fetchError)
}
clearCache()
rc := NewClient(rdb, NewDefaultOptions())
_, err := rc.FetchBatch(keys, 60, fn)
assert.Nil(t, err)
rc.TagAsDeleted("key1")
_, err = rc.FetchBatch(keys, 60, errFn)
assert.Nil(t, err)
time.Sleep(20 * time.Millisecond)
}
func TestTagAsDeletedBatchWait(t *testing.T) {
clearCache()
rc := NewClient(rdb, NewDefaultOptions())
rc.Options.WaitReplicas = 1
rc.Options.WaitReplicasTimeout = 10
err := rc.TagAsDeletedBatch([]string{"key1", "key2"})
if getCluster() != nil {
assert.Nil(t, err)
} else {
assert.Error(t, err, fmt.Errorf("wait replicas 1 failed. result replicas: 0"))
}
}