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