github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/utils/network_test.go (about)

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