Some checks failed
Go Tests / Run Tests (1.24.2) (push) Has been cancelled
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)
80 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|