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 }