Added Unit test for cache reloading
This commit is contained in:
parent
f92ae5e6ca
commit
ee50b55163
|
@ -14,6 +14,7 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/mock"
|
"github.com/stretchr/testify/mock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
"golang.org/x/time/rate"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Test a basic Get with no indexes (and therefore no blocking queries).
|
// Test a basic Get with no indexes (and therefore no blocking queries).
|
||||||
|
@ -1220,6 +1221,64 @@ func TestCacheGet_nonBlockingType(t *testing.T) {
|
||||||
typ.AssertExpectations(t)
|
typ.AssertExpectations(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test a get with an index set will wait until an index that is higher
|
||||||
|
// is set in the cache.
|
||||||
|
func TestCacheReload(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
typ1 := TestType(t)
|
||||||
|
defer typ1.AssertExpectations(t)
|
||||||
|
|
||||||
|
c := New(Options{EntryFetchRate: rate.Limit(1), EntryFetchMaxBurst: 1})
|
||||||
|
c.RegisterType("t1", typ1)
|
||||||
|
typ1.Mock.On("Fetch", mock.Anything, mock.Anything).Return(FetchResult{Value: 42, Index: 42}, nil).Maybe()
|
||||||
|
|
||||||
|
require.False(t, c.ReloadOptions(Options{EntryFetchRate: rate.Limit(1), EntryFetchMaxBurst: 1}), "Value should not be reloaded")
|
||||||
|
|
||||||
|
_, meta, err := c.Get(context.Background(), "t1", TestRequest(t, RequestInfo{Key: "hello1", MinIndex: uint64(1)}))
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, meta.Index, uint64(42))
|
||||||
|
|
||||||
|
testEntry := func(t *testing.T, doTest func(t *testing.T, entry cacheEntry)) {
|
||||||
|
c.entriesLock.Lock()
|
||||||
|
tEntry, ok := c.types["t1"]
|
||||||
|
require.True(t, ok)
|
||||||
|
keyName := makeEntryKey("t1", "", "", "hello1")
|
||||||
|
ok, entryValid, entry := c.getEntryLocked(tEntry, keyName, RequestInfo{})
|
||||||
|
require.True(t, ok)
|
||||||
|
require.True(t, entryValid)
|
||||||
|
doTest(t, entry)
|
||||||
|
c.entriesLock.Unlock()
|
||||||
|
|
||||||
|
}
|
||||||
|
testEntry(t, func(t *testing.T, entry cacheEntry) {
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Limit(), rate.Limit(1))
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Burst(), 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Modify only rateLimit
|
||||||
|
require.True(t, c.ReloadOptions(Options{EntryFetchRate: rate.Limit(100), EntryFetchMaxBurst: 1}))
|
||||||
|
testEntry(t, func(t *testing.T, entry cacheEntry) {
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Limit(), rate.Limit(100))
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Burst(), 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Modify only Burst
|
||||||
|
require.True(t, c.ReloadOptions(Options{EntryFetchRate: rate.Limit(100), EntryFetchMaxBurst: 5}))
|
||||||
|
testEntry(t, func(t *testing.T, entry cacheEntry) {
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Limit(), rate.Limit(100))
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Burst(), 5)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Modify only Burst and Limit at the same time
|
||||||
|
require.True(t, c.ReloadOptions(Options{EntryFetchRate: rate.Limit(1000), EntryFetchMaxBurst: 42}))
|
||||||
|
|
||||||
|
testEntry(t, func(t *testing.T, entry cacheEntry) {
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Limit(), rate.Limit(1000))
|
||||||
|
require.Equal(t, entry.FetchRateLimiter.Burst(), 42)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// TestCacheThrottle checks the assumptions for the cache throttling. It sets
|
// TestCacheThrottle checks the assumptions for the cache throttling. It sets
|
||||||
// up a cache with Options{EntryFetchRate: 10.0, EntryFetchMaxBurst: 1}, which
|
// up a cache with Options{EntryFetchRate: 10.0, EntryFetchMaxBurst: 1}, which
|
||||||
// allows for 10req/s, or one request every 100ms.
|
// allows for 10req/s, or one request every 100ms.
|
||||||
|
|
Loading…
Reference in New Issue