126 lines
2.8 KiB
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"))
|
|
}
|
|
}
|