package portallocator import ( "net" "testing" ) func reset() { ReleaseAll() } func TestRequestNewPort(t *testing.T) { defer reset() port, err := RequestPort(defaultIP, "tcp", 0) if err != nil { t.Fatal(err) } if expected := BeginPortRange; port != expected { t.Fatalf("Expected port %d got %d", expected, port) } } func TestRequestSpecificPort(t *testing.T) { defer reset() port, err := RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } if port != 5000 { t.Fatalf("Expected port 5000 got %d", port) } } func TestReleasePort(t *testing.T) { defer reset() port, err := RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } if port != 5000 { t.Fatalf("Expected port 5000 got %d", port) } if err := ReleasePort(defaultIP, "tcp", 5000); err != nil { t.Fatal(err) } } func TestReuseReleasedPort(t *testing.T) { defer reset() port, err := RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } if port != 5000 { t.Fatalf("Expected port 5000 got %d", port) } if err := ReleasePort(defaultIP, "tcp", 5000); err != nil { t.Fatal(err) } port, err = RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } } func TestReleaseUnreadledPort(t *testing.T) { defer reset() port, err := RequestPort(defaultIP, "tcp", 5000) if err != nil { t.Fatal(err) } if port != 5000 { t.Fatalf("Expected port 5000 got %d", port) } port, err = RequestPort(defaultIP, "tcp", 5000) if err != ErrPortAlreadyAllocated { t.Fatalf("Expected error %s got %s", ErrPortAlreadyAllocated, err) } } func TestUnknowProtocol(t *testing.T) { defer reset() if _, err := RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err) } } func TestAllocateAllPorts(t *testing.T) { defer reset() for i := 0; i <= EndPortRange-BeginPortRange; i++ { port, err := RequestPort(defaultIP, "tcp", 0) if err != nil { t.Fatal(err) } if expected := BeginPortRange + i; port != expected { t.Fatalf("Expected port %d got %d", expected, port) } } if _, err := RequestPort(defaultIP, "tcp", 0); err != ErrPortExceedsRange { t.Fatalf("Expected error %s got %s", ErrPortExceedsRange, err) } _, err := RequestPort(defaultIP, "udp", 0) if err != nil { t.Fatal(err) } } func BenchmarkAllocatePorts(b *testing.B) { defer reset() for i := 0; i < b.N; i++ { for i := 0; i <= EndPortRange-BeginPortRange; i++ { port, err := RequestPort(defaultIP, "tcp", 0) if err != nil { b.Fatal(err) } if expected := BeginPortRange + i; port != expected { b.Fatalf("Expected port %d got %d", expected, port) } } reset() } } func TestPortAllocation(t *testing.T) { defer reset() ip := net.ParseIP("192.168.0.1") ip2 := net.ParseIP("192.168.0.2") if port, err := RequestPort(ip, "tcp", 80); err != nil { t.Fatal(err) } else if port != 80 { t.Fatalf("Acquire(80) should return 80, not %d", port) } port, err := RequestPort(ip, "tcp", 0) if err != nil { t.Fatal(err) } if port <= 0 { t.Fatalf("Acquire(0) should return a non-zero port") } if _, err := RequestPort(ip, "tcp", port); err == nil { t.Fatalf("Acquiring a port already in use should return an error") } if newPort, err := RequestPort(ip, "tcp", 0); err != nil { t.Fatal(err) } else if newPort == port { t.Fatalf("Acquire(0) allocated the same port twice: %d", port) } if _, err := RequestPort(ip, "tcp", 80); err == nil { t.Fatalf("Acquiring a port already in use should return an error") } if _, err := RequestPort(ip2, "tcp", 80); err != nil { t.Fatalf("It should be possible to allocate the same port on a different interface") } if _, err := RequestPort(ip2, "tcp", 80); err == nil { t.Fatalf("Acquiring a port already in use should return an error") } if err := ReleasePort(ip, "tcp", 80); err != nil { t.Fatal(err) } if _, err := RequestPort(ip, "tcp", 80); err != nil { t.Fatal(err) } }