OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/quic/quic_simple_server_stream.h" | 5 #include "net/tools/quic/quic_simple_server_stream.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 using testing::Invoke; | 43 using testing::Invoke; |
44 using testing::InvokeArgument; | 44 using testing::InvokeArgument; |
45 using testing::InSequence; | 45 using testing::InSequence; |
46 using testing::Return; | 46 using testing::Return; |
47 using testing::StrictMock; | 47 using testing::StrictMock; |
48 using testing::WithArgs; | 48 using testing::WithArgs; |
49 | 49 |
50 namespace net { | 50 namespace net { |
51 namespace test { | 51 namespace test { |
52 | 52 |
| 53 size_t kFakeFrameLen = 60; |
| 54 |
53 class QuicSimpleServerStreamPeer : public QuicSimpleServerStream { | 55 class QuicSimpleServerStreamPeer : public QuicSimpleServerStream { |
54 public: | 56 public: |
55 QuicSimpleServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session) | 57 QuicSimpleServerStreamPeer(QuicStreamId stream_id, QuicSpdySession* session) |
56 : QuicSimpleServerStream(stream_id, session) {} | 58 : QuicSimpleServerStream(stream_id, session) {} |
57 | 59 |
58 ~QuicSimpleServerStreamPeer() override{}; | 60 ~QuicSimpleServerStreamPeer() override{}; |
59 | 61 |
60 using QuicSimpleServerStream::SendResponse; | 62 using QuicSimpleServerStream::SendResponse; |
61 using QuicSimpleServerStream::SendErrorResponse; | 63 using QuicSimpleServerStream::SendErrorResponse; |
62 | 64 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 const string& error_details, | 114 const string& error_details, |
113 ConnectionCloseSource source)); | 115 ConnectionCloseSource source)); |
114 MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id)); | 116 MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id)); |
115 MOCK_METHOD6(WritevData, | 117 MOCK_METHOD6(WritevData, |
116 QuicConsumedData(ReliableQuicStream* stream, | 118 QuicConsumedData(ReliableQuicStream* stream, |
117 QuicStreamId id, | 119 QuicStreamId id, |
118 QuicIOVector data, | 120 QuicIOVector data, |
119 QuicStreamOffset offset, | 121 QuicStreamOffset offset, |
120 bool fin, | 122 bool fin, |
121 QuicAckListenerInterface*)); | 123 QuicAckListenerInterface*)); |
122 MOCK_METHOD2(OnStreamHeaders, | 124 MOCK_METHOD4(OnStreamHeaderList, |
123 void(QuicStreamId stream_id, StringPiece headers_data)); | 125 void(QuicStreamId stream_id, |
| 126 bool fin, |
| 127 size_t frame_len, |
| 128 const QuicHeaderList& header_list)); |
124 MOCK_METHOD2(OnStreamHeadersPriority, | 129 MOCK_METHOD2(OnStreamHeadersPriority, |
125 void(QuicStreamId stream_id, SpdyPriority priority)); | 130 void(QuicStreamId stream_id, SpdyPriority priority)); |
126 MOCK_METHOD3(OnStreamHeadersComplete, | |
127 void(QuicStreamId stream_id, bool fin, size_t frame_len)); | |
128 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be | 131 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be |
129 // mocked directly. | 132 // mocked directly. |
130 size_t WriteHeaders( | 133 size_t WriteHeaders( |
131 QuicStreamId id, | 134 QuicStreamId id, |
132 SpdyHeaderBlock headers, | 135 SpdyHeaderBlock headers, |
133 bool fin, | 136 bool fin, |
134 SpdyPriority priority, | 137 SpdyPriority priority, |
135 QuicAckListenerInterface* ack_notifier_delegate) override { | 138 QuicAckListenerInterface* ack_notifier_delegate) override { |
136 return WriteHeadersMock(id, headers, fin, priority, ack_notifier_delegate); | 139 return WriteHeadersMock(id, headers, fin, priority, ack_notifier_delegate); |
137 } | 140 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 QuicRandom::GetInstance(), | 189 QuicRandom::GetInstance(), |
187 ::net::test::CryptoTestUtils::ProofSourceForTesting())), | 190 ::net::test::CryptoTestUtils::ProofSourceForTesting())), |
188 compressed_certs_cache_( | 191 compressed_certs_cache_( |
189 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), | 192 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), |
190 session_(connection_, | 193 session_(connection_, |
191 &session_owner_, | 194 &session_owner_, |
192 &session_helper_, | 195 &session_helper_, |
193 crypto_config_.get(), | 196 crypto_config_.get(), |
194 &compressed_certs_cache_), | 197 &compressed_certs_cache_), |
195 body_("hello world") { | 198 body_("hello world") { |
196 SpdyHeaderBlock request_headers; | 199 header_list_.OnHeaderBlockStart(); |
197 request_headers[":host"] = ""; | 200 header_list_.OnHeader(":authority", "www.google.com"); |
198 request_headers[":authority"] = "www.google.com"; | 201 header_list_.OnHeader(":path", "/"); |
199 request_headers[":path"] = "/"; | 202 header_list_.OnHeader(":method", "POST"); |
200 request_headers[":method"] = "POST"; | 203 header_list_.OnHeader(":version", "HTTP/1.1"); |
201 request_headers[":version"] = "HTTP/1.1"; | 204 header_list_.OnHeader("content-length", "11"); |
202 request_headers["content-length"] = "11"; | 205 header_list_.OnHeaderBlockEnd(128); |
203 | |
204 headers_string_ = | |
205 net::SpdyUtils::SerializeUncompressedHeaders(request_headers); | |
206 | 206 |
207 // New streams rely on having the peer's flow control receive window | 207 // New streams rely on having the peer's flow control receive window |
208 // negotiated in the config. | 208 // negotiated in the config. |
209 session_.config()->SetInitialStreamFlowControlWindowToSend( | 209 session_.config()->SetInitialStreamFlowControlWindowToSend( |
210 kInitialStreamFlowControlWindowForTest); | 210 kInitialStreamFlowControlWindowForTest); |
211 session_.config()->SetInitialSessionFlowControlWindowToSend( | 211 session_.config()->SetInitialSessionFlowControlWindowToSend( |
212 kInitialSessionFlowControlWindowForTest); | 212 kInitialSessionFlowControlWindowForTest); |
213 stream_ = new QuicSimpleServerStreamPeer(::net::test::kClientDataStreamId1, | 213 stream_ = new QuicSimpleServerStreamPeer(::net::test::kClientDataStreamId1, |
214 &session_); | 214 &session_); |
215 // Register stream_ in dynamic_stream_map_ and pass ownership to session_. | 215 // Register stream_ in dynamic_stream_map_ and pass ownership to session_. |
(...skipping 19 matching lines...) Expand all Loading... |
235 MockAlarmFactory alarm_factory_; | 235 MockAlarmFactory alarm_factory_; |
236 StrictMock<MockQuicConnection>* connection_; | 236 StrictMock<MockQuicConnection>* connection_; |
237 StrictMock<MockQuicServerSessionVisitor> session_owner_; | 237 StrictMock<MockQuicServerSessionVisitor> session_owner_; |
238 StrictMock<MockQuicCryptoServerStreamHelper> session_helper_; | 238 StrictMock<MockQuicCryptoServerStreamHelper> session_helper_; |
239 std::unique_ptr<QuicCryptoServerConfig> crypto_config_; | 239 std::unique_ptr<QuicCryptoServerConfig> crypto_config_; |
240 QuicCompressedCertsCache compressed_certs_cache_; | 240 QuicCompressedCertsCache compressed_certs_cache_; |
241 StrictMock<MockQuicSimpleServerSession> session_; | 241 StrictMock<MockQuicSimpleServerSession> session_; |
242 QuicSimpleServerStreamPeer* stream_; // Owned by session_. | 242 QuicSimpleServerStreamPeer* stream_; // Owned by session_. |
243 string headers_string_; | 243 string headers_string_; |
244 string body_; | 244 string body_; |
| 245 QuicHeaderList header_list_; |
245 }; | 246 }; |
246 | 247 |
247 INSTANTIATE_TEST_CASE_P(Tests, | 248 INSTANTIATE_TEST_CASE_P(Tests, |
248 QuicSimpleServerStreamTest, | 249 QuicSimpleServerStreamTest, |
249 ::testing::ValuesIn(AllSupportedVersions())); | 250 ::testing::ValuesIn(AllSupportedVersions())); |
250 | 251 |
251 TEST_P(QuicSimpleServerStreamTest, TestFraming) { | 252 TEST_P(QuicSimpleServerStreamTest, TestFraming) { |
252 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 253 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
253 .Times(AnyNumber()) | 254 .Times(AnyNumber()) |
254 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 255 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
255 stream_->OnStreamHeaders(headers_string_); | 256 stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_); |
256 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | |
257 stream_->OnStreamFrame( | 257 stream_->OnStreamFrame( |
258 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); | 258 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); |
259 EXPECT_EQ("11", StreamHeadersValue("content-length")); | 259 EXPECT_EQ("11", StreamHeadersValue("content-length")); |
260 EXPECT_EQ("/", StreamHeadersValue(":path")); | 260 EXPECT_EQ("/", StreamHeadersValue(":path")); |
261 EXPECT_EQ("POST", StreamHeadersValue(":method")); | 261 EXPECT_EQ("POST", StreamHeadersValue(":method")); |
262 EXPECT_EQ(body_, StreamBody()); | 262 EXPECT_EQ(body_, StreamBody()); |
263 } | 263 } |
264 | 264 |
265 TEST_P(QuicSimpleServerStreamTest, TestFramingOnePacket) { | 265 TEST_P(QuicSimpleServerStreamTest, TestFramingOnePacket) { |
266 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 266 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
267 .Times(AnyNumber()) | 267 .Times(AnyNumber()) |
268 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 268 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
269 | 269 |
270 stream_->OnStreamHeaders(headers_string_); | 270 stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_); |
271 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | |
272 stream_->OnStreamFrame( | 271 stream_->OnStreamFrame( |
273 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); | 272 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); |
274 EXPECT_EQ("11", StreamHeadersValue("content-length")); | 273 EXPECT_EQ("11", StreamHeadersValue("content-length")); |
275 EXPECT_EQ("/", StreamHeadersValue(":path")); | 274 EXPECT_EQ("/", StreamHeadersValue(":path")); |
276 EXPECT_EQ("POST", StreamHeadersValue(":method")); | 275 EXPECT_EQ("POST", StreamHeadersValue(":method")); |
277 EXPECT_EQ(body_, StreamBody()); | 276 EXPECT_EQ(body_, StreamBody()); |
278 } | 277 } |
279 | 278 |
280 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorInStopReading) { | 279 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorInStopReading) { |
281 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 280 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
(...skipping 12 matching lines...) Expand all Loading... |
294 | 293 |
295 TEST_P(QuicSimpleServerStreamTest, TestFramingExtraData) { | 294 TEST_P(QuicSimpleServerStreamTest, TestFramingExtraData) { |
296 string large_body = "hello world!!!!!!"; | 295 string large_body = "hello world!!!!!!"; |
297 | 296 |
298 // We'll automatically write out an error (headers + body) | 297 // We'll automatically write out an error (headers + body) |
299 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); | 298 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
300 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 299 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
301 .WillOnce(Invoke(MockQuicSession::ConsumeAllData)); | 300 .WillOnce(Invoke(MockQuicSession::ConsumeAllData)); |
302 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 301 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
303 | 302 |
304 stream_->OnStreamHeaders(headers_string_); | 303 stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_); |
305 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | |
306 stream_->OnStreamFrame( | 304 stream_->OnStreamFrame( |
307 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); | 305 QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, body_)); |
308 // Content length is still 11. This will register as an error and we won't | 306 // Content length is still 11. This will register as an error and we won't |
309 // accept the bytes. | 307 // accept the bytes. |
310 stream_->OnStreamFrame( | 308 stream_->OnStreamFrame( |
311 QuicStreamFrame(stream_->id(), /*fin=*/true, body_.size(), large_body)); | 309 QuicStreamFrame(stream_->id(), /*fin=*/true, body_.size(), large_body)); |
312 EXPECT_EQ("11", StreamHeadersValue("content-length")); | 310 EXPECT_EQ("11", StreamHeadersValue("content-length")); |
313 EXPECT_EQ("/", StreamHeadersValue(":path")); | 311 EXPECT_EQ("/", StreamHeadersValue(":path")); |
314 EXPECT_EQ("POST", StreamHeadersValue(":method")); | 312 EXPECT_EQ("POST", StreamHeadersValue(":method")); |
315 } | 313 } |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 531 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
534 EXPECT_TRUE(stream_->reading_stopped()); | 532 EXPECT_TRUE(stream_->reading_stopped()); |
535 EXPECT_TRUE(stream_->write_side_closed()); | 533 EXPECT_TRUE(stream_->write_side_closed()); |
536 } | 534 } |
537 | 535 |
538 TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { | 536 TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { |
539 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 537 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
540 | 538 |
541 SpdyHeaderBlock request_headers; | 539 SpdyHeaderBlock request_headers; |
542 // \000 is a way to write the null byte when followed by a literal digit. | 540 // \000 is a way to write the null byte when followed by a literal digit. |
543 request_headers["content-length"] = StringPiece("11\00012", 5); | 541 header_list_.OnHeader("content-length", StringPiece("11\00012", 5)); |
544 | 542 |
545 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 543 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
546 | 544 |
547 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); | 545 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
548 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 546 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
549 .Times(AnyNumber()) | 547 .Times(AnyNumber()) |
550 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 548 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
551 stream_->OnStreamHeaders(headers_string_); | 549 stream_->OnStreamHeaderList(true, kFakeFrameLen, header_list_); |
552 stream_->OnStreamHeadersComplete(true, headers_string_.size()); | |
553 | 550 |
554 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 551 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
555 EXPECT_TRUE(stream_->reading_stopped()); | 552 EXPECT_TRUE(stream_->reading_stopped()); |
556 EXPECT_TRUE(stream_->write_side_closed()); | 553 EXPECT_TRUE(stream_->write_side_closed()); |
557 } | 554 } |
558 | 555 |
559 TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { | 556 TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { |
560 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 557 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
561 | 558 |
562 SpdyHeaderBlock request_headers; | 559 SpdyHeaderBlock request_headers; |
563 // \000 is a way to write the null byte when followed by a literal digit. | 560 // \000 is a way to write the null byte when followed by a literal digit. |
564 request_headers["content-length"] = StringPiece("\00012", 3); | 561 header_list_.OnHeader("content-length", StringPiece("\00012", 3)); |
565 | 562 |
566 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 563 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
567 | 564 |
568 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); | 565 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
569 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 566 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
570 .Times(AnyNumber()) | 567 .Times(AnyNumber()) |
571 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 568 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
572 stream_->OnStreamHeaders(headers_string_); | 569 stream_->OnStreamHeaderList(true, kFakeFrameLen, header_list_); |
573 stream_->OnStreamHeadersComplete(true, headers_string_.size()); | |
574 | 570 |
575 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 571 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
576 EXPECT_TRUE(stream_->reading_stopped()); | 572 EXPECT_TRUE(stream_->reading_stopped()); |
577 EXPECT_TRUE(stream_->write_side_closed()); | 573 EXPECT_TRUE(stream_->write_side_closed()); |
578 } | 574 } |
579 | 575 |
580 TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) { | 576 TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) { |
581 SpdyHeaderBlock request_headers; | 577 SpdyHeaderBlock request_headers; |
582 // \000 is a way to write the null byte when followed by a literal digit. | 578 // \000 is a way to write the null byte when followed by a literal digit. |
583 request_headers["content-length"] = StringPiece("11\00011", 5); | 579 header_list_.OnHeader("content-length", StringPiece("11\00011", 5)); |
584 | 580 |
585 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 581 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
586 | 582 |
587 stream_->OnStreamHeaders(headers_string_); | 583 stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_); |
588 stream_->OnStreamHeadersComplete(false, headers_string_.size()); | |
589 | 584 |
590 EXPECT_EQ(11, QuicSimpleServerStreamPeer::content_length(stream_)); | 585 EXPECT_EQ(11, QuicSimpleServerStreamPeer::content_length(stream_)); |
591 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 586 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); |
592 EXPECT_FALSE(stream_->reading_stopped()); | 587 EXPECT_FALSE(stream_->reading_stopped()); |
593 EXPECT_FALSE(stream_->write_side_closed()); | 588 EXPECT_FALSE(stream_->write_side_closed()); |
594 } | 589 } |
595 | 590 |
596 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { | 591 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { |
597 InSequence s; | 592 InSequence s; |
598 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); | 593 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 }; | 641 }; |
647 StringPiece data(arr, arraysize(arr)); | 642 StringPiece data(arr, arraysize(arr)); |
648 QuicStreamFrame frame(stream_->id(), true, 0, data); | 643 QuicStreamFrame frame(stream_->id(), true, 0, data); |
649 // Verify that we don't crash when we get a invalid headers in stream frame. | 644 // Verify that we don't crash when we get a invalid headers in stream frame. |
650 stream_->OnStreamFrame(frame); | 645 stream_->OnStreamFrame(frame); |
651 } | 646 } |
652 | 647 |
653 } // namespace | 648 } // namespace |
654 } // namespace test | 649 } // namespace test |
655 } // namespace net | 650 } // namespace net |
OLD | NEW |