1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 func makeWriteNonStreamRequest() FrameWriteRequest {
15 return FrameWriteRequest{writeSettingsAck{}, nil, nil}
18 func makeWriteHeadersRequest(streamID uint32) FrameWriteRequest {
19 st := &stream{id: streamID}
20 return FrameWriteRequest{&writeResHeaders{streamID: streamID, httpResCode: 200}, st, nil}
23 func checkConsume(wr FrameWriteRequest, nbytes int32, want []FrameWriteRequest) error {
24 consumed, rest, n := wr.Consume(nbytes)
25 var wantConsumed, wantRest FrameWriteRequest
29 wantConsumed = want[0]
31 wantConsumed = want[0]
34 if !reflect.DeepEqual(consumed, wantConsumed) || !reflect.DeepEqual(rest, wantRest) || n != len(want) {
35 return fmt.Errorf("got %v, %v, %v\nwant %v, %v, %v", consumed, rest, n, wantConsumed, wantRest, len(want))
40 func TestFrameWriteRequestNonData(t *testing.T) {
41 wr := makeWriteNonStreamRequest()
42 if got, want := wr.DataSize(), 0; got != want {
43 t.Errorf("DataSize: got %v, want %v", got, want)
46 // Non-DATA frames are always consumed whole.
47 if err := checkConsume(wr, 0, []FrameWriteRequest{wr}); err != nil {
48 t.Errorf("Consume:\n%v", err)
52 func TestFrameWriteRequestData(t *testing.T) {
55 sc: &serverConn{maxFrameSize: 16},
58 wr := FrameWriteRequest{&writeData{st.id, make([]byte, size), true}, st, make(chan error)}
59 if got, want := wr.DataSize(), size; got != want {
60 t.Errorf("DataSize: got %v, want %v", got, want)
63 // No flow-control bytes available: cannot consume anything.
64 if err := checkConsume(wr, math.MaxInt32, []FrameWriteRequest{}); err != nil {
65 t.Errorf("Consume(limited by flow control):\n%v", err)
68 // Add enough flow-control bytes to consume the entire frame,
69 // but we're now restricted by st.sc.maxFrameSize.
71 want := []FrameWriteRequest{
73 write: &writeData{st.id, make([]byte, st.sc.maxFrameSize), false},
78 write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize), true},
83 if err := checkConsume(wr, math.MaxInt32, want); err != nil {
84 t.Errorf("Consume(limited by maxFrameSize):\n%v", err)
88 // Consume 8 bytes from the remaining frame.
89 want = []FrameWriteRequest{
91 write: &writeData{st.id, make([]byte, 8), false},
96 write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true},
101 if err := checkConsume(rest, 8, want); err != nil {
102 t.Errorf("Consume(8):\n%v", err)
106 // Consume all remaining bytes.
107 want = []FrameWriteRequest{
109 write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true},
114 if err := checkConsume(rest, math.MaxInt32, want); err != nil {
115 t.Errorf("Consume(remainder):\n%v", err)
119 func TestFrameWriteRequest_StreamID(t *testing.T) {
121 wr := FrameWriteRequest{write: streamError(streamID, ErrCodeNo)}
122 if got := wr.StreamID(); got != streamID {
123 t.Errorf("FrameWriteRequest(StreamError) = %v; want %v", got, streamID)