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