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 = &params.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  }