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() }