kevo/pkg/sstable/integration_test.go
Jeremy Tregunna 6fc3be617d
Some checks failed
Go Tests / Run Tests (1.24.2) (push) Has been cancelled
feat: Initial release of kevo storage engine.
Adds a complete LSM-based storage engine with these features:
- Single-writer based architecture for the storage engine
- WAL for durability, and hey it's configurable
- MemTable with skip list implementation for fast read/writes
- SSTable with block-based structure for on-disk level-based storage
- Background compaction with tiered strategy
- ACID transactions
- Good documentation (I hope)
2025-04-20 14:06:50 -06:00

80 lines
1.9 KiB
Go

package sstable
import (
"fmt"
"path/filepath"
"testing"
)
// TestIntegration performs a basic integration test between Writer and Reader
func TestIntegration(t *testing.T) {
// Create a temporary directory for the test
tempDir := t.TempDir()
sstablePath := filepath.Join(tempDir, "test-integration.sst")
// Create a new SSTable writer
writer, err := NewWriter(sstablePath)
if err != nil {
t.Fatalf("Failed to create SSTable writer: %v", err)
}
// Add some key-value pairs
numEntries := 100
keyValues := make(map[string]string, numEntries)
for i := 0; i < numEntries; i++ {
key := fmt.Sprintf("key%05d", i)
value := fmt.Sprintf("value%05d", i)
keyValues[key] = value
err := writer.Add([]byte(key), []byte(value))
if err != nil {
t.Fatalf("Failed to add entry: %v", err)
}
}
// Finish writing
err = writer.Finish()
if err != nil {
t.Fatalf("Failed to finish SSTable: %v", err)
}
// Open the SSTable for reading
reader, err := OpenReader(sstablePath)
if err != nil {
t.Fatalf("Failed to open SSTable: %v", err)
}
defer reader.Close()
// Verify the number of entries
if reader.GetKeyCount() != numEntries {
t.Errorf("Expected %d entries, got %d", numEntries, reader.GetKeyCount())
}
// Test GetKeyCount method
if reader.GetKeyCount() != numEntries {
t.Errorf("GetKeyCount returned %d, expected %d", reader.GetKeyCount(), numEntries)
}
// First test direct key retrieval
missingKeys := 0
for key, expectedValue := range keyValues {
// Test direct Get
value, err := reader.Get([]byte(key))
if err != nil {
t.Errorf("Failed to get key %s via Get(): %v", key, err)
missingKeys++
continue
}
if string(value) != expectedValue {
t.Errorf("Value mismatch for key %s via Get(): expected %s, got %s",
key, expectedValue, value)
}
}
if missingKeys > 0 {
t.Errorf("%d keys could not be retrieved via direct Get", missingKeys)
}
}