| 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 |