Describe("Net out", func() {
		It("delegates to the filter", func() {
			rule := garden.NetOutRule{}
			err := container.NetOut(rule)
			Expect(err).ToNot(HaveOccurred())

			Expect(fakeFilter.NetOutCallCount()).To(Equal(1))
			passedRule := fakeFilter.NetOutArgsForCall(0)
			Expect(passedRule).To(Equal(rule))
		})

		Context("when the filter fails", func() {
			disaster := errors.New("oh no!")

			BeforeEach(func() {
				fakeFilter.NetOutReturns(disaster)
			})

			It("returns the error", func() {
				err := container.NetOut(garden.NetOutRule{})
				Expect(err).To(Equal(disaster))
			})
		})
	})

	Describe("Properties", func() {
		Describe("CRUD", func() {
			It("can get a property", func() {
				value, err := container.Property("property-name")
				Expect(err).ToNot(HaveOccurred())
				Expect(value).To(Equal("property-value"))
		})

		It("redoes net-outs", func() {
			Expect(container.Restore(linux_backend.LinuxContainerSpec{
				NetOuts:   []garden.NetOutRule{netOutRule1, netOutRule2},
				Resources: containerResources,
			})).To(Succeed())

			Expect(fakeFilter.NetOutCallCount()).To(Equal(2))
			Expect(fakeFilter.NetOutArgsForCall(0)).To(Equal(netOutRule1))
			Expect(fakeFilter.NetOutArgsForCall(1)).To(Equal(netOutRule2))
		})

		Context("when applying a netout rule fails", func() {
			It("returns an error", func() {
				fakeFilter.NetOutReturns(errors.New("didn't work"))

				Expect(container.Restore(
					linux_backend.LinuxContainerSpec{
						NetOuts:   []garden.NetOutRule{{}},
						Resources: containerResources,
					})).To(MatchError("didn't work"))
			})
		})

		It("redoes network setup and net-ins", func() {
			err := container.Restore(linux_backend.LinuxContainerSpec{
				State:     "active",
				Events:    []string{},
				Resources: containerResources,