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