It("stops trying to accept connections", func() { Eventually(fakeLocalListener.AcceptCallCount).Should(Equal(1)) Consistently(fakeLocalListener.AcceptCallCount).Should(Equal(1)) Expect(fakeLocalListener.CloseCallCount()).To(Equal(1)) }) }) Context("with a temporary error", func() { var timeCh chan time.Time BeforeEach(func() { timeCh = make(chan time.Time, 3) fakeLocalListener.AcceptStub = func() (net.Conn, error) { timeCh := timeCh if fakeLocalListener.AcceptCallCount() > 3 { close(timeCh) return nil, test_helpers.NewTestNetError(false, false) } else { timeCh <- time.Now() return nil, test_helpers.NewTestNetError(false, true) } } }) It("retries connecting after a short delay", func() { Eventually(fakeLocalListener.AcceptCallCount).Should(Equal(3)) Expect(timeCh).To(HaveLen(3)) times := make([]time.Time, 0) for t := range timeCh {
case conn := <-cx: return conn, nil default: return nil, errors.New("fail") } } }) JustBeforeEach(func() { srv = server.NewServer(logger, address, handler) srv.SetListener(fakeListener) srv.Serve() }) It("accepts inbound connections", func() { Expect(fakeListener.AcceptCallCount()).To(Equal(2)) }) It("passes the connection to the connection handler", func() { Eventually(handler.HandleConnectionCallCount).Should(Equal(1)) Expect(handler.HandleConnectionArgsForCall(0)).To(Equal(fakeConn)) }) Context("when accept returns a permanent error", func() { BeforeEach(func() { fakeListener.AcceptReturns(nil, errors.New("oops")) }) It("closes the listener", func() { Expect(fakeListener.CloseCallCount()).To(Equal(1)) })