diff --git a/codeagent-wrapper/internal/app/main_integration_test.go b/codeagent-wrapper/internal/app/main_integration_test.go index 79e8be5..5765866 100644 --- a/codeagent-wrapper/internal/app/main_integration_test.go +++ b/codeagent-wrapper/internal/app/main_integration_test.go @@ -550,10 +550,8 @@ func TestRunNonParallelOutputsIncludeLogPathsIntegration(t *testing.T) { os.Args = []string{"codeagent-wrapper", "integration-log-check"} stdinReader = strings.NewReader("") isTerminalFn = func() bool { return true } - codexCommand = "echo" - buildCodexArgsFn = func(cfg *Config, targetArg string) []string { - return []string{`{"type":"thread.started","thread_id":"integration-session"}` + "\n" + `{"type":"item.completed","item":{"type":"agent_message","text":"done"}}`} - } + codexCommand = createFakeCodexScript(t, "integration-session", "done") + buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{} } var exitCode int stderr := captureStderr(t, func() { @@ -828,15 +826,20 @@ func TestRunCleanupFlagEndToEnd_Success(t *testing.T) { tempDir := setTempDirEnv(t, t.TempDir()) - staleA := createTempLog(t, tempDir, "codeagent-wrapper-2100.log") - staleB := createTempLog(t, tempDir, "codeagent-wrapper-2200-extra.log") - keeper := createTempLog(t, tempDir, "codeagent-wrapper-2300.log") + basePID := os.Getpid() + stalePID1 := basePID + 10000 + stalePID2 := basePID + 11000 + keeperPID := basePID + 12000 + + staleA := createTempLog(t, tempDir, fmt.Sprintf("codeagent-wrapper-%d.log", stalePID1)) + staleB := createTempLog(t, tempDir, fmt.Sprintf("codeagent-wrapper-%d-extra.log", stalePID2)) + keeper := createTempLog(t, tempDir, fmt.Sprintf("codeagent-wrapper-%d.log", keeperPID)) stubProcessRunning(t, func(pid int) bool { - return pid == 2300 || pid == os.Getpid() + return pid == keeperPID || pid == basePID }) stubProcessStartTime(t, func(pid int) time.Time { - if pid == 2300 || pid == os.Getpid() { + if pid == keeperPID || pid == basePID { return time.Now().Add(-1 * time.Hour) } return time.Time{} @@ -866,10 +869,10 @@ func TestRunCleanupFlagEndToEnd_Success(t *testing.T) { if !strings.Contains(output, "Files kept: 1") { t.Fatalf("missing 'Files kept: 1' in output: %q", output) } - if !strings.Contains(output, "codeagent-wrapper-2100.log") || !strings.Contains(output, "codeagent-wrapper-2200-extra.log") { + if !strings.Contains(output, fmt.Sprintf("codeagent-wrapper-%d.log", stalePID1)) || !strings.Contains(output, fmt.Sprintf("codeagent-wrapper-%d-extra.log", stalePID2)) { t.Fatalf("missing deleted file names in output: %q", output) } - if !strings.Contains(output, "codeagent-wrapper-2300.log") { + if !strings.Contains(output, fmt.Sprintf("codeagent-wrapper-%d.log", keeperPID)) { t.Fatalf("missing kept file names in output: %q", output) } diff --git a/codeagent-wrapper/internal/app/main_test.go b/codeagent-wrapper/internal/app/main_test.go index 44854d7..5a3b040 100644 --- a/codeagent-wrapper/internal/app/main_test.go +++ b/codeagent-wrapper/internal/app/main_test.go @@ -2953,13 +2953,10 @@ func TestRunCodexTask_StartError(t *testing.T) { func TestRunCodexTask_WithEcho(t *testing.T) { defer resetTestHooks() - codexCommand = "echo" - buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{targetArg} } + codexCommand = createFakeCodexScript(t, "test-session", "Test output") + buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{} } - jsonOutput := `{"type":"thread.started","thread_id":"test-session"} -{"type":"item.completed","item":{"type":"agent_message","text":"Test output"}}` - - res := runCodexTask(TaskSpec{Task: jsonOutput}, false, 10) + res := runCodexTask(TaskSpec{Task: "ignored"}, false, 10) if res.ExitCode != 0 || res.Message != "Test output" || res.SessionID != "test-session" { t.Fatalf("unexpected result: %+v", res) } @@ -3039,13 +3036,10 @@ func TestRunCodexTask_LogPathWithActiveLogger(t *testing.T) { } setLogger(logger) - codexCommand = "echo" - buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{targetArg} } + codexCommand = createFakeCodexScript(t, "fake-thread", "ok") + buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{} } - jsonOutput := `{"type":"thread.started","thread_id":"fake-thread"} -{"type":"item.completed","item":{"type":"agent_message","text":"ok"}}` - - result := runCodexTask(TaskSpec{Task: jsonOutput}, false, 5) + result := runCodexTask(TaskSpec{Task: "ignored"}, false, 5) if result.LogPath != logger.Path() { t.Fatalf("LogPath = %q, want %q", result.LogPath, logger.Path()) } @@ -3057,13 +3051,10 @@ func TestRunCodexTask_LogPathWithActiveLogger(t *testing.T) { func TestRunCodexTask_LogPathWithTempLogger(t *testing.T) { defer resetTestHooks() - codexCommand = "echo" - buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{targetArg} } + codexCommand = createFakeCodexScript(t, "temp-thread", "temp") + buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{} } - jsonOutput := `{"type":"thread.started","thread_id":"temp-thread"} -{"type":"item.completed","item":{"type":"agent_message","text":"temp"}}` - - result := runCodexTask(TaskSpec{Task: jsonOutput}, true, 5) + result := runCodexTask(TaskSpec{Task: "ignored"}, true, 5) t.Cleanup(func() { if result.LogPath != "" { os.Remove(result.LogPath) @@ -3109,10 +3100,19 @@ func TestRunCodexTask_LogPathOnStartError(t *testing.T) { func TestRunCodexTask_NoMessage(t *testing.T) { defer resetTestHooks() - codexCommand = "echo" - buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{targetArg} } - jsonOutput := `{"type":"thread.started","thread_id":"test-session"}` - res := runCodexTask(TaskSpec{Task: jsonOutput}, false, 10) + + fake := newFakeCmd(fakeCmdConfig{ + StdoutPlan: []fakeStdoutEvent{ + {Data: `{"type":"thread.started","thread_id":"test-session"}` + "\n"}, + }, + WaitDelay: 5 * time.Millisecond, + }) + restore := executor.SetNewCommandRunner(func(ctx context.Context, name string, args ...string) executor.CommandRunner { return fake }) + t.Cleanup(restore) + + codexCommand = "fake-cmd" + buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{} } + res := runCodexTask(TaskSpec{Task: "ignored"}, false, 10) if res.ExitCode != 1 || res.Error == "" { t.Fatalf("expected error for missing agent_message, got %+v", res) } @@ -4504,10 +4504,8 @@ func TestRun_CleanupHookAlwaysCalled(t *testing.T) { called := false cleanupHook = func() { called = true } // Use a command that goes through normal flow, not --version which returns early - restore := withBackend("echo", func(cfg *Config, targetArg string) []string { - return []string{`{"type":"thread.started","thread_id":"x"} -{"type":"item.completed","item":{"type":"agent_message","text":"ok"}}`} - }) + scriptPath := createFakeCodexScript(t, "x", "ok") + restore := withBackend(scriptPath, func(cfg *Config, targetArg string) []string { return []string{} }) defer restore() os.Args = []string{"codeagent-wrapper", "task"} if exitCode := run(); exitCode != 0 { @@ -4739,10 +4737,8 @@ func TestParallelLogPathInSerialMode(t *testing.T) { os.Args = []string{"codeagent-wrapper", "do-stuff"} stdinReader = strings.NewReader("") isTerminalFn = func() bool { return true } - codexCommand = "echo" - buildCodexArgsFn = func(cfg *Config, targetArg string) []string { - return []string{`{"type":"thread.started","thread_id":"cli-session"}` + "\n" + `{"type":"item.completed","item":{"type":"agent_message","text":"ok"}}`} - } + codexCommand = createFakeCodexScript(t, "cli-session", "ok") + buildCodexArgsFn = func(cfg *Config, targetArg string) []string { return []string{} } var exitCode int stderr := captureStderr(t, func() { @@ -4766,9 +4762,8 @@ func TestRun_CLI_Success(t *testing.T) { stdinReader = strings.NewReader("") isTerminalFn = func() bool { return true } - restore := withBackend("echo", func(cfg *Config, targetArg string) []string { - return []string{`{"type":"thread.started","thread_id":"cli-session"}` + "\n" + `{"type":"item.completed","item":{"type":"agent_message","text":"ok"}}`} - }) + scriptPath := createFakeCodexScript(t, "cli-session", "ok") + restore := withBackend(scriptPath, func(cfg *Config, targetArg string) []string { return []string{} }) defer restore() var exitCode int