package quic import ( "io" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/lucas-clemente/quic-go/frames" "github.com/lucas-clemente/quic-go/protocol" ) var _ = Describe("Session", func() { var ( session *Session callbackCalled bool ) BeforeEach(func() { callbackCalled = false session = &Session{ streams: make(map[protocol.StreamID]*Stream), streamCallback: func(*Session, *Stream) { callbackCalled = true }, } }) Context("when handling stream frames", func() { It("makes new streams", func() { session.handleStreamFrame(&frames.StreamFrame{ StreamID: 5, Data: []byte{0xde, 0xca, 0xfb, 0xad}, }) Expect(session.streams).To(HaveLen(1)) Expect(callbackCalled).To(BeTrue()) p := make([]byte, 4) _, err := session.streams[5].Read(p) Expect(err).ToNot(HaveOccurred()) Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad})) }) It("handles existing streams", func() { session.handleStreamFrame(&frames.StreamFrame{ StreamID: 5, Data: []byte{0xde, 0xca}, }) Expect(session.streams).To(HaveLen(1)) Expect(callbackCalled).To(BeTrue()) session.handleStreamFrame(&frames.StreamFrame{ StreamID: 5, Offset: 2, Data: []byte{0xfb, 0xad}, }) Expect(session.streams).To(HaveLen(1)) p := make([]byte, 4) _, err := session.streams[5].Read(p) Expect(err).ToNot(HaveOccurred()) Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad})) }) It("closes streams", func() { session.handleStreamFrame(&frames.StreamFrame{ StreamID: 5, Data: []byte{0xde, 0xca, 0xfb, 0xad}, FinBit: true, }) Expect(session.streams).To(HaveLen(1)) Expect(session.streams[5]).ToNot(BeNil()) Expect(callbackCalled).To(BeTrue()) p := make([]byte, 4) _, err := session.streams[5].Read(p) Expect(err).To(Equal(io.EOF)) Expect(p).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad})) Expect(session.streams).To(HaveLen(1)) Expect(session.streams[5]).To(BeNil()) }) It("rejects streams that existed previously", func() { session.handleStreamFrame(&frames.StreamFrame{ StreamID: 5, Data: []byte{}, FinBit: true, }) _, err := session.streams[5].Read([]byte{0}) Expect(err).To(Equal(io.EOF)) err = session.handleStreamFrame(&frames.StreamFrame{ StreamID: 5, Data: []byte{}, }) Expect(err).To(MatchError("Session: reopening streams is not allowed")) }) }) })