|
|
|
@@ -1,7 +1,6 @@
|
|
|
|
|
package config
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"runtime"
|
|
|
|
@@ -88,7 +87,7 @@ func TestLoadProviderCommandTimeout(t *testing.T) {
|
|
|
|
|
if elapsed > maxElapsed {
|
|
|
|
|
t.Fatalf("timeout returned after %s, want roughly 5s", elapsed)
|
|
|
|
|
}
|
|
|
|
|
assertProcessTerminatedIfStarted(t, pidFile)
|
|
|
|
|
assertProcessTerminated(t, pidFile)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TestLoadProviderCommandTerminatesBackgroundChild covers a command that
|
|
|
|
@@ -98,10 +97,9 @@ func TestLoadProviderCommandTimeout(t *testing.T) {
|
|
|
|
|
// leftover child instead of just returning and leaking it.
|
|
|
|
|
func TestLoadProviderCommandTerminatesBackgroundChild(t *testing.T) {
|
|
|
|
|
pidFile := filepath.Join(t.TempDir(), "bg.pid")
|
|
|
|
|
childLifetime := 10 * time.Second
|
|
|
|
|
command := writeCommand(t, commandScript{
|
|
|
|
|
Stdout: `{"name":"cmd","provider":"openai","apiKey":"sk-command","model":"gpt-command"}`,
|
|
|
|
|
BackgroundSleepSeconds: int(childLifetime / time.Second),
|
|
|
|
|
BackgroundSleepSeconds: 10,
|
|
|
|
|
BackgroundPidFile: pidFile,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
@@ -114,8 +112,8 @@ func TestLoadProviderCommandTerminatesBackgroundChild(t *testing.T) {
|
|
|
|
|
if !strings.Contains(err.Error(), "timed out after 5s") {
|
|
|
|
|
t.Fatalf("error = %q, want timeout", err.Error())
|
|
|
|
|
}
|
|
|
|
|
if elapsed >= childLifetime {
|
|
|
|
|
t.Fatalf("returned after %s, want before the background child finishes naturally after %s", elapsed, childLifetime)
|
|
|
|
|
if elapsed > 4*time.Second {
|
|
|
|
|
t.Fatalf("returned after %s, want well under the 5s provider-command timeout since WaitDelay (1s) should trigger termination", elapsed)
|
|
|
|
|
}
|
|
|
|
|
assertProcessTerminated(t, pidFile)
|
|
|
|
|
}
|
|
|
|
@@ -128,11 +126,10 @@ func TestLoadProviderCommandTerminatesBackgroundChild(t *testing.T) {
|
|
|
|
|
// be terminated on that path.
|
|
|
|
|
func TestLoadProviderCommandTerminatesBackgroundChildOnFailure(t *testing.T) {
|
|
|
|
|
pidFile := filepath.Join(t.TempDir(), "bg-fail.pid")
|
|
|
|
|
childLifetime := 10 * time.Second
|
|
|
|
|
command := writeCommand(t, commandScript{
|
|
|
|
|
Stderr: "boom",
|
|
|
|
|
ExitCode: 7,
|
|
|
|
|
BackgroundSleepSeconds: int(childLifetime / time.Second),
|
|
|
|
|
BackgroundSleepSeconds: 10,
|
|
|
|
|
BackgroundPidFile: pidFile,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
@@ -145,21 +142,8 @@ func TestLoadProviderCommandTerminatesBackgroundChildOnFailure(t *testing.T) {
|
|
|
|
|
if !strings.Contains(err.Error(), "exit status") {
|
|
|
|
|
t.Fatalf("error = %q, want exit status failure", err.Error())
|
|
|
|
|
}
|
|
|
|
|
if elapsed >= childLifetime {
|
|
|
|
|
t.Fatalf("returned after %s, want before the background child finishes naturally after %s", elapsed, childLifetime)
|
|
|
|
|
}
|
|
|
|
|
assertProcessTerminated(t, pidFile)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func assertProcessTerminatedIfStarted(t *testing.T, pidFile string) {
|
|
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
|
|
// The basic timeout fixture is intentionally unsynchronized. On a loaded
|
|
|
|
|
// Windows runner, the cold PowerShell child can be terminated before it
|
|
|
|
|
// records its PID; the synchronized background-child tests below retain
|
|
|
|
|
// the strict PID and liveness checks.
|
|
|
|
|
if _, err := os.Stat(pidFile); errors.Is(err, os.ErrNotExist) {
|
|
|
|
|
return
|
|
|
|
|
if elapsed > 4*time.Second {
|
|
|
|
|
t.Fatalf("returned after %s, want well under the 5s provider-command timeout since WaitDelay (1s) should trigger termination", elapsed)
|
|
|
|
|
}
|
|
|
|
|
assertProcessTerminated(t, pidFile)
|
|
|
|
|
}
|
|
|
|
|