})

		Context("when getting the sandbox namespace fails", func() {
			BeforeEach(func() {
				sandboxRepository.GetReturns(nil, errors.New("potato"))
			})

			It("wraps and propogates the error", func() {
				err := startMonitor.Execute(context)
				Expect(err).To(MatchError("getting sandbox namespace: potato"))
			})
		})

		Context("when the StartMonitor call fails", func() {
			BeforeEach(func() {
				fakeWatcher.StartMonitorReturns(errors.New("banana"))
			})

			It("wraps and propogates the error", func() {
				err := startMonitor.Execute(context)
				Expect(err).To(MatchError("watcher start monitor: banana"))
			})
		})
	})

	Describe("String", func() {
		It("describes itself", func() {
			Expect(startMonitor.String()).To(Equal("ip netns exec some-sandbox ip monitor neigh"))
		})
	})
})
		ns.NameReturns("/some/sbox/path/vni-some-sandbox")
	})

	Describe("Callback", func() {
		It("restart the monitor for the given namespace", func() {
			err := monitorReloader.Callback(ns)
			Expect(err).NotTo(HaveOccurred())

			Expect(watcher.StartMonitorCallCount()).To(Equal(1))
			calledNS, vxlanDev := watcher.StartMonitorArgsForCall(0)
			Expect(calledNS).To(Equal(ns))
			Expect(vxlanDev).To(Equal("vxlansome-sandbox"))
		})

		Context("failure cases", func() {
			It("returns an error when the sandbox name is not valid", func() {
				ns.NameReturns("some-invalid-name")

				err := monitorReloader.Callback(ns)
				Expect(err).To(MatchError("get vxlan name: not a valid sandbox name"))
			})
			It("returns an error when monitor does not start", func() {
				watcher.StartMonitorReturns(errors.New("some-fake-error"))

				err := monitorReloader.Callback(ns)
				Expect(err).To(MatchError("start monitor: some-fake-error"))
			})
		})
	})
})
	AfterEach(func() {
		process.Signal(syscall.SIGINT)
	})

	It("calls StartMonitor with the right arguments", func() {
		Eventually(missWatcher.StartMonitorCallCount).Should(Equal(1))

		n, vxlanName := missWatcher.StartMonitorArgsForCall(0)
		Expect(n).To(Equal(ns))
		Expect(vxlanName).To(Equal("some-vxlan-name"))
	})

	Context("when StartMonitor fails", func() {
		BeforeEach(func() {
			missWatcher.StartMonitorReturns(errors.New("pineapple"))
		})

		It("returns a meaningful error", func() {
			errCh := process.Wait()
			Eventually(errCh).Should(Receive(MatchError("start monitor: pineapple")))
		})

		It("does not close the ready channel", func() {
			Consistently(process.Ready()).ShouldNot(BeClosed())
		})
	})

	It("calls StopMonitor when signaled", func() {
		Eventually(process.Ready()).Should(BeClosed())