| 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_spdy_session_peer.h" | 10 #include "net/quic/test_tools/quic_spdy_session_peer.h" |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 bool end)); | 86 bool end)); |
| 87 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); | 87 MOCK_METHOD2(OnContinuation, void(SpdyStreamId stream_id, bool end)); |
| 88 MOCK_METHOD3(OnAltSvc, | 88 MOCK_METHOD3(OnAltSvc, |
| 89 void(SpdyStreamId stream_id, | 89 void(SpdyStreamId stream_id, |
| 90 StringPiece origin, | 90 StringPiece origin, |
| 91 const SpdyAltSvcWireFormat::AlternativeServiceVector& | 91 const SpdyAltSvcWireFormat::AlternativeServiceVector& |
| 92 altsvc_vector)); | 92 altsvc_vector)); |
| 93 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); | 93 MOCK_METHOD2(OnUnknownFrame, bool(SpdyStreamId stream_id, int frame_type)); |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 // Run all tests with each version, and client or server | 96 // Run all tests with each version, perspective (client or server), |
| 97 // and relevant flag options (false or true) |
| 97 struct TestParams { | 98 struct TestParams { |
| 98 TestParams(QuicVersion version, Perspective perspective) | 99 TestParams(QuicVersion version, |
| 99 : version(version), perspective(perspective) {} | 100 Perspective perspective, |
| 101 bool spdy_on_stream_end) |
| 102 : version(version), |
| 103 perspective(perspective), |
| 104 spdy_on_stream_end(spdy_on_stream_end) {} |
| 100 | 105 |
| 101 friend ostream& operator<<(ostream& os, const TestParams& p) { | 106 friend ostream& operator<<(ostream& os, const TestParams& p) { |
| 102 os << "{ version: " << QuicVersionToString(p.version); | 107 os << "{ version: " << QuicVersionToString(p.version); |
| 103 os << ", perspective: " << p.perspective << " }"; | 108 os << ", perspective: " << p.perspective; |
| 109 os << ", spdy_on_stream_end: " << p.spdy_on_stream_end << " }"; |
| 104 return os; | 110 return os; |
| 105 } | 111 } |
| 106 | 112 |
| 107 QuicVersion version; | 113 QuicVersion version; |
| 108 Perspective perspective; | 114 Perspective perspective; |
| 115 bool spdy_on_stream_end; |
| 109 }; | 116 }; |
| 110 | 117 |
| 111 // Constructs various test permutations. | 118 // Constructs various test permutations. |
| 112 vector<TestParams> GetTestParams() { | 119 vector<TestParams> GetTestParams() { |
| 113 vector<TestParams> params; | 120 vector<TestParams> params; |
| 114 QuicVersionVector all_supported_versions = QuicSupportedVersions(); | 121 QuicVersionVector all_supported_versions = QuicSupportedVersions(); |
| 115 for (const QuicVersion version : all_supported_versions) { | 122 for (const QuicVersion version : all_supported_versions) { |
| 116 params.push_back(TestParams(version, Perspective::IS_CLIENT)); | 123 params.push_back(TestParams(version, Perspective::IS_CLIENT, true)); |
| 117 params.push_back(TestParams(version, Perspective::IS_SERVER)); | 124 params.push_back(TestParams(version, Perspective::IS_SERVER, true)); |
| 125 params.push_back(TestParams(version, Perspective::IS_CLIENT, false)); |
| 126 params.push_back(TestParams(version, Perspective::IS_SERVER, false)); |
| 118 } | 127 } |
| 119 FLAGS_quic_supports_push_promise = true; | 128 FLAGS_quic_supports_push_promise = true; |
| 120 return params; | 129 return params; |
| 121 } | 130 } |
| 122 | 131 |
| 123 class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { | 132 class QuicHeadersStreamTest : public ::testing::TestWithParam<TestParams> { |
| 124 public: | 133 public: |
| 125 QuicHeadersStreamTest() | 134 QuicHeadersStreamTest() |
| 126 : connection_(new StrictMock<MockConnection>(&helper_, | 135 : connection_(new StrictMock<MockConnection>(&helper_, |
| 127 perspective(), | 136 perspective(), |
| 128 GetVersion())), | 137 GetVersion())), |
| 129 session_(connection_), | 138 session_(connection_), |
| 130 headers_stream_(QuicSpdySessionPeer::GetHeadersStream(&session_)), | 139 headers_stream_(QuicSpdySessionPeer::GetHeadersStream(&session_)), |
| 131 body_("hello world"), | 140 body_("hello world"), |
| 132 framer_(HTTP2), | |
| 133 stream_frame_(kHeadersStreamId, /*fin=*/false, /*offset=*/0, ""), | 141 stream_frame_(kHeadersStreamId, /*fin=*/false, /*offset=*/0, ""), |
| 134 next_promised_stream_id_(2) { | 142 next_promised_stream_id_(2) { |
| 135 FLAGS_quic_always_log_bugs_for_tests = true; | 143 FLAGS_quic_always_log_bugs_for_tests = true; |
| 136 headers_[":version"] = "HTTP/1.1"; | 144 headers_[":version"] = "HTTP/1.1"; |
| 137 headers_[":status"] = "200 Ok"; | 145 headers_[":status"] = "200 Ok"; |
| 138 headers_["content-length"] = "11"; | 146 headers_["content-length"] = "11"; |
| 139 framer_.set_visitor(&visitor_); | 147 FLAGS_spdy_on_stream_end = GetParam().spdy_on_stream_end; |
| 148 framer_ = std::unique_ptr<SpdyFramer>(new SpdyFramer(HTTP2)); |
| 149 framer_->set_visitor(&visitor_); |
| 140 EXPECT_EQ(version(), session_.connection()->version()); | 150 EXPECT_EQ(version(), session_.connection()->version()); |
| 141 EXPECT_TRUE(headers_stream_ != nullptr); | 151 EXPECT_TRUE(headers_stream_ != nullptr); |
| 142 VLOG(1) << GetParam(); | 152 VLOG(1) << GetParam(); |
| 143 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 153 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 144 } | 154 } |
| 145 | 155 |
| 146 QuicConsumedData SaveIov(const QuicIOVector& data) { | 156 QuicConsumedData SaveIov(const QuicIOVector& data) { |
| 147 const iovec* iov = data.iov; | 157 const iovec* iov = data.iov; |
| 148 int count = data.iov_count; | 158 int count = data.iov_count; |
| 149 for (int i = 0; i < count; ++i) { | 159 for (int i = 0; i < count; ++i) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 EXPECT_CALL(visitor_, | 200 EXPECT_CALL(visitor_, |
| 191 OnHeaders(stream_id, !kHasPriority, | 201 OnHeaders(stream_id, !kHasPriority, |
| 192 /*priority=*/0, | 202 /*priority=*/0, |
| 193 /*parent_stream_id=*/0, | 203 /*parent_stream_id=*/0, |
| 194 /*exclusive=*/false, fin, kFrameComplete)); | 204 /*exclusive=*/false, fin, kFrameComplete)); |
| 195 } | 205 } |
| 196 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 206 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
| 197 .WillRepeatedly(WithArgs<1, 2>( | 207 .WillRepeatedly(WithArgs<1, 2>( |
| 198 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 208 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
| 199 if (fin) { | 209 if (fin) { |
| 200 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, nullptr, 0, true)); | 210 if (FLAGS_spdy_on_stream_end) { |
| 211 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); |
| 212 } else { |
| 213 EXPECT_CALL(visitor_, OnStreamFrameData(stream_id, nullptr, 0, true)); |
| 214 } |
| 201 } | 215 } |
| 202 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); | 216 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
| 203 EXPECT_FALSE(framer_.HasError()) | 217 EXPECT_FALSE(framer_->HasError()) |
| 204 << SpdyFramer::ErrorCodeToString(framer_.error_code()); | 218 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
| 205 | 219 |
| 206 CheckHeaders(); | 220 CheckHeaders(); |
| 207 saved_data_.clear(); | 221 saved_data_.clear(); |
| 208 } | 222 } |
| 209 | 223 |
| 210 void CheckHeaders() { | 224 void CheckHeaders() { |
| 211 SpdyHeaderBlock headers; | 225 SpdyHeaderBlock headers; |
| 212 EXPECT_TRUE(framer_.ParseHeaderBlockInBuffer( | 226 EXPECT_TRUE(framer_->ParseHeaderBlockInBuffer( |
| 213 saved_header_data_.data(), saved_header_data_.length(), &headers)); | 227 saved_header_data_.data(), saved_header_data_.length(), &headers)); |
| 214 EXPECT_EQ(headers_, headers); | 228 EXPECT_EQ(headers_, headers); |
| 215 saved_header_data_.clear(); | 229 saved_header_data_.clear(); |
| 216 } | 230 } |
| 217 | 231 |
| 218 Perspective perspective() { return GetParam().perspective; } | 232 Perspective perspective() { return GetParam().perspective; } |
| 219 | 233 |
| 220 QuicVersion version() { return GetParam().version; } | 234 QuicVersion version() { return GetParam().version; } |
| 221 | 235 |
| 222 QuicVersionVector GetVersion() { | 236 QuicVersionVector GetVersion() { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 233 static const bool kHasPriority = true; | 247 static const bool kHasPriority = true; |
| 234 | 248 |
| 235 MockConnectionHelper helper_; | 249 MockConnectionHelper helper_; |
| 236 StrictMock<MockConnection>* connection_; | 250 StrictMock<MockConnection>* connection_; |
| 237 StrictMock<MockQuicSpdySession> session_; | 251 StrictMock<MockQuicSpdySession> session_; |
| 238 QuicHeadersStream* headers_stream_; | 252 QuicHeadersStream* headers_stream_; |
| 239 SpdyHeaderBlock headers_; | 253 SpdyHeaderBlock headers_; |
| 240 string body_; | 254 string body_; |
| 241 string saved_data_; | 255 string saved_data_; |
| 242 string saved_header_data_; | 256 string saved_header_data_; |
| 243 SpdyFramer framer_; | 257 std::unique_ptr<SpdyFramer> framer_; |
| 244 StrictMock<MockVisitor> visitor_; | 258 StrictMock<MockVisitor> visitor_; |
| 245 QuicStreamFrame stream_frame_; | 259 QuicStreamFrame stream_frame_; |
| 246 QuicStreamId next_promised_stream_id_; | 260 QuicStreamId next_promised_stream_id_; |
| 247 }; | 261 }; |
| 248 | 262 |
| 249 INSTANTIATE_TEST_CASE_P(Tests, | 263 INSTANTIATE_TEST_CASE_P(Tests, |
| 250 QuicHeadersStreamTest, | 264 QuicHeadersStreamTest, |
| 251 ::testing::ValuesIn(GetTestParams())); | 265 ::testing::ValuesIn(GetTestParams())); |
| 252 | 266 |
| 253 TEST_P(QuicHeadersStreamTest, StreamId) { | 267 TEST_P(QuicHeadersStreamTest, StreamId) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 280 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 294 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
| 281 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, | 295 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
| 282 nullptr); | 296 nullptr); |
| 283 | 297 |
| 284 // Parse the outgoing data and check that it matches was was written. | 298 // Parse the outgoing data and check that it matches was was written. |
| 285 EXPECT_CALL(visitor_, | 299 EXPECT_CALL(visitor_, |
| 286 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); | 300 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
| 287 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 301 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) |
| 288 .WillRepeatedly(WithArgs<1, 2>( | 302 .WillRepeatedly(WithArgs<1, 2>( |
| 289 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 303 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); |
| 290 framer_.ProcessInput(saved_data_.data(), saved_data_.length()); | 304 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
| 291 EXPECT_FALSE(framer_.HasError()) | 305 EXPECT_FALSE(framer_->HasError()) |
| 292 << SpdyFramer::ErrorCodeToString(framer_.error_code()); | 306 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
| 293 CheckHeaders(); | 307 CheckHeaders(); |
| 294 saved_data_.clear(); | 308 saved_data_.clear(); |
| 295 } else { | 309 } else { |
| 296 EXPECT_DFATAL(headers_stream_->WritePushPromise( | 310 EXPECT_DFATAL(headers_stream_->WritePushPromise( |
| 297 stream_id, promised_stream_id, headers_, nullptr), | 311 stream_id, promised_stream_id, headers_, nullptr), |
| 298 "Client shouldn't send PUSH_PROMISE"); | 312 "Client shouldn't send PUSH_PROMISE"); |
| 299 } | 313 } |
| 300 } | 314 } |
| 301 } | 315 } |
| 302 | 316 |
| 303 TEST_P(QuicHeadersStreamTest, ProcessRawData) { | 317 TEST_P(QuicHeadersStreamTest, ProcessRawData) { |
| 304 for (QuicStreamId stream_id = kClientDataStreamId1; | 318 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 305 stream_id < kClientDataStreamId3; stream_id += 2) { | 319 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 306 for (bool fin : {false, true}) { | 320 for (bool fin : {false, true}) { |
| 307 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 321 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
| 308 // Replace with "WriteHeadersAndSaveData" | 322 // Replace with "WriteHeadersAndSaveData" |
| 309 scoped_ptr<SpdySerializedFrame> frame; | 323 scoped_ptr<SpdySerializedFrame> frame; |
| 310 if (perspective() == Perspective::IS_SERVER) { | 324 if (perspective() == Perspective::IS_SERVER) { |
| 311 SpdyHeadersIR headers_frame(stream_id); | 325 SpdyHeadersIR headers_frame(stream_id); |
| 312 headers_frame.set_header_block(headers_); | 326 headers_frame.set_header_block(headers_); |
| 313 headers_frame.set_fin(fin); | 327 headers_frame.set_fin(fin); |
| 314 headers_frame.set_has_priority(true); | 328 headers_frame.set_has_priority(true); |
| 315 frame.reset(framer_.SerializeFrame(headers_frame)); | 329 frame.reset(framer_->SerializeFrame(headers_frame)); |
| 316 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 330 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 317 } else { | 331 } else { |
| 318 SpdyHeadersIR headers_frame(stream_id); | 332 SpdyHeadersIR headers_frame(stream_id); |
| 319 headers_frame.set_header_block(headers_); | 333 headers_frame.set_header_block(headers_); |
| 320 headers_frame.set_fin(fin); | 334 headers_frame.set_fin(fin); |
| 321 frame.reset(framer_.SerializeFrame(headers_frame)); | 335 frame.reset(framer_->SerializeFrame(headers_frame)); |
| 322 } | 336 } |
| 323 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | 337 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) |
| 324 .WillRepeatedly(WithArgs<1>(Invoke( | 338 .WillRepeatedly(WithArgs<1>(Invoke( |
| 325 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 339 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
| 326 EXPECT_CALL(session_, | 340 EXPECT_CALL(session_, |
| 327 OnStreamHeadersComplete(stream_id, fin, frame->size())); | 341 OnStreamHeadersComplete(stream_id, fin, frame->size())); |
| 328 stream_frame_.frame_buffer = frame->data(); | 342 stream_frame_.frame_buffer = frame->data(); |
| 329 stream_frame_.frame_length = frame->size(); | 343 stream_frame_.frame_length = frame->size(); |
| 330 headers_stream_->OnStreamFrame(stream_frame_); | 344 headers_stream_->OnStreamFrame(stream_frame_); |
| 331 stream_frame_.offset += frame->size(); | 345 stream_frame_.offset += frame->size(); |
| 332 CheckHeaders(); | 346 CheckHeaders(); |
| 333 } | 347 } |
| 334 } | 348 } |
| 335 } | 349 } |
| 336 } | 350 } |
| 337 | 351 |
| 338 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 352 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
| 339 if (perspective() == Perspective::IS_SERVER) | 353 if (perspective() == Perspective::IS_SERVER) |
| 340 return; | 354 return; |
| 341 for (QuicStreamId stream_id = kClientDataStreamId1; | 355 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 342 stream_id < kClientDataStreamId3; stream_id += 2) { | 356 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 343 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 357 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
| 344 scoped_ptr<SpdySerializedFrame> frame; | 358 scoped_ptr<SpdySerializedFrame> frame; |
| 345 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); | 359 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
| 346 push_promise.set_header_block(headers_); | 360 push_promise.set_header_block(headers_); |
| 347 frame.reset(framer_.SerializeFrame(push_promise)); | 361 frame.reset(framer_->SerializeFrame(push_promise)); |
| 348 if (perspective() == Perspective::IS_SERVER) { | 362 if (perspective() == Perspective::IS_SERVER) { |
| 349 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( | 363 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
| 350 QUIC_INVALID_HEADERS_STREAM_DATA, | 364 QUIC_INVALID_HEADERS_STREAM_DATA, |
| 351 "PUSH_PROMISE not supported.")) | 365 "PUSH_PROMISE not supported.")) |
| 352 .WillRepeatedly( | 366 .WillRepeatedly( |
| 353 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 367 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 354 } else { | 368 } else { |
| 355 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) | 369 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) |
| 356 .WillRepeatedly(WithArgs<1>( | 370 .WillRepeatedly(WithArgs<1>( |
| 357 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 371 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 374 bool fin = true; | 388 bool fin = true; |
| 375 for (int stream_num = 0; stream_num < 10; stream_num++) { | 389 for (int stream_num = 0; stream_num < 10; stream_num++) { |
| 376 QuicStreamId stream_id = QuicClientDataStreamId(stream_num); | 390 QuicStreamId stream_id = QuicClientDataStreamId(stream_num); |
| 377 // Replace with "WriteHeadersAndSaveData" | 391 // Replace with "WriteHeadersAndSaveData" |
| 378 scoped_ptr<SpdySerializedFrame> frame; | 392 scoped_ptr<SpdySerializedFrame> frame; |
| 379 if (perspective() == Perspective::IS_SERVER) { | 393 if (perspective() == Perspective::IS_SERVER) { |
| 380 SpdyHeadersIR headers_frame(stream_id); | 394 SpdyHeadersIR headers_frame(stream_id); |
| 381 headers_frame.set_header_block(headers_); | 395 headers_frame.set_header_block(headers_); |
| 382 headers_frame.set_fin(fin); | 396 headers_frame.set_fin(fin); |
| 383 headers_frame.set_has_priority(true); | 397 headers_frame.set_has_priority(true); |
| 384 frame.reset(framer_.SerializeFrame(headers_frame)); | 398 frame.reset(framer_->SerializeFrame(headers_frame)); |
| 385 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 399 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 386 } else { | 400 } else { |
| 387 SpdyHeadersIR headers_frame(stream_id); | 401 SpdyHeadersIR headers_frame(stream_id); |
| 388 headers_frame.set_header_block(headers_); | 402 headers_frame.set_header_block(headers_); |
| 389 headers_frame.set_fin(fin); | 403 headers_frame.set_fin(fin); |
| 390 frame.reset(framer_.SerializeFrame(headers_frame)); | 404 frame.reset(framer_->SerializeFrame(headers_frame)); |
| 391 } | 405 } |
| 392 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); | 406 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); |
| 393 EXPECT_CALL(session_, | 407 EXPECT_CALL(session_, |
| 394 OnStreamHeadersComplete(stream_id, fin, frame->size())); | 408 OnStreamHeadersComplete(stream_id, fin, frame->size())); |
| 395 stream_frame_.frame_buffer = frame->data(); | 409 stream_frame_.frame_buffer = frame->data(); |
| 396 stream_frame_.frame_length = frame->size(); | 410 stream_frame_.frame_length = frame->size(); |
| 397 headers_stream_->OnStreamFrame(stream_frame_); | 411 headers_stream_->OnStreamFrame(stream_frame_); |
| 398 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 412 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 399 stream_frame_.offset += frame->size(); | 413 stream_frame_.offset += frame->size(); |
| 400 } | 414 } |
| 401 } | 415 } |
| 402 | 416 |
| 403 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 417 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
| 404 QuicStreamId stream_id; | 418 QuicStreamId stream_id; |
| 405 bool fin = true; | 419 bool fin = true; |
| 406 QuicStreamFrame stream_frames[10]; | 420 QuicStreamFrame stream_frames[10]; |
| 407 scoped_ptr<SpdySerializedFrame> frames[10]; | 421 scoped_ptr<SpdySerializedFrame> frames[10]; |
| 408 // First create all the frames in order | 422 // First create all the frames in order |
| 409 { | 423 { |
| 410 InSequence seq; | 424 InSequence seq; |
| 411 for (int stream_num = 0; stream_num < 10; ++stream_num) { | 425 for (int stream_num = 0; stream_num < 10; ++stream_num) { |
| 412 stream_id = QuicClientDataStreamId(stream_num); | 426 stream_id = QuicClientDataStreamId(stream_num); |
| 413 if (perspective() == Perspective::IS_SERVER) { | 427 if (perspective() == Perspective::IS_SERVER) { |
| 414 SpdyHeadersIR headers_frame(stream_id); | 428 SpdyHeadersIR headers_frame(stream_id); |
| 415 headers_frame.set_header_block(headers_); | 429 headers_frame.set_header_block(headers_); |
| 416 headers_frame.set_fin(fin); | 430 headers_frame.set_fin(fin); |
| 417 headers_frame.set_has_priority(true); | 431 headers_frame.set_has_priority(true); |
| 418 frames[stream_num].reset(framer_.SerializeFrame(headers_frame)); | 432 frames[stream_num].reset(framer_->SerializeFrame(headers_frame)); |
| 419 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)).Times(1); | 433 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)).Times(1); |
| 420 } else { | 434 } else { |
| 421 SpdyHeadersIR headers_frame(stream_id); | 435 SpdyHeadersIR headers_frame(stream_id); |
| 422 headers_frame.set_header_block(headers_); | 436 headers_frame.set_header_block(headers_); |
| 423 headers_frame.set_fin(fin); | 437 headers_frame.set_fin(fin); |
| 424 frames[stream_num].reset(framer_.SerializeFrame(headers_frame)); | 438 frames[stream_num].reset(framer_->SerializeFrame(headers_frame)); |
| 425 } | 439 } |
| 426 stream_frames[stream_num].stream_id = stream_frame_.stream_id; | 440 stream_frames[stream_num].stream_id = stream_frame_.stream_id; |
| 427 stream_frames[stream_num].offset = stream_frame_.offset; | 441 stream_frames[stream_num].offset = stream_frame_.offset; |
| 428 stream_frames[stream_num].frame_buffer = frames[stream_num]->data(); | 442 stream_frames[stream_num].frame_buffer = frames[stream_num]->data(); |
| 429 stream_frames[stream_num].frame_length = frames[stream_num]->size(); | 443 stream_frames[stream_num].frame_length = frames[stream_num]->size(); |
| 430 DVLOG(1) << "make frame for stream " << stream_num << " offset " | 444 DVLOG(1) << "make frame for stream " << stream_num << " offset " |
| 431 << stream_frames[stream_num].offset; | 445 << stream_frames[stream_num].offset; |
| 432 stream_frame_.offset += frames[stream_num]->size(); | 446 stream_frame_.offset += frames[stream_num]->size(); |
| 433 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); | 447 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); |
| 434 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) | 448 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 458 stream_id < kClientDataStreamId3; stream_id += 2) { | 472 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 459 for (bool fin : {false, true}) { | 473 for (bool fin : {false, true}) { |
| 460 for (SpdyPriority priority = 0; priority < 7; ++priority) { | 474 for (SpdyPriority priority = 0; priority < 7; ++priority) { |
| 461 // Replace with "WriteHeadersAndSaveData" | 475 // Replace with "WriteHeadersAndSaveData" |
| 462 scoped_ptr<SpdySerializedFrame> frame; | 476 scoped_ptr<SpdySerializedFrame> frame; |
| 463 if (perspective() == Perspective::IS_SERVER) { | 477 if (perspective() == Perspective::IS_SERVER) { |
| 464 SpdyHeadersIR headers_frame(stream_id); | 478 SpdyHeadersIR headers_frame(stream_id); |
| 465 headers_frame.set_header_block(headers_); | 479 headers_frame.set_header_block(headers_); |
| 466 headers_frame.set_fin(fin); | 480 headers_frame.set_fin(fin); |
| 467 headers_frame.set_has_priority(true); | 481 headers_frame.set_has_priority(true); |
| 468 frame.reset(framer_.SerializeFrame(headers_frame)); | 482 frame.reset(framer_->SerializeFrame(headers_frame)); |
| 469 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 483 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 470 } else { | 484 } else { |
| 471 SpdyHeadersIR headers_frame(stream_id); | 485 SpdyHeadersIR headers_frame(stream_id); |
| 472 headers_frame.set_header_block(headers_); | 486 headers_frame.set_header_block(headers_); |
| 473 headers_frame.set_fin(fin); | 487 headers_frame.set_fin(fin); |
| 474 frame.reset(framer_.SerializeFrame(headers_frame)); | 488 frame.reset(framer_->SerializeFrame(headers_frame)); |
| 475 } | 489 } |
| 476 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | 490 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) |
| 477 .WillRepeatedly(WithArgs<1>(Invoke( | 491 .WillRepeatedly(WithArgs<1>(Invoke( |
| 478 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 492 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); |
| 479 EXPECT_CALL(session_, | 493 EXPECT_CALL(session_, |
| 480 OnStreamHeadersComplete(stream_id, fin, frame->size())); | 494 OnStreamHeadersComplete(stream_id, fin, frame->size())); |
| 481 stream_frame_.frame_buffer = frame->data(); | 495 stream_frame_.frame_buffer = frame->data(); |
| 482 stream_frame_.frame_length = frame->size(); | 496 stream_frame_.frame_length = frame->size(); |
| 483 headers_stream_->OnStreamFrame(stream_frame_); | 497 headers_stream_->OnStreamFrame(stream_frame_); |
| 484 stream_frame_.offset += frame->size(); | 498 stream_frame_.offset += frame->size(); |
| 485 CheckHeaders(); | 499 CheckHeaders(); |
| 486 } | 500 } |
| 487 } | 501 } |
| 488 } | 502 } |
| 489 } | 503 } |
| 490 | 504 |
| 491 TEST_P(QuicHeadersStreamTest, ProcessBadData) { | 505 TEST_P(QuicHeadersStreamTest, ProcessBadData) { |
| 492 const char kBadData[] = "blah blah blah"; | 506 const char kBadData[] = "blah blah blah"; |
| 493 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( | 507 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
| 494 QUIC_INVALID_HEADERS_STREAM_DATA, _)) | 508 QUIC_INVALID_HEADERS_STREAM_DATA, _)) |
| 495 .Times(::testing::AnyNumber()); | 509 .Times(::testing::AnyNumber()); |
| 496 stream_frame_.frame_buffer = kBadData; | 510 stream_frame_.frame_buffer = kBadData; |
| 497 stream_frame_.frame_length = strlen(kBadData); | 511 stream_frame_.frame_length = strlen(kBadData); |
| 498 headers_stream_->OnStreamFrame(stream_frame_); | 512 headers_stream_->OnStreamFrame(stream_frame_); |
| 499 } | 513 } |
| 500 | 514 |
| 501 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { | 515 TEST_P(QuicHeadersStreamTest, ProcessSpdyDataFrame) { |
| 502 SpdyDataIR data(2, ""); | 516 SpdyDataIR data(2, ""); |
| 503 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 517 scoped_ptr<SpdySerializedFrame> frame(framer_->SerializeFrame(data)); |
| 504 EXPECT_CALL(*connection_, | 518 EXPECT_CALL(*connection_, |
| 505 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 519 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 506 "SPDY DATA frame received.")) | 520 "SPDY DATA frame received.")) |
| 507 .WillOnce( | 521 .WillOnce( |
| 508 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 522 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 509 stream_frame_.frame_buffer = frame->data(); | 523 stream_frame_.frame_buffer = frame->data(); |
| 510 stream_frame_.frame_length = frame->size(); | 524 stream_frame_.frame_length = frame->size(); |
| 511 headers_stream_->OnStreamFrame(stream_frame_); | 525 headers_stream_->OnStreamFrame(stream_frame_); |
| 512 } | 526 } |
| 513 | 527 |
| 514 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { | 528 TEST_P(QuicHeadersStreamTest, ProcessSpdyRstStreamFrame) { |
| 515 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR); | 529 SpdyRstStreamIR data(2, RST_STREAM_PROTOCOL_ERROR); |
| 516 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 530 scoped_ptr<SpdySerializedFrame> frame(framer_->SerializeFrame(data)); |
| 517 EXPECT_CALL(*connection_, | 531 EXPECT_CALL(*connection_, |
| 518 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 532 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 519 "SPDY RST_STREAM frame received.")) | 533 "SPDY RST_STREAM frame received.")) |
| 520 .WillOnce( | 534 .WillOnce( |
| 521 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 535 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 522 stream_frame_.frame_buffer = frame->data(); | 536 stream_frame_.frame_buffer = frame->data(); |
| 523 stream_frame_.frame_length = frame->size(); | 537 stream_frame_.frame_length = frame->size(); |
| 524 headers_stream_->OnStreamFrame(stream_frame_); | 538 headers_stream_->OnStreamFrame(stream_frame_); |
| 525 } | 539 } |
| 526 | 540 |
| 527 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { | 541 TEST_P(QuicHeadersStreamTest, ProcessSpdySettingsFrame) { |
| 528 SpdySettingsIR data; | 542 SpdySettingsIR data; |
| 529 data.AddSetting(SETTINGS_HEADER_TABLE_SIZE, true, true, 0); | 543 data.AddSetting(SETTINGS_HEADER_TABLE_SIZE, true, true, 0); |
| 530 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 544 scoped_ptr<SpdySerializedFrame> frame(framer_->SerializeFrame(data)); |
| 531 EXPECT_CALL(*connection_, | 545 EXPECT_CALL(*connection_, |
| 532 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 546 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 533 "SPDY SETTINGS frame received.")) | 547 "SPDY SETTINGS frame received.")) |
| 534 .WillOnce( | 548 .WillOnce( |
| 535 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 549 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 536 stream_frame_.frame_buffer = frame->data(); | 550 stream_frame_.frame_buffer = frame->data(); |
| 537 stream_frame_.frame_length = frame->size(); | 551 stream_frame_.frame_length = frame->size(); |
| 538 headers_stream_->OnStreamFrame(stream_frame_); | 552 headers_stream_->OnStreamFrame(stream_frame_); |
| 539 } | 553 } |
| 540 | 554 |
| 541 TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) { | 555 TEST_P(QuicHeadersStreamTest, ProcessSpdyPingFrame) { |
| 542 SpdyPingIR data(1); | 556 SpdyPingIR data(1); |
| 543 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 557 scoped_ptr<SpdySerializedFrame> frame(framer_->SerializeFrame(data)); |
| 544 EXPECT_CALL(*connection_, | 558 EXPECT_CALL(*connection_, |
| 545 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 559 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 546 "SPDY PING frame received.")) | 560 "SPDY PING frame received.")) |
| 547 .WillOnce( | 561 .WillOnce( |
| 548 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 562 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 549 stream_frame_.frame_buffer = frame->data(); | 563 stream_frame_.frame_buffer = frame->data(); |
| 550 stream_frame_.frame_length = frame->size(); | 564 stream_frame_.frame_length = frame->size(); |
| 551 headers_stream_->OnStreamFrame(stream_frame_); | 565 headers_stream_->OnStreamFrame(stream_frame_); |
| 552 } | 566 } |
| 553 | 567 |
| 554 TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) { | 568 TEST_P(QuicHeadersStreamTest, ProcessSpdyGoAwayFrame) { |
| 555 SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away"); | 569 SpdyGoAwayIR data(1, GOAWAY_PROTOCOL_ERROR, "go away"); |
| 556 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 570 scoped_ptr<SpdySerializedFrame> frame(framer_->SerializeFrame(data)); |
| 557 EXPECT_CALL(*connection_, | 571 EXPECT_CALL(*connection_, |
| 558 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, | 572 SendConnectionCloseWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 559 "SPDY GOAWAY frame received.")) | 573 "SPDY GOAWAY frame received.")) |
| 560 .WillOnce( | 574 .WillOnce( |
| 561 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 575 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 562 stream_frame_.frame_buffer = frame->data(); | 576 stream_frame_.frame_buffer = frame->data(); |
| 563 stream_frame_.frame_length = frame->size(); | 577 stream_frame_.frame_length = frame->size(); |
| 564 headers_stream_->OnStreamFrame(stream_frame_); | 578 headers_stream_->OnStreamFrame(stream_frame_); |
| 565 } | 579 } |
| 566 | 580 |
| 567 TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) { | 581 TEST_P(QuicHeadersStreamTest, ProcessSpdyWindowUpdateFrame) { |
| 568 SpdyWindowUpdateIR data(1, 1); | 582 SpdyWindowUpdateIR data(1, 1); |
| 569 scoped_ptr<SpdySerializedFrame> frame(framer_.SerializeFrame(data)); | 583 scoped_ptr<SpdySerializedFrame> frame(framer_->SerializeFrame(data)); |
| 570 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( | 584 EXPECT_CALL(*connection_, SendConnectionCloseWithDetails( |
| 571 QUIC_INVALID_HEADERS_STREAM_DATA, | 585 QUIC_INVALID_HEADERS_STREAM_DATA, |
| 572 "SPDY WINDOW_UPDATE frame received.")) | 586 "SPDY WINDOW_UPDATE frame received.")) |
| 573 .WillOnce( | 587 .WillOnce( |
| 574 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); | 588 InvokeWithoutArgs(this, &QuicHeadersStreamTest::CloseConnection)); |
| 575 stream_frame_.frame_buffer = frame->data(); | 589 stream_frame_.frame_buffer = frame->data(); |
| 576 stream_frame_.frame_length = frame->size(); | 590 stream_frame_.frame_length = frame->size(); |
| 577 headers_stream_->OnStreamFrame(stream_frame_); | 591 headers_stream_->OnStreamFrame(stream_frame_); |
| 578 } | 592 } |
| 579 | 593 |
| 580 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { | 594 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { |
| 581 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( | 595 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( |
| 582 headers_stream_)); | 596 headers_stream_)); |
| 583 } | 597 } |
| 584 | 598 |
| 585 } // namespace | 599 } // namespace |
| 586 } // namespace test | 600 } // namespace test |
| 587 } // namespace net | 601 } // namespace net |
| OLD | NEW |