sww tests: wait for every starting line as long as the start takes (closes #331)
check / check (push) Successful in 4m13s
check / check (push) Successful in 4m13s
Tests only, in `internal/sww`. Every wait for the `starting` line now uses `output.lineBeforeExit`, which waits until the line is written or sww exits, so a slow Core Rule Set compile on a loaded host no longer fails these tests. `TestMainRunsWAF` and `startRProxyProcess` start sww through `startProcess`, whose cleanup kills sww as the test ends and waits for it to exit; `startRProxyProcess` returns a stop function that sends SIGTERM and fails the test unless sww exits with status 0 within `waitLimit`. Model: opus-5-5
This commit was merged in pull request #340.
This commit is contained in:
1 parent
83525b5e73
commit
1748a670f9
3 files changed
+72
-54
No files matched your search
+40
-18
@@ -38,6 +38,35 @@ func TestMain(m *testing.M) {
|
||||
os.Exit(sww.Main(testVersion))
|
||||
}
|
||||
|
||||
// startProcess starts cmd and returns a channel that gets its exit status. As
|
||||
// the test ends, cmd is killed and the test waits for it to exit.
|
||||
func startProcess(t *testing.T, cmd *exec.Cmd) <-chan int {
|
||||
t.Helper()
|
||||
|
||||
err := cmd.Start()
|
||||
if err != nil {
|
||||
t.Fatalf("start: %v", err)
|
||||
}
|
||||
|
||||
exited := make(chan int, 1)
|
||||
waitReturned := make(chan struct{})
|
||||
|
||||
go func() {
|
||||
_ = cmd.Wait()
|
||||
exited <- cmd.ProcessState.ExitCode()
|
||||
|
||||
close(waitReturned)
|
||||
}()
|
||||
|
||||
t.Cleanup(func() {
|
||||
_ = cmd.Process.Kill()
|
||||
|
||||
<-waitReturned
|
||||
})
|
||||
|
||||
return exited
|
||||
}
|
||||
|
||||
func TestMainRunsWAF(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
@@ -54,12 +83,9 @@ func TestMainRunsWAF(t *testing.T) {
|
||||
t.Fatalf("find the test binary: %v", err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(t.Context(), 3*waitLimit)
|
||||
defer cancel()
|
||||
|
||||
dir := t.TempDir()
|
||||
out := &output{}
|
||||
cmd := exec.CommandContext(ctx, binary) //nolint:gosec // this test binary
|
||||
cmd := exec.CommandContext(t.Context(), binary) //nolint:gosec // this test binary
|
||||
cmd.Stdout = out
|
||||
|
||||
cmd.Env = append(os.Environ(),
|
||||
@@ -71,17 +97,9 @@ func TestMainRunsWAF(t *testing.T) {
|
||||
rulesDir+"="+t.TempDir(),
|
||||
lookupSource+"=off")
|
||||
|
||||
err = cmd.Start()
|
||||
if err != nil {
|
||||
t.Fatalf("start: %v", err)
|
||||
}
|
||||
exited := startProcess(t, cmd)
|
||||
|
||||
t.Cleanup(func() {
|
||||
_ = cmd.Process.Kill()
|
||||
_ = cmd.Wait()
|
||||
})
|
||||
|
||||
starting := out.line(t, "msg", "starting")
|
||||
starting := out.lineBeforeExit(t, "starting", exited)
|
||||
addr, _ := starting["address"].(string)
|
||||
ask(t, addr, "/", http.StatusOK, waf.DispositionAllow)
|
||||
|
||||
@@ -91,9 +109,13 @@ func TestMainRunsWAF(t *testing.T) {
|
||||
t.Fatalf("signal: %v", err)
|
||||
}
|
||||
|
||||
err = cmd.Wait()
|
||||
if err != nil {
|
||||
t.Fatalf("exit: %v; output:\n%s", err, out.text())
|
||||
select {
|
||||
case status := <-exited:
|
||||
if status != 0 {
|
||||
t.Fatalf("exit status %d, want 0; output:\n%s", status, out.text())
|
||||
}
|
||||
case <-time.After(waitLimit):
|
||||
t.Fatal("still running after being told to stop")
|
||||
}
|
||||
|
||||
wantUTC(t, "the process line", starting["time"])
|
||||
@@ -216,7 +238,7 @@ func runWAF(t *testing.T, env map[string]string, use func(addr string)) {
|
||||
exited <- run(ctx, env, out)
|
||||
}()
|
||||
|
||||
addr, _ := out.line(t, "msg", "starting")["address"].(string)
|
||||
addr, _ := out.lineBeforeExit(t, "starting", exited)["address"].(string)
|
||||
use(addr)
|
||||
stop()
|
||||
|
||||
|
||||
Reference in new issue
Block a user