| 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/quic/quic_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_utils.h" | 7 #include "net/quic/quic_utils.h" |
| 8 #include "net/quic/spdy_utils.h" | 8 #include "net/quic/spdy_utils.h" |
| 9 #include "net/quic/test_tools/quic_connection_peer.h" | 9 #include "net/quic/test_tools/quic_connection_peer.h" |
| 10 #include "net/quic/test_tools/quic_session_peer.h" | 10 #include "net/quic/test_tools/quic_session_peer.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 uint32 max_age, | 69 uint32 max_age, |
| 70 uint16 port, | 70 uint16 port, |
| 71 StringPiece protocol_id, | 71 StringPiece protocol_id, |
| 72 StringPiece host, | 72 StringPiece host, |
| 73 StringPiece origin)); | 73 StringPiece origin)); |
| 74 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); | 74 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); |
| 75 }; | 75 }; |
| 76 | 76 |
| 77 // Run all tests with each version, and client or server | 77 // Run all tests with each version, and client or server |
| 78 struct TestParams { | 78 struct TestParams { |
| 79 TestParams(QuicVersion version, bool is_server) | 79 TestParams(QuicVersion version, Perspective perspective) |
| 80 : version(version), is_server(is_server) {} | 80 : version(version), perspective(perspective) {} |
| 81 | 81 |
| 82 friend ostream& operator<<(ostream& os, const TestParams& p) { | 82 friend ostream& operator<<(ostream& os, const TestParams& p) { |
| 83 os << "{ version: " << QuicVersionToString(p.version); | 83 os << "{ version: " << QuicVersionToString(p.version); |
| 84 os << ", is_server: " << p.is_server << " }"; | 84 os << ", perspective: " << p.perspective << " }"; |
| 85 return os; | 85 return os; |
| 86 } | 86 } |
| 87 | 87 |
| 88 QuicVersion version; | 88 QuicVersion version; |
| 89 bool is_server; | 89 Perspective perspective; |
| 90 }; | 90 }; |
| 91 | 91 |
| 92 // Constructs various test permutations. | 92 // Constructs various test permutations. |
| 93 vector<TestParams> GetTestParams() { | 93 vector<TestParams> GetTestParams() { |
| 94 vector<TestParams> params; | 94 vector<TestParams> params; |
| 95 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 95 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 96 for (const QuicVersion version : all_supported_versions) { | 96 for (const QuicVersion version : all_supported_versions) { |
| 97 params.push_back(TestParams(version, false)); | 97 params.push_back(TestParams(version, Perspective::IS_CLIENT)); |
| 98 params.push_back(TestParams(version, true)); | 98 params.push_back(TestParams(version, Perspective::IS_SERVER)); |
| 99 } | 99 } |
| 100 return params; | 100 return params; |
| 101 } | 101 } |
| 102 | 102 |
| 103 class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { | 103 class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
| 104 public: | 104 public: |
| 105 QuicHeadersStreamTest() | 105 QuicHeadersStreamTest() |
| 106 : connection_(new StrictMock<MockConnection>(is_server(), GetVersion())), | 106 : connection_( |
| 107 new StrictMock<MockConnection>(perspective(), GetVersion())), |
| 107 session_(connection_), | 108 session_(connection_), |
| 108 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), | 109 headers_stream_(QuicSessionPeer::GetHeadersStream(&session_)), |
| 109 body_("hello world"), | 110 body_("hello world"), |
| 110 framer_(version() > QUIC_VERSION_23 ? SPDY4 : SPDY3) { | 111 framer_(version() > QUIC_VERSION_23 ? SPDY4 : SPDY3) { |
| 111 headers_[":version"] = "HTTP/1.1"; | 112 headers_[":version"] = "HTTP/1.1"; |
| 112 headers_[":status"] = "200 Ok"; | 113 headers_[":status"] = "200 Ok"; |
| 113 headers_["content-length"] = "11"; | 114 headers_["content-length"] = "11"; |
| 114 framer_.set_visitor(&visitor_); | 115 framer_.set_visitor(&visitor_); |
| 115 EXPECT_EQ(version(), session_.connection()->version()); | 116 EXPECT_EQ(version(), session_.connection()->version()); |
| 116 EXPECT_TRUE(headers_stream_ != nullptr); | 117 EXPECT_TRUE(headers_stream_ != nullptr); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 void CheckHeaders() { | 191 void CheckHeaders() { |
| 191 SpdyHeaderBlock headers; | 192 SpdyHeaderBlock headers; |
| 192 EXPECT_EQ(saved_header_data_.length(), | 193 EXPECT_EQ(saved_header_data_.length(), |
| 193 framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(), | 194 framer_.ParseHeaderBlockInBuffer(saved_header_data_.data(), |
| 194 saved_header_data_.length(), | 195 saved_header_data_.length(), |
| 195 &headers)); | 196 &headers)); |
| 196 EXPECT_EQ(headers_, headers); | 197 EXPECT_EQ(headers_, headers); |
| 197 saved_header_data_.clear(); | 198 saved_header_data_.clear(); |
| 198 } | 199 } |
| 199 | 200 |
| 200 bool is_server() { return GetParam().is_server; } | 201 Perspective perspective() { return GetParam().perspective; } |
| 201 | 202 |
| 202 QuicVersion version() { return GetParam().version; } | 203 QuicVersion version() { return GetParam().version; } |
| 203 | 204 |
| 204 QuicVersionVector GetVersion() { | 205 QuicVersionVector GetVersion() { |
| 205 QuicVersionVector versions; | 206 QuicVersionVector versions; |
| 206 versions.push_back(version()); | 207 versions.push_back(version()); |
| 207 return versions; | 208 return versions; |
| 208 } | 209 } |
| 209 | 210 |
| 210 void CloseConnection() { | 211 void CloseConnection() { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 237 | 238 |
| 238 TEST_P(QuicHeadersStreamTest, EffectivePriority) { | 239 TEST_P(QuicHeadersStreamTest, EffectivePriority) { |
| 239 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); | 240 EXPECT_EQ(0u, headers_stream_->EffectivePriority()); |
| 240 } | 241 } |
| 241 | 242 |
| 242 TEST_P(QuicHeadersStreamTest, WriteHeaders) { | 243 TEST_P(QuicHeadersStreamTest, WriteHeaders) { |
| 243 for (QuicStreamId stream_id = kClientDataStreamId1; | 244 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 244 stream_id < kClientDataStreamId3; stream_id += 2) { | 245 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 245 for (int count = 0; count < 2; ++count) { | 246 for (int count = 0; count < 2; ++count) { |
| 246 bool fin = (count == 0); | 247 bool fin = (count == 0); |
| 247 if (is_server()) { | 248 if (perspective() == Perspective::IS_SERVER) { |
| 248 WriteHeadersAndExpectSynReply(stream_id, fin); | 249 WriteHeadersAndExpectSynReply(stream_id, fin); |
| 249 } else { | 250 } else { |
| 250 for (QuicPriority priority = 0; priority < 7; ++priority) { | 251 for (QuicPriority priority = 0; priority < 7; ++priority) { |
| 251 // TODO(rch): implement priorities correctly. | 252 // TODO(rch): implement priorities correctly. |
| 252 WriteHeadersAndExpectSynStream(stream_id, fin, 0); | 253 WriteHeadersAndExpectSynStream(stream_id, fin, 0); |
| 253 } | 254 } |
| 254 } | 255 } |
| 255 } | 256 } |
| 256 } | 257 } |
| 257 } | 258 } |
| 258 | 259 |
| 259 TEST_P(QuicHeadersStreamTest, ProcessRawData) { | 260 TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
| 260 for (QuicStreamId stream_id = kClientDataStreamId1; | 261 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 261 stream_id < kClientDataStreamId3; stream_id += 2) { | 262 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 262 for (int count = 0; count < 2; ++count) { | 263 for (int count = 0; count < 2; ++count) { |
| 263 bool fin = (count == 0); | 264 bool fin = (count == 0); |
| 264 for (QuicPriority priority = 0; priority < 7; ++priority) { | 265 for (QuicPriority priority = 0; priority < 7; ++priority) { |
| 265 // Replace with "WriteHeadersAndSaveData" | 266 // Replace with "WriteHeadersAndSaveData" |
| 266 scoped_ptr<SpdySerializedFrame> frame; | 267 scoped_ptr<SpdySerializedFrame> frame; |
| 267 if (is_server()) { | 268 if (perspective() == Perspective::IS_SERVER) { |
| 268 if (version() > QUIC_VERSION_23) { | 269 if (version() > QUIC_VERSION_23) { |
| 269 SpdyHeadersIR headers_frame(stream_id); | 270 SpdyHeadersIR headers_frame(stream_id); |
| 270 headers_frame.set_name_value_block(headers_); | 271 headers_frame.set_name_value_block(headers_); |
| 271 headers_frame.set_fin(fin); | 272 headers_frame.set_fin(fin); |
| 272 headers_frame.set_has_priority(true); | 273 headers_frame.set_has_priority(true); |
| 273 frame.reset(framer_.SerializeFrame(headers_frame)); | 274 frame.reset(framer_.SerializeFrame(headers_frame)); |
| 274 } else { | 275 } else { |
| 275 SpdySynStreamIR syn_stream(stream_id); | 276 SpdySynStreamIR syn_stream(stream_id); |
| 276 syn_stream.set_name_value_block(headers_); | 277 syn_stream.set_name_value_block(headers_); |
| 277 syn_stream.set_fin(fin); | 278 syn_stream.set_fin(fin); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 headers_["key0"] = string(1 << 13, '.'); | 312 headers_["key0"] = string(1 << 13, '.'); |
| 312 headers_["key1"] = string(1 << 13, '.'); | 313 headers_["key1"] = string(1 << 13, '.'); |
| 313 headers_["key2"] = string(1 << 13, '.'); | 314 headers_["key2"] = string(1 << 13, '.'); |
| 314 for (QuicStreamId stream_id = kClientDataStreamId1; | 315 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 315 stream_id < kClientDataStreamId3; stream_id += 2) { | 316 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 316 for (int count = 0; count < 2; ++count) { | 317 for (int count = 0; count < 2; ++count) { |
| 317 bool fin = (count == 0); | 318 bool fin = (count == 0); |
| 318 for (QuicPriority priority = 0; priority < 7; ++priority) { | 319 for (QuicPriority priority = 0; priority < 7; ++priority) { |
| 319 // Replace with "WriteHeadersAndSaveData" | 320 // Replace with "WriteHeadersAndSaveData" |
| 320 scoped_ptr<SpdySerializedFrame> frame; | 321 scoped_ptr<SpdySerializedFrame> frame; |
| 321 if (is_server()) { | 322 if (perspective() == Perspective::IS_SERVER) { |
| 322 if (version() > QUIC_VERSION_23) { | 323 if (version() > QUIC_VERSION_23) { |
| 323 SpdyHeadersIR headers_frame(stream_id); | 324 SpdyHeadersIR headers_frame(stream_id); |
| 324 headers_frame.set_name_value_block(headers_); | 325 headers_frame.set_name_value_block(headers_); |
| 325 headers_frame.set_fin(fin); | 326 headers_frame.set_fin(fin); |
| 326 headers_frame.set_has_priority(true); | 327 headers_frame.set_has_priority(true); |
| 327 frame.reset(framer_.SerializeFrame(headers_frame)); | 328 frame.reset(framer_.SerializeFrame(headers_frame)); |
| 328 } else { | 329 } else { |
| 329 SpdySynStreamIR syn_stream(stream_id); | 330 SpdySynStreamIR syn_stream(stream_id); |
| 330 syn_stream.set_name_value_block(headers_); | 331 syn_stream.set_name_value_block(headers_); |
| 331 syn_stream.set_fin(fin); | 332 syn_stream.set_fin(fin); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 } | 458 } |
| 458 | 459 |
| 459 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { | 460 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { |
| 460 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( | 461 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( |
| 461 headers_stream_)); | 462 headers_stream_)); |
| 462 } | 463 } |
| 463 | 464 |
| 464 } // namespace | 465 } // namespace |
| 465 } // namespace test | 466 } // namespace test |
| 466 } // namespace net | 467 } // namespace net |
| OLD | NEW |