diff --git a/transport.go b/transport.go index 242eedc10..3bc11d3bd 100644 --- a/transport.go +++ b/transport.go @@ -244,14 +244,16 @@ func (t *Transport) runSendQueue() { func (t *Transport) Close() error { t.close(errors.New("closing")) if t.createdConn { - if err := t.conn.Close(); err != nil { + if err := t.Conn.Close(); err != nil { return err } - } else { + } else if t.conn != nil { t.conn.SetReadDeadline(time.Now()) defer func() { t.conn.SetReadDeadline(time.Time{}) }() } - <-t.listening // wait until listening returns + if t.listening != nil { + <-t.listening // wait until listening returns + } return nil } @@ -280,7 +282,9 @@ func (t *Transport) close(e error) { return } - t.handlerMap.Close(e) + if t.handlerMap != nil { + t.handlerMap.Close(e) + } if t.server != nil { t.server.setCloseError(e) } diff --git a/transport_test.go b/transport_test.go index 9426f350c..c78742f80 100644 --- a/transport_test.go +++ b/transport_test.go @@ -291,4 +291,20 @@ var _ = Describe("Transport", func() { close(packetChan) tr.Close() }) + + It("closes uninitialized Transport and closes underlying PacketConn", func() { + packetChan := make(chan packetToRead) + pconn := newMockPacketConn(packetChan) + + tr := &Transport{ + Conn: pconn, + createdConn: true, // owns pconn + } + // NO init + + // shutdown + close(packetChan) + pconn.EXPECT().Close() + Expect(tr.Close()).To(Succeed()) + }) })