github.com/jaegerpicker/docker@v0.7.7-0.20150325003727-22dba32b4dab/daemon/networkdriver/portallocator/portallocator_test.go (about) 1 package portallocator 2 3 import ( 4 "net" 5 "testing" 6 ) 7 8 func init() { 9 beginPortRange = DefaultPortRangeStart 10 endPortRange = DefaultPortRangeEnd 11 } 12 13 func TestRequestNewPort(t *testing.T) { 14 p := New() 15 16 port, err := p.RequestPort(defaultIP, "tcp", 0) 17 if err != nil { 18 t.Fatal(err) 19 } 20 21 if expected := beginPortRange; port != expected { 22 t.Fatalf("Expected port %d got %d", expected, port) 23 } 24 } 25 26 func TestRequestSpecificPort(t *testing.T) { 27 p := New() 28 29 port, err := p.RequestPort(defaultIP, "tcp", 5000) 30 if err != nil { 31 t.Fatal(err) 32 } 33 if port != 5000 { 34 t.Fatalf("Expected port 5000 got %d", port) 35 } 36 } 37 38 func TestReleasePort(t *testing.T) { 39 p := New() 40 41 port, err := p.RequestPort(defaultIP, "tcp", 5000) 42 if err != nil { 43 t.Fatal(err) 44 } 45 if port != 5000 { 46 t.Fatalf("Expected port 5000 got %d", port) 47 } 48 49 if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { 50 t.Fatal(err) 51 } 52 } 53 54 func TestReuseReleasedPort(t *testing.T) { 55 p := New() 56 57 port, err := p.RequestPort(defaultIP, "tcp", 5000) 58 if err != nil { 59 t.Fatal(err) 60 } 61 if port != 5000 { 62 t.Fatalf("Expected port 5000 got %d", port) 63 } 64 65 if err := p.ReleasePort(defaultIP, "tcp", 5000); err != nil { 66 t.Fatal(err) 67 } 68 69 port, err = p.RequestPort(defaultIP, "tcp", 5000) 70 if err != nil { 71 t.Fatal(err) 72 } 73 } 74 75 func TestReleaseUnreadledPort(t *testing.T) { 76 p := New() 77 78 port, err := p.RequestPort(defaultIP, "tcp", 5000) 79 if err != nil { 80 t.Fatal(err) 81 } 82 if port != 5000 { 83 t.Fatalf("Expected port 5000 got %d", port) 84 } 85 86 port, err = p.RequestPort(defaultIP, "tcp", 5000) 87 88 switch err.(type) { 89 case ErrPortAlreadyAllocated: 90 default: 91 t.Fatalf("Expected port allocation error got %s", err) 92 } 93 } 94 95 func TestUnknowProtocol(t *testing.T) { 96 if _, err := New().RequestPort(defaultIP, "tcpp", 0); err != ErrUnknownProtocol { 97 t.Fatalf("Expected error %s got %s", ErrUnknownProtocol, err) 98 } 99 } 100 101 func TestAllocateAllPorts(t *testing.T) { 102 p := New() 103 104 for i := 0; i <= endPortRange-beginPortRange; i++ { 105 port, err := p.RequestPort(defaultIP, "tcp", 0) 106 if err != nil { 107 t.Fatal(err) 108 } 109 110 if expected := beginPortRange + i; port != expected { 111 t.Fatalf("Expected port %d got %d", expected, port) 112 } 113 } 114 115 if _, err := p.RequestPort(defaultIP, "tcp", 0); err != ErrAllPortsAllocated { 116 t.Fatalf("Expected error %s got %s", ErrAllPortsAllocated, err) 117 } 118 119 _, err := p.RequestPort(defaultIP, "udp", 0) 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 // release a port in the middle and ensure we get another tcp port 125 port := beginPortRange + 5 126 if err := p.ReleasePort(defaultIP, "tcp", port); err != nil { 127 t.Fatal(err) 128 } 129 newPort, err := p.RequestPort(defaultIP, "tcp", 0) 130 if err != nil { 131 t.Fatal(err) 132 } 133 if newPort != port { 134 t.Fatalf("Expected port %d got %d", port, newPort) 135 } 136 137 // now pm.last == newPort, release it so that it's the only free port of 138 // the range, and ensure we get it back 139 if err := p.ReleasePort(defaultIP, "tcp", newPort); err != nil { 140 t.Fatal(err) 141 } 142 port, err = p.RequestPort(defaultIP, "tcp", 0) 143 if err != nil { 144 t.Fatal(err) 145 } 146 if newPort != port { 147 t.Fatalf("Expected port %d got %d", newPort, port) 148 } 149 } 150 151 func BenchmarkAllocatePorts(b *testing.B) { 152 p := New() 153 154 for i := 0; i < b.N; i++ { 155 for i := 0; i <= endPortRange-beginPortRange; i++ { 156 port, err := p.RequestPort(defaultIP, "tcp", 0) 157 if err != nil { 158 b.Fatal(err) 159 } 160 161 if expected := beginPortRange + i; port != expected { 162 b.Fatalf("Expected port %d got %d", expected, port) 163 } 164 } 165 p.ReleaseAll() 166 } 167 } 168 169 func TestPortAllocation(t *testing.T) { 170 p := New() 171 172 ip := net.ParseIP("192.168.0.1") 173 ip2 := net.ParseIP("192.168.0.2") 174 if port, err := p.RequestPort(ip, "tcp", 80); err != nil { 175 t.Fatal(err) 176 } else if port != 80 { 177 t.Fatalf("Acquire(80) should return 80, not %d", port) 178 } 179 port, err := p.RequestPort(ip, "tcp", 0) 180 if err != nil { 181 t.Fatal(err) 182 } 183 if port <= 0 { 184 t.Fatalf("Acquire(0) should return a non-zero port") 185 } 186 187 if _, err := p.RequestPort(ip, "tcp", port); err == nil { 188 t.Fatalf("Acquiring a port already in use should return an error") 189 } 190 191 if newPort, err := p.RequestPort(ip, "tcp", 0); err != nil { 192 t.Fatal(err) 193 } else if newPort == port { 194 t.Fatalf("Acquire(0) allocated the same port twice: %d", port) 195 } 196 197 if _, err := p.RequestPort(ip, "tcp", 80); err == nil { 198 t.Fatalf("Acquiring a port already in use should return an error") 199 } 200 if _, err := p.RequestPort(ip2, "tcp", 80); err != nil { 201 t.Fatalf("It should be possible to allocate the same port on a different interface") 202 } 203 if _, err := p.RequestPort(ip2, "tcp", 80); err == nil { 204 t.Fatalf("Acquiring a port already in use should return an error") 205 } 206 if err := p.ReleasePort(ip, "tcp", 80); err != nil { 207 t.Fatal(err) 208 } 209 if _, err := p.RequestPort(ip, "tcp", 80); err != nil { 210 t.Fatal(err) 211 } 212 213 port, err = p.RequestPort(ip, "tcp", 0) 214 if err != nil { 215 t.Fatal(err) 216 } 217 port2, err := p.RequestPort(ip, "tcp", port+1) 218 if err != nil { 219 t.Fatal(err) 220 } 221 port3, err := p.RequestPort(ip, "tcp", 0) 222 if err != nil { 223 t.Fatal(err) 224 } 225 if port3 == port2 { 226 t.Fatal("Requesting a dynamic port should never allocate a used port") 227 } 228 } 229 230 func TestNoDuplicateBPR(t *testing.T) { 231 p := New() 232 233 if port, err := p.RequestPort(defaultIP, "tcp", beginPortRange); err != nil { 234 t.Fatal(err) 235 } else if port != beginPortRange { 236 t.Fatalf("Expected port %d got %d", beginPortRange, port) 237 } 238 239 if port, err := p.RequestPort(defaultIP, "tcp", 0); err != nil { 240 t.Fatal(err) 241 } else if port == beginPortRange { 242 t.Fatalf("Acquire(0) allocated the same port twice: %d", port) 243 } 244 }