Example #1
0
					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)