Describe("Setup", func() {
		It("brings up the loopback adapter in the sandbox namespace", func() {
			sbNamespace.ExecuteStub = func(callback func(*os.File) error) error {
				Expect(linkFactory.SetUpCallCount()).To(Equal(0))
				err := callback(nil)
				Expect(linkFactory.SetUpCallCount()).To(Equal(1))
				return err
			}

			err := sb.Setup()
			Expect(err).NotTo(HaveOccurred())

			Expect(sbNamespace.ExecuteCallCount()).To(Equal(1))

			Expect(linkFactory.SetUpCallCount()).To(Equal(1))
			linkName := linkFactory.SetUpArgsForCall(0)
			Expect(linkName).To(Equal("lo"))
		})

		Context("when namespace execution fails", func() {
			BeforeEach(func() {
				sbNamespace.ExecuteReturns(errors.New("boysenberry"))
			})

			It("returns a meaningful error", func() {
				err := sb.Setup()
				Expect(err).To(MatchError("setup failed: boysenberry"))
			})
		})

		Context("when setting the link up fails", func() {
		Expect(address.IP.String()).To(Equal("10.10.10.10"))
	})

	It("ups the dummy device in the sandbox namespace", func() {
		ns.ExecuteStub = func(callback func(*os.File) error) error {
			Expect(linkFactory.SetUpCallCount()).To(Equal(0))
			err := callback(nil)
			Expect(linkFactory.SetUpCallCount()).To(Equal(1))
			return err
		}

		err := startDNS.Execute(context)
		Expect(err).NotTo(HaveOccurred())

		Expect(linkFactory.SetUpCallCount()).To(Equal(1))
		Expect(linkFactory.SetUpArgsForCall(0)).To(Equal("dns0"))
	})

	It("creates a listener in the sandbox namespace", func() {
		ns.ExecuteStub = func(callback func(*os.File) error) error {
			Expect(listenerFactory.ListenUDPCallCount()).To(Equal(0))
			err := callback(nil)
			Expect(listenerFactory.ListenUDPCallCount()).To(Equal(1))

			return err
		}

		expectedAddress, err := net.ResolveUDPAddr("udp", "10.10.10.10:53")
		Expect(err).NotTo(HaveOccurred())

		err = startDNS.Execute(context)
	BeforeEach(func() {
		context = &fakes.Context{}
		linkFactory = &fakes.LinkFactory{}
		context.LinkFactoryReturns(linkFactory)

		setLinkUp = commands.SetLinkUp{
			LinkName: "link-name",
		}
	})

	It("sets the link up", func() {
		err := setLinkUp.Execute(context)
		Expect(err).NotTo(HaveOccurred())

		Expect(linkFactory.SetUpCallCount()).To(Equal(1))
		Expect(linkFactory.SetUpArgsForCall(0)).To(Equal("link-name"))
	})

	Context("when setting the link UP fails", func() {
		It("wraps and propagates the error", func() {
			linkFactory.SetUpReturns(errors.New("welp"))

			err := setLinkUp.Execute(context)
			Expect(err).To(MatchError("set link up: welp"))
		})
	})

	Describe("String", func() {
		It("describes itself", func() {
			Expect(setLinkUp.String()).To(Equal("ip link set link-name up"))
		})