fakeProcess = &gardenFakes.FakeProcess{} }) Context("When garden is healthy", func() { BeforeEach(func() { gardenClient.CreateReturns(fakeContainer, nil) gardenClient.ContainersReturns([]garden.Container{oldContainer}, nil) fakeContainer.RunReturns(fakeProcess, nil) fakeProcess.WaitReturns(0, nil) }) It("drives a container lifecycle", func() { err := gardenChecker.Healthcheck(logger) By("Fetching any pre-existing healthcheck containers") Expect(gardenClient.ContainersCallCount()).To(Equal(1)) By("Deleting all pre-existing-containers") //call count is two because we also expect to destroy the container we create Expect(gardenClient.DestroyCallCount()).To(Equal(2)) guid := gardenClient.DestroyArgsForCall(0) Expect(guid).To(Equal("old-guid")) By("Creates the container") Expect(gardenClient.CreateCallCount()).To(Equal(1)) containerSpec := gardenClient.CreateArgsForCall(0) Expect(containerSpec).To(Equal(garden.ContainerSpec{ Handle: "executor-healthcheck-abc-123", RootFSPath: rootfsPath, Properties: garden.Properties{ gardenstore.ContainerOwnerProperty: containerOwnerName,
Context("when the container can be found", func() { var fakeContainer *gfakes.FakeContainer BeforeEach(func() { fakeContainer = new(gfakes.FakeContainer) fakeContainer.HandleReturns("some-handle") fakeGardenClient.ContainersReturns([]garden.Container{fakeContainer}, nil) }) It("succeeds", func() { Ω(lookupErr).ShouldNot(HaveOccurred()) }) It("looks for containers with matching properties via the Garden client", func() { Ω(fakeGardenClient.ContainersCallCount()).Should(Equal(1)) Ω(fakeGardenClient.ContainersArgsForCall(0)).Should(Equal(garden.Properties{ "concourse:name": "some-name", })) }) Describe("the found container", func() { It("can be destroyed", func() { err := foundContainer.Destroy() Ω(err).ShouldNot(HaveOccurred()) By("destroying via garden") Ω(fakeGardenClient.DestroyCallCount()).Should(Equal(1)) Ω(fakeGardenClient.DestroyArgsForCall(0)).Should(Equal("some-handle")) By("no longer heartbeating")