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  }