From ef47ed57e907b3590975add0eb053244f52a17bb Mon Sep 17 00:00:00 2001 From: "swe-agent[bot]" <0+swe-agent[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:27:50 +0800 Subject: [PATCH] =?UTF-8?q?test(codeagent-wrapper):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20ExtractRecentErrors=20=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 测试覆盖: - 空日志文件 - 无错误日志 - 单个错误 - ERROR 和 WARN 混合 - maxEntries 截断 - nil logger - 空路径 - 不存在的文件 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- codeagent-wrapper/logger_test.go | 98 ++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/codeagent-wrapper/logger_test.go b/codeagent-wrapper/logger_test.go index ebe139c..6a9c37b 100644 --- a/codeagent-wrapper/logger_test.go +++ b/codeagent-wrapper/logger_test.go @@ -768,3 +768,101 @@ func (f fakeFileInfo) Mode() os.FileMode { return f.mode } func (f fakeFileInfo) ModTime() time.Time { return f.modTime } func (f fakeFileInfo) IsDir() bool { return false } func (f fakeFileInfo) Sys() interface{} { return nil } + +func TestExtractRecentErrors(t *testing.T) { + tests := []struct { + name string + content string + maxEntries int + want []string + }{ + { + name: "empty log", + content: "", + maxEntries: 10, + want: nil, + }, + { + name: "no errors", + content: `[2025-01-01 12:00:00.000] [PID:123] INFO: started +[2025-01-01 12:00:01.000] [PID:123] DEBUG: processing`, + maxEntries: 10, + want: nil, + }, + { + name: "single error", + content: `[2025-01-01 12:00:00.000] [PID:123] INFO: started +[2025-01-01 12:00:01.000] [PID:123] ERROR: something failed`, + maxEntries: 10, + want: []string{"[2025-01-01 12:00:01.000] [PID:123] ERROR: something failed"}, + }, + { + name: "error and warn", + content: `[2025-01-01 12:00:00.000] [PID:123] INFO: started +[2025-01-01 12:00:01.000] [PID:123] WARN: warning message +[2025-01-01 12:00:02.000] [PID:123] ERROR: error message`, + maxEntries: 10, + want: []string{ + "[2025-01-01 12:00:01.000] [PID:123] WARN: warning message", + "[2025-01-01 12:00:02.000] [PID:123] ERROR: error message", + }, + }, + { + name: "truncate to max", + content: `[2025-01-01 12:00:00.000] [PID:123] ERROR: error 1 +[2025-01-01 12:00:01.000] [PID:123] ERROR: error 2 +[2025-01-01 12:00:02.000] [PID:123] ERROR: error 3 +[2025-01-01 12:00:03.000] [PID:123] ERROR: error 4 +[2025-01-01 12:00:04.000] [PID:123] ERROR: error 5`, + maxEntries: 3, + want: []string{ + "[2025-01-01 12:00:02.000] [PID:123] ERROR: error 3", + "[2025-01-01 12:00:03.000] [PID:123] ERROR: error 4", + "[2025-01-01 12:00:04.000] [PID:123] ERROR: error 5", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tempDir := t.TempDir() + logPath := filepath.Join(tempDir, "test.log") + if err := os.WriteFile(logPath, []byte(tt.content), 0o644); err != nil { + t.Fatalf("failed to write test log: %v", err) + } + + logger := &Logger{path: logPath} + got := logger.ExtractRecentErrors(tt.maxEntries) + + if len(got) != len(tt.want) { + t.Fatalf("ExtractRecentErrors() got %d entries, want %d", len(got), len(tt.want)) + } + for i, entry := range got { + if entry != tt.want[i] { + t.Errorf("entry[%d] = %q, want %q", i, entry, tt.want[i]) + } + } + }) + } +} + +func TestExtractRecentErrorsNilLogger(t *testing.T) { + var logger *Logger + if got := logger.ExtractRecentErrors(10); got != nil { + t.Fatalf("nil logger ExtractRecentErrors() should return nil, got %v", got) + } +} + +func TestExtractRecentErrorsEmptyPath(t *testing.T) { + logger := &Logger{path: ""} + if got := logger.ExtractRecentErrors(10); got != nil { + t.Fatalf("empty path ExtractRecentErrors() should return nil, got %v", got) + } +} + +func TestExtractRecentErrorsFileNotExist(t *testing.T) { + logger := &Logger{path: "/nonexistent/path/to/log.log"} + if got := logger.ExtractRecentErrors(10); got != nil { + t.Fatalf("nonexistent file ExtractRecentErrors() should return nil, got %v", got) + } +}