github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/portallocator/portallocator_test.go (about) 1 package portallocator 2 3 import ( 4 "net" 5 "testing" 6 ) 7 8 func resetPortAllocator() { 9 instance = NewInstance() 10 } 11 12 func TestRequestNewPort(t *testing.T) { 13 p := Get() 14 defer resetPortAllocator() 15 16 port, err := p.RequestPort(defaultIP, "tcp", 0) 17 if err != nil { 18 t.Fatal(err) 19 } 20 21 if expected := p.Begin; port != expected { 22 t.Fatalf("Expected port %d got %d", expected, port) 23 } 24 } 25 26 func TestRequestSpecificPort(t *testing.T) { 27 p := Get() 28 defer resetPortAllocator() 29 30 port, err := p.RequestPort(defaultIP, "tcp", 5000) 31 if err != nil { 32 t.Fatal(err) 33 } 34 35 if port != 5000 { 36 t.Fatalf("Expected port 5000 got %d", port) 37 } 38 } 39 40 func TestReleasePort(t *testing.T) { 41 p := Get() 42 43 port, err := p.RequestPort(defaultIP, "tcp", 5000) 44 if err != nil { 45 t.Fatal(err) 46 } 47 if port != 5000 { 48 t.Fatalf("Expected port 5000 got %d", port) 49 } 50 51 if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { 52 t.Fatal(err) 53 } 54 } 55 56 func TestReuseReleasedPort(t *testing.T) { 57 p := Get() 58 defer resetPortAllocator() 59 60 port, err := p.RequestPort(defaultIP, "tcp", 5000) 61 if err != nil { 62 t.Fatal(err) 63 } 64 if port != 5000 { 65 t.Fatalf("Expected port 5000 got %d", port) 66 } 67 68 if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { 69 t.Fatal(err) 70 } 71 72 port, err = p.RequestPort(defaultIP, "tcp", 5000) 73 if err != nil { 74 t.Fatal(err) 75 } 76 if port != 5000 { 77 t.Fatalf("Expected port 5000 got %d", port) 78 } 79 } 80 81 func TestReleaseUnreadledPort(t *testing.T) { 82 p := Get() 83 defer resetPortAllocator() 84 85 port, err := p.RequestPort(defaultIP, "tcp", 5000) 86 if err != nil { 87 t.Fatal(err) 88 } 89 if port != 5000 { 90 t.Fatalf("Expected port 5000 got %d", port) 91 } 92 93 _, err = p.RequestPort(defaultIP, "tcp", 5000) 94 95 switch err.(type) { 96 case ErrPortAlreadyAllocated: 97 default: 98 t.Fatalf("Expected port allocation error got %s", err) 99 } 100 } 101 102 func TestUnknowProtocol(t *testing.T) { 103 if _, err := Get().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { 104 t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err) 105 } 106 } 107 108 func TestAllocateAllPorts(t *testing.T) { 109 p := Get() 110 defer resetPortAllocator() 111 112 for i := 0; i <= p.End-p.Begin; i++ { 113 port, err := p.RequestPort(defaultIP, "tcp", 0) 114 if err != nil { 115 t.Fatal(err) 116 } 117 118 if expected := p.Begin + i; port != expected { 119 t.Fatalf("Expected port %d got %d", expected, port) 120 } 121 } 122 123 if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { 124 t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) 125 } 126 127 _, err := p.RequestPort(defaultIP, "udp", 0) 128 if err != nil { 129 t.Fatal(err) 130 } 131 132 // release a port in the middle and ensure we get another tcp port 133 port := p.Begin + 5 134 if err := p.ReleasePort(defaultIP, "tcp", port); err != nil { 135 t.Fatal(err) 136 } 137 newPort, err := p.RequestPort(defaultIP, "tcp", 0) 138 if err != nil { 139 t.Fatal(err) 140 } 141 if newPort != port { 142 t.Fatalf("Expected port %d got %d", port, newPort) 143 } 144 145 // now pm.last == newPort, release it so that it's the only free port of 146 // the range, and ensure we get it back 147 if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil { 148 t.Fatal(err) 149 } 150 port, err = p.RequestPort(defaultIP, "tcp", 0) 151 if err != nil { 152 t.Fatal(err) 153 } 154 if newPort != port { 155 t.Fatalf("Expected port %d got %d", newPort, port) 156 } 157 } 158 159 func BenchmarkAllocatePorts(b *testing.B) { 160 p := Get() 161 defer resetPortAllocator() 162 163 for i := 0; i < b.N; i++ { 164 for i := 0; i <= p.End-p.Begin; i++ { 165 port, err := p.RequestPort(defaultIP, "tcp", 0) 166 if err != nil { 167 b.Fatal(err) 168 } 169 170 if expected := p.Begin + i; port != expected { 171 b.Fatalf("Expected port %d got %d", expected, port) 172 } 173 } 174 if err := p.ReleaseAll(); err != nil { 175 b.Fatal(err) 176 } 177 } 178 } 179 180 func TestPortAllocation(t *testing.T) { 181 p := Get() 182 defer resetPortAllocator() 183 184 ip := net.ParseIP("192.168.0.1") 185 ip2 := net.ParseIP("192.168.0.2") 186 if port, err := p.RequestPort(ip, "tcp", 80); err != nil { 187 t.Fatal(err) 188 } else if port != 80 { 189 t.Fatalf("Acquire(80) should return 80, not %d", port) 190 } 191 port, err := p.RequestPort(ip, "tcp", 0) 192 if err != nil { 193 t.Fatal(err) 194 } 195 if port <= 0 { 196 t.Fatalf("Acquire(0) should return a non-zero port") 197 } 198 199 if _, err := p.RequestPort(ip, "tcp", port); err == nil { 200 t.Fatalf("Acquiring a port already in use should return an error") 201 } 202 203 if newPort, err := p.RequestPort(ip, "tcp", 0); err != nil { 204 t.Fatal(err) 205 } else if newPort == port { 206 t.Fatalf("Acquire(0) allocated the same port twice: %d", port) 207 } 208 209 if _, err := p.RequestPort(ip, "tcp", 80); err == nil { 210 t.Fatalf("Acquiring a port already in use should return an error") 211 } 212 if _, err := p.RequestPort(ip2, "tcp", 80); err != nil { 213 t.Fatalf("It should be possible to allocate the same port on a different interface") 214 } 215 if _, err := p.RequestPort(ip2, "tcp", 80); err == nil { 216 t.Fatalf("Acquiring a port already in use should return an error") 217 } 218 if err := p.ReleasePort(ip, "tcp", 80); err != nil { 219 t.Fatal(err) 220 } 221 if _, err := p.RequestPort(ip, "tcp", 80); err != nil { 222 t.Fatal(err) 223 } 224 225 port, err = p.RequestPort(ip, "tcp", 0) 226 if err != nil { 227 t.Fatal(err) 228 } 229 port2, err := p.RequestPort(ip, "tcp", port+1) 230 if err != nil { 231 t.Fatal(err) 232 } 233 port3, err := p.RequestPort(ip, "tcp", 0) 234 if err != nil { 235 t.Fatal(err) 236 } 237 if port3 == port2 { 238 t.Fatal("Requesting a dynamic port should never allocate a used port") 239 } 240 } 241 242 func TestPortAllocationWithCustomRange(t *testing.T) { 243 p := Get() 244 defer resetPortAllocator() 245 246 start, end := 8081, 8082 247 specificPort := 8000 248 249 // get an ephemeral port. 250 port1, err := p.RequestPortInRange(defaultIP, "tcp", 0, 0) 251 if err != nil { 252 t.Fatal(err) 253 } 254 255 // request invalid ranges 256 if _, err := p.RequestPortInRange(defaultIP, "tcp", 0, end); err == nil { 257 t.Fatalf("Expected error for invalid range %d-%d", 0, end) 258 } 259 if _, err := p.RequestPortInRange(defaultIP, "tcp", start, 0); err == nil { 260 t.Fatalf("Expected error for invalid range %d-%d", 0, end) 261 } 262 if _, err := p.RequestPortInRange(defaultIP, "tcp", 8081, 8080); err == nil { 263 t.Fatalf("Expected error for invalid range %d-%d", 0, end) 264 } 265 266 // request a single port 267 port, err := p.RequestPortInRange(defaultIP, "tcp", specificPort, specificPort) 268 if err != nil { 269 t.Fatal(err) 270 } 271 if port != specificPort { 272 t.Fatalf("Expected port %d, got %d", specificPort, port) 273 } 274 275 // get a port from the range 276 port2, err := p.RequestPortInRange(defaultIP, "tcp", start, end) 277 if err != nil { 278 t.Fatal(err) 279 } 280 if port2 < start || port2 > end { 281 t.Fatalf("Expected a port between %d and %d, got %d", start, end, port2) 282 } 283 // get another ephemeral port (should be > port1) 284 port3, err := p.RequestPortInRange(defaultIP, "tcp", 0, 0) 285 if err != nil { 286 t.Fatal(err) 287 } 288 if port3 < port1 { 289 t.Fatalf("Expected new port > %d in the ephemeral range, got %d", port1, port3) 290 } 291 // get another (and in this case the only other) port from the range 292 port4, err := p.RequestPortInRange(defaultIP, "tcp", start, end) 293 if err != nil { 294 t.Fatal(err) 295 } 296 if port4 < start || port4 > end { 297 t.Fatalf("Expected a port between %d and %d, got %d", start, end, port4) 298 } 299 if port4 == port2 { 300 t.Fatal("Allocated the same port from a custom range") 301 } 302 // request 3rd port from the range of 2 303 if _, err := p.RequestPortInRange(defaultIP, "tcp", start, end); err != ErrAllPortsAllocated { 304 t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) 305 } 306 } 307 308 func TestNoDuplicateBPR(t *testing.T) { 309 p := Get() 310 defer resetPortAllocator() 311 312 if port, err := p.RequestPort(defaultIP, "tcp", p.Begin); err != nil { 313 t.Fatal(err) 314 } else if port != p.Begin { 315 t.Fatalf("Expected port %d got %d", p.Begin, port) 316 } 317 318 if port, err := p.RequestPort(defaultIP, "tcp", 0); err != nil { 319 t.Fatal(err) 320 } else if port == p.Begin { 321 t.Fatalf("Acquire(0) allocated the same port twice: %d", port) 322 } 323 }