It("returns the error", func() { err := missWatcher.StartMonitor(ns, vxlanLinkName) Expect(err).To(MatchError("arp inserter failed: handle resolved: zuccini")) }) It("subscriber does not get called", func() { missWatcher.StartMonitor(ns, vxlanLinkName) Consistently(sub.SubscribeCallCount).Should(Equal(0)) }) }) It("locks and unlocks to protect the map", func() { missWatcher.StartMonitor(ns, vxlanLinkName) Expect(locker.LockCallCount()).To(Equal(1)) Expect(locker.UnlockCallCount()).To(Equal(1)) }) Context("when subscribe returns an error", func() { It("returns the error", func() { sub.SubscribeReturns(errors.New("some subscribe error")) err := missWatcher.StartMonitor(ns, vxlanLinkName) Expect(err).To(MatchError("subscribe in some-namespace: some subscribe error")) }) }) }) Describe("StopMonitor", func() { var complete chan struct{} BeforeEach(func() {
Gateway: net.ParseIP("192.168.2.1").To4(), Routes: []types.Route{{ Dst: net.IPNet{ IP: net.ParseIP("192.168.0.0").To4(), Mask: net.CIDRMask(16, 32), }, }}, }, })) }) It("acquires and releases a lock when accessing stores collection", func() { allocator.AllocateIP("network-id", "container-id") Expect(storeLocker.LockCallCount()).To(Equal(1)) Expect(storeLocker.UnlockCallCount()).To(Equal(1)) }) It("acquires and releases a lock when accessing the configs collection", func() { allocator.AllocateIP("network-id", "container-id") Expect(configLocker.LockCallCount()).To(Equal(1)) Expect(configLocker.UnlockCallCount()).To(Equal(1)) }) Context("when a network configuration already exists", func() { It("does not create a new configuration", func() { allocator.AllocateIP("network-id", "container-id") allocator.AllocateIP("network-id", "container-id") Expect(configFactory.CreateCallCount()).To(Equal(1))