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 }