launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/pinger_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiserver_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/loggo/loggo"
    10  	"launchpad.net/errgo/errors"
    11  	gc "launchpad.net/gocheck"
    12  
    13  	"launchpad.net/juju-core/juju/testing"
    14  	"launchpad.net/juju-core/state/api"
    15  	"launchpad.net/juju-core/state/api/params"
    16  	"launchpad.net/juju-core/state/apiserver"
    17  	coretesting "launchpad.net/juju-core/testing"
    18  )
    19  
    20  type stateSuite struct {
    21  	testing.JujuConnSuite
    22  }
    23  
    24  var _ = gc.Suite(&stateSuite{})
    25  
    26  var testPingPeriod = 100 * time.Millisecond
    27  
    28  func (s *stateSuite) TestConnectionBrokenDetection(c *gc.C) {
    29  	s.PatchValue(&api.PingPeriod, testPingPeriod)
    30  
    31  	st, _ := s.OpenAPIAsNewMachine(c)
    32  
    33  	// Connection still alive
    34  	select {
    35  	case <-time.After(testPingPeriod):
    36  	case <-st.Broken():
    37  		c.Fatalf("connection should be alive still")
    38  	}
    39  
    40  	// Close the connection and see if we detect this
    41  	go st.Close()
    42  
    43  	// Check it's detected
    44  	select {
    45  	case <-time.After(testPingPeriod + time.Second):
    46  		c.Fatalf("connection not closed as expected")
    47  	case <-st.Broken():
    48  		return
    49  	}
    50  }
    51  
    52  func (s *stateSuite) TestPing(c *gc.C) {
    53  	tw := &loggo.TestWriter{}
    54  	c.Assert(loggo.RegisterWriter("ping-tester", tw, loggo.DEBUG), gc.IsNil)
    55  	defer loggo.RemoveWriter("ping-tester")
    56  
    57  	st, _ := s.OpenAPIAsNewMachine(c)
    58  	err := st.Ping()
    59  	c.Assert(err, gc.IsNil)
    60  	err = st.Close()
    61  	c.Assert(err, gc.IsNil)
    62  	err = st.Ping()
    63  	c.Assert(errors.Cause(err), gc.Equals, params.CodeServerShutdown)
    64  
    65  	// Make sure that ping messages have not been logged.
    66  	for _, m := range tw.Log {
    67  		c.Logf("checking %q", m.Message)
    68  		c.Check(m.Message, gc.Not(gc.Matches), ".*Ping.*")
    69  	}
    70  }
    71  
    72  func (s *stateSuite) TestClientNoNeedToPing(c *gc.C) {
    73  	s.PatchValue(apiserver.MaxPingInterval, time.Duration(0))
    74  	st, err := api.Open(s.APIInfo(c), api.DefaultDialOpts())
    75  	c.Assert(err, gc.IsNil)
    76  	time.Sleep(coretesting.ShortWait)
    77  	err = st.Ping()
    78  	c.Assert(err, gc.IsNil)
    79  }
    80  
    81  func (s *stateSuite) TestAgentConnectionShutsDownWithNoPing(c *gc.C) {
    82  	s.PatchValue(apiserver.MaxPingInterval, time.Duration(0))
    83  	st, _ := s.OpenAPIAsNewMachine(c)
    84  	time.Sleep(coretesting.ShortWait)
    85  	err := st.Ping()
    86  	c.Assert(err, gc.ErrorMatches, "connection is shut down")
    87  }