1package quic 2 3import ( 4 "errors" 5 "time" 6 7 "github.com/golang/mock/gomock" 8 "github.com/lucas-clemente/quic-go/internal/protocol" 9 "github.com/lucas-clemente/quic-go/internal/utils" 10 11 . "github.com/onsi/ginkgo" 12 . "github.com/onsi/gomega" 13) 14 15var _ = Describe("Closed local session", func() { 16 var ( 17 sess packetHandler 18 mconn *MockSendConn 19 ) 20 21 BeforeEach(func() { 22 mconn = NewMockSendConn(mockCtrl) 23 sess = newClosedLocalSession(mconn, []byte("close"), protocol.PerspectiveClient, utils.DefaultLogger) 24 }) 25 26 AfterEach(func() { 27 Eventually(areClosedSessionsRunning).Should(BeFalse()) 28 }) 29 30 It("tells its perspective", func() { 31 Expect(sess.getPerspective()).To(Equal(protocol.PerspectiveClient)) 32 // stop the session 33 sess.shutdown() 34 }) 35 36 It("repeats the packet containing the CONNECTION_CLOSE frame", func() { 37 written := make(chan []byte) 38 mconn.EXPECT().Write(gomock.Any()).Do(func(p []byte) { written <- p }).AnyTimes() 39 for i := 1; i <= 20; i++ { 40 sess.handlePacket(&receivedPacket{}) 41 if i == 1 || i == 2 || i == 4 || i == 8 || i == 16 { 42 Eventually(written).Should(Receive(Equal([]byte("close")))) // receive the CONNECTION_CLOSE 43 } else { 44 Consistently(written, 10*time.Millisecond).Should(HaveLen(0)) 45 } 46 } 47 // stop the session 48 sess.shutdown() 49 }) 50 51 It("destroys sessions", func() { 52 Eventually(areClosedSessionsRunning).Should(BeTrue()) 53 sess.destroy(errors.New("destroy")) 54 Eventually(areClosedSessionsRunning).Should(BeFalse()) 55 }) 56}) 57