summaryrefslogtreecommitdiffstats
path: root/encoding_test.go
diff options
context:
space:
mode:
authorMarc Pervaz Boocha <marcpervaz@qburst.com>2025-02-20 17:58:55 +0530
committerMarc Pervaz Boocha <marcpervaz@qburst.com>2025-02-20 17:58:55 +0530
commit2f95efc236520485c7cc1439acae24140657d76c (patch)
tree10eac60e3eec8e6b3bb9c27e131cd531363c39d6 /encoding_test.go
parentAdded Eviction and Options setup (diff)
downloadcache-2f95efc236520485c7cc1439acae24140657d76c.tar
cache-2f95efc236520485c7cc1439acae24140657d76c.tar.gz
cache-2f95efc236520485c7cc1439acae24140657d76c.tar.bz2
cache-2f95efc236520485c7cc1439acae24140657d76c.tar.lz
cache-2f95efc236520485c7cc1439acae24140657d76c.tar.xz
cache-2f95efc236520485c7cc1439acae24140657d76c.tar.zst
cache-2f95efc236520485c7cc1439acae24140657d76c.zip
Add Tests and benchmarks
Diffstat (limited to 'encoding_test.go')
-rw-r--r--encoding_test.go202
1 files changed, 181 insertions, 21 deletions
diff --git a/encoding_test.go b/encoding_test.go
index d48d2fd..6ca50cb 100644
--- a/encoding_test.go
+++ b/encoding_test.go
@@ -2,10 +2,14 @@ package cache
import (
"bytes"
+ "encoding/binary"
+ "fmt"
+ "os"
"testing"
"time"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestEncodeDecodeUint64(t *testing.T) {
@@ -102,27 +106,36 @@ func TestEncodeDecodeNode(t *testing.T) {
name string
value *node
}{
- {name: "Empty", value: &node{
- Hash: 1234567890,
- Expiration: time.Now(),
- Access: 987654321,
- Key: []byte("testKey"),
- Value: []byte("testValue"),
- }},
- {name: "Non-Empty", value: &node{
- Hash: 1234567890,
- Expiration: time.Now(),
- Access: 987654321,
- Key: []byte("testKey"),
- Value: []byte("testValue"),
- }},
- {name: "Bytes Large", value: &node{
- Hash: 1234567890,
- Expiration: time.Now(),
- Access: 987654321,
- Key: []byte("testKey"),
- Value: []byte("testValue"),
- }},
+ {
+ name: "Empty",
+ value: &node{
+ Hash: 1234567890,
+ Expiration: time.Now(),
+ Access: 987654321,
+ Key: []byte("testKey"),
+ Value: []byte("testValue"),
+ },
+ },
+ {
+ name: "Non-Empty",
+ value: &node{
+ Hash: 1234567890,
+ Expiration: time.Now(),
+ Access: 987654321,
+ Key: []byte("testKey"),
+ Value: []byte("testValue"),
+ },
+ },
+ {
+ name: "Bytes Large",
+ value: &node{
+ Hash: 1234567890,
+ Expiration: time.Now(),
+ Access: 987654321,
+ Key: []byte("testKey"),
+ Value: []byte("testValue"),
+ },
+ },
}
for _, tt := range tests {
@@ -148,3 +161,150 @@ func TestEncodeDecodeNode(t *testing.T) {
})
}
}
+
+func TestEncodeDecodeStrorage(t *testing.T) {
+ tests := []struct {
+ name string
+ store map[string]string
+ policy EvictionPolicyType
+ maxCost int
+ }{
+ {
+ name: "Empty",
+ store: map[string]string{},
+ policy: PolicyNone,
+ maxCost: 0,
+ },
+ {
+ name: "Single Item",
+ store: map[string]string{
+ "Test": "Test",
+ },
+ policy: PolicyNone,
+ maxCost: 0,
+ },
+ {
+ name: "Many Items",
+ store: map[string]string{
+ "Test1": "Test",
+ "Test2": "Test",
+ "Test3": "Test",
+ "Test4": "Test",
+ },
+ policy: PolicyNone,
+ maxCost: 0,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ var buf bytes.Buffer
+ e := newEncoder(&buf)
+
+ want := setupTestStore(t)
+ want.MaxCost = uint64(tt.maxCost)
+ err := want.Policy.SetPolicy(tt.policy)
+ assert.NoError(t, err)
+
+ for k, v := range tt.store {
+ want.Set([]byte(k), []byte(v), 0)
+ }
+
+ err = e.EncodeStore(want)
+ assert.NoError(t, err)
+ err = e.Flush()
+ assert.NoError(t, err)
+
+ decoder := newDecoder(bytes.NewReader(buf.Bytes()))
+ got := setupTestStore(t)
+
+ err = decoder.DecodeStore(got)
+ assert.NoError(t, err)
+
+ assert.Equal(t, want.MaxCost, got.MaxCost)
+ assert.Equal(t, want.Length, got.Length)
+ assert.Equal(t, want.Policy.Type, got.Policy.Type)
+
+ gotOrder := getListOrder(t, &got.Evict)
+ for i, v := range getListOrder(t, &want.Evict) {
+ assert.Equal(t, v.Key, gotOrder[i].Key)
+ }
+
+ for k, v := range tt.store {
+ gotVal, _, ok := want.Get([]byte(k))
+ require.True(t, ok)
+ require.Equal(t, []byte(v), gotVal)
+ }
+ })
+ }
+}
+
+type MockSeeker struct {
+ *bytes.Buffer
+}
+
+func BenchmarkEncoder_EncodeStore(b *testing.B) {
+ file, err := os.CreateTemp("", "benchmark_test_")
+ if err != nil {
+ b.Fatal(err)
+ }
+ defer os.Remove(file.Name())
+ defer file.Close()
+
+ for n := 1; n <= 10000; n *= 10 {
+ b.Run(fmt.Sprint(n), func(b *testing.B) {
+ want := setupTestStore(b)
+
+ for i := range n {
+ buf := make([]byte, 8)
+ binary.LittleEndian.PutUint64(buf, uint64(i))
+ want.Set(buf, buf, 0)
+ }
+
+ err = want.Snapshot(file)
+ require.NoError(b, err)
+
+ fileInfo, err := file.Stat()
+ require.NoError(b, err)
+ b.SetBytes(int64(fileInfo.Size()))
+ b.ReportAllocs()
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ want.Snapshot(file)
+ }
+ })
+ }
+
+}
+
+func BenchmarkDecoder_DecodeStore(b *testing.B) {
+
+ file, err := os.CreateTemp("", "benchmark_test_")
+ require.NoError(b, err)
+ defer os.Remove(file.Name())
+ defer file.Close()
+
+ for n := 1; n <= 10000; n *= 10 {
+ b.Run(fmt.Sprint(n), func(b *testing.B) {
+ want := setupTestStore(b)
+ for i := range 100 {
+ buf := make([]byte, 8)
+ binary.LittleEndian.PutUint64(buf, uint64(i))
+ want.Set(buf, buf, 0)
+ }
+
+ err = want.Snapshot(file)
+ require.NoError(b, err)
+ fileInfo, err := file.Stat()
+ require.NoError(b, err)
+ b.SetBytes(int64(fileInfo.Size()))
+ b.ReportAllocs()
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ want.LoadSnapshot(file)
+ }
+ })
+ }
+}