package seqlog import ( "fmt" "testing" "time" ) // TestQueryFromProcessing 测试从处理窗口开始位置查询记录 func TestQueryFromProcessing(t *testing.T) { // 创建临时目录 tmpDir := t.TempDir() // 创建配置(带 handler,不处理任何记录以保持窗口稳定) config := &TopicConfig{ Handler: func(record *Record) error { // 不处理,只是为了让 tailer 启动 time.Sleep(1 * time.Second) // 延迟处理 return nil }, } // 创建 TopicProcessor processor, err := NewTopicProcessor(tmpDir, "test", nil, config) if err != nil { t.Fatal(err) } defer processor.Close() // 写入 10 条记录 for i := 0; i < 10; i++ { msg := fmt.Sprintf("message %d", i) _, err := processor.Write([]byte(msg)) if err != nil { t.Fatal(err) } } // 不启动 tailer,直接测试查询功能 // startIdx 应该是 0(没有处理任何记录) // 从处理窗口开始位置查询 5 条记录 records, err := processor.QueryFromProcessing(5) if err != nil { t.Fatal(err) } t.Logf("查询到 %d 条记录", len(records)) if len(records) != 5 { t.Fatalf("expected 5 records, got %d", len(records)) } // 验证查询结果从索引 0 开始 for i, rec := range records { expectedIndex := i if rec.Index != expectedIndex { t.Errorf("record[%d]: expected index %d, got %d", i, expectedIndex, rec.Index) } expectedMsg := fmt.Sprintf("message %d", expectedIndex) if string(rec.Record.Data) != expectedMsg { t.Errorf("record[%d]: expected data '%s', got '%s'", i, expectedMsg, string(rec.Record.Data)) } // 未启动 tailer,所有记录都应该是 Pending 状态 if rec.Status != StatusPending { t.Errorf("record[%d]: expected StatusPending, got %s", i, rec.Status) } t.Logf(" [索引 %d] %s - 状态: %s", rec.Index, string(rec.Record.Data), rec.Status) } t.Log("QueryFromProcessing 测试通过") }