github.com/apernet/quic-go@v0.43.1-0.20240515053213-5e9e635fd9f0/internal/wire/max_streams_frame_test.go (about)

     1  package wire
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/apernet/quic-go/internal/protocol"
     9  	"github.com/apernet/quic-go/quicvarint"
    10  
    11  	. "github.com/onsi/ginkgo/v2"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  var _ = Describe("MAX_STREAMS frame", func() {
    16  	Context("parsing", func() {
    17  		It("accepts a frame for a bidirectional stream", func() {
    18  			data := encodeVarInt(0xdecaf)
    19  			b := bytes.NewReader(data)
    20  			f, err := parseMaxStreamsFrame(b, bidiMaxStreamsFrameType, protocol.Version1)
    21  			Expect(err).ToNot(HaveOccurred())
    22  			Expect(f.Type).To(Equal(protocol.StreamTypeBidi))
    23  			Expect(f.MaxStreamNum).To(BeEquivalentTo(0xdecaf))
    24  			Expect(b.Len()).To(BeZero())
    25  		})
    26  
    27  		It("accepts a frame for a bidirectional stream", func() {
    28  			data := encodeVarInt(0xdecaf)
    29  			b := bytes.NewReader(data)
    30  			f, err := parseMaxStreamsFrame(b, uniMaxStreamsFrameType, protocol.Version1)
    31  			Expect(err).ToNot(HaveOccurred())
    32  			Expect(f.Type).To(Equal(protocol.StreamTypeUni))
    33  			Expect(f.MaxStreamNum).To(BeEquivalentTo(0xdecaf))
    34  			Expect(b.Len()).To(BeZero())
    35  		})
    36  
    37  		It("errors on EOFs", func() {
    38  			const typ = 0x1d
    39  			data := encodeVarInt(0xdeadbeefcafe13)
    40  			_, err := parseMaxStreamsFrame(bytes.NewReader(data), typ, protocol.Version1)
    41  			Expect(err).NotTo(HaveOccurred())
    42  			for i := range data {
    43  				_, err = parseMaxStreamsFrame(bytes.NewReader(data[:i]), typ, protocol.Version1)
    44  				Expect(err).To(MatchError(io.EOF))
    45  			}
    46  		})
    47  
    48  		for _, t := range []protocol.StreamType{protocol.StreamTypeUni, protocol.StreamTypeBidi} {
    49  			streamType := t
    50  
    51  			It("accepts a frame containing the maximum stream count", func() {
    52  				f := &MaxStreamsFrame{
    53  					Type:         streamType,
    54  					MaxStreamNum: protocol.MaxStreamCount,
    55  				}
    56  				b, err := f.Append(nil, protocol.Version1)
    57  				Expect(err).ToNot(HaveOccurred())
    58  				r := bytes.NewReader(b)
    59  				typ, err := quicvarint.Read(r)
    60  				Expect(err).ToNot(HaveOccurred())
    61  				frame, err := parseMaxStreamsFrame(r, typ, protocol.Version1)
    62  				Expect(err).ToNot(HaveOccurred())
    63  				Expect(frame).To(Equal(f))
    64  			})
    65  
    66  			It("errors when receiving a too large stream count", func() {
    67  				f := &MaxStreamsFrame{
    68  					Type:         streamType,
    69  					MaxStreamNum: protocol.MaxStreamCount + 1,
    70  				}
    71  				b, err := f.Append(nil, protocol.Version1)
    72  				Expect(err).ToNot(HaveOccurred())
    73  				r := bytes.NewReader(b)
    74  				typ, err := quicvarint.Read(r)
    75  				Expect(err).ToNot(HaveOccurred())
    76  				_, err = parseMaxStreamsFrame(r, typ, protocol.Version1)
    77  				Expect(err).To(MatchError(fmt.Sprintf("%d exceeds the maximum stream count", protocol.MaxStreamCount+1)))
    78  			})
    79  		}
    80  	})
    81  
    82  	Context("writing", func() {
    83  		It("for a bidirectional stream", func() {
    84  			f := &MaxStreamsFrame{
    85  				Type:         protocol.StreamTypeBidi,
    86  				MaxStreamNum: 0xdeadbeef,
    87  			}
    88  			b, err := f.Append(nil, protocol.Version1)
    89  			Expect(err).ToNot(HaveOccurred())
    90  			expected := []byte{bidiMaxStreamsFrameType}
    91  			expected = append(expected, encodeVarInt(0xdeadbeef)...)
    92  			Expect(b).To(Equal(expected))
    93  		})
    94  
    95  		It("for a unidirectional stream", func() {
    96  			f := &MaxStreamsFrame{
    97  				Type:         protocol.StreamTypeUni,
    98  				MaxStreamNum: 0xdecafbad,
    99  			}
   100  			b, err := f.Append(nil, protocol.Version1)
   101  			Expect(err).ToNot(HaveOccurred())
   102  			expected := []byte{uniMaxStreamsFrameType}
   103  			expected = append(expected, encodeVarInt(0xdecafbad)...)
   104  			Expect(b).To(Equal(expected))
   105  		})
   106  
   107  		It("has the correct length", func() {
   108  			frame := MaxStreamsFrame{MaxStreamNum: 0x1337}
   109  			Expect(frame.Length(protocol.Version1)).To(BeEquivalentTo(1 + quicvarint.Len(0x1337)))
   110  		})
   111  	})
   112  })