github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/network_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apiserver 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/testing" 14 ) 15 16 type networkSuite struct { 17 testing.BaseSuite 18 } 19 20 var _ = gc.Suite(&networkSuite{}) 21 22 func (s *networkSuite) TestOpSuccess(c *gc.C) { 23 isCalled := false 24 f := func() error { 25 isCalled = true 26 return nil 27 } 28 err := networkOperationWitDefaultRetries(f, "do it")() 29 c.Assert(err, jc.ErrorIsNil) 30 c.Assert(isCalled, jc.IsTrue) 31 } 32 33 func (s *networkSuite) TestOpFailureNoRetry(c *gc.C) { 34 s.PatchValue(&defaultNetworkOperationRetryDelay, 1*time.Millisecond) 35 netErr := &netError{false} 36 callCount := 0 37 f := func() error { 38 callCount++ 39 return netErr 40 } 41 err := networkOperationWitDefaultRetries(f, "do it")() 42 c.Assert(errors.Cause(err), gc.Equals, netErr) 43 c.Assert(callCount, gc.Equals, 1) 44 } 45 46 func (s *networkSuite) TestOpFailureRetries(c *gc.C) { 47 s.PatchValue(&defaultNetworkOperationRetryDelay, 1*time.Millisecond) 48 netErr := &netError{true} 49 callCount := 0 50 f := func() error { 51 callCount++ 52 return netErr 53 } 54 err := networkOperationWitDefaultRetries(f, "do it")() 55 c.Assert(errors.Cause(err), gc.Equals, netErr) 56 c.Assert(callCount, gc.Equals, 10) 57 } 58 59 func (s *networkSuite) TestOpNestedFailureRetries(c *gc.C) { 60 s.PatchValue(&defaultNetworkOperationRetryDelay, 1*time.Millisecond) 61 netErr := &netError{true} 62 callCount := 0 63 f := func() error { 64 callCount++ 65 return errors.Annotate(errors.Trace(netErr), "create a wrapped error") 66 } 67 err := networkOperationWitDefaultRetries(f, "do it")() 68 c.Assert(errors.Cause(err), gc.Equals, netErr) 69 c.Assert(callCount, gc.Equals, 10) 70 } 71 72 func (s *networkSuite) TestOpSucceedsAfterRetries(c *gc.C) { 73 s.PatchValue(&defaultNetworkOperationRetryDelay, 1*time.Millisecond) 74 netErr := &netError{true} 75 callCount := 0 76 f := func() error { 77 callCount++ 78 if callCount == 5 { 79 return nil 80 } 81 return netErr 82 } 83 err := networkOperationWitDefaultRetries(f, "do it")() 84 c.Assert(err, jc.ErrorIsNil) 85 c.Assert(callCount, gc.Equals, 5) 86 } 87 88 type netError struct { 89 temporary bool 90 } 91 92 func (e *netError) Error() string { 93 return "network error" 94 } 95 96 func (e *netError) Temporary() bool { 97 return e.temporary 98 } 99 100 func (e *netError) Timeout() bool { 101 return false 102 }