github.com/jaegerpicker/docker@v0.7.7-0.20150325003727-22dba32b4dab/daemon/networkdriver/portmapper/mapper_test.go (about) 1 package portmapper 2 3 import ( 4 "net" 5 "testing" 6 7 "github.com/docker/docker/daemon/networkdriver/portallocator" 8 "github.com/docker/docker/pkg/iptables" 9 ) 10 11 func init() { 12 // override this func to mock out the proxy server 13 NewProxy = NewMockProxyCommand 14 } 15 16 func TestSetIptablesChain(t *testing.T) { 17 pm := New() 18 19 c := &iptables.Chain{ 20 Name: "TEST", 21 Bridge: "192.168.1.1", 22 } 23 24 if pm.chain != nil { 25 t.Fatal("chain should be nil at init") 26 } 27 28 pm.SetIptablesChain(c) 29 if pm.chain == nil { 30 t.Fatal("chain should not be nil after set") 31 } 32 } 33 34 func TestMapPorts(t *testing.T) { 35 pm := New() 36 dstIp1 := net.ParseIP("192.168.0.1") 37 dstIp2 := net.ParseIP("192.168.0.2") 38 dstAddr1 := &net.TCPAddr{IP: dstIp1, Port: 80} 39 dstAddr2 := &net.TCPAddr{IP: dstIp2, Port: 80} 40 41 srcAddr1 := &net.TCPAddr{Port: 1080, IP: net.ParseIP("172.16.0.1")} 42 srcAddr2 := &net.TCPAddr{Port: 1080, IP: net.ParseIP("172.16.0.2")} 43 44 addrEqual := func(addr1, addr2 net.Addr) bool { 45 return (addr1.Network() == addr2.Network()) && (addr1.String() == addr2.String()) 46 } 47 48 if host, err := pm.Map(srcAddr1, dstIp1, 80); err != nil { 49 t.Fatalf("Failed to allocate port: %s", err) 50 } else if !addrEqual(dstAddr1, host) { 51 t.Fatalf("Incorrect mapping result: expected %s:%s, got %s:%s", 52 dstAddr1.String(), dstAddr1.Network(), host.String(), host.Network()) 53 } 54 55 if _, err := pm.Map(srcAddr1, dstIp1, 80); err == nil { 56 t.Fatalf("Port is in use - mapping should have failed") 57 } 58 59 if _, err := pm.Map(srcAddr2, dstIp1, 80); err == nil { 60 t.Fatalf("Port is in use - mapping should have failed") 61 } 62 63 if _, err := pm.Map(srcAddr2, dstIp2, 80); err != nil { 64 t.Fatalf("Failed to allocate port: %s", err) 65 } 66 67 if pm.Unmap(dstAddr1) != nil { 68 t.Fatalf("Failed to release port") 69 } 70 71 if pm.Unmap(dstAddr2) != nil { 72 t.Fatalf("Failed to release port") 73 } 74 75 if pm.Unmap(dstAddr2) == nil { 76 t.Fatalf("Port already released, but no error reported") 77 } 78 } 79 80 func TestGetUDPKey(t *testing.T) { 81 addr := &net.UDPAddr{IP: net.ParseIP("192.168.1.5"), Port: 53} 82 83 key := getKey(addr) 84 85 if expected := "192.168.1.5:53/udp"; key != expected { 86 t.Fatalf("expected key %s got %s", expected, key) 87 } 88 } 89 90 func TestGetTCPKey(t *testing.T) { 91 addr := &net.TCPAddr{IP: net.ParseIP("192.168.1.5"), Port: 80} 92 93 key := getKey(addr) 94 95 if expected := "192.168.1.5:80/tcp"; key != expected { 96 t.Fatalf("expected key %s got %s", expected, key) 97 } 98 } 99 100 func TestGetUDPIPAndPort(t *testing.T) { 101 addr := &net.UDPAddr{IP: net.ParseIP("192.168.1.5"), Port: 53} 102 103 ip, port := getIPAndPort(addr) 104 if expected := "192.168.1.5"; ip.String() != expected { 105 t.Fatalf("expected ip %s got %s", expected, ip) 106 } 107 108 if ep := 53; port != ep { 109 t.Fatalf("expected port %d got %d", ep, port) 110 } 111 } 112 113 func TestMapAllPortsSingleInterface(t *testing.T) { 114 pm := New() 115 dstIp1 := net.ParseIP("0.0.0.0") 116 srcAddr1 := &net.TCPAddr{Port: 1080, IP: net.ParseIP("172.16.0.1")} 117 118 hosts := []net.Addr{} 119 var host net.Addr 120 var err error 121 122 defer func() { 123 for _, val := range hosts { 124 pm.Unmap(val) 125 } 126 }() 127 128 for i := 0; i < 10; i++ { 129 start, end := portallocator.PortRange() 130 for i := start; i < end; i++ { 131 if host, err = pm.Map(srcAddr1, dstIp1, 0); err != nil { 132 t.Fatal(err) 133 } 134 135 hosts = append(hosts, host) 136 } 137 138 if _, err := pm.Map(srcAddr1, dstIp1, start); err == nil { 139 t.Fatalf("Port %d should be bound but is not", start) 140 } 141 142 for _, val := range hosts { 143 if err := pm.Unmap(val); err != nil { 144 t.Fatal(err) 145 } 146 } 147 148 hosts = []net.Addr{} 149 } 150 }