github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/portallocator/portallocator_test.go (about) 1 package portallocator 2 3 import ( 4 "net" 5 "testing" 6 7 _ "github.com/docker/libnetwork/testutils" 8 ) 9 10 func resetPortAllocator() { 11 instance = newInstance() 12 } 13 14 func TestRequestNewPort(t *testing.T) { 15 p := Get() 16 defer resetPortAllocator() 17 18 port, err := p.RequestPort(defaultIP, "tcp", 0) 19 if err != nil { 20 t.Fatal(err) 21 } 22 23 if expected := p.Begin; port != expected { 24 t.Fatalf("Expected port %d got %d", expected, port) 25 } 26 } 27 28 func TestRequestSpecificPort(t *testing.T) { 29 p := Get() 30 defer resetPortAllocator() 31 32 port, err := p.RequestPort(defaultIP, "tcp", 5000) 33 if err != nil { 34 t.Fatal(err) 35 } 36 37 if port != 5000 { 38 t.Fatalf("Expected port 5000 got %d", port) 39 } 40 } 41 42 func TestReleasePort(t *testing.T) { 43 p := Get() 44 45 port, err := p.RequestPort(defaultIP, "tcp", 5000) 46 if err != nil { 47 t.Fatal(err) 48 } 49 if port != 5000 { 50 t.Fatalf("Expected port 5000 got %d", port) 51 } 52 53 if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { 54 t.Fatal(err) 55 } 56 } 57 58 func TestReuseReleasedPort(t *testing.T) { 59 p := Get() 60 defer resetPortAllocator() 61 62 port, err := p.RequestPort(defaultIP, "tcp", 5000) 63 if err != nil { 64 t.Fatal(err) 65 } 66 if port != 5000 { 67 t.Fatalf("Expected port 5000 got %d", port) 68 } 69 70 if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { 71 t.Fatal(err) 72 } 73 74 port, err = p.RequestPort(defaultIP, "tcp", 5000) 75 if err != nil { 76 t.Fatal(err) 77 } 78 if port != 5000 { 79 t.Fatalf("Expected port 5000 got %d", port) 80 } 81 } 82 83 func TestReleaseUnreadledPort(t *testing.T) { 84 p := Get() 85 defer resetPortAllocator() 86 87 port, err := p.RequestPort(defaultIP, "tcp", 5000) 88 if err != nil { 89 t.Fatal(err) 90 } 91 if port != 5000 { 92 t.Fatalf("Expected port 5000 got %d", port) 93 } 94 95 _, err = p.RequestPort(defaultIP, "tcp", 5000) 96 97 switch err.(type) { 98 case ErrPortAlreadyAllocated: 99 default: 100 t.Fatalf("Expected port allocation error got %s", err) 101 } 102 } 103 104 func TestUnknowProtocol(t *testing.T) { 105 if _, err := Get().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { 106 t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err) 107 } 108 } 109 110 func TestAllocateAllPorts(t *testing.T) { 111 p := Get() 112 defer resetPortAllocator() 113 114 for i := 0; i <= p.End-p.Begin; i++ { 115 port, err := p.RequestPort(defaultIP, "tcp", 0) 116 if err != nil { 117 t.Fatal(err) 118 } 119 120 if expected := p.Begin + i; port != expected { 121 t.Fatalf("Expected port %d got %d", expected, port) 122 } 123 } 124 125 if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { 126 t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) 127 } 128 129 _, err := p.RequestPort(defaultIP, "udp", 0) 130 if err != nil { 131 t.Fatal(err) 132 } 133 134 // release a port in the middle and ensure we get another tcp port 135 port := p.Begin + 5 136 if err := p.ReleasePort(defaultIP, "tcp", port); err != nil { 137 t.Fatal(err) 138 } 139 newPort, err := p.RequestPort(defaultIP, "tcp", 0) 140 if err != nil { 141 t.Fatal(err) 142 } 143 if newPort != port { 144 t.Fatalf("Expected port %d got %d", port, newPort) 145 } 146 147 // now pm.last == newPort, release it so that it's the only free port of 148 // the range, and ensure we get it back 149 if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil { 150 t.Fatal(err) 151 } 152 port, err = p.RequestPort(defaultIP, "tcp", 0) 153 if err != nil { 154 t.Fatal(err) 155 } 156 if newPort != port { 157 t.Fatalf("Expected port %d got %d", newPort, port) 158 } 159 } 160 161 func BenchmarkAllocatePorts(b *testing.B) { 162 p := Get() 163 defer resetPortAllocator() 164 165 for i := 0; i < b.N; i++ { 166 for i := 0; i <= p.End-p.Begin; i++ { 167 port, err := p.RequestPort(defaultIP, "tcp", 0) 168 if err != nil { 169 b.Fatal(err) 170 } 171 172 if expected := p.Begin + i; port != expected { 173 b.Fatalf("Expected port %d got %d", expected, port) 174 } 175 } 176 p.ReleaseAll() 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 }