package agent import ( "testing" ) func TestPortAllocator_Allocate(t *testing.T) { pa := NewPortAllocator() port, err := pa.Allocate() if err != nil { t.Fatalf("allocate: %v", err) } if port < portRangeMin || port >= portRangeMax { t.Fatalf("port %d out of range [%d, %d)", port, portRangeMin, portRangeMax) } } func TestPortAllocator_NoDuplicates(t *testing.T) { pa := NewPortAllocator() ports := make(map[int]bool) for range 20 { port, err := pa.Allocate() if err != nil { t.Fatalf("allocate: %v", err) } if ports[port] { t.Fatalf("duplicate port allocated: %d", port) } ports[port] = true } } func TestPortAllocator_Release(t *testing.T) { pa := NewPortAllocator() port, err := pa.Allocate() if err != nil { t.Fatalf("allocate: %v", err) } pa.Release(port) // After release, the port should no longer be tracked as allocated. pa.mu.Lock() if pa.allocated[port] { t.Fatal("port should not be tracked after release") } pa.mu.Unlock() } func TestPortAllocator_PortIsFree(t *testing.T) { pa := NewPortAllocator() port, err := pa.Allocate() if err != nil { t.Fatalf("allocate: %v", err) } // The port should be free (we only track it, we don't hold the listener). if !isPortFree(port) { t.Fatalf("allocated port %d should be free on the system", port) } }