Keep neoirc-cli sessions on localhost and test the relay goroutine stop
check / check (push) Failing after 5s
check / check (push) Failing after 5s
The auth cookie is always Secure, and Go 1.24's cookie jar sends a Secure cookie only over HTTPS, so neoirc-cli lost its session against a plain-HTTP server on localhost. Its jar now treats a server on localhost as HTTPS, as curl does. The README's Transport Security section and Python example say what a client needs. A test checks that closing a registered IRC client's connection stops its relay goroutine. The README Entrypoints section names a make target only for the scripts that have one, and the Dockerfile says why the test phase runs with -p 4. Model: opus-5-5
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"log/slog"
|
||||
"net"
|
||||
"os"
|
||||
"runtime"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
@@ -608,6 +609,56 @@ func TestNamesNonExistentChannel(t *testing.T) {
|
||||
)
|
||||
}
|
||||
|
||||
// TestRelayStopsWhenConnectionCloses checks that closing a
|
||||
// registered client's connection stops the goroutine that
|
||||
// relays its messages.
|
||||
//
|
||||
//nolint:paralleltest // counts every goroutine in the process
|
||||
func TestRelayStopsWhenConnectionCloses(t *testing.T) {
|
||||
env := newTestEnv(t)
|
||||
client := env.dial(t)
|
||||
|
||||
client.register("relaystop")
|
||||
waitForRelayGoroutines(t, 1)
|
||||
|
||||
err := client.conn.Close()
|
||||
if err != nil {
|
||||
t.Fatalf("close: %v", err)
|
||||
}
|
||||
|
||||
waitForRelayGoroutines(t, 0)
|
||||
}
|
||||
|
||||
const (
|
||||
stackDumpSize = 1 << 20
|
||||
relayCheckStep = 10 * time.Millisecond
|
||||
)
|
||||
|
||||
// waitForRelayGoroutines waits until exactly want goroutines
|
||||
// are running the relay loop, and fails the test if that does
|
||||
// not happen within testTimeout.
|
||||
func waitForRelayGoroutines(t *testing.T, want int) {
|
||||
t.Helper()
|
||||
|
||||
deadline := time.Now().Add(testTimeout)
|
||||
stacks := make([]byte, stackDumpSize)
|
||||
|
||||
for {
|
||||
n := runtime.Stack(stacks, true)
|
||||
got := strings.Count(string(stacks[:n]), "(*Conn).relayMessages(")
|
||||
|
||||
if got == want {
|
||||
return
|
||||
}
|
||||
|
||||
if time.Now().After(deadline) {
|
||||
t.Fatalf("relay goroutines: got %d, want %d", got, want)
|
||||
}
|
||||
|
||||
time.Sleep(relayCheckStep)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkParseMessage(b *testing.B) {
|
||||
line := ":nick!user@host PRIVMSG #channel :Hello, world!"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user