func (s *GardenServer) streamInput(decoder *json.Decoder, in *io.PipeWriter, process garden.Process, connCloseCh chan struct{}) { for { var payload transport.ProcessPayload err := decoder.Decode(&payload) if err != nil { close(connCloseCh) in.CloseWithError(errors.New("Connection closed")) return } switch { case payload.TTY != nil: process.SetTTY(*payload.TTY) case payload.Source != nil: if payload.Data == nil { in.Close() return } else { _, err := in.Write([]byte(*payload.Data)) if err != nil { return } } case payload.Signal != nil: s.logger.Info("stream-input-process-signal", lager.Data{"payload": payload}) switch *payload.Signal { case garden.SignalKill: err = process.Signal(garden.SignalKill) if err != nil { s.logger.Error("stream-input-process-signal-kill-failed", err, lager.Data{"payload": payload}) } case garden.SignalTerminate: err = process.Signal(garden.SignalTerminate) if err != nil { s.logger.Error("stream-input-process-signal-terminate-failed", err, lager.Data{"payload": payload}) } default: s.logger.Error("stream-input-unknown-process-payload-signal", nil, lager.Data{"payload": payload}) in.Close() return } default: s.logger.Error("stream-input-unknown-process-payload", nil, lager.Data{"payload": payload}) in.Close() return } } }
BeforeEach(func() { errs := make(chan error, 1) errs <- io.EOF close(errs) fakeProcess.SetTTYStub = func(garden.TTYSpec) error { return <-errs } }) It("reattaches on use of closed connection", func() { ttySpec := garden.TTYSpec{ WindowSize: &garden.WindowSize{Columns: 345678, Rows: 45689}, } Ω(process.SetTTY(ttySpec)).Should(Succeed()) Ω(fakeProcess.SetTTYArgsForCall(0)).Should(Equal(ttySpec)) Ω(innerConnection.AttachCallCount()).Should(Equal(2)) handle, processID, calledProcessIO := innerConnection.AttachArgsForCall(1) Ω(handle).Should(Equal("la-contineur")) Ω(processID).Should(Equal(uint32(6))) Ω(calledProcessIO).Should(Equal(processIO)) }) }) }) }) }) Describe("Run", func() { var (
BeforeEach(func() { errs := make(chan error, 1) errs <- io.EOF close(errs) fakeProcess.SetTTYStub = func(garden.TTYSpec) error { return <-errs } }) It("reattaches on use of closed connection", func() { ttySpec := garden.TTYSpec{ WindowSize: &garden.WindowSize{Columns: 345678, Rows: 45689}, } Expect(process.SetTTY(ttySpec)).To(Succeed()) Expect(fakeProcess.SetTTYArgsForCall(0)).To(Equal(ttySpec)) 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("Run", func() { var (