* plugin/dnssec: use entire RRset as key input This uses the entire rrset as input for the hash key; this is to detect differences in the RRset and generate the correct signature. As this would then lead to unbounded growth, we periodically (every 8h) prune the cache of old entries. In theory we could rely on the random eviction, but it seems nicer to do this in a maintannce loop so that we remove the unused ones. This required adding a Walk function to the plugin/pkg/cache. Signed-off-by: Miek Gieben <miek@miek.nl> * Update plugin/dnssec/cache.go Co-authored-by: Chris O'Haver <cohaver@infoblox.com> Co-authored-by: Chris O'Haver <cohaver@infoblox.com>
85 lines
1.4 KiB
Go
85 lines
1.4 KiB
Go
package cache
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestCacheAddAndGet(t *testing.T) {
|
|
const N = shardSize * 4
|
|
c := New(N)
|
|
c.Add(1, 1)
|
|
|
|
if _, found := c.Get(1); !found {
|
|
t.Fatal("Failed to find inserted record")
|
|
}
|
|
|
|
for i := 0; i < N; i++ {
|
|
c.Add(uint64(i), 1)
|
|
}
|
|
for i := 0; i < N; i++ {
|
|
c.Add(uint64(i), 1)
|
|
if c.Len() != N {
|
|
t.Fatal("A item was unnecessarily evicted from the cache")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCacheLen(t *testing.T) {
|
|
c := New(4)
|
|
|
|
c.Add(1, 1)
|
|
if l := c.Len(); l != 1 {
|
|
t.Fatalf("Cache size should %d, got %d", 1, l)
|
|
}
|
|
|
|
c.Add(1, 1)
|
|
if l := c.Len(); l != 1 {
|
|
t.Fatalf("Cache size should %d, got %d", 1, l)
|
|
}
|
|
|
|
c.Add(2, 2)
|
|
if l := c.Len(); l != 2 {
|
|
t.Fatalf("Cache size should %d, got %d", 2, l)
|
|
}
|
|
}
|
|
|
|
func TestCacheSharding(t *testing.T) {
|
|
c := New(shardSize)
|
|
for i := 0; i < shardSize*2; i++ {
|
|
c.Add(uint64(i), 1)
|
|
}
|
|
for i, s := range c.shards {
|
|
if s.Len() == 0 {
|
|
t.Errorf("Failed to populate shard: %d", i)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCacheWalk(t *testing.T) {
|
|
c := New(10)
|
|
exp := make([]int, 10*2)
|
|
for i := 0; i < 10*2; i++ {
|
|
c.Add(uint64(i), 1)
|
|
exp[i] = 1
|
|
}
|
|
got := make([]int, 10*2)
|
|
c.Walk(func(items map[uint64]interface{}, key uint64) bool {
|
|
got[key] = items[key].(int)
|
|
return true
|
|
})
|
|
for i := range exp {
|
|
if exp[i] != got[i] {
|
|
t.Errorf("Expected %d, got %d", exp[i], got[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkCache(b *testing.B) {
|
|
b.ReportAllocs()
|
|
|
|
c := New(4)
|
|
for n := 0; n < b.N; n++ {
|
|
c.Add(1, 1)
|
|
c.Get(1)
|
|
}
|
|
}
|