github.com/geofffranks/garden-linux@v0.0.0-20160715111146-26c893169cfa/linux_container/iptables_manager/iptables_manager_test.go (about)

     1  package iptables_manager_test
     2  
     3  import (
     4  	"errors"
     5  	"net"
     6  
     7  	"code.cloudfoundry.org/garden-linux/linux_container/iptables_manager"
     8  	"code.cloudfoundry.org/garden-linux/linux_container/iptables_manager/fake_chain"
     9  	. "github.com/onsi/ginkgo"
    10  	. "github.com/onsi/gomega"
    11  )
    12  
    13  var _ = Describe("IptablesManager", func() {
    14  	var (
    15  		fakeChains  []*fake_chain.FakeChain
    16  		manager     *iptables_manager.IPTablesManager
    17  		containerID string
    18  		bridgeName  string
    19  		ip          net.IP
    20  		network     *net.IPNet
    21  	)
    22  
    23  	BeforeEach(func() {
    24  		manager = iptables_manager.New()
    25  
    26  		fakeChains = []*fake_chain.FakeChain{}
    27  		for i := 0; i < 2; i++ {
    28  			fakeChain := new(fake_chain.FakeChain)
    29  			fakeChains = append(fakeChains, fakeChain)
    30  			manager.AddChain(fakeChain)
    31  		}
    32  
    33  		containerID = "some-ctr-id"
    34  		bridgeName = "some-bridge"
    35  		var err error
    36  		ip, network, err = net.ParseCIDR("1.2.3.4/28")
    37  		Expect(err).NotTo(HaveOccurred())
    38  	})
    39  
    40  	Describe("ContainerSetup", func() {
    41  		It("should set up the chains", func() {
    42  			Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).To(Succeed())
    43  			for _, fakeChain := range fakeChains {
    44  				Expect(fakeChain.SetupCallCount()).To(Equal(1))
    45  				ctrID, br, i, n := fakeChain.SetupArgsForCall(0)
    46  				Expect(ctrID).To(Equal(containerID))
    47  				Expect(br).To(Equal(bridgeName))
    48  				Expect(i).To(Equal(ip))
    49  				Expect(n).To(Equal(network))
    50  			}
    51  		})
    52  
    53  		It("should tear down the chains", func() {
    54  			Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).To(Succeed())
    55  
    56  			for _, fakeChain := range fakeChains {
    57  				Expect(fakeChain.TeardownCallCount()).To(Equal(1))
    58  				ctrID := fakeChain.TeardownArgsForCall(0)
    59  				Expect(ctrID).To(Equal(containerID))
    60  			}
    61  		})
    62  
    63  		Context("when tearing down a chain fails", func() {
    64  			BeforeEach(func() {
    65  				fakeChains[1].TeardownReturns(errors.New("banana"))
    66  			})
    67  
    68  			It("should return an error", func() {
    69  				Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).To(MatchError("banana"))
    70  			})
    71  
    72  			It("should not set up any chains", func() {
    73  				for _, fakeChain := range fakeChains {
    74  					Expect(fakeChain.SetupCallCount()).To(Equal(0))
    75  				}
    76  			})
    77  		})
    78  
    79  		Context("when setting up an early chain fails", func() {
    80  			BeforeEach(func() {
    81  				fakeChains[0].SetupReturns(errors.New("banana"))
    82  			})
    83  
    84  			It("should return an error", func() {
    85  				Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).To(MatchError("banana"))
    86  			})
    87  
    88  			It("should not setup subsequent chains", func() {
    89  				Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).NotTo(Succeed())
    90  
    91  				Expect(fakeChains[1].SetupCallCount()).To(Equal(0))
    92  			})
    93  		})
    94  
    95  		Context("when setting up a late chain fails", func() {
    96  			BeforeEach(func() {
    97  				fakeChains[1].SetupReturns(errors.New("banana"))
    98  			})
    99  
   100  			It("should return an error", func() {
   101  				Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).To(MatchError("banana"))
   102  			})
   103  
   104  			It("should tear down the earlier chains", func() {
   105  				Expect(manager.ContainerSetup(containerID, bridgeName, ip, network)).NotTo(Succeed())
   106  
   107  				Expect(fakeChains[0].TeardownCallCount()).To(Equal(2))
   108  				ctrID := fakeChains[0].TeardownArgsForCall(1)
   109  				Expect(ctrID).To(Equal(containerID))
   110  
   111  				Expect(fakeChains[1].TeardownCallCount()).To(Equal(1))
   112  
   113  			})
   114  		})
   115  	})
   116  
   117  	Describe("ContainerTeardown", func() {
   118  		It("should tear down the chains", func() {
   119  			Expect(manager.ContainerTeardown(containerID)).To(Succeed())
   120  
   121  			for _, fakeChain := range fakeChains {
   122  				Expect(fakeChain.TeardownCallCount()).To(Equal(1))
   123  				ctrID := fakeChain.TeardownArgsForCall(0)
   124  				Expect(ctrID).To(Equal(containerID))
   125  			}
   126  		})
   127  
   128  		Context("when tearing down a chain fails", func() {
   129  			BeforeEach(func() {
   130  				fakeChains[0].TeardownReturns(errors.New("banana"))
   131  			})
   132  
   133  			It("should return an error", func() {
   134  				Expect(manager.ContainerTeardown(containerID)).To(MatchError("banana"))
   135  			})
   136  
   137  			It("should tear down subsequent chains", func() {
   138  				Expect(manager.ContainerTeardown(containerID)).NotTo(Succeed())
   139  
   140  				Expect(fakeChains[1].TeardownCallCount()).To(Equal(1))
   141  			})
   142  		})
   143  	})
   144  })