}) Context("when the layer is retained", func() { JustBeforeEach(func() { retainer.Retain(lagertest.NewTestLogger(""), layercake.DockerImageID("child")) }) It("should not remove the layer", func() { Expect(gc.GC(logger, fakeCake)).To(Succeed()) Expect(fakeCake.RemoveCallCount()).To(Equal(0)) }) }) Context("when removing fails", func() { It("returns an error", func() { fakeCake.RemoveReturns(errors.New("cake failure")) Expect(gc.GC(logger, fakeCake)).To(MatchError("cake failure")) }) }) }) Context("when the layer has a parent", func() { BeforeEach(func() { child2parent[layercake.DockerImageID("child")] = layercake.DockerImageID("parent") }) Context("and the parent has no other children", func() { It("removes the layer, and its parent", func() { Expect(gc.GC(logger, fakeCake)).To(Succeed()) Expect(fakeCake.RemoveCallCount()).To(Equal(2))
testImage := &image.Image{Parent: "this-parent"} cake.GetReturns(testImage, nil) img, err := aufsCake.Get(childID) Expect(cake.GetCallCount()).To(Equal(1)) Expect(cake.GetArgsForCall(0)).To(Equal(childID)) Expect(err).To(BeNil()) Expect(img).To(Equal(testImage)) }) }) }) Describe("Remove", func() { Context("when the image ID is not namespaced", func() { It("should return the error when cake fails", func() { cake.RemoveReturns(testError) Expect(aufsCake.Remove(childID)).To(Equal(testError)) }) It("should delegate to the cake", func() { Expect(aufsCake.Remove(childID)).To(Succeed()) Expect(cake.RemoveCallCount()).To(Equal(1)) Expect(cake.RemoveArgsForCall(0)).To(Equal(childID)) }) }) Context("when the image ID is namespaced", func() { var ( parentDir string namespacedChildDir string otherNamespacedChildDir string