Commit 01ae5cf9a0

01ae5cf9a0397d2ec7fdddf1af27d67982494e81

parent: ceafd97e30

Verified · cmc ci/build: success ci/test: success

cmc <hello@cleberg.net> · 2026-09-29 02:12 UTC

e2e: hand out ports below the ephemeral range

A test's gitbayd failed to bind a port an outgoing connection had taken (32864, inside bay1's 32768-60999). Ref #300

Layout: unified · split

e2e/ssh_test.go +9 −5
@@ -29,12 +29,16 @@ type instance struct {
29 stderr *tailBuffer // the end of the first serve's stderr 29 stderr *tailBuffer // the end of the first serve's stderr
30} 30}
31 31
32// nextPort hands out candidate ports. Seeded randomly so two test processes 32// nextPort hands out candidate ports below 32768, where Linux and macOS
33// on one machine — `go test ./...` runs packages concurrently — start in 33// start the ports they give outgoing connections: a git or SMTP client in
34// different places. 34// another test cannot take one between the bind test and gitbayd's bind.
35// Seeded randomly so two test processes on one machine — `go test ./...`
36// runs packages concurrently — start in different places.
37const lastPort = 32000
38
35var nextPort = func() *atomic.Int32 { 39var nextPort = func() *atomic.Int32 {
36 var n atomic.Int32 40 var n atomic.Int32
37 n.Store(int32(20000 + rand.IntN(20000))) 41 n.Store(int32(10000 + rand.IntN(10000)))
38 return &n 42 return &n
39}() 43}()
40 44
@@ -58,7 +62,7 @@ func freePorts(t *testing.T, n int) []int {
58 ports := make([]int, 0, n) 62 ports := make([]int, 0, n)
59 for len(ports) < n { 63 for len(ports) < n {
60 p := int(nextPort.Add(1)) 64 p := int(nextPort.Add(1))
61 if p > 60000 { 65 if p > lastPort {
62 t.Fatal("ran out of ports") 66 t.Fatal("ran out of ports")
63 } 67 }
64 ln, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", p)) 68 ln, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", p))