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