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 })