Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: net/quic/core/quic_headers_stream_test.cc

Issue 2609493002: Landing Recent QUIC changes until 05:15 PM, Dec 24, 2016 UTC (Closed)
Patch Set: Fix random. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_headers_stream.cc ('k') | net/quic/core/quic_session_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/quic/core/quic_headers_stream.h" 5 #include "net/quic/core/quic_headers_stream.h"
6 6
7 #include <cstdint> 7 #include <cstdint>
8 #include <ostream> 8 #include <ostream>
9 #include <string> 9 #include <string>
10 #include <tuple> 10 #include <tuple>
11 #include <utility> 11 #include <utility>
12 12
13 #include "net/quic/core/quic_bug_tracker.h" 13 #include "net/quic/core/quic_bug_tracker.h"
14 #include "net/quic/core/quic_flags.h" 14 #include "net/quic/core/quic_flags.h"
15 #include "net/quic/core/quic_utils.h" 15 #include "net/quic/core/quic_utils.h"
16 #include "net/quic/core/spdy_utils.h" 16 #include "net/quic/core/spdy_utils.h"
17 #include "net/quic/platform/api/quic_str_cat.h" 17 #include "net/quic/platform/api/quic_str_cat.h"
18 #include "net/quic/test_tools/quic_connection_peer.h" 18 #include "net/quic/test_tools/quic_connection_peer.h"
19 #include "net/quic/test_tools/quic_headers_stream_peer.h"
20 #include "net/quic/test_tools/quic_spdy_session_peer.h" 19 #include "net/quic/test_tools/quic_spdy_session_peer.h"
21 #include "net/quic/test_tools/quic_stream_peer.h" 20 #include "net/quic/test_tools/quic_stream_peer.h"
22 #include "net/quic/test_tools/quic_test_utils.h" 21 #include "net/quic/test_tools/quic_test_utils.h"
23 #include "net/spdy/spdy_alt_svc_wire_format.h" 22 #include "net/spdy/spdy_alt_svc_wire_format.h"
24 #include "net/spdy/spdy_flags.h" 23 #include "net/spdy/spdy_flags.h"
25 #include "net/spdy/spdy_protocol.h" 24 #include "net/spdy/spdy_protocol.h"
26 #include "net/spdy/spdy_test_utils.h" 25 #include "net/spdy/spdy_test_utils.h"
27 #include "net/test/gtest_util.h" 26 #include "net/test/gtest_util.h"
28 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
29 28
30 using base::StringPiece; 29 using base::StringPiece;
31 using std::string; 30 using std::string;
32 using testing::_; 31 using testing::_;
33 using testing::AtLeast; 32 using testing::AtLeast;
34 using testing::HasSubstr; 33 using testing::HasSubstr;
35 using testing::InSequence; 34 using testing::InSequence;
36 using testing::Invoke; 35 using testing::Invoke;
37 using testing::Return; 36 using testing::Return;
38 using testing::StrictMock; 37 using testing::StrictMock;
39 using testing::WithArgs; 38 using testing::WithArgs;
40 39
41 // TODO(bnc): Merge these correctly. 40 // TODO(bnc): Merge these correctly.
42 bool FLAGS_use_http2_frame_decoder_adapter; 41 bool FLAGS_use_http2_frame_decoder_adapter;
43 bool FLAGS_spdy_use_hpack_decoder2; 42 bool FLAGS_spdy_use_hpack_decoder2;
44 bool FLAGS_spdy_framer_use_new_methods4; 43 bool FLAGS_spdy_framer_use_new_methods4;
45 44
46 namespace net { 45 namespace net {
47 namespace test { 46 namespace test {
48 47
49 class MockHpackDebugVisitor : public QuicHeadersStream::HpackDebugVisitor { 48 class MockQuicHpackDebugVisitor : public QuicHpackDebugVisitor {
50 public: 49 public:
51 MockHpackDebugVisitor() : HpackDebugVisitor() {} 50 MockQuicHpackDebugVisitor() : QuicHpackDebugVisitor() {}
52 51
53 MOCK_METHOD1(OnUseEntry, void(QuicTime::Delta elapsed)); 52 MOCK_METHOD1(OnUseEntry, void(QuicTime::Delta elapsed));
54 53
55 private: 54 private:
56 DISALLOW_COPY_AND_ASSIGN(MockHpackDebugVisitor); 55 DISALLOW_COPY_AND_ASSIGN(MockQuicHpackDebugVisitor);
57 }; 56 };
58 57
59 namespace { 58 namespace {
60 59
61 // TODO(ckrasic): this workaround is due to absence of std::initializer_list 60 // TODO(ckrasic): this workaround is due to absence of std::initializer_list
62 const bool kFins[] = {false, true}; 61 const bool kFins[] = {false, true};
63 62
64 class MockVisitor : public SpdyFramerVisitorInterface { 63 class MockVisitor : public SpdyFramerVisitorInterface {
65 public: 64 public:
66 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); 65 MOCK_METHOD1(OnError, void(SpdyFramer* framer));
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 // to construct a decoder adapter. 220 // to construct a decoder adapter.
222 QuicHeadersStreamTest() 221 QuicHeadersStreamTest()
223 : test_params_(GetParam()), 222 : test_params_(GetParam()),
224 connection_(new StrictMock<MockQuicConnection>(&helper_, 223 connection_(new StrictMock<MockQuicConnection>(&helper_,
225 &alarm_factory_, 224 &alarm_factory_,
226 perspective(), 225 perspective(),
227 GetVersion())), 226 GetVersion())),
228 session_(connection_), 227 session_(connection_),
229 headers_stream_(QuicSpdySessionPeer::GetHeadersStream(&session_)), 228 headers_stream_(QuicSpdySessionPeer::GetHeadersStream(&session_)),
230 body_("hello world"), 229 body_("hello world"),
231 hpack_encoder_visitor_(new StrictMock<MockHpackDebugVisitor>), 230 hpack_encoder_visitor_(new StrictMock<MockQuicHpackDebugVisitor>),
232 hpack_decoder_visitor_(new StrictMock<MockHpackDebugVisitor>), 231 hpack_decoder_visitor_(new StrictMock<MockQuicHpackDebugVisitor>),
233 stream_frame_(kHeadersStreamId, /*fin=*/false, /*offset=*/0, ""), 232 stream_frame_(kHeadersStreamId, /*fin=*/false, /*offset=*/0, ""),
234 next_promised_stream_id_(2) { 233 next_promised_stream_id_(2) {
235 headers_[":version"] = "HTTP/1.1"; 234 headers_[":version"] = "HTTP/1.1";
236 headers_[":status"] = "200 Ok"; 235 headers_[":status"] = "200 Ok";
237 headers_["content-length"] = "11"; 236 headers_["content-length"] = "11";
238 framer_ = std::unique_ptr<SpdyFramer>( 237 framer_ = std::unique_ptr<SpdyFramer>(
239 new SpdyFramer(SpdyFramer::ENABLE_COMPRESSION)); 238 new SpdyFramer(SpdyFramer::ENABLE_COMPRESSION));
240 framer_->set_visitor(&visitor_); 239 framer_->set_visitor(&visitor_);
241 EXPECT_EQ(version(), session_.connection()->version()); 240 EXPECT_EQ(version(), session_.connection()->version());
242 EXPECT_TRUE(headers_stream_ != nullptr); 241 EXPECT_TRUE(headers_stream_ != nullptr);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 } 319 }
321 320
322 void WriteHeadersAndCheckData(QuicStreamId stream_id, 321 void WriteHeadersAndCheckData(QuicStreamId stream_id,
323 bool fin, 322 bool fin,
324 SpdyPriority priority, 323 SpdyPriority priority,
325 bool is_request) { 324 bool is_request) {
326 // Write the headers and capture the outgoing data 325 // Write the headers and capture the outgoing data
327 EXPECT_CALL(session_, 326 EXPECT_CALL(session_,
328 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _)) 327 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
329 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); 328 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov)));
330 headers_stream_->WriteHeaders(stream_id, headers_.Clone(), fin, priority, 329 QuicSpdySessionPeer::WriteHeadersImpl(
331 nullptr); 330 &session_, stream_id, headers_.Clone(), fin, priority, nullptr);
332 331
333 // Parse the outgoing data and check that it matches was was written. 332 // Parse the outgoing data and check that it matches was was written.
334 if (is_request) { 333 if (is_request) {
335 EXPECT_CALL(visitor_, 334 EXPECT_CALL(visitor_,
336 OnHeaders(stream_id, kHasPriority, 335 OnHeaders(stream_id, kHasPriority,
337 Spdy3PriorityToHttp2Weight(priority), 336 Spdy3PriorityToHttp2Weight(priority),
338 /*parent_stream_id=*/0, 337 /*parent_stream_id=*/0,
339 /*exclusive=*/false, fin, kFrameComplete)); 338 /*exclusive=*/false, fin, kFrameComplete));
340 } else { 339 } else {
341 EXPECT_CALL(visitor_, 340 EXPECT_CALL(visitor_,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 StrictMock<MockQuicSpdySession> session_; 390 StrictMock<MockQuicSpdySession> session_;
392 QuicHeadersStream* headers_stream_; 391 QuicHeadersStream* headers_stream_;
393 SpdyHeaderBlock headers_; 392 SpdyHeaderBlock headers_;
394 std::unique_ptr<TestHeadersHandler> headers_handler_; 393 std::unique_ptr<TestHeadersHandler> headers_handler_;
395 string body_; 394 string body_;
396 string saved_data_; 395 string saved_data_;
397 string saved_header_data_; 396 string saved_header_data_;
398 string saved_payloads_; 397 string saved_payloads_;
399 std::unique_ptr<SpdyFramer> framer_; 398 std::unique_ptr<SpdyFramer> framer_;
400 StrictMock<MockVisitor> visitor_; 399 StrictMock<MockVisitor> visitor_;
401 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_encoder_visitor_; 400 std::unique_ptr<StrictMock<MockQuicHpackDebugVisitor>> hpack_encoder_visitor_;
402 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_decoder_visitor_; 401 std::unique_ptr<StrictMock<MockQuicHpackDebugVisitor>> hpack_decoder_visitor_;
403 QuicStreamFrame stream_frame_; 402 QuicStreamFrame stream_frame_;
404 QuicStreamId next_promised_stream_id_; 403 QuicStreamId next_promised_stream_id_;
405 }; 404 };
406 405
407 // Run all tests with each version, perspective (client or server), 406 // Run all tests with each version, perspective (client or server),
408 // HTTP/2 and HPACK decoder. 407 // HTTP/2 and HPACK decoder.
409 INSTANTIATE_TEST_CASE_P( 408 INSTANTIATE_TEST_CASE_P(
410 Tests, 409 Tests,
411 QuicHeadersStreamTest, 410 QuicHeadersStreamTest,
412 ::testing::Combine( 411 ::testing::Combine(
(...skipping 26 matching lines...) Expand all
439 438
440 TEST_P(QuicHeadersStreamTest, WritePushPromises) { 439 TEST_P(QuicHeadersStreamTest, WritePushPromises) {
441 for (QuicStreamId stream_id = kClientDataStreamId1; 440 for (QuicStreamId stream_id = kClientDataStreamId1;
442 stream_id < kClientDataStreamId3; stream_id += 2) { 441 stream_id < kClientDataStreamId3; stream_id += 2) {
443 QuicStreamId promised_stream_id = NextPromisedStreamId(); 442 QuicStreamId promised_stream_id = NextPromisedStreamId();
444 if (perspective() == Perspective::IS_SERVER) { 443 if (perspective() == Perspective::IS_SERVER) {
445 // Write the headers and capture the outgoing data 444 // Write the headers and capture the outgoing data
446 EXPECT_CALL(session_, 445 EXPECT_CALL(session_,
447 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _)) 446 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
448 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); 447 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov)));
449 headers_stream_->WritePushPromise(stream_id, promised_stream_id, 448 session_.WritePushPromise(stream_id, promised_stream_id,
450 headers_.Clone()); 449 headers_.Clone());
451 450
452 // Parse the outgoing data and check that it matches was was written. 451 // Parse the outgoing data and check that it matches was was written.
453 EXPECT_CALL(visitor_, 452 EXPECT_CALL(visitor_,
454 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); 453 OnPushPromise(stream_id, promised_stream_id, kFrameComplete));
455 headers_handler_.reset(new TestHeadersHandler); 454 headers_handler_.reset(new TestHeadersHandler);
456 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) 455 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id))
457 .WillOnce(Return(headers_handler_.get())); 456 .WillOnce(Return(headers_handler_.get()));
458 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); 457 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1);
459 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); 458 framer_->ProcessInput(saved_data_.data(), saved_data_.length());
460 EXPECT_FALSE(framer_->HasError()) 459 EXPECT_FALSE(framer_->HasError())
461 << SpdyFramer::ErrorCodeToString(framer_->error_code()); 460 << SpdyFramer::ErrorCodeToString(framer_->error_code());
462 CheckHeaders(); 461 CheckHeaders();
463 saved_data_.clear(); 462 saved_data_.clear();
464 } else { 463 } else {
465 EXPECT_QUIC_BUG(headers_stream_->WritePushPromise( 464 EXPECT_QUIC_BUG(session_.WritePushPromise(stream_id, promised_stream_id,
466 stream_id, promised_stream_id, headers_.Clone()), 465 headers_.Clone()),
467 "Client shouldn't send PUSH_PROMISE"); 466 "Client shouldn't send PUSH_PROMISE");
468 } 467 }
469 } 468 }
470 } 469 }
471 470
472 TEST_P(QuicHeadersStreamTest, ProcessRawData) { 471 TEST_P(QuicHeadersStreamTest, ProcessRawData) {
473 for (QuicStreamId stream_id = kClientDataStreamId1; 472 for (QuicStreamId stream_id = kClientDataStreamId1;
474 stream_id < kClientDataStreamId3; stream_id += 2) { 473 stream_id < kClientDataStreamId3; stream_id += 2) {
475 for (bool fin : {false, true}) { 474 for (bool fin : {false, true}) {
476 for (SpdyPriority priority = 0; priority < 7; ++priority) { 475 for (SpdyPriority priority = 0; priority < 7; ++priority) {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 621
623 for (int stream_num = 9; stream_num >= 0; --stream_num) { 622 for (int stream_num = 9; stream_num >= 0; --stream_num) {
624 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " 623 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset "
625 << stream_frames[stream_num].offset; 624 << stream_frames[stream_num].offset;
626 headers_stream_->OnStreamFrame(stream_frames[stream_num]); 625 headers_stream_->OnStreamFrame(stream_frames[stream_num]);
627 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); 626 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
628 } 627 }
629 } 628 }
630 629
631 TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) { 630 TEST_P(QuicHeadersStreamTest, ProcessLargeRawData) {
632 headers_stream_->set_max_uncompressed_header_bytes(256 * 1024); 631 QuicSpdySessionPeer::SetMaxUncompressedHeaderBytes(&session_, 256 * 1024);
633 // We want to create a frame that is more than the SPDY Framer's max control 632 // We want to create a frame that is more than the SPDY Framer's max control
634 // frame size, which is 16K, but less than the HPACK decoders max decode 633 // frame size, which is 16K, but less than the HPACK decoders max decode
635 // buffer size, which is 32K. 634 // buffer size, which is 32K.
636 headers_["key0"] = string(1 << 13, '.'); 635 headers_["key0"] = string(1 << 13, '.');
637 headers_["key1"] = string(1 << 13, '.'); 636 headers_["key1"] = string(1 << 13, '.');
638 headers_["key2"] = string(1 << 13, '.'); 637 headers_["key2"] = string(1 << 13, '.');
639 for (QuicStreamId stream_id = kClientDataStreamId1; 638 for (QuicStreamId stream_id = kClientDataStreamId1;
640 stream_id < kClientDataStreamId3; stream_id += 2) { 639 stream_id < kClientDataStreamId3; stream_id += 2) {
641 for (bool fin : {false, true}) { 640 for (bool fin : {false, true}) {
642 for (SpdyPriority priority = 0; priority < 7; ++priority) { 641 for (SpdyPriority priority = 0; priority < 7; ++priority) {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 SpdySettingsIR data; 750 SpdySettingsIR data;
752 // Respect supported settings frames SETTINGS_HEADER_TABLE_SIZE, 751 // Respect supported settings frames SETTINGS_HEADER_TABLE_SIZE,
753 // SETTINGS_MAX_HEADER_LIST_SIZE. 752 // SETTINGS_MAX_HEADER_LIST_SIZE.
754 data.AddSetting(SETTINGS_HEADER_TABLE_SIZE, kTestHeaderTableSize); 753 data.AddSetting(SETTINGS_HEADER_TABLE_SIZE, kTestHeaderTableSize);
755 data.AddSetting(SETTINGS_MAX_HEADER_LIST_SIZE, 2000); 754 data.AddSetting(SETTINGS_MAX_HEADER_LIST_SIZE, 2000);
756 SpdySerializedFrame frame(framer_->SerializeFrame(data)); 755 SpdySerializedFrame frame(framer_->SerializeFrame(data));
757 stream_frame_.data_buffer = frame.data(); 756 stream_frame_.data_buffer = frame.data();
758 stream_frame_.data_length = frame.size(); 757 stream_frame_.data_length = frame.size();
759 headers_stream_->OnStreamFrame(stream_frame_); 758 headers_stream_->OnStreamFrame(stream_frame_);
760 EXPECT_EQ(kTestHeaderTableSize, 759 EXPECT_EQ(kTestHeaderTableSize,
761 QuicHeadersStreamPeer::GetSpdyFramer(headers_stream_) 760 QuicSpdySessionPeer::GetSpdyFramer(&session_)
762 .header_encoder_table_size()); 761 .header_encoder_table_size());
763 } 762 }
764 763
765 TEST_P(QuicHeadersStreamTest, RespectHttp2SettingsFrameUnsupportedFields) { 764 TEST_P(QuicHeadersStreamTest, RespectHttp2SettingsFrameUnsupportedFields) {
766 FLAGS_quic_reloadable_flag_quic_respect_http2_settings_frame = true; 765 FLAGS_quic_reloadable_flag_quic_respect_http2_settings_frame = true;
767 FLAGS_quic_reloadable_flag_quic_send_max_header_list_size = true; 766 FLAGS_quic_reloadable_flag_quic_send_max_header_list_size = true;
768 SpdySettingsIR data; 767 SpdySettingsIR data;
769 // Does not support SETTINGS_MAX_CONCURRENT_STREAMS, 768 // Does not support SETTINGS_MAX_CONCURRENT_STREAMS,
770 // SETTINGS_INITIAL_WINDOW_SIZE, SETTINGS_ENABLE_PUSH and 769 // SETTINGS_INITIAL_WINDOW_SIZE, SETTINGS_ENABLE_PUSH and
771 // SETTINGS_MAX_FRAME_SIZE. 770 // SETTINGS_MAX_FRAME_SIZE.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 stream_frame_.data_length = frame.size(); 841 stream_frame_.data_length = frame.size();
843 headers_stream_->OnStreamFrame(stream_frame_); 842 headers_stream_->OnStreamFrame(stream_frame_);
844 } 843 }
845 844
846 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { 845 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) {
847 EXPECT_FALSE(QuicStreamPeer::StreamContributesToConnectionFlowControl( 846 EXPECT_FALSE(QuicStreamPeer::StreamContributesToConnectionFlowControl(
848 headers_stream_)); 847 headers_stream_));
849 } 848 }
850 849
851 TEST_P(QuicHeadersStreamTest, HpackDecoderDebugVisitor) { 850 TEST_P(QuicHeadersStreamTest, HpackDecoderDebugVisitor) {
852 if (FLAGS_use_nested_spdy_framer_decoder) 851 StrictMock<MockQuicHpackDebugVisitor>* hpack_decoder_visitor =
853 return;
854
855 StrictMock<MockHpackDebugVisitor>* hpack_decoder_visitor =
856 hpack_decoder_visitor_.get(); 852 hpack_decoder_visitor_.get();
857 headers_stream_->SetHpackDecoderDebugVisitor( 853 QuicSpdySessionPeer::SetHpackDecoderDebugVisitor(
858 std::move(hpack_decoder_visitor_)); 854 &session_, std::move(hpack_decoder_visitor_));
859 855
860 // Create some headers we expect to generate entries in HPACK's 856 // Create some headers we expect to generate entries in HPACK's
861 // dynamic table, in addition to content-length. 857 // dynamic table, in addition to content-length.
862 headers_["key0"] = string(1 << 1, '.'); 858 headers_["key0"] = string(1 << 1, '.');
863 headers_["key1"] = string(1 << 2, '.'); 859 headers_["key1"] = string(1 << 2, '.');
864 headers_["key2"] = string(1 << 3, '.'); 860 headers_["key2"] = string(1 << 3, '.');
865 { 861 {
866 InSequence seq; 862 InSequence seq;
867 // Number of indexed representations generated in headers below. 863 // Number of indexed representations generated in headers below.
868 for (int i = 1; i < 28; i++) { 864 for (int i = 1; i < 28; i++) {
(...skipping 28 matching lines...) Expand all
897 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); 893 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
898 headers_stream_->OnStreamFrame(stream_frame_); 894 headers_stream_->OnStreamFrame(stream_frame_);
899 stream_frame_.offset += frame.size(); 895 stream_frame_.offset += frame.size();
900 CheckHeaders(); 896 CheckHeaders();
901 } 897 }
902 } 898 }
903 } 899 }
904 } 900 }
905 901
906 TEST_P(QuicHeadersStreamTest, HpackEncoderDebugVisitor) { 902 TEST_P(QuicHeadersStreamTest, HpackEncoderDebugVisitor) {
907 StrictMock<MockHpackDebugVisitor>* hpack_encoder_visitor = 903 StrictMock<MockQuicHpackDebugVisitor>* hpack_encoder_visitor =
908 hpack_encoder_visitor_.get(); 904 hpack_encoder_visitor_.get();
909 headers_stream_->SetHpackEncoderDebugVisitor( 905 QuicSpdySessionPeer::SetHpackEncoderDebugVisitor(
910 std::move(hpack_encoder_visitor_)); 906 &session_, std::move(hpack_encoder_visitor_));
911 907
912 if (perspective() == Perspective::IS_SERVER) { 908 if (perspective() == Perspective::IS_SERVER) {
913 InSequence seq; 909 InSequence seq;
914 for (int i = 1; i < 4; i++) { 910 for (int i = 1; i < 4; i++) {
915 EXPECT_CALL(*hpack_encoder_visitor, 911 EXPECT_CALL(*hpack_encoder_visitor,
916 OnUseEntry(QuicTime::Delta::FromMilliseconds(i))); 912 OnUseEntry(QuicTime::Delta::FromMilliseconds(i)));
917 } 913 }
918 } else { 914 } else {
919 InSequence seq; 915 InSequence seq;
920 for (int i = 1; i < 28; i++) { 916 for (int i = 1; i < 28; i++) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 for (bool use_ack_listener : {true, false}) { 953 for (bool use_ack_listener : {true, false}) {
958 QuicReferenceCountedPointer<ForceHolAckListener> ack_listener; 954 QuicReferenceCountedPointer<ForceHolAckListener> ack_listener;
959 if (use_ack_listener) { 955 if (use_ack_listener) {
960 ack_listener = new ForceHolAckListener(); 956 ack_listener = new ForceHolAckListener();
961 } 957 }
962 EXPECT_CALL(session_, 958 EXPECT_CALL(session_,
963 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _)) 959 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
964 .WillRepeatedly(WithArgs<2, 5>(Invoke( 960 .WillRepeatedly(WithArgs<2, 5>(Invoke(
965 this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener))); 961 this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener)));
966 962
967 QuicConsumedData consumed_data = headers_stream_->WritevStreamData( 963 QuicConsumedData consumed_data = session_.WritevStreamData(
968 id, MakeIOVector(data, &iov), offset, fin, ack_listener); 964 id, MakeIOVector(data, &iov), offset, fin, ack_listener);
969 965
970 EXPECT_EQ(consumed_data.bytes_consumed, data_len); 966 EXPECT_EQ(consumed_data.bytes_consumed, data_len);
971 EXPECT_EQ(consumed_data.fin_consumed, fin); 967 EXPECT_EQ(consumed_data.fin_consumed, fin);
972 // Now process the written data with the SPDY framer, and verify 968 // Now process the written data with the SPDY framer, and verify
973 // that the original data is unchanged. 969 // that the original data is unchanged.
974 EXPECT_CALL(visitor_, OnDataFrameHeader(id, _, _)) 970 EXPECT_CALL(visitor_, OnDataFrameHeader(id, _, _))
975 .Times(AtLeast(kMinDataFrames)); 971 .Times(AtLeast(kMinDataFrames));
976 EXPECT_CALL(visitor_, OnStreamFrameData(id, _, _)) 972 EXPECT_CALL(visitor_, OnStreamFrameData(id, _, _))
977 .WillRepeatedly(WithArgs<1, 2>( 973 .WillRepeatedly(WithArgs<1, 2>(
(...skipping 17 matching lines...) Expand all
995 991
996 TEST_P(QuicHeadersStreamTest, WritevStreamDataFinOnly) { 992 TEST_P(QuicHeadersStreamTest, WritevStreamDataFinOnly) {
997 struct iovec iov; 993 struct iovec iov;
998 string data; 994 string data;
999 995
1000 EXPECT_CALL(session_, 996 EXPECT_CALL(session_,
1001 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _)) 997 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
1002 .WillOnce(WithArgs<2, 5>( 998 .WillOnce(WithArgs<2, 5>(
1003 Invoke(this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener))); 999 Invoke(this, &QuicHeadersStreamTest::SaveIovAndNotifyAckListener)));
1004 1000
1005 QuicConsumedData consumed_data = headers_stream_->WritevStreamData( 1001 QuicConsumedData consumed_data = session_.WritevStreamData(
1006 kClientDataStreamId1, MakeIOVector(data, &iov), 0, true, nullptr); 1002 kClientDataStreamId1, MakeIOVector(data, &iov), 0, true, nullptr);
1007 1003
1008 EXPECT_EQ(consumed_data.bytes_consumed, 0u); 1004 EXPECT_EQ(consumed_data.bytes_consumed, 0u);
1009 EXPECT_EQ(consumed_data.fin_consumed, true); 1005 EXPECT_EQ(consumed_data.fin_consumed, true);
1010 } 1006 }
1011 1007
1012 TEST_P(QuicHeadersStreamTest, WritevStreamDataSendBlocked) { 1008 TEST_P(QuicHeadersStreamTest, WritevStreamDataSendBlocked) {
1013 QuicStreamId id = kClientDataStreamId1; 1009 QuicStreamId id = kClientDataStreamId1;
1014 QuicStreamOffset offset = 0; 1010 QuicStreamOffset offset = 0;
1015 struct iovec iov; 1011 struct iovec iov;
(...skipping 11 matching lines...) Expand all
1027 1023
1028 bool fin = true; 1024 bool fin = true;
1029 // So force the underlying |WritevData| to consume only 1 byte. 1025 // So force the underlying |WritevData| to consume only 1 byte.
1030 // In that case, |WritevStreamData| should consume just one 1026 // In that case, |WritevStreamData| should consume just one
1031 // HTTP/2 data frame's worth of data. 1027 // HTTP/2 data frame's worth of data.
1032 EXPECT_CALL(session_, 1028 EXPECT_CALL(session_,
1033 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _)) 1029 WritevData(headers_stream_, kHeadersStreamId, _, _, false, _))
1034 .WillOnce( 1030 .WillOnce(
1035 WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIovShort))); 1031 WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIovShort)));
1036 1032
1037 QuicConsumedData consumed_data = headers_stream_->WritevStreamData( 1033 QuicConsumedData consumed_data = session_.WritevStreamData(
1038 id, MakeIOVector(data, &iov), offset, fin, nullptr); 1034 id, MakeIOVector(data, &iov), offset, fin, nullptr);
1039 1035
1040 // bytes_consumed is max HTTP/2 data frame size minus the HTTP/2 1036 // bytes_consumed is max HTTP/2 data frame size minus the HTTP/2
1041 // data header size. 1037 // data header size.
1042 EXPECT_EQ(consumed_data.bytes_consumed, 1038 EXPECT_EQ(consumed_data.bytes_consumed,
1043 kSpdyInitialFrameSizeLimit - kDataFrameMinimumSize); 1039 kSpdyInitialFrameSizeLimit - kDataFrameMinimumSize);
1044 EXPECT_EQ(consumed_data.fin_consumed, false); 1040 EXPECT_EQ(consumed_data.fin_consumed, false);
1045 1041
1046 // If session already blocked, then bytes_consumed should be zero. 1042 // If session already blocked, then bytes_consumed should be zero.
1047 consumed_data = headers_stream_->WritevStreamData( 1043 consumed_data = session_.WritevStreamData(id, MakeIOVector(data, &iov),
1048 id, MakeIOVector(data, &iov), offset, fin, nullptr); 1044 offset, fin, nullptr);
1049 1045
1050 EXPECT_EQ(consumed_data.bytes_consumed, 0u); 1046 EXPECT_EQ(consumed_data.bytes_consumed, 0u);
1051 EXPECT_EQ(consumed_data.fin_consumed, false); 1047 EXPECT_EQ(consumed_data.fin_consumed, false);
1052 } 1048 }
1053 1049
1054 } // namespace 1050 } // namespace
1055 } // namespace test 1051 } // namespace test
1056 } // namespace net 1052 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_headers_stream.cc ('k') | net/quic/core/quic_session_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698