cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2018.10.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

h2mux/muxedstream_test.go

92lines · modecode

1package h2mux
2
3import (
4 "bytes"
5 "io"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
11const testWindowSize uint32 = 65535
12const testMaxWindowSize uint32 = testWindowSize << 2
13
14// Only sending WINDOW_UPDATE frame, so sendWindow should never change
15func TestFlowControlSingleStream(t *testing.T) {
16 stream := &MuxedStream{
17 responseHeadersReceived: make(chan struct{}),
18 readBuffer: NewSharedBuffer(),
19 writeBuffer: &bytes.Buffer{},
20 receiveWindow: testWindowSize,
21 receiveWindowCurrentMax: testWindowSize,
22 receiveWindowMax: testMaxWindowSize,
23 sendWindow: testWindowSize,
24 readyList: NewReadyList(),
25 }
26 assert.True(t, stream.consumeReceiveWindow(testWindowSize/2))
27 dataSent := testWindowSize / 2
28 assert.Equal(t, testWindowSize-dataSent, stream.receiveWindow)
29 assert.Equal(t, testWindowSize, stream.receiveWindowCurrentMax)
30 assert.Equal(t, uint32(0), stream.windowUpdate)
31 tempWindowUpdate := stream.windowUpdate
32
33 streamChunk := stream.getChunk()
34 assert.Equal(t, tempWindowUpdate, streamChunk.windowUpdate)
35 assert.Equal(t, testWindowSize-dataSent, stream.receiveWindow)
36 assert.Equal(t, uint32(0), stream.windowUpdate)
37 assert.Equal(t, testWindowSize, stream.sendWindow)
38
39 assert.True(t, stream.consumeReceiveWindow(2))
40 dataSent += 2
41 assert.Equal(t, testWindowSize-dataSent, stream.receiveWindow)
42 assert.Equal(t, testWindowSize<<1, stream.receiveWindowCurrentMax)
43 assert.Equal(t, (testWindowSize<<1)-stream.receiveWindow, stream.windowUpdate)
44 tempWindowUpdate = stream.windowUpdate
45
46 streamChunk = stream.getChunk()
47 assert.Equal(t, tempWindowUpdate, streamChunk.windowUpdate)
48 assert.Equal(t, testWindowSize<<1, stream.receiveWindow)
49 assert.Equal(t, uint32(0), stream.windowUpdate)
50 assert.Equal(t, testWindowSize, stream.sendWindow)
51
52 assert.True(t, stream.consumeReceiveWindow(testWindowSize+10))
53 dataSent = testWindowSize + 10
54 assert.Equal(t, (testWindowSize<<1)-dataSent, stream.receiveWindow)
55 assert.Equal(t, testWindowSize<<2, stream.receiveWindowCurrentMax)
56 assert.Equal(t, (testWindowSize<<2)-stream.receiveWindow, stream.windowUpdate)
57 tempWindowUpdate = stream.windowUpdate
58
59 streamChunk = stream.getChunk()
60 assert.Equal(t, tempWindowUpdate, streamChunk.windowUpdate)
61 assert.Equal(t, testWindowSize<<2, stream.receiveWindow)
62 assert.Equal(t, uint32(0), stream.windowUpdate)
63 assert.Equal(t, testWindowSize, stream.sendWindow)
64
65 assert.False(t, stream.consumeReceiveWindow(testMaxWindowSize+1))
66 assert.Equal(t, testWindowSize<<2, stream.receiveWindow)
67 assert.Equal(t, testMaxWindowSize, stream.receiveWindowCurrentMax)
68}
69
70func TestMuxedStreamEOF(t *testing.T) {
71 for i := 0; i < 4096; i++ {
72 readyList := NewReadyList()
73 stream := &MuxedStream{
74 streamID: 1,
75 readBuffer: NewSharedBuffer(),
76 receiveWindow: 65536,
77 receiveWindowMax: 65536,
78 sendWindow: 65536,
79 readyList: readyList,
80 }
81
82 go func() { stream.Close() }()
83 n, err := stream.Read([]byte{0})
84 assert.Equal(t, io.EOF, err)
85 assert.Equal(t, 0, n)
86 // Write comes after read, because write buffers data before it is flushed. It wouldn't know about EOF
87 // until some time later. Calling read first forces it to know about EOF now.
88 n, err = stream.Write([]byte{1})
89 assert.Equal(t, io.EOF, err)
90 assert.Equal(t, 0, n)
91 }
92}
93