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 }