1package wire
2
3import (
4	"bytes"
5
6	"github.com/lucas-clemente/quic-go/internal/protocol"
7	"github.com/lucas-clemente/quic-go/internal/utils"
8
9	. "github.com/onsi/ginkgo"
10	. "github.com/onsi/gomega"
11)
12
13var _ = Describe("STREAM_DATA_BLOCKED frame", func() {
14	Context("parsing", func() {
15		It("accepts sample frame", func() {
16			data := []byte{0x15}
17			data = append(data, encodeVarInt(0xdeadbeef)...) // stream ID
18			data = append(data, encodeVarInt(0xdecafbad)...) // offset
19			b := bytes.NewReader(data)
20			frame, err := parseStreamDataBlockedFrame(b, versionIETFFrames)
21			Expect(err).ToNot(HaveOccurred())
22			Expect(frame.StreamID).To(Equal(protocol.StreamID(0xdeadbeef)))
23			Expect(frame.DataLimit).To(Equal(protocol.ByteCount(0xdecafbad)))
24			Expect(b.Len()).To(BeZero())
25		})
26
27		It("errors on EOFs", func() {
28			data := []byte{0x15}
29			data = append(data, encodeVarInt(0xdeadbeef)...)
30			data = append(data, encodeVarInt(0xc0010ff)...)
31			_, err := parseStreamDataBlockedFrame(bytes.NewReader(data), versionIETFFrames)
32			Expect(err).NotTo(HaveOccurred())
33			for i := range data {
34				_, err := parseStreamDataBlockedFrame(bytes.NewReader(data[0:i]), versionIETFFrames)
35				Expect(err).To(HaveOccurred())
36			}
37		})
38	})
39
40	Context("writing", func() {
41		It("has proper min length", func() {
42			f := &StreamDataBlockedFrame{
43				StreamID:  0x1337,
44				DataLimit: 0xdeadbeef,
45			}
46			Expect(f.Length(0)).To(Equal(1 + utils.VarIntLen(0x1337) + utils.VarIntLen(0xdeadbeef)))
47		})
48
49		It("writes a sample frame", func() {
50			b := &bytes.Buffer{}
51			f := &StreamDataBlockedFrame{
52				StreamID:  0xdecafbad,
53				DataLimit: 0x1337,
54			}
55			err := f.Write(b, versionIETFFrames)
56			Expect(err).ToNot(HaveOccurred())
57			expected := []byte{0x15}
58			expected = append(expected, encodeVarInt(uint64(f.StreamID))...)
59			expected = append(expected, encodeVarInt(uint64(f.DataLimit))...)
60			Expect(b.Bytes()).To(Equal(expected))
61		})
62	})
63})
64