}) It("returns nil having only run the first attempt", func() { Expect(<-process.Wait()).ToNot(HaveOccurred()) Expect(attempt1Step.RunCallCount()).To(Equal(1)) Expect(attempt2Step.RunCallCount()).To(Equal(0)) Expect(attempt3Step.RunCallCount()).To(Equal(0)) }) Describe("Result", func() { It("delegates to attempt 1", func() { <-process.Wait() // internal check for success within retry loop Expect(attempt1Step.ResultCallCount()).To(Equal(1)) attempt1Step.ResultReturns(true) var foo interface{} destination := &foo Expect(step.Result(destination)).To(BeTrue()) Expect(attempt1Step.ResultCallCount()).To(Equal(2)) Expect(attempt1Step.ResultArgsForCall(1)).To(Equal(destination)) }) }) }) }) Context("when attempt 1 fails, and attempt 2 succeeds", func() {
Ω(bool(succeeded)).To(BeTrue()) }) }) Context("when step fails", func() { BeforeEach(func() { step.ResultStub = successResult(false) }) It("does not run hook and assigns the provided interface to false", func() { var succeeded exec.Success onSuccessStep.Run(signals, ready) onSuccessStep.Result(&succeeded) Ω(hook.RunCallCount()).To(Equal(0)) Ω(hook.ResultCallCount()).To(Equal(0)) Ω(bool(succeeded)).To(BeFalse()) }) }) Context("when step succeeds and hook fails", func() { BeforeEach(func() { step.ResultStub = successResult(true) hook.ResultStub = successResult(false) }) It("assigns the provided interface to false", func() { var succeeded exec.Success onSuccessStep.Run(signals, ready)
inStep = new(fakes.FakeStep) repo = NewSourceRepository() }) JustBeforeEach(func() { step = identity.Using(inStep, repo) }) Describe("Run", func() { It("is a no-op", func() { ready := make(chan struct{}) signals := make(chan os.Signal) err := step.Run(signals, ready) Ω(err).ShouldNot(HaveOccurred()) Ω(inStep.RunCallCount()).Should(BeZero()) }) }) Describe("Result", func() { It("calls through to the input source", func() { var result int step.Result(&result) Ω(inStep.ResultCallCount()).Should(Equal(1)) Ω(inStep.ResultArgsForCall(0)).Should(Equal(&result)) }) }) })
Expect(bool(succeeded)).To(BeFalse()) }) }) Context("when step succeeds", func() { BeforeEach(func() { step.ResultStub = successResult(true) }) It("never runs hook", func() { var succeeded exec.Success onFailureStep.Run(signals, ready) onFailureStep.Result(&succeeded) Expect(hook.RunCallCount()).To(Equal(0)) Expect(hook.ResultCallCount()).To(Equal(0)) Expect(bool(succeeded)).To(BeTrue()) }) }) Context("when step fails and hook fails", func() { BeforeEach(func() { step.ResultStub = successResult(false) hook.ResultStub = successResult(false) }) It("doesn't indicate success", func() { var succeeded exec.Success onFailureStep.Run(signals, ready) onFailureStep.Result(&succeeded) Expect(step.RunCallCount()).To(Equal(1))
inStep = new(fakes.FakeStep) repo = NewSourceRepository() }) JustBeforeEach(func() { step = identity.Using(inStep, repo) }) Describe("Run", func() { It("is a no-op", func() { ready := make(chan struct{}) signals := make(chan os.Signal) err := step.Run(signals, ready) Expect(err).NotTo(HaveOccurred()) Expect(inStep.RunCallCount()).To(BeZero()) }) }) Describe("Result", func() { It("calls through to the input source", func() { var result int step.Result(&result) Expect(inStep.ResultCallCount()).To(Equal(1)) Expect(inStep.ResultArgsForCall(0)).To(Equal(&result)) }) }) })