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