github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/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 } 79 80 func TestReleaseUnreadledPort(t *testing.T) { 81 p := Get() 82 defer resetPortAllocator() 83 84 port, err := p.RequestPort(defaultIP, "tcp", 5000) 85 if err != nil { 86 t.Fatal(err) 87 } 88 if port != 5000 { 89 t.Fatalf("Expected port 5000 got %d", port) 90 } 91 92 port, err = p.RequestPort(defaultIP, "tcp", 5000) 93 94 switch err.(type) { 95 case ErrPortAlreadyAllocated: 96 default: 97 t.Fatalf("Expected port allocation error got %s", err) 98 } 99 } 100 101 func TestUnknowProtocol(t *testing.T) { 102 if _, err := Get().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { 103 t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err) 104 } 105 } 106 107 func TestAllocateAllPorts(t *testing.T) { 108 p := Get() 109 defer resetPortAllocator() 110 111 for i := 0; i <= p.End-p.Begin; i++ { 112 port, err := p.RequestPort(defaultIP, "tcp", 0) 113 if err != nil { 114 t.Fatal(err) 115 } 116 117 if expected := p.Begin + i; port != expected { 118 t.Fatalf("Expected port %d got %d", expected, port) 119 } 120 } 121 122 if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { 123 t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) 124 } 125 126 _, err := p.RequestPort(defaultIP, "udp", 0) 127 if err != nil { 128 t.Fatal(err) 129 } 130 131 // release a port in the middle and ensure we get another tcp port 132 port := p.Begin + 5 133 if err := p.ReleasePort(defaultIP, "tcp", port); err != nil { 134 t.Fatal(err) 135 } 136 newPort, err := p.RequestPort(defaultIP, "tcp", 0) 137 if err != nil { 138 t.Fatal(err) 139 } 140 if newPort != port { 141 t.Fatalf("Expected port %d got %d", port, newPort) 142 } 143 144 // now pm.last == newPort, release it so that it's the only free port of 145 // the range, and ensure we get it back 146 if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil { 147 t.Fatal(err) 148 } 149 port, err = p.RequestPort(defaultIP, "tcp", 0) 150 if err != nil { 151 t.Fatal(err) 152 } 153 if newPort != port { 154 t.Fatalf("Expected port %d got %d", newPort, port) 155 } 156 } 157 158 func BenchmarkAllocatePorts(b *testing.B) { 159 p := Get() 160 defer resetPortAllocator() 161 162 for i := 0; i < b.N; i++ { 163 for i := 0; i <= p.End-p.Begin; i++ { 164 port, err := p.RequestPort(defaultIP, "tcp", 0) 165 if err != nil { 166 b.Fatal(err) 167 } 168 169 if expected := p.Begin + i; port != expected { 170 b.Fatalf("Expected port %d got %d", expected, port) 171 } 172 } 173 p.ReleaseAll() 174 } 175 } 176 177 func TestPortAllocation(t *testing.T) { 178 p := Get() 179 defer resetPortAllocator() 180 181 ip := net.ParseIP("192.168.0.1") 182 ip2 := net.ParseIP("192.168.0.2") 183 if port, err := p.RequestPort(ip, "tcp", 80); err != nil { 184 t.Fatal(err) 185 } else if port != 80 { 186 t.Fatalf("Acquire(80) should return 80, not %d", port) 187 } 188 port, err := p.RequestPort(ip, "tcp", 0) 189 if err != nil { 190 t.Fatal(err) 191 } 192 if port <= 0 { 193 t.Fatalf("Acquire(0) should return a non-zero port") 194 } 195 196 if _, err := p.RequestPort(ip, "tcp", port); err == nil { 197 t.Fatalf("Acquiring a port already in use should return an error") 198 } 199 200 if newPort, err := p.RequestPort(ip, "tcp", 0); err != nil { 201 t.Fatal(err) 202 } else if newPort == port { 203 t.Fatalf("Acquire(0) allocated the same port twice: %d", port) 204 } 205 206 if _, err := p.RequestPort(ip, "tcp", 80); err == nil { 207 t.Fatalf("Acquiring a port already in use should return an error") 208 } 209 if _, err := p.RequestPort(ip2, "tcp", 80); err != nil { 210 t.Fatalf("It should be possible to allocate the same port on a different interface") 211 } 212 if _, err := p.RequestPort(ip2, "tcp", 80); err == nil { 213 t.Fatalf("Acquiring a port already in use should return an error") 214 } 215 if err := p.ReleasePort(ip, "tcp", 80); err != nil { 216 t.Fatal(err) 217 } 218 if _, err := p.RequestPort(ip, "tcp", 80); err != nil { 219 t.Fatal(err) 220 } 221 222 port, err = p.RequestPort(ip, "tcp", 0) 223 if err != nil { 224 t.Fatal(err) 225 } 226 port2, err := p.RequestPort(ip, "tcp", port+1) 227 if err != nil { 228 t.Fatal(err) 229 } 230 port3, err := p.RequestPort(ip, "tcp", 0) 231 if err != nil { 232 t.Fatal(err) 233 } 234 if port3 == port2 { 235 t.Fatal("Requesting a dynamic port should never allocate a used port") 236 } 237 } 238 239 func TestPortAllocationWithCustomRange(t *testing.T) { 240 p := Get() 241 defer resetPortAllocator() 242 243 start, end := 8081, 8082 244 specificPort := 8000 245 246 //get an ephemeral port. 247 port1, err := p.RequestPortInRange(defaultIP, "tcp", 0, 0) 248 if err != nil { 249 t.Fatal(err) 250 } 251 252 //request invalid ranges 253 if _, err := p.RequestPortInRange(defaultIP, "tcp", 0, end); err == nil { 254 t.Fatalf("Expected error for invalid range %d-%d", 0, end) 255 } 256 if _, err := p.RequestPortInRange(defaultIP, "tcp", start, 0); err == nil { 257 t.Fatalf("Expected error for invalid range %d-%d", 0, end) 258 } 259 if _, err := p.RequestPortInRange(defaultIP, "tcp", 8081, 8080); err == nil { 260 t.Fatalf("Expected error for invalid range %d-%d", 0, end) 261 } 262 263 //request a single port 264 port, err := p.RequestPortInRange(defaultIP, "tcp", specificPort, specificPort) 265 if err != nil { 266 t.Fatal(err) 267 } 268 if port != specificPort { 269 t.Fatalf("Expected port %d, got %d", specificPort, port) 270 } 271 272 //get a port from the range 273 port2, err := p.RequestPortInRange(defaultIP, "tcp", start, end) 274 if err != nil { 275 t.Fatal(err) 276 } 277 if port2 < start || port2 > end { 278 t.Fatalf("Expected a port between %d and %d, got %d", start, end, port2) 279 } 280 //get another ephemeral port (should be > port1) 281 port3, err := p.RequestPortInRange(defaultIP, "tcp", 0, 0) 282 if err != nil { 283 t.Fatal(err) 284 } 285 if port3 < port1 { 286 t.Fatalf("Expected new port > %d in the ephemeral range, got %d", port1, port3) 287 } 288 //get another (and in this case the only other) port from the range 289 port4, err := p.RequestPortInRange(defaultIP, "tcp", start, end) 290 if err != nil { 291 t.Fatal(err) 292 } 293 if port4 < start || port4 > end { 294 t.Fatalf("Expected a port between %d and %d, got %d", start, end, port4) 295 } 296 if port4 == port2 { 297 t.Fatal("Allocated the same port from a custom range") 298 } 299 //request 3rd port from the range of 2 300 if _, err := p.RequestPortInRange(defaultIP, "tcp", start, end); err != ErrAllPortsAllocated { 301 t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) 302 } 303 } 304 305 func TestNoDuplicateBPR(t *testing.T) { 306 p := Get() 307 defer resetPortAllocator() 308 309 if port, err := p.RequestPort(defaultIP, "tcp", p.Begin); err != nil { 310 t.Fatal(err) 311 } else if port != p.Begin { 312 t.Fatalf("Expected port %d got %d", p.Begin, port) 313 } 314 315 if port, err := p.RequestPort(defaultIP, "tcp", 0); err != nil { 316 t.Fatal(err) 317 } else if port == p.Begin { 318 t.Fatalf("Acquire(0) allocated the same port twice: %d", port) 319 } 320 }