}, )) }) Context("unmounting the translation layer", func() { BeforeEach(func() { // ensure umount doesnt happen too quickly fakeNamespacer.NamespaceStub = func(_ lager.Logger, _ string) error { Expect(fakeCake.UnmountCallCount()).To(Equal(0)) return nil } }) It("unmounts the translation layer after performing namespacing", func() { Expect(fakeCake.UnmountCallCount()).Should(Equal(1)) Expect(fakeCake.UnmountArgsForCall(0)).To(Equal(layercake.NamespacedID(layercake.DockerImageID("some-image-id"), "jam"))) }) }) }) Context("and the image has already been translated", func() { BeforeEach(func() { fakeCake.PathStub = func(id layercake.ID) (string, error) { return "/mount/point/" + id.GraphID(), nil } fakeNamespacer.CacheKeyReturns("sandwich") fakeCake.GetStub = func(id layercake.ID) (*image.Image, error) { if id == (layercake.NamespacedID(layercake.DockerImageID("some-image-id"), "sandwich")) { return &image.Image{}, nil
Context("when getting parent's path succeeds", func() { var succeedingRunner *fake_command_runner.FakeCommandRunner BeforeEach(func() { succeedingRunner = fake_command_runner.New() succeedingRunner.WhenRunning(fake_command_runner.CommandSpec{}, func(cmd *exec.Cmd) error { return nil }) }) It("should unmount the parentID", func() { aufsCake.Runner = succeedingRunner Expect(aufsCake.Create(namespacedChildID, parentID, "")).To(Succeed()) Expect(cake.UnmountCallCount()).To(Equal(1)) Expect(cake.UnmountArgsForCall(0)).To(Equal(parentID)) }) It("should only unmount the parentID after mounting it", func() { cake.UnmountStub = func(id layercake.ID) error { Expect(cake.PathCallCount()).Should(BeNumerically(">", 0)) Expect(cake.PathArgsForCall(0)).To(Equal(parentID)) return nil } aufsCake.Runner = succeedingRunner Expect(aufsCake.Create(namespacedChildID, parentID, "")).To(Succeed()) }) It("should only unmount the parentID after we copy the parent directory", func() { runCallCount := 0