Add e2e tests

This commit is contained in:
2026-02-18 00:03:59 +04:00
parent d197e90103
commit 4b3230bb27
26 changed files with 4490 additions and 3 deletions

110
e2e/timeout_test.go Normal file
View File

@@ -0,0 +1,110 @@
package e2e
import (
"testing"
"time"
)
func TestRequestTimeout(t *testing.T) {
t.Parallel()
// Server that takes 2 seconds to respond
srv := slowServer(2 * time.Second)
defer srv.Close()
// Timeout of 200ms — should fail with timeout error
res := run("-U", srv.URL, "-r", "1", "-T", "200ms", "-q", "-o", "json")
assertExitCode(t, res, 0)
out := res.jsonOutput(t)
// Should NOT have "200" — should have a timeout error
if _, ok := out.Responses["200"]; ok {
t.Error("expected timeout error, but got 200")
}
// Total count should still be 1 (the timed-out request is counted)
assertResponseCount(t, out, 1)
}
func TestRequestTimeoutMultiple(t *testing.T) {
t.Parallel()
srv := slowServer(2 * time.Second)
defer srv.Close()
res := run("-U", srv.URL, "-r", "3", "-c", "3", "-T", "200ms", "-q", "-o", "json")
assertExitCode(t, res, 0)
out := res.jsonOutput(t)
assertResponseCount(t, out, 3)
// None should be 200
if _, ok := out.Responses["200"]; ok {
t.Error("expected all requests to timeout, but got some 200s")
}
}
func TestTimeoutDoesNotAffectFastRequests(t *testing.T) {
t.Parallel()
srv := echoServer()
defer srv.Close()
// Short timeout but server responds instantly — should succeed
res := run("-U", srv.URL, "-r", "3", "-T", "5s", "-q", "-o", "json")
assertExitCode(t, res, 0)
out := res.jsonOutput(t)
assertHasResponseKey(t, out, "200")
assertResponseCount(t, out, 3)
}
func TestDurationStopsAfterTime(t *testing.T) {
t.Parallel()
srv := echoServer()
defer srv.Close()
start := time.Now()
res := run("-U", srv.URL, "-d", "1s", "-q", "-o", "json")
elapsed := time.Since(start)
assertExitCode(t, res, 0)
// Should finish roughly around 1s (allow some tolerance)
if elapsed < 900*time.Millisecond {
t.Errorf("expected test to run ~1s, but finished in %v", elapsed)
}
if elapsed > 3*time.Second {
t.Errorf("expected test to finish around 1s, but took %v", elapsed)
}
}
func TestDurationWithRequestLimit(t *testing.T) {
t.Parallel()
srv := echoServer()
defer srv.Close()
// Request limit reached before duration — should stop early
res := run("-U", srv.URL, "-r", "2", "-d", "30s", "-q", "-o", "json")
assertExitCode(t, res, 0)
out := res.jsonOutput(t)
assertResponseCount(t, out, 2)
}
func TestDurationWithSlowServerStopsAtDuration(t *testing.T) {
t.Parallel()
// Server delays 500ms per request
srv := slowServer(500 * time.Millisecond)
defer srv.Close()
start := time.Now()
res := run("-U", srv.URL, "-d", "1s", "-c", "1", "-q", "-o", "json")
elapsed := time.Since(start)
assertExitCode(t, res, 0)
// Should stop after ~1s even though requests are slow
if elapsed > 3*time.Second {
t.Errorf("expected to stop around 1s duration, took %v", elapsed)
}
}