github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 return M{"Error": err, "Ports": ports} 51 } 52 mkError := func(msg, code string) M { 53 return M{"Message": msg, "Code": code} 54 } 55 mkPort := func(prot string, num int) M { 56 return M{"Protocol": prot, "Number": num} 57 } 58 // Tests. 59 tests := []struct { 60 about string 61 results params.PortsResults 62 expected M 63 }{{ 64 about: "empty result set", 65 results: mkPortsResults(), 66 expected: mkResults(), 67 }, { 68 about: "one error", 69 results: mkPortsResults( 70 mkPortsResult("I failed", "ERR42")), 71 expected: mkResults( 72 mkResult(mkError("I failed", "ERR42"), nil)), 73 }, { 74 about: "one succes with one port", 75 results: mkPortsResults( 76 mkPortsResult("", "", P{"tcp", 80})), 77 expected: mkResults( 78 mkResult(nil, IS{mkPort("tcp", 80)})), 79 }, { 80 about: "two results, one error and one success with two ports", 81 results: mkPortsResults( 82 mkPortsResult("I failed", "ERR42"), 83 mkPortsResult("", "", P{"tcp", 80}, P{"tcp", 443})), 84 expected: mkResults( 85 mkResult(mkError("I failed", "ERR42"), nil), 86 mkResult(nil, IS{mkPort("tcp", 80), mkPort("tcp", 443)})), 87 }} 88 for i, test := range tests { 89 c.Logf("\ntest %d: %s", i, test.about) 90 output, err := json.Marshal(test.results) 91 if !c.Check(err, jc.ErrorIsNil) { 92 continue 93 } 94 c.Logf("\nJSON output:\n%v", string(output)) 95 c.Check(string(output), jc.JSONEquals, test.expected) 96 } 97 } 98 99 func (s *NetworkSuite) TestHostPort(c *gc.C) { 100 mkHostPort := func(v, t, s string, p int) M { 101 return M{ 102 "Value": v, 103 "Type": t, 104 "Scope": s, 105 "Port": p, 106 } 107 } 108 tests := []struct { 109 about string 110 hostPort params.HostPort 111 expected M 112 }{{ 113 about: "address only value; port is 1234", 114 hostPort: params.HostPort{ 115 Address: params.Address{ 116 Value: "foo", 117 }, 118 Port: 1234, 119 }, 120 expected: mkHostPort("foo", "", "", 1234), 121 }, { 122 about: "address value and type; port is 1234", 123 hostPort: params.HostPort{ 124 Address: params.Address{ 125 Value: "foo", 126 Type: "ipv4", 127 }, 128 Port: 1234, 129 }, 130 expected: mkHostPort("foo", "ipv4", "", 1234), 131 }, { 132 about: "address value, type, and network name, port is 1234", 133 hostPort: params.HostPort{ 134 Address: params.Address{ 135 Value: "foo", 136 Type: "ipv4", 137 }, 138 Port: 1234, 139 }, 140 expected: mkHostPort("foo", "ipv4", "", 1234), 141 }, { 142 about: "address all fields, port is 1234", 143 hostPort: params.HostPort{ 144 Address: params.Address{ 145 Value: "foo", 146 Type: "ipv4", 147 Scope: "public", 148 }, 149 Port: 1234, 150 }, 151 expected: mkHostPort("foo", "ipv4", "public", 1234), 152 }, { 153 about: "address all fields, port is 0", 154 hostPort: params.HostPort{ 155 Address: params.Address{ 156 Value: "foo", 157 Type: "ipv4", 158 Scope: "public", 159 }, 160 Port: 0, 161 }, 162 expected: mkHostPort("foo", "ipv4", "public", 0), 163 }} 164 for i, test := range tests { 165 c.Logf("\ntest %d: %s", i, test.about) 166 output, err := json.Marshal(test.hostPort) 167 if !c.Check(err, jc.ErrorIsNil) { 168 continue 169 } 170 c.Logf("\nJSON output:\n%v", string(output)) 171 c.Check(string(output), jc.JSONEquals, test.expected) 172 } 173 } 174 175 func (s *NetworkSuite) TestMachinePortRange(c *gc.C) { 176 mkPortRange := func(u, r string, f, t int, p string) M { 177 return M{ 178 "UnitTag": u, 179 "RelationTag": r, 180 "PortRange": M{ 181 "FromPort": f, 182 "ToPort": t, 183 "Protocol": p, 184 }, 185 } 186 } 187 tests := []struct { 188 about string 189 machinePortRange params.MachinePortRange 190 expected M 191 }{{ 192 about: "all values", 193 machinePortRange: params.MachinePortRange{ 194 UnitTag: "foo/0", 195 RelationTag: "foo.db#bar.server", 196 PortRange: params.PortRange{ 197 FromPort: 100, 198 ToPort: 200, 199 Protocol: "tcp", 200 }, 201 }, 202 expected: mkPortRange("foo/0", "foo.db#bar.server", 100, 200, "tcp"), 203 }, { 204 about: "only port range, missing from", 205 machinePortRange: params.MachinePortRange{ 206 PortRange: params.PortRange{ 207 ToPort: 200, 208 Protocol: "tcp", 209 }, 210 }, 211 expected: mkPortRange("", "", 0, 200, "tcp"), 212 }, { 213 about: "only port range, missing to", 214 machinePortRange: params.MachinePortRange{ 215 PortRange: params.PortRange{ 216 FromPort: 100, 217 Protocol: "tcp", 218 }, 219 }, 220 expected: mkPortRange("", "", 100, 0, "tcp"), 221 }, { 222 about: "only port range, missing protocol", 223 machinePortRange: params.MachinePortRange{ 224 PortRange: params.PortRange{ 225 FromPort: 100, 226 ToPort: 200, 227 }, 228 }, 229 expected: mkPortRange("", "", 100, 200, ""), 230 }, { 231 about: "no field values", 232 machinePortRange: params.MachinePortRange{}, 233 expected: mkPortRange("", "", 0, 0, ""), 234 }} 235 for i, test := range tests { 236 c.Logf("\ntest %d: %s", i, test.about) 237 output, err := json.Marshal(test.machinePortRange) 238 if !c.Check(err, jc.ErrorIsNil) { 239 continue 240 } 241 c.Logf("\nJSON output:\n%v", string(output)) 242 c.Check(string(output), jc.JSONEquals, test.expected) 243 } 244 } 245 246 func (s *NetworkSuite) TestPortConvenience(c *gc.C) { 247 networkPort := network.Port{ 248 Protocol: "udp", 249 Number: 55555, 250 } 251 paramsPort := params.FromNetworkPort(networkPort) 252 c.Assert(networkPort, jc.DeepEquals, paramsPort.NetworkPort()) 253 } 254 255 func (s *NetworkSuite) TestPortRangeConvenience(c *gc.C) { 256 networkPortRange := network.PortRange{ 257 FromPort: 61001, 258 ToPort: 61010, 259 Protocol: "tcp", 260 } 261 paramsPortRange := params.FromNetworkPortRange(networkPortRange) 262 networkPortRangeBack := paramsPortRange.NetworkPortRange() 263 c.Assert(networkPortRange, jc.DeepEquals, networkPortRangeBack) 264 } 265 266 func (s *NetworkSuite) TestAddressConvenience(c *gc.C) { 267 networkAddress := network.Address{ 268 Value: "foo", 269 Type: network.IPv4Address, 270 Scope: network.ScopePublic, 271 } 272 paramsAddress := params.FromNetworkAddress(networkAddress) 273 c.Assert(networkAddress, jc.DeepEquals, paramsAddress.NetworkAddress()) 274 } 275 276 func (s *NetworkSuite) TestHostPortConvenience(c *gc.C) { 277 networkAddress := network.Address{ 278 Value: "foo", 279 Type: network.IPv4Address, 280 Scope: network.ScopePublic, 281 } 282 networkHostPort := network.HostPort{ 283 Address: networkAddress, 284 Port: 4711, 285 } 286 paramsHostPort := params.FromNetworkHostPort(networkHostPort) 287 c.Assert(networkHostPort, jc.DeepEquals, paramsHostPort.NetworkHostPort()) 288 }