github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/peergrouper/publish_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package peergrouper
     5  
     6  import (
     7  	gc "gopkg.in/check.v1"
     8  
     9  	"github.com/juju/juju/network"
    10  	"github.com/juju/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  )
    13  
    14  type publishSuite struct {
    15  	testing.BaseSuite
    16  }
    17  
    18  var _ = gc.Suite(&publishSuite{})
    19  
    20  type mockAPIHostPortsSetter struct {
    21  	calls        int
    22  	apiHostPorts [][]network.HostPort
    23  }
    24  
    25  func (s *mockAPIHostPortsSetter) SetAPIHostPorts(apiHostPorts [][]network.HostPort) error {
    26  	s.calls++
    27  	s.apiHostPorts = apiHostPorts
    28  	return nil
    29  }
    30  
    31  func (s *publishSuite) TestPublisherSetsAPIHostPortsOnce(c *gc.C) {
    32  	var mock mockAPIHostPortsSetter
    33  	statePublish := &CachingAPIHostPortsSetter{APIHostPortsSetter: &mock}
    34  
    35  	hostPorts1 := network.NewHostPorts(1234, "testing1.invalid", "127.0.0.1")
    36  	hostPorts2 := network.NewHostPorts(1234, "testing2.invalid", "127.0.0.2")
    37  
    38  	// statePublish.SetAPIHostPorts should not update state a second time.
    39  	apiServers := [][]network.HostPort{hostPorts1}
    40  	for i := 0; i < 2; i++ {
    41  		err := statePublish.SetAPIHostPorts(apiServers)
    42  		c.Assert(err, jc.ErrorIsNil)
    43  	}
    44  
    45  	c.Assert(mock.calls, gc.Equals, 1)
    46  	c.Assert(mock.apiHostPorts, gc.DeepEquals, apiServers)
    47  
    48  	apiServers = append(apiServers, hostPorts2)
    49  	for i := 0; i < 2; i++ {
    50  		err := statePublish.SetAPIHostPorts(apiServers)
    51  		c.Assert(err, jc.ErrorIsNil)
    52  	}
    53  	c.Assert(mock.calls, gc.Equals, 2)
    54  	c.Assert(mock.apiHostPorts, gc.DeepEquals, apiServers)
    55  }
    56  
    57  func (s *publishSuite) TestPublisherSortsHostPorts(c *gc.C) {
    58  	ipV4First := network.NewHostPorts(1234, "testing1.invalid", "127.0.0.1", "::1")
    59  	ipV6First := network.NewHostPorts(1234, "testing1.invalid", "::1", "127.0.0.1")
    60  
    61  	check := func(publish, expect []network.HostPort) {
    62  		var mock mockAPIHostPortsSetter
    63  		statePublish := &CachingAPIHostPortsSetter{APIHostPortsSetter: &mock}
    64  		for i := 0; i < 2; i++ {
    65  			err := statePublish.SetAPIHostPorts([][]network.HostPort{publish})
    66  			c.Assert(err, jc.ErrorIsNil)
    67  		}
    68  		c.Assert(mock.calls, gc.Equals, 1)
    69  		c.Assert(mock.apiHostPorts, gc.DeepEquals, [][]network.HostPort{expect})
    70  	}
    71  
    72  	check(ipV6First, ipV4First)
    73  	check(ipV4First, ipV4First)
    74  }
    75  
    76  func (s *publishSuite) TestPublisherRejectsNoServers(c *gc.C) {
    77  	var mock mockAPIHostPortsSetter
    78  	statePublish := &CachingAPIHostPortsSetter{APIHostPortsSetter: &mock}
    79  	err := statePublish.SetAPIHostPorts(nil)
    80  	c.Assert(err, gc.ErrorMatches, "no API servers specified")
    81  }