performErr <- step.Perform() close(performErr) }() Eventually(waiting).Should(BeClosed()) step.Cancel() }) AfterEach(func() { close(waitExited) Eventually(performErr).Should(BeClosed()) }) It("sends an interrupt to the process", func() { Eventually(spawnedProcess.SignalCallCount).Should(Equal(1)) Expect(spawnedProcess.SignalArgsForCall(0)).To(Equal(garden.SignalTerminate)) }) Context("when the process exits", func() { It("completes the perform without having sent kill", func() { Eventually(spawnedProcess.SignalCallCount).Should(Equal(1)) waitExited <- (128 + 15) Eventually(performErr).Should(Receive(Equal(steps.ErrCancelled))) Expect(spawnedProcess.SignalCallCount()).To(Equal(1)) Expect(spawnedProcess.SignalArgsForCall(0)).To(Equal(garden.SignalTerminate)) }) })
select {} return 0, nil } fakeContainer.RunReturns(fakeProcess, nil) }) It("is eventually killed in the backend", func() { process, err := container.Run(processSpec, garden.ProcessIO{}) Ω(err).ShouldNot(HaveOccurred()) err = process.Signal(garden.SignalKill) Ω(err).ShouldNot(HaveOccurred()) Eventually(fakeProcess.SignalCallCount).Should(Equal(1)) Ω(fakeProcess.SignalArgsForCall(0)).Should(Equal(garden.SignalKill)) }) }) Context("when the process is terminated", func() { var fakeProcess *fakes.FakeProcess BeforeEach(func() { fakeProcess = new(fakes.FakeProcess) fakeProcess.IDReturns(42) fakeProcess.WaitStub = func() (int, error) { select {} return 0, nil } fakeContainer.RunReturns(fakeProcess, nil)
}) Describe("Signal", func() { BeforeEach(func() { errs := make(chan error, 1) errs <- io.EOF close(errs) fakeProcess.SignalStub = func(garden.Signal) error { return <-errs } }) It("reattaches on use of closed connection", func() { Expect(process.Signal(garden.SignalTerminate)).To(Succeed()) Expect(fakeProcess.SignalArgsForCall(0)).To(Equal(garden.SignalTerminate)) Expect(innerConnection.AttachCallCount()).To(Equal(2)) handle, processID, calledProcessIO := innerConnection.AttachArgsForCall(1) Expect(handle).To(Equal("la-contineur")) Expect(processID).To(Equal("process-id")) Expect(calledProcessIO).To(Equal(processIO)) }) }) Describe("SetTTY", func() { BeforeEach(func() { errs := make(chan error, 1) errs <- io.EOF close(errs)