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