Spend less of make test writing the image and waiting (closes #56)
check / check (push) Failing after 45s

The test phase spends most of its time compiling with the race
detector from an empty build cache; then come writing the test image
and the internal/proxy tests.

- Go's build cache is on a tmpfs in the test phase, so its 137 MB are
  no longer written into the test image.
- TestUpgradedConnectionOutlastsTheTimeouts waits until just past
  shortTimeout after the answer to the upgrade was read, by when every
  timeout has started, rather than 7.5 s, so it ends with the other
  timing tests.
- shortTimeout is written as waitLimit / 2, as its comment says it is.

Model: opus-5-5
This commit was merged in pull request #59.
This commit is contained in:
2026-10-04 11:13:32 +02:00
parent d4f90dba37
commit e7fb88af9e
3 changed files with 12 additions and 7 deletions
+4 -1
View File
@@ -29,7 +29,10 @@ RUN go mod download
COPY . . COPY . .
RUN go test -count=1 -timeout 90s -race -cover ./... || \ # Go's build cache is kept on a tmpfs, out of the image: nothing uses it
# after this step, and writing it into the image takes seconds.
RUN --mount=type=tmpfs,target=/root/.cache/go-build \
go test -count=1 -timeout 90s -race -cover ./... || \
{ echo "--- Rerunning with -v for details ---"; \ { echo "--- Rerunning with -v for details ---"; \
go test -count=1 -timeout 90s -race -v ./...; exit 1; } go test -count=1 -timeout 90s -race -v ./...; exit 1; }
+5 -3
View File
@@ -240,15 +240,17 @@ func TestUpgradedConnectionOutlastsTheTimeouts(t *testing.T) {
t.Fatalf("read the answer to the upgrade: %v", err) t.Fatalf("read the answer to the upgrade: %v", err)
} }
answered := time.Now()
_ = res.Body.Close() _ = res.Body.Close()
if res.StatusCode != http.StatusSwitchingProtocols { if res.StatusCode != http.StatusSwitchingProtocols {
t.Fatalf("status %d, want %d", res.StatusCode, http.StatusSwitchingProtocols) t.Fatalf("status %d, want %d", res.StatusCode, http.StatusSwitchingProtocols)
} }
// Every timeout started before the upgrade was answered: wait past // Every timeout started before the upgrade was answered, the response
// them all, then use the connection. // timeouts last, at the end of the request: wait until just past
time.Sleep(3 * shortTimeout / 2) // shortTimeout after the answer was read, then use the connection.
time.Sleep(time.Until(answered.Add(shortTimeout + 100*time.Millisecond)))
send(t, conn, "still here\n") send(t, conn, "still here\n")
echoed, err := reader.ReadString('\n') echoed, err := reader.ReadString('\n')
+3 -3
View File
@@ -23,9 +23,9 @@ const (
// shortTimeout is what a test sets a timeout to, to see it run out. // shortTimeout is what a test sets a timeout to, to see it run out.
// It starts before the test has set up its case, such as an upgrade // It starts before the test has set up its case, such as an upgrade
// or the app's buffers filling, so it is as long as the hold-up of the // or the app's buffers filling, so it is as long as the hold-up of the
// test process that wantTimedOut allows, waitLimit/2: a shorter one // test process that wantTimedOut allows: a shorter one can run out
// can run out first on a busy host. // first on a busy host.
shortTimeout = 5 * time.Second shortTimeout = waitLimit / 2
// shortTimeoutSetting is shortTimeout as a setting's value. // shortTimeoutSetting is shortTimeout as a setting's value.
shortTimeoutSetting = "5s" shortTimeoutSetting = "5s"
// longTimeoutSetting is a timeout that does not run out in a test. // longTimeoutSetting is a timeout that does not run out in a test.