godocdb/index/index_test.go

136 lines
2.9 KiB
Go
Raw Normal View History

package index
import (
"fmt"
"os"
"sync"
"testing"
)
func TestIndexStore(t *testing.T) {
// 测试目录
dir := "./testdb"
defer os.RemoveAll(dir)
// 初始化索引存储
is, err := NewIndexStore(dir)
if err != nil {
t.Fatalf("Failed to create index store: %v", err)
}
defer is.storage.Close()
// 测试索引名称和字段
indexName := "test_index"
keyFields := []string{"name"}
// 测试创建索引
if err := is.CreateIndex(indexName, SingleField, keyFields); err != nil {
t.Errorf("CreateIndex failed: %v", err)
}
// 验证元数据
metadata, err := is.GetIndexMetadata(indexName)
if err != nil {
t.Errorf("GetIndexMetadata failed: %v", err)
}
if metadata.Name != indexName || metadata.Type != SingleField {
t.Errorf("Metadata mismatch: got %+v want name=%s type=%s", metadata, indexName, SingleField)
}
// 测试删除索引
if err := is.DropIndex(indexName); err != nil {
t.Errorf("DropIndex failed: %v", err)
}
// 验证索引已被删除
_, err = is.GetIndexMetadata(indexName)
if err == nil {
t.Errorf("Expected error after DropIndex")
}
}
func TestCompositeIndex(t *testing.T) {
// 测试目录
dir := "./testdb_composite"
defer os.RemoveAll(dir)
// 初始化索引存储
is, err := NewIndexStore(dir)
if err != nil {
t.Fatalf("Failed to create index store: %v", err)
}
defer is.storage.Close()
// 测试复合索引
indexName := "composite_index"
keyFields := []string{"name", "age"}
// 创建复合索引
if err := is.CreateIndex(indexName, Composite, keyFields); err != nil {
t.Errorf("CreateIndex failed: %v", err)
}
// 验证元数据
metadata, err := is.GetIndexMetadata(indexName)
if err != nil {
t.Errorf("GetIndexMetadata failed: %v", err)
}
if metadata.Type != Composite || len(metadata.KeyFields) != 2 {
t.Errorf("Composite index metadata mismatch: got %+v want type=%s fieldsCount=2", metadata, Composite)
}
}
func BenchmarkSingleFieldQuery(b *testing.B) {
// 基准测试单字段查询性能
dir := "./testdb_bench"
defer os.RemoveAll(dir)
is, _ := NewIndexStore(dir)
// 创建测试数据
for i := 0; i < 1000; i++ {
is.CreateIndex(fmt.Sprintf("index_%d", i), SingleField, []string{"name"})
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := is.GetIndexMetadata(fmt.Sprintf("index_%d", i%1000))
if err != nil {
b.Error(err)
}
}
}
func TestConcurrentIndexOperations(t *testing.T) {
// 测试并发索引操作
dir := "./testdb_concurrent"
defer os.RemoveAll(dir)
is, _ := NewIndexStore(dir)
numGoroutines := 10
var wg sync.WaitGroup
for i := 0; i < numGoroutines; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
indexName := fmt.Sprintf("concurrent_index_%d", i)
// 创建索引
if err := is.CreateIndex(indexName, SingleField, []string{"name"}); err != nil {
t.Errorf("CreateIndex failed: %v", err)
}
// 删除索引
if err := is.DropIndex(indexName); err != nil {
t.Errorf("DropIndex failed: %v", err)
}
}(i)
}
wg.Wait()
}