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  }