18
var HeadersFixture = http.Header{
19
"Url": []string{"http://www.google.com/"},
20
"Method": []string{"get"},
21
"Version": []string{"http/1.1"},
18
24
func TestHeaderParsing(t *testing.T) {
19
headers := http.Header{
20
"Url": []string{"http://www.google.com/"},
21
"Method": []string{"get"},
22
"Version": []string{"http/1.1"},
24
25
var headerValueBlockBuf bytes.Buffer
25
writeHeaderValueBlock(&headerValueBlockBuf, headers)
26
writeHeaderValueBlock(&headerValueBlockBuf, HeadersFixture)
27
27
const bogusStreamId = 1
28
28
newHeaders, err := parseHeaderValueBlock(&headerValueBlockBuf, bogusStreamId)
30
30
t.Fatal("parseHeaderValueBlock:", err)
33
if !reflect.DeepEqual(headers, newHeaders) {
34
t.Fatal("got: ", newHeaders, "\nwant: ", headers)
32
if !reflect.DeepEqual(HeadersFixture, newHeaders) {
33
t.Fatal("got: ", newHeaders, "\nwant: ", HeadersFixture)
38
func TestCreateParseSynStreamFrame(t *testing.T) {
37
func TestCreateParseSynStreamFrameCompressionDisable(t *testing.T) {
39
38
buffer := new(bytes.Buffer)
39
// Fixture framer for no compression test.
41
41
headerCompressionDisabled: true,
49
49
frameType: TypeSynStream,
53
"Url": []string{"http://www.google.com/"},
54
"Method": []string{"get"},
55
"Version": []string{"http/1.1"},
52
Headers: HeadersFixture,
58
54
if err := framer.WriteFrame(&synStreamFrame); err != nil {
59
55
t.Fatal("WriteFrame without compression:", err)
69
65
if !reflect.DeepEqual(synStreamFrame, *parsedSynStreamFrame) {
70
66
t.Fatal("got: ", *parsedSynStreamFrame, "\nwant: ", synStreamFrame)
73
// Test again with compression
75
framer, err = NewFramer(buffer, buffer)
70
func TestCreateParseSynStreamFrameCompressionEnable(t *testing.T) {
71
buffer := new(bytes.Buffer)
72
framer, err := NewFramer(buffer, buffer)
73
synStreamFrame := SynStreamFrame{
74
CFHeader: ControlFrameHeader{
76
frameType: TypeSynStream,
79
Headers: HeadersFixture,
77
82
t.Fatal("Failed to create new framer:", err)
79
84
if err := framer.WriteFrame(&synStreamFrame); err != nil {
80
85
t.Fatal("WriteFrame with compression:", err)
82
frame, err = framer.ReadFrame()
87
frame, err := framer.ReadFrame()
84
89
t.Fatal("ReadFrame with compression:", err)
86
parsedSynStreamFrame, ok = frame.(*SynStreamFrame)
91
parsedSynStreamFrame, ok := frame.(*SynStreamFrame)
88
93
t.Fatal("Parsed incorrect frame type:", frame)
95
func TestCreateParseSynReplyFrame(t *testing.T) {
100
func TestCreateParseSynReplyFrameCompressionDisable(t *testing.T) {
96
101
buffer := new(bytes.Buffer)
97
102
framer := &Framer{
98
103
headerCompressionDisabled: true,
106
111
frameType: TypeSynReply,
109
Headers: http.Header{
110
"Url": []string{"http://www.google.com/"},
111
"Method": []string{"get"},
112
"Version": []string{"http/1.1"},
114
Headers: HeadersFixture,
115
116
if err := framer.WriteFrame(&synReplyFrame); err != nil {
116
117
t.Fatal("WriteFrame without compression:", err)
126
127
if !reflect.DeepEqual(synReplyFrame, *parsedSynReplyFrame) {
127
128
t.Fatal("got: ", *parsedSynReplyFrame, "\nwant: ", synReplyFrame)
130
// Test again with compression
132
framer, err = NewFramer(buffer, buffer)
132
func TestCreateParseSynReplyFrameCompressionEnable(t *testing.T) {
133
buffer := new(bytes.Buffer)
134
framer, err := NewFramer(buffer, buffer)
135
synReplyFrame := SynReplyFrame{
136
CFHeader: ControlFrameHeader{
138
frameType: TypeSynReply,
141
Headers: HeadersFixture,
134
144
t.Fatal("Failed to create new framer:", err)
136
146
if err := framer.WriteFrame(&synReplyFrame); err != nil {
137
147
t.Fatal("WriteFrame with compression:", err)
139
frame, err = framer.ReadFrame()
149
frame, err := framer.ReadFrame()
141
151
t.Fatal("ReadFrame with compression:", err)
143
parsedSynReplyFrame, ok = frame.(*SynReplyFrame)
153
parsedSynReplyFrame, ok := frame.(*SynReplyFrame)
145
155
t.Fatal("Parsed incorrect frame type:", frame)
214
func TestCreateParseNoop(t *testing.T) {
215
buffer := new(bytes.Buffer)
216
framer, err := NewFramer(buffer, buffer)
218
t.Fatal("Failed to create new framer:", err)
220
noopFrame := NoopFrame{
221
CFHeader: ControlFrameHeader{
226
if err := framer.WriteFrame(&noopFrame); err != nil {
227
t.Fatal("WriteFrame:", err)
229
frame, err := framer.ReadFrame()
231
t.Fatal("ReadFrame:", err)
233
parsedNoopFrame, ok := frame.(*NoopFrame)
235
t.Fatal("Parsed incorrect frame type:", frame)
237
if !reflect.DeepEqual(noopFrame, *parsedNoopFrame) {
238
t.Fatal("got: ", *parsedNoopFrame, "\nwant: ", noopFrame)
242
224
func TestCreateParsePing(t *testing.T) {
243
225
buffer := new(bytes.Buffer)
244
226
framer, err := NewFramer(buffer, buffer)
255
237
if err := framer.WriteFrame(&pingFrame); err != nil {
256
238
t.Fatal("WriteFrame:", err)
240
if pingFrame.CFHeader.Flags != 0 {
241
t.Fatal("Incorrect frame type:", pingFrame)
258
243
frame, err := framer.ReadFrame()
260
245
t.Fatal("ReadFrame:", err)
264
249
t.Fatal("Parsed incorrect frame type:", frame)
251
if parsedPingFrame.CFHeader.Flags != 0 {
252
t.Fatal("Parsed incorrect frame type:", parsedPingFrame)
266
254
if !reflect.DeepEqual(pingFrame, *parsedPingFrame) {
267
255
t.Fatal("got: ", *parsedPingFrame, "\nwant: ", pingFrame)
280
268
frameType: TypeGoAway,
282
270
LastGoodStreamId: 31337,
284
273
if err := framer.WriteFrame(&goAwayFrame); err != nil {
285
274
t.Fatal("WriteFrame:", err)
276
if goAwayFrame.CFHeader.Flags != 0 {
277
t.Fatal("Incorrect frame type:", goAwayFrame)
279
if goAwayFrame.CFHeader.length != 8 {
280
t.Fatal("Incorrect frame type:", goAwayFrame)
287
282
frame, err := framer.ReadFrame()
289
284
t.Fatal("ReadFrame:", err)
293
288
t.Fatal("Parsed incorrect frame type:", frame)
290
if parsedGoAwayFrame.CFHeader.Flags != 0 {
291
t.Fatal("Incorrect frame type:", parsedGoAwayFrame)
293
if parsedGoAwayFrame.CFHeader.length != 8 {
294
t.Fatal("Incorrect frame type:", parsedGoAwayFrame)
295
296
if !reflect.DeepEqual(goAwayFrame, *parsedGoAwayFrame) {
296
297
t.Fatal("got: ", *parsedGoAwayFrame, "\nwant: ", goAwayFrame)
315
headersFrame.Headers = http.Header{
316
"Url": []string{"http://www.google.com/"},
317
"Method": []string{"get"},
318
"Version": []string{"http/1.1"},
316
headersFrame.Headers = HeadersFixture
320
317
if err := framer.WriteFrame(&headersFrame); err != nil {
321
318
t.Fatal("WriteFrame without compression:", err)
331
328
if !reflect.DeepEqual(headersFrame, *parsedHeadersFrame) {
332
329
t.Fatal("got: ", *parsedHeadersFrame, "\nwant: ", headersFrame)
335
// Test again with compression
337
framer, err = NewFramer(buffer, buffer)
333
func TestCreateParseHeadersFrameCompressionEnable(t *testing.T) {
334
buffer := new(bytes.Buffer)
335
headersFrame := HeadersFrame{
336
CFHeader: ControlFrameHeader{
338
frameType: TypeHeaders,
342
headersFrame.Headers = HeadersFixture
344
framer, err := NewFramer(buffer, buffer)
338
345
if err := framer.WriteFrame(&headersFrame); err != nil {
339
346
t.Fatal("WriteFrame with compression:", err)
341
frame, err = framer.ReadFrame()
348
frame, err := framer.ReadFrame()
343
350
t.Fatal("ReadFrame with compression:", err)
345
parsedHeadersFrame, ok = frame.(*HeadersFrame)
352
parsedHeadersFrame, ok := frame.(*HeadersFrame)
347
354
t.Fatal("Parsed incorrect frame type:", frame)
361
func TestCreateParseWindowUpdateFrame(t *testing.T) {
362
buffer := new(bytes.Buffer)
363
framer, err := NewFramer(buffer, buffer)
365
t.Fatal("Failed to create new framer:", err)
367
windowUpdateFrame := WindowUpdateFrame{
368
CFHeader: ControlFrameHeader{
370
frameType: TypeWindowUpdate,
375
if err := framer.WriteFrame(&windowUpdateFrame); err != nil {
376
t.Fatal("WriteFrame:", err)
378
if windowUpdateFrame.CFHeader.Flags != 0 {
379
t.Fatal("Incorrect frame type:", windowUpdateFrame)
381
if windowUpdateFrame.CFHeader.length != 8 {
382
t.Fatal("Incorrect frame type:", windowUpdateFrame)
384
frame, err := framer.ReadFrame()
386
t.Fatal("ReadFrame:", err)
388
parsedWindowUpdateFrame, ok := frame.(*WindowUpdateFrame)
390
t.Fatal("Parsed incorrect frame type:", frame)
392
if parsedWindowUpdateFrame.CFHeader.Flags != 0 {
393
t.Fatal("Incorrect frame type:", parsedWindowUpdateFrame)
395
if parsedWindowUpdateFrame.CFHeader.length != 8 {
396
t.Fatal("Incorrect frame type:", parsedWindowUpdateFrame)
398
if !reflect.DeepEqual(windowUpdateFrame, *parsedWindowUpdateFrame) {
399
t.Fatal("got: ", *parsedWindowUpdateFrame, "\nwant: ", windowUpdateFrame)
354
403
func TestCreateParseDataFrame(t *testing.T) {
355
404
buffer := new(bytes.Buffer)
356
405
framer, err := NewFramer(buffer, buffer)
389
438
frameType: TypeHeaders,
392
Headers: http.Header{
393
"Url": []string{"http://www.google.com/"},
394
"Method": []string{"get"},
395
"Version": []string{"http/1.1"},
441
Headers: HeadersFixture,
398
443
if err := framer.WriteFrame(&headersFrame); err != nil {
399
444
t.Fatal("WriteFrame (HEADERS):", err)
401
synStreamFrame := SynStreamFrame{ControlFrameHeader{Version, TypeSynStream, 0, 0}, 2, 0, 0, nil}
402
synStreamFrame.Headers = http.Header{
403
"Url": []string{"http://www.google.com/"},
404
"Method": []string{"get"},
405
"Version": []string{"http/1.1"},
446
synStreamFrame := SynStreamFrame{
454
0, // AssociatedTOStreamID
459
synStreamFrame.Headers = HeadersFixture
407
461
if err := framer.WriteFrame(&synStreamFrame); err != nil {
408
462
t.Fatal("WriteFrame (SYN_STREAM):", err)
451
505
frameType: TypeHeaders,
454
Headers: http.Header{
455
"Url": []string{"http://www.google.com/"},
456
"Method": []string{"get"},
457
"Version": []string{"http/1.1"},
508
Headers: HeadersFixture,
460
510
synStreamFrame := SynStreamFrame{
461
511
CFHeader: ControlFrameHeader{
463
513
frameType: TypeSynStream,
466
Headers: http.Header{
467
"Url": []string{"http://www.google.com/"},
468
"Method": []string{"get"},
469
"Version": []string{"http/1.1"},
516
Headers: HeadersFixture,
473
519
// Start the goroutines to write the frames.
565
613
func TestNoZeroStreamId(t *testing.T) {
614
t.Log("skipping") // TODO: update to work with SPDY3
566
617
for name, f := range streamIdZeroFrames {
567
618
b, err := base64.StdEncoding.DecodeString(f.encoded)