github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/params/network_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package params_test 5 6 import ( 7 "encoding/json" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/network" 14 ) 15 16 type ( 17 P struct { 18 prot string 19 num int 20 } 21 IS []interface{} 22 M map[string]interface{} 23 ) 24 25 type NetworkSuite struct{} 26 27 var _ = gc.Suite(&NetworkSuite{}) 28 29 func (s *NetworkSuite) TestPortsResults(c *gc.C) { 30 // Convenience helpers. 31 mkPortsResults := func(prs ...params.PortsResult) params.PortsResults { 32 return params.PortsResults{ 33 Results: prs, 34 } 35 } 36 mkPortsResult := func(msg, code string, ports ...P) params.PortsResult { 37 pr := params.PortsResult{} 38 if msg != "" { 39 pr.Error = ¶ms.Error{Message: msg, Code: code} 40 } 41 for _, p := range ports { 42 pr.Ports = append(pr.Ports, params.Port{p.prot, p.num}) 43 } 44 return pr 45 } 46 mkResults := func(rs ...interface{}) M { 47 return M{"results": rs} 48 } 49 mkResult := func(err, ports interface{}) M { 50 result := M{"ports": ports} 51 if err != nil { 52 result["error"] = err 53 } 54 return result 55 } 56 mkError := func(msg, code string) M { 57 return M{"message": msg, "code": code} 58 } 59 mkPort := func(prot string, num int) M { 60 return M{"protocol": prot, "number": num} 61 } 62 // Tests. 63 tests := []struct { 64 about string 65 results params.PortsResults 66 expected M 67 }{{ 68 about: "empty result set", 69 results: mkPortsResults(), 70 expected: mkResults(), 71 }, { 72 about: "one error", 73 results: mkPortsResults( 74 mkPortsResult("I failed", "ERR42")), 75 expected: mkResults( 76 mkResult(mkError("I failed", "ERR42"), nil)), 77 }, { 78 about: "one succes with one port", 79 results: mkPortsResults( 80 mkPortsResult("", "", P{"tcp", 80})), 81 expected: mkResults( 82 mkResult(nil, IS{mkPort("tcp", 80)})), 83 }, { 84 about: "two results, one error and one success with two ports", 85 results: mkPortsResults( 86 mkPortsResult("I failed", "ERR42"), 87 mkPortsResult("", "", P{"tcp", 80}, P{"tcp", 443})), 88 expected: mkResults( 89 mkResult(mkError("I failed", "ERR42"), nil), 90 mkResult(nil, IS{mkPort("tcp", 80), mkPort("tcp", 443)})), 91 }} 92 for i, test := range tests { 93 c.Logf("\ntest %d: %s", i, test.about) 94 output, err := json.Marshal(test.results) 95 if !c.Check(err, jc.ErrorIsNil) { 96 continue 97 } 98 c.Logf("\nJSON output:\n%v", string(output)) 99 c.Check(string(output), jc.JSONEquals, test.expected) 100 } 101 } 102 103 func (s *NetworkSuite) TestHostPort(c *gc.C) { 104 mkHostPort := func(v, t, s string, p int) M { 105 return M{ 106 "value": v, 107 "type": t, 108 "scope": s, 109 "port": p, 110 } 111 } 112 tests := []struct { 113 about string 114 hostPort params.HostPort 115 expected M 116 }{{ 117 about: "address only value; port is 1234", 118 hostPort: params.HostPort{ 119 Address: params.Address{ 120 Value: "foo", 121 }, 122 Port: 1234, 123 }, 124 expected: mkHostPort("foo", "", "", 1234), 125 }, { 126 about: "address value and type; port is 1234", 127 hostPort: params.HostPort{ 128 Address: params.Address{ 129 Value: "foo", 130 Type: "ipv4", 131 }, 132 Port: 1234, 133 }, 134 expected: mkHostPort("foo", "ipv4", "", 1234), 135 }, { 136 about: "address value, type, and network name, port is 1234", 137 hostPort: params.HostPort{ 138 Address: params.Address{ 139 Value: "foo", 140 Type: "ipv4", 141 }, 142 Port: 1234, 143 }, 144 expected: mkHostPort("foo", "ipv4", "", 1234), 145 }, { 146 about: "address all fields, port is 1234", 147 hostPort: params.HostPort{ 148 Address: params.Address{ 149 Value: "foo", 150 Type: "ipv4", 151 Scope: "public", 152 }, 153 Port: 1234, 154 }, 155 expected: mkHostPort("foo", "ipv4", "public", 1234), 156 }, { 157 about: "address all fields, port is 0", 158 hostPort: params.HostPort{ 159 Address: params.Address{ 160 Value: "foo", 161 Type: "ipv4", 162 Scope: "public", 163 }, 164 Port: 0, 165 }, 166 expected: mkHostPort("foo", "ipv4", "public", 0), 167 }} 168 for i, test := range tests { 169 c.Logf("\ntest %d: %s", i, test.about) 170 output, err := json.Marshal(test.hostPort) 171 if !c.Check(err, jc.ErrorIsNil) { 172 continue 173 } 174 c.Logf("\nJSON output:\n%v", string(output)) 175 c.Check(string(output), jc.JSONEquals, test.expected) 176 } 177 } 178 179 func (s *NetworkSuite) TestMachinePortRange(c *gc.C) { 180 mkPortRange := func(u, r string, f, t int, p string) M { 181 return M{ 182 "unit-tag": u, 183 "relation-tag": r, 184 "port-range": M{ 185 "from-port": f, 186 "to-port": t, 187 "protocol": p, 188 }, 189 } 190 } 191 tests := []struct { 192 about string 193 machinePortRange params.MachinePortRange 194 expected M 195 }{{ 196 about: "all values", 197 machinePortRange: params.MachinePortRange{ 198 UnitTag: "foo/0", 199 RelationTag: "foo.db#bar.server", 200 PortRange: params.PortRange{ 201 FromPort: 100, 202 ToPort: 200, 203 Protocol: "tcp", 204 }, 205 }, 206 expected: mkPortRange("foo/0", "foo.db#bar.server", 100, 200, "tcp"), 207 }, { 208 about: "only port range, missing from", 209 machinePortRange: params.MachinePortRange{ 210 PortRange: params.PortRange{ 211 ToPort: 200, 212 Protocol: "tcp", 213 }, 214 }, 215 expected: mkPortRange("", "", 0, 200, "tcp"), 216 }, { 217 about: "only port range, missing to", 218 machinePortRange: params.MachinePortRange{ 219 PortRange: params.PortRange{ 220 FromPort: 100, 221 Protocol: "tcp", 222 }, 223 }, 224 expected: mkPortRange("", "", 100, 0, "tcp"), 225 }, { 226 about: "only port range, missing protocol", 227 machinePortRange: params.MachinePortRange{ 228 PortRange: params.PortRange{ 229 FromPort: 100, 230 ToPort: 200, 231 }, 232 }, 233 expected: mkPortRange("", "", 100, 200, ""), 234 }, { 235 about: "no field values", 236 machinePortRange: params.MachinePortRange{}, 237 expected: mkPortRange("", "", 0, 0, ""), 238 }} 239 for i, test := range tests { 240 c.Logf("\ntest %d: %s", i, test.about) 241 output, err := json.Marshal(test.machinePortRange) 242 if !c.Check(err, jc.ErrorIsNil) { 243 continue 244 } 245 c.Logf("\nJSON output:\n%v", string(output)) 246 c.Check(string(output), jc.JSONEquals, test.expected) 247 } 248 } 249 250 func (s *NetworkSuite) TestPortConvenience(c *gc.C) { 251 networkPort := network.Port{ 252 Protocol: "udp", 253 Number: 55555, 254 } 255 paramsPort := params.FromNetworkPort(networkPort) 256 c.Assert(networkPort, jc.DeepEquals, paramsPort.NetworkPort()) 257 } 258 259 func (s *NetworkSuite) TestPortRangeConvenience(c *gc.C) { 260 networkPortRange := network.PortRange{ 261 FromPort: 61001, 262 ToPort: 61010, 263 Protocol: "tcp", 264 } 265 paramsPortRange := params.FromNetworkPortRange(networkPortRange) 266 networkPortRangeBack := paramsPortRange.NetworkPortRange() 267 c.Assert(networkPortRange, jc.DeepEquals, networkPortRangeBack) 268 } 269 270 func (s *NetworkSuite) TestAddressConvenience(c *gc.C) { 271 networkAddress := network.Address{ 272 Value: "foo", 273 Type: network.IPv4Address, 274 Scope: network.ScopePublic, 275 } 276 paramsAddress := params.FromNetworkAddress(networkAddress) 277 c.Assert(networkAddress, jc.DeepEquals, paramsAddress.NetworkAddress()) 278 } 279 280 func (s *NetworkSuite) TestHostPortConvenience(c *gc.C) { 281 networkAddress := network.Address{ 282 Value: "foo", 283 Type: network.IPv4Address, 284 Scope: network.ScopePublic, 285 } 286 networkHostPort := network.HostPort{ 287 Address: networkAddress, 288 Port: 4711, 289 } 290 paramsHostPort := params.FromNetworkHostPort(networkHostPort) 291 c.Assert(networkHostPort, jc.DeepEquals, paramsHostPort.NetworkHostPort()) 292 }