github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/ec2/securitygroups_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package ec2_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/clock/testclock"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	amzec2 "gopkg.in/amz.v3/ec2"
    14  	gc "gopkg.in/check.v1"
    15  
    16  	"github.com/juju/juju/environs/context"
    17  	"github.com/juju/juju/provider/ec2"
    18  	coretesting "github.com/juju/juju/testing"
    19  )
    20  
    21  type SecurityGroupSuite struct {
    22  	coretesting.BaseSuite
    23  
    24  	instanceStub *stubInstance
    25  	deleteFunc   func(ec2.SecurityGroupCleaner, context.ProviderCallContext, amzec2.SecurityGroup, clock.Clock) error
    26  	cloudCallCtx context.ProviderCallContext
    27  }
    28  
    29  var _ = gc.Suite(&SecurityGroupSuite{})
    30  
    31  func (s *SecurityGroupSuite) SetUpSuite(c *gc.C) {
    32  	s.BaseSuite.SetUpSuite(c)
    33  	s.deleteFunc = *ec2.DeleteSecurityGroupInsistently
    34  }
    35  
    36  func (s *SecurityGroupSuite) SetUpTest(c *gc.C) {
    37  	s.BaseSuite.SetUpTest(c)
    38  	s.instanceStub = &stubInstance{
    39  		Stub: &testing.Stub{},
    40  		deleteSecurityGroup: func(group amzec2.SecurityGroup) (resp *amzec2.SimpleResp, err error) {
    41  			return nil, nil
    42  		},
    43  	}
    44  	s.cloudCallCtx = context.NewCloudCallContext()
    45  }
    46  
    47  func (s *SecurityGroupSuite) TestDeleteSecurityGroupSuccess(c *gc.C) {
    48  	err := s.deleteFunc(s.instanceStub, s.cloudCallCtx, amzec2.SecurityGroup{}, testclock.NewClock(time.Time{}))
    49  	c.Assert(err, jc.ErrorIsNil)
    50  	s.instanceStub.CheckCallNames(c, "DeleteSecurityGroup")
    51  }
    52  
    53  func (s *SecurityGroupSuite) TestDeleteSecurityGroupInvalidGroupNotFound(c *gc.C) {
    54  	s.instanceStub.deleteSecurityGroup = func(group amzec2.SecurityGroup) (resp *amzec2.SimpleResp, err error) {
    55  		return nil, &amzec2.Error{Code: "InvalidGroup.NotFound"}
    56  	}
    57  	err := s.deleteFunc(s.instanceStub, s.cloudCallCtx, amzec2.SecurityGroup{}, testclock.NewClock(time.Time{}))
    58  	c.Assert(err, jc.ErrorIsNil)
    59  	s.instanceStub.CheckCallNames(c, "DeleteSecurityGroup")
    60  }
    61  
    62  func (s *SecurityGroupSuite) TestDeleteSecurityGroupFewCalls(c *gc.C) {
    63  	t0 := time.Time{}
    64  	clock := autoAdvancingClock{testclock.NewClock(t0)}
    65  	count := 0
    66  	maxCalls := 4
    67  	expectedTimes := []time.Time{
    68  		t0,
    69  		t0.Add(time.Second),
    70  		t0.Add(3 * time.Second),
    71  		t0.Add(7 * time.Second),
    72  		t0.Add(15 * time.Second),
    73  	}
    74  	s.instanceStub.deleteSecurityGroup = func(group amzec2.SecurityGroup) (resp *amzec2.SimpleResp, err error) {
    75  		c.Assert(clock.Now(), gc.Equals, expectedTimes[count])
    76  		if count < maxCalls {
    77  			count++
    78  			return nil, &amzec2.Error{Code: "keep going"}
    79  		}
    80  		return nil, nil
    81  	}
    82  	err := s.deleteFunc(s.instanceStub, s.cloudCallCtx, amzec2.SecurityGroup{}, clock)
    83  	c.Assert(err, jc.ErrorIsNil)
    84  
    85  	expectedCalls := make([]string, maxCalls+1)
    86  	for i := 0; i < maxCalls+1; i++ {
    87  		expectedCalls[i] = "DeleteSecurityGroup"
    88  	}
    89  	s.instanceStub.CheckCallNames(c, expectedCalls...)
    90  }
    91  
    92  type autoAdvancingClock struct {
    93  	*testclock.Clock
    94  }
    95  
    96  func (c autoAdvancingClock) After(d time.Duration) <-chan time.Time {
    97  	ch := c.Clock.After(d)
    98  	c.Advance(d)
    99  	return ch
   100  }
   101  
   102  type stubInstance struct {
   103  	*testing.Stub
   104  	deleteSecurityGroup func(group amzec2.SecurityGroup) (resp *amzec2.SimpleResp, err error)
   105  }
   106  
   107  func (s *stubInstance) DeleteSecurityGroup(group amzec2.SecurityGroup) (resp *amzec2.SimpleResp, err error) {
   108  	s.MethodCall(s, "DeleteSecurityGroup", group)
   109  	return s.deleteSecurityGroup(group)
   110  }