diff options
Diffstat (limited to '')
-rw-r--r-- | encoding_test.go | 202 |
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) + } + }) + } +} |