101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package rockscache
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestBadOptions(t *testing.T) {
|
|
assert.Panics(t, func() {
|
|
NewClient(nil, Options{})
|
|
})
|
|
}
|
|
|
|
func TestDisable(t *testing.T) {
|
|
rc := NewClient(nil, NewDefaultOptions())
|
|
rc.Options.DisableCacheDelete = true
|
|
rc.Options.DisableCacheRead = true
|
|
fn := func() (string, error) { return "", nil }
|
|
_, err := rc.Fetch2(context.Background(), "key", 60, fn)
|
|
assert.Nil(t, err)
|
|
err = rc.TagAsDeleted2(context.Background(), "key")
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
func TestEmptyExpire(t *testing.T) {
|
|
testEmptyExpire(t, 0)
|
|
testEmptyExpire(t, 10*time.Second)
|
|
}
|
|
|
|
func testEmptyExpire(t *testing.T, expire time.Duration) {
|
|
clearCache()
|
|
rc := NewClient(rdb, NewDefaultOptions())
|
|
rc.Options.EmptyExpire = expire
|
|
fn := func() (string, error) { return "", nil }
|
|
fetchError := errors.New("fetch error")
|
|
errFn := func() (string, error) {
|
|
return "", fetchError
|
|
}
|
|
_, err := rc.Fetch("key1", 600, fn)
|
|
assert.Nil(t, err)
|
|
_, err = rc.Fetch("key1", 600, errFn)
|
|
if expire == 0 {
|
|
assert.ErrorIs(t, err, fetchError)
|
|
} else {
|
|
assert.Nil(t, err)
|
|
}
|
|
|
|
rc.Options.StrongConsistency = true
|
|
_, err = rc.Fetch("key2", 600, fn)
|
|
assert.Nil(t, err)
|
|
_, err = rc.Fetch("key2", 600, errFn)
|
|
if expire == 0 {
|
|
assert.ErrorIs(t, err, fetchError)
|
|
} else {
|
|
assert.Nil(t, err)
|
|
}
|
|
}
|
|
|
|
func TestErrorFetch(t *testing.T) {
|
|
fn := func() (string, error) { return "", fmt.Errorf("error") }
|
|
clearCache()
|
|
rc := NewClient(rdb, NewDefaultOptions())
|
|
_, err := rc.Fetch("key1", 60, fn)
|
|
assert.Equal(t, fmt.Errorf("error"), err)
|
|
|
|
rc.Options.StrongConsistency = true
|
|
_, err = rc.Fetch("key2", 60, fn)
|
|
assert.Equal(t, fmt.Errorf("error"), err)
|
|
}
|
|
|
|
func TestPanicFetch(t *testing.T) {
|
|
fn := func() (string, error) { return "abc", nil }
|
|
pfn := func() (string, error) { panic(fmt.Errorf("error")) }
|
|
clearCache()
|
|
rc := NewClient(rdb, NewDefaultOptions())
|
|
_, err := rc.Fetch("key1", 60*time.Second, fn)
|
|
assert.Nil(t, err)
|
|
rc.TagAsDeleted("key1")
|
|
_, err = rc.Fetch("key1", 60*time.Second, pfn)
|
|
assert.Nil(t, err)
|
|
time.Sleep(20 * time.Millisecond)
|
|
}
|
|
|
|
func TestTagAsDeletedWait(t *testing.T) {
|
|
clearCache()
|
|
rc := NewClient(rdb, NewDefaultOptions())
|
|
rc.Options.WaitReplicas = 1
|
|
rc.Options.WaitReplicasTimeout = 10
|
|
err := rc.TagAsDeleted("key1")
|
|
if getCluster() != nil {
|
|
assert.Nil(t, err)
|
|
} else {
|
|
assert.Error(t, err, fmt.Errorf("wait replicas 1 failed. result replicas: 0"))
|
|
}
|
|
}
|