OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/tools/flip_server/spdy_interface.h" | 5 #include "net/tools/flip_server/spdy_interface.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 const char* data; | 42 const char* data; |
43 size_t size; | 43 size_t size; |
44 std::string string; | 44 std::string string; |
45 }; | 45 }; |
46 | 46 |
47 class SpdyFramerVisitor : public BufferedSpdyFramerVisitorInterface { | 47 class SpdyFramerVisitor : public BufferedSpdyFramerVisitorInterface { |
48 public: | 48 public: |
49 virtual ~SpdyFramerVisitor() {} | 49 virtual ~SpdyFramerVisitor() {} |
50 MOCK_METHOD1(OnError, void(SpdyFramer::SpdyError)); | 50 MOCK_METHOD1(OnError, void(SpdyFramer::SpdyError)); |
51 MOCK_METHOD2(OnStreamError, void(SpdyStreamId, const std::string&)); | 51 MOCK_METHOD2(OnStreamError, void(SpdyStreamId, const std::string&)); |
52 MOCK_METHOD6(OnSynStream, | 52 // SaveArg cannot be used on non-copyable types like SpdyHeaderBlock. |
| 53 void OnSynStream(SpdyStreamId stream_id, |
| 54 SpdyStreamId associated_stream_id, |
| 55 SpdyPriority priority, |
| 56 bool fin, |
| 57 bool unidirectional, |
| 58 const SpdyHeaderBlock& headers) override { |
| 59 actual_header_block_ = headers.Clone(); |
| 60 OnSynStreamMock(stream_id, associated_stream_id, priority, fin, |
| 61 unidirectional, headers); |
| 62 } |
| 63 MOCK_METHOD6(OnSynStreamMock, |
53 void(SpdyStreamId, | 64 void(SpdyStreamId, |
54 SpdyStreamId, | 65 SpdyStreamId, |
55 SpdyPriority, | 66 SpdyPriority, |
56 bool, | 67 bool, |
57 bool, | 68 bool, |
58 const SpdyHeaderBlock&)); | 69 const SpdyHeaderBlock&)); |
59 MOCK_METHOD3(OnSynReply, void(SpdyStreamId, bool, const SpdyHeaderBlock&)); | 70 void OnSynReply(SpdyStreamId stream_id, |
60 MOCK_METHOD7(OnHeaders, | 71 bool fin, |
| 72 const SpdyHeaderBlock& headers) override { |
| 73 actual_header_block_ = headers.Clone(); |
| 74 OnSynReplyMock(stream_id, fin, headers); |
| 75 } |
| 76 MOCK_METHOD3(OnSynReplyMock, |
| 77 void(SpdyStreamId, bool, const SpdyHeaderBlock&)); |
| 78 void OnHeaders(SpdyStreamId stream_id, |
| 79 bool has_priority, |
| 80 int weight, |
| 81 SpdyStreamId parent_stream_id, |
| 82 bool exclusive, |
| 83 bool fin, |
| 84 const SpdyHeaderBlock& headers) override { |
| 85 actual_header_block_ = headers.Clone(); |
| 86 OnHeadersMock(stream_id, has_priority, weight, parent_stream_id, exclusive, |
| 87 fin, headers); |
| 88 } |
| 89 MOCK_METHOD7(OnHeadersMock, |
61 void(SpdyStreamId stream_id, | 90 void(SpdyStreamId stream_id, |
62 bool has_priority, | 91 bool has_priority, |
63 int weight, | 92 int weight, |
64 SpdyStreamId parent_stream_id, | 93 SpdyStreamId parent_stream_id, |
65 bool exclusive, | 94 bool exclusive, |
66 bool fin, | 95 bool fin, |
67 const SpdyHeaderBlock& headers)); | 96 const SpdyHeaderBlock& headers)); |
68 MOCK_METHOD3(OnDataFrameHeader, void(SpdyStreamId, size_t, bool)); | 97 MOCK_METHOD3(OnDataFrameHeader, void(SpdyStreamId, size_t, bool)); |
69 MOCK_METHOD3(OnStreamFrameData, void(SpdyStreamId, const char*, size_t)); | 98 MOCK_METHOD3(OnStreamFrameData, void(SpdyStreamId, const char*, size_t)); |
70 MOCK_METHOD1(OnStreamEnd, void(SpdyStreamId)); | 99 MOCK_METHOD1(OnStreamEnd, void(SpdyStreamId)); |
71 MOCK_METHOD2(OnStreamPadding, void(SpdyStreamId, size_t)); | 100 MOCK_METHOD2(OnStreamPadding, void(SpdyStreamId, size_t)); |
72 MOCK_METHOD1(OnHeaderFrameStart, | 101 MOCK_METHOD1(OnHeaderFrameStart, |
73 SpdyHeadersHandlerInterface*(SpdyStreamId stream_id)); | 102 SpdyHeadersHandlerInterface*(SpdyStreamId stream_id)); |
74 MOCK_METHOD2(OnHeaderFrameEnd, | 103 MOCK_METHOD2(OnHeaderFrameEnd, |
75 void(SpdyStreamId stream_id, bool end_headers)); | 104 void(SpdyStreamId stream_id, bool end_headers)); |
76 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); | 105 MOCK_METHOD1(OnSettings, void(bool clear_persisted)); |
77 MOCK_METHOD3(OnSetting, void(SpdySettingsIds, uint8_t, uint32_t)); | 106 MOCK_METHOD3(OnSetting, void(SpdySettingsIds, uint8_t, uint32_t)); |
78 MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack)); | 107 MOCK_METHOD2(OnPing, void(SpdyPingId unique_id, bool is_ack)); |
79 MOCK_METHOD2(OnRstStream, void(SpdyStreamId, SpdyRstStreamStatus)); | 108 MOCK_METHOD2(OnRstStream, void(SpdyStreamId, SpdyRstStreamStatus)); |
80 MOCK_METHOD3(OnGoAway, void(SpdyStreamId, SpdyGoAwayStatus, StringPiece)); | 109 MOCK_METHOD3(OnGoAway, void(SpdyStreamId, SpdyGoAwayStatus, StringPiece)); |
81 MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId, int)); | 110 MOCK_METHOD2(OnWindowUpdate, void(SpdyStreamId, int)); |
82 MOCK_METHOD3(OnPushPromise, | 111 MOCK_METHOD3(OnPushPromise, |
83 void(SpdyStreamId, SpdyStreamId, const SpdyHeaderBlock&)); | 112 void(SpdyStreamId, SpdyStreamId, const SpdyHeaderBlock&)); |
84 MOCK_METHOD3(OnAltSvc, | 113 MOCK_METHOD3(OnAltSvc, |
85 void(SpdyStreamId, | 114 void(SpdyStreamId, |
86 base::StringPiece, | 115 base::StringPiece, |
87 const SpdyAltSvcWireFormat::AlternativeServiceVector&)); | 116 const SpdyAltSvcWireFormat::AlternativeServiceVector&)); |
88 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); | 117 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); |
| 118 |
| 119 SpdyHeaderBlock actual_header_block_; |
89 }; | 120 }; |
90 | 121 |
91 class FakeSMConnection : public SMConnection { | 122 class FakeSMConnection : public SMConnection { |
92 public: | 123 public: |
93 FakeSMConnection(EpollServer* epoll_server, | 124 FakeSMConnection(EpollServer* epoll_server, |
94 SSLState* ssl_state, | 125 SSLState* ssl_state, |
95 MemoryCache* memory_cache, | 126 MemoryCache* memory_cache, |
96 FlipAcceptor* acceptor, | 127 FlipAcceptor* acceptor, |
97 std::string log_prefix) | 128 std::string log_prefix) |
98 : SMConnection(epoll_server, | 129 : SMConnection(epoll_server, |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 memory_cache_->InsertFile(&headers, filename, ""); | 390 memory_cache_->InsertFile(&headers, filename, ""); |
360 mci.file_data = memory_cache_->GetFileData(filename); | 391 mci.file_data = memory_cache_->GetFileData(filename); |
361 } | 392 } |
362 | 393 |
363 interface_->AddToOutputOrder(mci); | 394 interface_->AddToOutputOrder(mci); |
364 ASSERT_TRUE(HasStream(stream_id)); | 395 ASSERT_TRUE(HasStream(stream_id)); |
365 } | 396 } |
366 | 397 |
367 TEST_P(SpdySMProxyTest, SendErrorNotFound) { | 398 TEST_P(SpdySMProxyTest, SendErrorNotFound) { |
368 uint32_t stream_id = 82; | 399 uint32_t stream_id = 82; |
369 SpdyHeaderBlock actual_header_block; | |
370 const char* actual_data; | 400 const char* actual_data; |
371 size_t actual_size; | 401 size_t actual_size; |
372 testing::MockFunction<void(int)> checkpoint; // NOLINT | 402 testing::MockFunction<void(int)> checkpoint; // NOLINT |
373 | 403 |
374 interface_->SendErrorNotFound(stream_id); | 404 interface_->SendErrorNotFound(stream_id); |
375 | 405 |
376 ASSERT_EQ(2u, connection_->output_list()->size()); | 406 ASSERT_EQ(2u, connection_->output_list()->size()); |
377 | 407 |
378 { | 408 { |
379 InSequence s; | 409 InSequence s; |
380 if (GetParam() < HTTP2) { | 410 if (GetParam() < HTTP2) { |
381 EXPECT_CALL(*spdy_framer_visitor_, | 411 EXPECT_CALL(*spdy_framer_visitor_, OnSynReplyMock(stream_id, false, _)); |
382 OnSynReply(stream_id, false, _)) | |
383 .WillOnce(SaveArg<2>(&actual_header_block)); | |
384 } else { | 412 } else { |
385 EXPECT_CALL(*spdy_framer_visitor_, | 413 EXPECT_CALL(*spdy_framer_visitor_, |
386 OnHeaders(stream_id, /*has_priority=*/false, _, _, _, | 414 OnHeadersMock(stream_id, /*has_priority=*/false, _, _, _, |
387 /*fin=*/false, _)) | 415 /*fin=*/false, _)); |
388 .WillOnce(SaveArg<6>(&actual_header_block)); | |
389 } | 416 } |
390 EXPECT_CALL(checkpoint, Call(0)); | 417 EXPECT_CALL(checkpoint, Call(0)); |
391 EXPECT_CALL(*spdy_framer_visitor_, | 418 EXPECT_CALL(*spdy_framer_visitor_, |
392 OnDataFrameHeader(stream_id, _, true)); | 419 OnDataFrameHeader(stream_id, _, true)); |
393 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, _, _)) | 420 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, _, _)) |
394 .Times(1) | 421 .Times(1) |
395 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); | 422 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); |
396 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, NULL, 0)) | 423 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, NULL, 0)) |
397 .Times(1); | 424 .Times(1); |
398 } | 425 } |
399 | 426 |
400 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 427 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
401 DataFrame* df = *i++; | 428 DataFrame* df = *i++; |
402 spdy_framer_->ProcessInput(df->data, df->size); | 429 spdy_framer_->ProcessInput(df->data, df->size); |
403 checkpoint.Call(0); | 430 checkpoint.Call(0); |
404 df = *i++; | 431 df = *i++; |
405 spdy_framer_->ProcessInput(df->data, df->size); | 432 spdy_framer_->ProcessInput(df->data, df->size); |
406 | 433 |
407 ASSERT_EQ(2, spdy_framer_->frames_received()); | 434 ASSERT_EQ(2, spdy_framer_->frames_received()); |
408 ASSERT_EQ(2u, actual_header_block.size()); | 435 ASSERT_EQ(2u, spdy_framer_visitor_->actual_header_block_.size()); |
409 ASSERT_EQ("404 Not Found", actual_header_block[":status"]); | 436 ASSERT_EQ("404 Not Found", |
410 ASSERT_EQ("HTTP/1.1", actual_header_block[":version"]); | 437 spdy_framer_visitor_->actual_header_block_[":status"]); |
| 438 ASSERT_EQ("HTTP/1.1", spdy_framer_visitor_->actual_header_block_[":version"]); |
411 ASSERT_EQ("wtf?", StringPiece(actual_data, actual_size)); | 439 ASSERT_EQ("wtf?", StringPiece(actual_data, actual_size)); |
412 } | 440 } |
413 | 441 |
414 TEST_P(SpdySMProxyTest, SendSynStream) { | 442 TEST_P(SpdySMProxyTest, SendSynStream) { |
415 uint32_t stream_id = 82; | 443 uint32_t stream_id = 82; |
416 BalsaHeaders headers; | 444 BalsaHeaders headers; |
417 SpdyHeaderBlock actual_header_block; | |
418 headers.AppendHeader("key1", "value1"); | 445 headers.AppendHeader("key1", "value1"); |
419 headers.AppendHeader("Host", "www.example.com"); | 446 headers.AppendHeader("Host", "www.example.com"); |
420 headers.SetRequestFirstlineFromStringPieces("GET", "/path", "HTTP/1.1"); | 447 headers.SetRequestFirstlineFromStringPieces("GET", "/path", "HTTP/1.1"); |
421 | 448 |
422 interface_->SendSynStream(stream_id, headers); | 449 interface_->SendSynStream(stream_id, headers); |
423 | 450 |
424 ASSERT_EQ(1u, connection_->output_list()->size()); | 451 ASSERT_EQ(1u, connection_->output_list()->size()); |
425 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 452 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
426 DataFrame* df = *i++; | 453 DataFrame* df = *i++; |
427 | 454 |
428 { | 455 { |
429 InSequence s; | 456 InSequence s; |
430 EXPECT_CALL(*spdy_framer_visitor_, | 457 EXPECT_CALL(*spdy_framer_visitor_, |
431 OnSynStream(stream_id, 0, _, false, false, _)) | 458 OnSynStreamMock(stream_id, 0, _, false, false, _)); |
432 .WillOnce(SaveArg<5>(&actual_header_block)); | |
433 } | 459 } |
434 | 460 |
435 spdy_framer_->ProcessInput(df->data, df->size); | 461 spdy_framer_->ProcessInput(df->data, df->size); |
436 ASSERT_EQ(1, spdy_framer_->frames_received()); | 462 ASSERT_EQ(1, spdy_framer_->frames_received()); |
437 ASSERT_EQ(5u, actual_header_block.size()); | 463 ASSERT_EQ(5u, spdy_framer_visitor_->actual_header_block_.size()); |
438 ASSERT_EQ("GET", actual_header_block[":method"]); | 464 ASSERT_EQ("GET", spdy_framer_visitor_->actual_header_block_[":method"]); |
439 ASSERT_EQ("HTTP/1.1", actual_header_block[":version"]); | 465 ASSERT_EQ("HTTP/1.1", spdy_framer_visitor_->actual_header_block_[":version"]); |
440 ASSERT_EQ("/path", actual_header_block[":path"]); | 466 ASSERT_EQ("/path", spdy_framer_visitor_->actual_header_block_[":path"]); |
441 ASSERT_EQ("www.example.com", actual_header_block[":host"]); | 467 ASSERT_EQ("www.example.com", |
442 ASSERT_EQ("value1", actual_header_block["key1"]); | 468 spdy_framer_visitor_->actual_header_block_[":host"]); |
| 469 ASSERT_EQ("value1", spdy_framer_visitor_->actual_header_block_["key1"]); |
443 } | 470 } |
444 | 471 |
445 TEST_P(SpdySMProxyTest, SendSynReply) { | 472 TEST_P(SpdySMProxyTest, SendSynReply) { |
446 uint32_t stream_id = 82; | 473 uint32_t stream_id = 82; |
447 BalsaHeaders headers; | 474 BalsaHeaders headers; |
448 SpdyHeaderBlock actual_header_block; | |
449 headers.AppendHeader("key1", "value1"); | 475 headers.AppendHeader("key1", "value1"); |
450 headers.SetResponseFirstlineFromStringPieces("HTTP/1.1", "200", "OK"); | 476 headers.SetResponseFirstlineFromStringPieces("HTTP/1.1", "200", "OK"); |
451 | 477 |
452 interface_->SendSynReply(stream_id, headers); | 478 interface_->SendSynReply(stream_id, headers); |
453 | 479 |
454 ASSERT_EQ(1u, connection_->output_list()->size()); | 480 ASSERT_EQ(1u, connection_->output_list()->size()); |
455 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 481 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
456 DataFrame* df = *i++; | 482 DataFrame* df = *i++; |
457 | 483 |
458 { | 484 { |
459 InSequence s; | 485 InSequence s; |
460 if (GetParam() < HTTP2) { | 486 if (GetParam() < HTTP2) { |
461 EXPECT_CALL(*spdy_framer_visitor_, OnSynReply(stream_id, false, _)) | 487 EXPECT_CALL(*spdy_framer_visitor_, OnSynReplyMock(stream_id, false, _)); |
462 .WillOnce(SaveArg<2>(&actual_header_block)); | |
463 } else { | 488 } else { |
464 EXPECT_CALL(*spdy_framer_visitor_, | 489 EXPECT_CALL(*spdy_framer_visitor_, |
465 OnHeaders(stream_id, /*has_priority=*/false, _, _, _, | 490 OnHeadersMock(stream_id, /*has_priority=*/false, _, _, _, |
466 /*fin=*/false, _)) | 491 /*fin=*/false, _)); |
467 .WillOnce(SaveArg<6>(&actual_header_block)); | |
468 } | 492 } |
469 } | 493 } |
470 | 494 |
471 spdy_framer_->ProcessInput(df->data, df->size); | 495 spdy_framer_->ProcessInput(df->data, df->size); |
472 ASSERT_EQ(1, spdy_framer_->frames_received()); | 496 ASSERT_EQ(1, spdy_framer_->frames_received()); |
473 ASSERT_EQ(3u, actual_header_block.size()); | 497 ASSERT_EQ(3u, spdy_framer_visitor_->actual_header_block_.size()); |
474 ASSERT_EQ("200 OK", actual_header_block[":status"]); | 498 ASSERT_EQ("200 OK", spdy_framer_visitor_->actual_header_block_[":status"]); |
475 ASSERT_EQ("HTTP/1.1", actual_header_block[":version"]); | 499 ASSERT_EQ("HTTP/1.1", spdy_framer_visitor_->actual_header_block_[":version"]); |
476 ASSERT_EQ("value1", actual_header_block["key1"]); | 500 ASSERT_EQ("value1", spdy_framer_visitor_->actual_header_block_["key1"]); |
477 } | 501 } |
478 | 502 |
479 TEST_P(SpdySMProxyTest, SendDataFrame) { | 503 TEST_P(SpdySMProxyTest, SendDataFrame) { |
480 uint32_t stream_id = 133; | 504 uint32_t stream_id = 133; |
481 SpdyDataFlags flags = DATA_FLAG_NONE; | 505 SpdyDataFlags flags = DATA_FLAG_NONE; |
482 const char* actual_data; | 506 const char* actual_data; |
483 size_t actual_size; | 507 size_t actual_size; |
484 | 508 |
485 interface_->SendDataFrame(stream_id, "hello", 5, flags, true); | 509 interface_->SendDataFrame(stream_id, "hello", 5, flags, true); |
486 | 510 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 BalsaHeaders headers; | 588 BalsaHeaders headers; |
565 memory_cache_->InsertFile(&headers, filename, ""); | 589 memory_cache_->InsertFile(&headers, filename, ""); |
566 } | 590 } |
567 | 591 |
568 interface_->NewStream(stream_id, 0, filename); | 592 interface_->NewStream(stream_id, 0, filename); |
569 ASSERT_TRUE(HasStream(stream_id)); | 593 ASSERT_TRUE(HasStream(stream_id)); |
570 } | 594 } |
571 | 595 |
572 TEST_P(SpdySMServerTest, NewStreamError) { | 596 TEST_P(SpdySMServerTest, NewStreamError) { |
573 uint32_t stream_id = 82; | 597 uint32_t stream_id = 82; |
574 SpdyHeaderBlock actual_header_block; | |
575 const char* actual_data; | 598 const char* actual_data; |
576 size_t actual_size; | 599 size_t actual_size; |
577 testing::MockFunction<void(int)> checkpoint; // NOLINT | 600 testing::MockFunction<void(int)> checkpoint; // NOLINT |
578 | 601 |
579 interface_->NewStream(stream_id, 0, "nonexistingfile"); | 602 interface_->NewStream(stream_id, 0, "nonexistingfile"); |
580 | 603 |
581 ASSERT_EQ(2u, connection_->output_list()->size()); | 604 ASSERT_EQ(2u, connection_->output_list()->size()); |
582 | 605 |
583 { | 606 { |
584 InSequence s; | 607 InSequence s; |
585 if (GetParam() < HTTP2) { | 608 if (GetParam() < HTTP2) { |
586 EXPECT_CALL(*spdy_framer_visitor_, OnSynReply(stream_id, false, _)) | 609 EXPECT_CALL(*spdy_framer_visitor_, OnSynReplyMock(stream_id, false, _)); |
587 .WillOnce(SaveArg<2>(&actual_header_block)); | |
588 } else { | 610 } else { |
589 EXPECT_CALL(*spdy_framer_visitor_, | 611 EXPECT_CALL(*spdy_framer_visitor_, |
590 OnHeaders(stream_id, /*has_priority=*/false, _, _, _, | 612 OnHeadersMock(stream_id, /*has_priority=*/false, _, _, _, |
591 /*fin=*/false, _)) | 613 /*fin=*/false, _)); |
592 .WillOnce(SaveArg<6>(&actual_header_block)); | |
593 } | 614 } |
594 EXPECT_CALL(checkpoint, Call(0)); | 615 EXPECT_CALL(checkpoint, Call(0)); |
595 EXPECT_CALL(*spdy_framer_visitor_, | 616 EXPECT_CALL(*spdy_framer_visitor_, |
596 OnDataFrameHeader(stream_id, _, true)); | 617 OnDataFrameHeader(stream_id, _, true)); |
597 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, _, _)) | 618 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, _, _)) |
598 .Times(1) | 619 .Times(1) |
599 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); | 620 .WillOnce(DoAll(SaveArg<1>(&actual_data), SaveArg<2>(&actual_size))); |
600 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, NULL, 0)) | 621 EXPECT_CALL(*spdy_framer_visitor_, OnStreamFrameData(stream_id, NULL, 0)) |
601 .Times(1); | 622 .Times(1); |
602 } | 623 } |
603 | 624 |
604 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 625 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
605 DataFrame* df = *i++; | 626 DataFrame* df = *i++; |
606 spdy_framer_->ProcessInput(df->data, df->size); | 627 spdy_framer_->ProcessInput(df->data, df->size); |
607 checkpoint.Call(0); | 628 checkpoint.Call(0); |
608 df = *i++; | 629 df = *i++; |
609 spdy_framer_->ProcessInput(df->data, df->size); | 630 spdy_framer_->ProcessInput(df->data, df->size); |
610 | 631 |
611 ASSERT_EQ(2, spdy_framer_->frames_received()); | 632 ASSERT_EQ(2, spdy_framer_->frames_received()); |
612 ASSERT_EQ(2u, actual_header_block.size()); | 633 ASSERT_EQ(2u, spdy_framer_visitor_->actual_header_block_.size()); |
613 ASSERT_EQ("404 Not Found", actual_header_block["status"]); | 634 ASSERT_EQ("404 Not Found", |
614 ASSERT_EQ("HTTP/1.1", actual_header_block["version"]); | 635 spdy_framer_visitor_->actual_header_block_["status"]); |
| 636 ASSERT_EQ("HTTP/1.1", spdy_framer_visitor_->actual_header_block_["version"]); |
615 ASSERT_EQ("wtf?", StringPiece(actual_data, actual_size)); | 637 ASSERT_EQ("wtf?", StringPiece(actual_data, actual_size)); |
616 } | 638 } |
617 | 639 |
618 } // namespace | 640 } // namespace |
619 | 641 |
620 } // namespace net | 642 } // namespace net |
OLD | NEW |