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

Side by Side Diff: net/tools/quic/quic_simple_server_stream_test.cc

Issue 2547583002: Landing Recent QUIC changes until Fri Nov 18 23:21:04 2016 +0000 (Closed)
Patch Set: Remove explicit HTTP/2 enum usage Created 4 years 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/tools/quic/quic_simple_server_stream.cc ('k') | net/tools/quic/quic_simple_server_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 (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
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/string_piece.h" 13 #include "base/strings/string_piece.h"
14 #include "net/quic/core/quic_connection.h" 14 #include "net/quic/core/quic_connection.h"
15 #include "net/quic/core/quic_flags.h" 15 #include "net/quic/core/quic_flags.h"
16 #include "net/quic/core/quic_protocol.h" 16 #include "net/quic/core/quic_packets.h"
17 #include "net/quic/core/quic_utils.h" 17 #include "net/quic/core/quic_utils.h"
18 #include "net/quic/core/spdy_utils.h" 18 #include "net/quic/core/spdy_utils.h"
19 #include "net/quic/platform/api/quic_socket_address.h" 19 #include "net/quic/platform/api/quic_socket_address.h"
20 #include "net/quic/test_tools/crypto_test_utils.h" 20 #include "net/quic/test_tools/crypto_test_utils.h"
21 #include "net/quic/test_tools/quic_stream_peer.h" 21 #include "net/quic/test_tools/quic_stream_peer.h"
22 #include "net/quic/test_tools/quic_test_utils.h" 22 #include "net/quic/test_tools/quic_test_utils.h"
23 #include "net/test/gtest_util.h" 23 #include "net/test/gtest_util.h"
24 #include "net/tools/epoll_server/epoll_server.h" 24 #include "net/tools/epoll_server/epoll_server.h"
25 #include "net/tools/quic/quic_in_memory_cache.h" 25 #include "net/tools/quic/quic_http_response_cache.h"
26 #include "net/tools/quic/quic_simple_server_session.h" 26 #include "net/tools/quic/quic_simple_server_session.h"
27 #include "testing/gmock/include/gmock/gmock.h" 27 #include "testing/gmock/include/gmock/gmock.h"
28 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
29 #include "url/gurl.h" 29 #include "url/gurl.h"
30 30
31 using base::StringPiece; 31 using base::StringPiece;
32 using net::test::MockQuicConnection; 32 using net::test::MockQuicConnection;
33 using net::test::MockQuicConnectionHelper; 33 using net::test::MockQuicConnectionHelper;
34 using net::test::MockQuicSpdySession; 34 using net::test::MockQuicSpdySession;
35 using net::test::QuicStreamPeer; 35 using net::test::QuicStreamPeer;
(...skipping 12 matching lines...) Expand all
48 48
49 namespace net { 49 namespace net {
50 namespace test { 50 namespace test {
51 51
52 size_t kFakeFrameLen = 60; 52 size_t kFakeFrameLen = 60;
53 53
54 class QuicSimpleServerStreamPeer : public QuicSimpleServerStream { 54 class QuicSimpleServerStreamPeer : public QuicSimpleServerStream {
55 public: 55 public:
56 QuicSimpleServerStreamPeer(QuicStreamId stream_id, 56 QuicSimpleServerStreamPeer(QuicStreamId stream_id,
57 QuicSpdySession* session, 57 QuicSpdySession* session,
58 QuicInMemoryCache* in_memory_cache) 58 QuicHttpResponseCache* response_cache)
59 : QuicSimpleServerStream(stream_id, session, in_memory_cache) {} 59 : QuicSimpleServerStream(stream_id, session, response_cache) {}
60 60
61 ~QuicSimpleServerStreamPeer() override{}; 61 ~QuicSimpleServerStreamPeer() override{};
62 62
63 using QuicSimpleServerStream::SendResponse; 63 using QuicSimpleServerStream::SendResponse;
64 using QuicSimpleServerStream::SendErrorResponse; 64 using QuicSimpleServerStream::SendErrorResponse;
65 65
66 SpdyHeaderBlock* mutable_headers() { return &request_headers_; } 66 SpdyHeaderBlock* mutable_headers() { return &request_headers_; }
67 67
68 static void SendResponse(QuicSimpleServerStream* stream) { 68 static void SendResponse(QuicSimpleServerStream* stream) {
69 stream->SendResponse(); 69 stream->SendResponse();
(...skipping 19 matching lines...) Expand all
89 class MockQuicSimpleServerSession : public QuicSimpleServerSession { 89 class MockQuicSimpleServerSession : public QuicSimpleServerSession {
90 public: 90 public:
91 const size_t kMaxStreamsForTest = 100; 91 const size_t kMaxStreamsForTest = 100;
92 92
93 explicit MockQuicSimpleServerSession( 93 explicit MockQuicSimpleServerSession(
94 QuicConnection* connection, 94 QuicConnection* connection,
95 MockQuicSessionVisitor* owner, 95 MockQuicSessionVisitor* owner,
96 MockQuicCryptoServerStreamHelper* helper, 96 MockQuicCryptoServerStreamHelper* helper,
97 QuicCryptoServerConfig* crypto_config, 97 QuicCryptoServerConfig* crypto_config,
98 QuicCompressedCertsCache* compressed_certs_cache, 98 QuicCompressedCertsCache* compressed_certs_cache,
99 QuicInMemoryCache* in_memory_cache) 99 QuicHttpResponseCache* response_cache)
100 : QuicSimpleServerSession(DefaultQuicConfig(), 100 : QuicSimpleServerSession(DefaultQuicConfig(),
101 connection, 101 connection,
102 owner, 102 owner,
103 helper, 103 helper,
104 crypto_config, 104 crypto_config,
105 compressed_certs_cache, 105 compressed_certs_cache,
106 in_memory_cache) { 106 response_cache) {
107 set_max_open_incoming_streams(kMaxStreamsForTest); 107 set_max_open_incoming_streams(kMaxStreamsForTest);
108 set_max_open_outgoing_streams(kMaxStreamsForTest); 108 set_max_open_outgoing_streams(kMaxStreamsForTest);
109 ON_CALL(*this, WritevData(_, _, _, _, _, _)) 109 ON_CALL(*this, WritevData(_, _, _, _, _, _))
110 .WillByDefault(testing::Return(QuicConsumedData(0, false))); 110 .WillByDefault(testing::Return(QuicConsumedData(0, false)));
111 } 111 }
112 112
113 ~MockQuicSimpleServerSession() override {} 113 ~MockQuicSimpleServerSession() override {}
114 114
115 MOCK_METHOD3(OnConnectionClosed, 115 MOCK_METHOD3(OnConnectionClosed,
116 void(QuicErrorCode error, 116 void(QuicErrorCode error,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 SpdyPriority priority, 148 SpdyPriority priority,
149 QuicAckListenerInterface* ack_notifier_delegate)); 149 QuicAckListenerInterface* ack_notifier_delegate));
150 MOCK_METHOD3(SendRstStream, 150 MOCK_METHOD3(SendRstStream,
151 void(QuicStreamId stream_id, 151 void(QuicStreamId stream_id,
152 QuicRstStreamErrorCode error, 152 QuicRstStreamErrorCode error,
153 QuicStreamOffset bytes_written)); 153 QuicStreamOffset bytes_written));
154 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); 154 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta));
155 // Matchers cannot be used on non-copyable types like SpdyHeaderBlock. 155 // Matchers cannot be used on non-copyable types like SpdyHeaderBlock.
156 void PromisePushResources( 156 void PromisePushResources(
157 const string& request_url, 157 const string& request_url,
158 const std::list<QuicInMemoryCache::ServerPushInfo>& resources, 158 const std::list<QuicHttpResponseCache::ServerPushInfo>& resources,
159 QuicStreamId original_stream_id, 159 QuicStreamId original_stream_id,
160 const SpdyHeaderBlock& original_request_headers) override { 160 const SpdyHeaderBlock& original_request_headers) override {
161 original_request_headers_ = original_request_headers.Clone(); 161 original_request_headers_ = original_request_headers.Clone();
162 PromisePushResourcesMock(request_url, resources, original_stream_id, 162 PromisePushResourcesMock(request_url, resources, original_stream_id,
163 original_request_headers); 163 original_request_headers);
164 } 164 }
165 MOCK_METHOD4(PromisePushResourcesMock, 165 MOCK_METHOD4(PromisePushResourcesMock,
166 void(const string&, 166 void(const string&,
167 const std::list<QuicInMemoryCache::ServerPushInfo>&, 167 const std::list<QuicHttpResponseCache::ServerPushInfo>&,
168 QuicStreamId, 168 QuicStreamId,
169 const SpdyHeaderBlock&)); 169 const SpdyHeaderBlock&));
170 170
171 using QuicSession::ActivateStream; 171 using QuicSession::ActivateStream;
172 172
173 SpdyHeaderBlock original_request_headers_; 173 SpdyHeaderBlock original_request_headers_;
174 174
175 private: 175 private:
176 DISALLOW_COPY_AND_ASSIGN(MockQuicSimpleServerSession); 176 DISALLOW_COPY_AND_ASSIGN(MockQuicSimpleServerSession);
177 }; 177 };
(...skipping 13 matching lines...) Expand all
191 QuicCryptoServerConfig::TESTING, 191 QuicCryptoServerConfig::TESTING,
192 QuicRandom::GetInstance(), 192 QuicRandom::GetInstance(),
193 ::net::test::CryptoTestUtils::ProofSourceForTesting())), 193 ::net::test::CryptoTestUtils::ProofSourceForTesting())),
194 compressed_certs_cache_( 194 compressed_certs_cache_(
195 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize), 195 QuicCompressedCertsCache::kQuicCompressedCertsCacheSize),
196 session_(connection_, 196 session_(connection_,
197 &session_owner_, 197 &session_owner_,
198 &session_helper_, 198 &session_helper_,
199 crypto_config_.get(), 199 crypto_config_.get(),
200 &compressed_certs_cache_, 200 &compressed_certs_cache_,
201 &in_memory_cache_), 201 &response_cache_),
202 body_("hello world") { 202 body_("hello world") {
203 header_list_.OnHeaderBlockStart(); 203 header_list_.OnHeaderBlockStart();
204 header_list_.OnHeader(":authority", "www.google.com"); 204 header_list_.OnHeader(":authority", "www.google.com");
205 header_list_.OnHeader(":path", "/"); 205 header_list_.OnHeader(":path", "/");
206 header_list_.OnHeader(":method", "POST"); 206 header_list_.OnHeader(":method", "POST");
207 header_list_.OnHeader(":version", "HTTP/1.1"); 207 header_list_.OnHeader(":version", "HTTP/1.1");
208 header_list_.OnHeader("content-length", "11"); 208 header_list_.OnHeader("content-length", "11");
209 header_list_.OnHeaderBlockEnd(128); 209 header_list_.OnHeaderBlockEnd(128);
210 210
211 // New streams rely on having the peer's flow control receive window 211 // New streams rely on having the peer's flow control receive window
212 // negotiated in the config. 212 // negotiated in the config.
213 session_.config()->SetInitialStreamFlowControlWindowToSend( 213 session_.config()->SetInitialStreamFlowControlWindowToSend(
214 kInitialStreamFlowControlWindowForTest); 214 kInitialStreamFlowControlWindowForTest);
215 session_.config()->SetInitialSessionFlowControlWindowToSend( 215 session_.config()->SetInitialSessionFlowControlWindowToSend(
216 kInitialSessionFlowControlWindowForTest); 216 kInitialSessionFlowControlWindowForTest);
217 stream_ = new QuicSimpleServerStreamPeer(::net::test::kClientDataStreamId1, 217 stream_ = new QuicSimpleServerStreamPeer(::net::test::kClientDataStreamId1,
218 &session_, &in_memory_cache_); 218 &session_, &response_cache_);
219 // Register stream_ in dynamic_stream_map_ and pass ownership to session_. 219 // Register stream_ in dynamic_stream_map_ and pass ownership to session_.
220 session_.ActivateStream(base::WrapUnique(stream_)); 220 session_.ActivateStream(base::WrapUnique(stream_));
221 } 221 }
222 222
223 const string& StreamBody() { 223 const string& StreamBody() {
224 return QuicSimpleServerStreamPeer::body(stream_); 224 return QuicSimpleServerStreamPeer::body(stream_);
225 } 225 }
226 226
227 string StreamHeadersValue(const string& key) { 227 string StreamHeadersValue(const string& key) {
228 return (*stream_->mutable_headers())[key].as_string(); 228 return (*stream_->mutable_headers())[key].as_string();
229 } 229 }
230 230
231 SpdyHeaderBlock response_headers_; 231 SpdyHeaderBlock response_headers_;
232 MockQuicConnectionHelper helper_; 232 MockQuicConnectionHelper helper_;
233 MockAlarmFactory alarm_factory_; 233 MockAlarmFactory alarm_factory_;
234 StrictMock<MockQuicConnection>* connection_; 234 StrictMock<MockQuicConnection>* connection_;
235 StrictMock<MockQuicSessionVisitor> session_owner_; 235 StrictMock<MockQuicSessionVisitor> session_owner_;
236 StrictMock<MockQuicCryptoServerStreamHelper> session_helper_; 236 StrictMock<MockQuicCryptoServerStreamHelper> session_helper_;
237 std::unique_ptr<QuicCryptoServerConfig> crypto_config_; 237 std::unique_ptr<QuicCryptoServerConfig> crypto_config_;
238 QuicCompressedCertsCache compressed_certs_cache_; 238 QuicCompressedCertsCache compressed_certs_cache_;
239 QuicInMemoryCache in_memory_cache_; 239 QuicHttpResponseCache response_cache_;
240 StrictMock<MockQuicSimpleServerSession> session_; 240 StrictMock<MockQuicSimpleServerSession> session_;
241 QuicSimpleServerStreamPeer* stream_; // Owned by session_. 241 QuicSimpleServerStreamPeer* stream_; // Owned by session_.
242 string headers_string_; 242 string headers_string_;
243 string body_; 243 string body_;
244 QuicHeaderList header_list_; 244 QuicHeaderList header_list_;
245 }; 245 };
246 246
247 INSTANTIATE_TEST_CASE_P(Tests, 247 INSTANTIATE_TEST_CASE_P(Tests,
248 QuicSimpleServerStreamTest, 248 QuicSimpleServerStreamTest,
249 ::testing::ValuesIn(AllSupportedVersions())); 249 ::testing::ValuesIn(AllSupportedVersions()));
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 (*request_headers)[":path"] = "/bar"; 317 (*request_headers)[":path"] = "/bar";
318 (*request_headers)[":authority"] = "www.google.com"; 318 (*request_headers)[":authority"] = "www.google.com";
319 (*request_headers)[":version"] = "HTTP/1.1"; 319 (*request_headers)[":version"] = "HTTP/1.1";
320 (*request_headers)[":method"] = "GET"; 320 (*request_headers)[":method"] = "GET";
321 321
322 response_headers_[":version"] = "HTTP/1.1"; 322 response_headers_[":version"] = "HTTP/1.1";
323 // HTTP/2 only supports integer responsecode, so "200 OK" is illegal. 323 // HTTP/2 only supports integer responsecode, so "200 OK" is illegal.
324 response_headers_[":status"] = "200 OK"; 324 response_headers_[":status"] = "200 OK";
325 response_headers_["content-length"] = "5"; 325 response_headers_["content-length"] = "5";
326 string body = "Yummm"; 326 string body = "Yummm";
327 in_memory_cache_.AddResponse("www.google.com", "/bar", 327 response_cache_.AddResponse("www.google.com", "/bar",
328 std::move(response_headers_), body); 328 std::move(response_headers_), body);
329 329
330 stream_->set_fin_received(true); 330 stream_->set_fin_received(true);
331 331
332 InSequence s; 332 InSequence s;
333 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); 333 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr));
334 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) 334 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _))
335 .Times(1) 335 .Times(1)
336 .WillOnce(Return(QuicConsumedData( 336 .WillOnce(Return(QuicConsumedData(
337 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); 337 strlen(QuicSimpleServerStream::kErrorResponseBody), true)));
338 338
339 QuicSimpleServerStreamPeer::SendResponse(stream_); 339 QuicSimpleServerStreamPeer::SendResponse(stream_);
340 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); 340 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
341 EXPECT_TRUE(stream_->reading_stopped()); 341 EXPECT_TRUE(stream_->reading_stopped());
342 EXPECT_TRUE(stream_->write_side_closed()); 342 EXPECT_TRUE(stream_->write_side_closed());
343 } 343 }
344 344
345 TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus2) { 345 TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus2) {
346 // Send an illegal response with response status not supported by HTTP/2. 346 // Send an illegal response with response status not supported by HTTP/2.
347 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); 347 SpdyHeaderBlock* request_headers = stream_->mutable_headers();
348 (*request_headers)[":path"] = "/bar"; 348 (*request_headers)[":path"] = "/bar";
349 (*request_headers)[":authority"] = "www.google.com"; 349 (*request_headers)[":authority"] = "www.google.com";
350 (*request_headers)[":version"] = "HTTP/1.1"; 350 (*request_headers)[":version"] = "HTTP/1.1";
351 (*request_headers)[":method"] = "GET"; 351 (*request_headers)[":method"] = "GET";
352 352
353 response_headers_[":version"] = "HTTP/1.1"; 353 response_headers_[":version"] = "HTTP/1.1";
354 // HTTP/2 only supports 3-digit-integer, so "+200" is illegal. 354 // HTTP/2 only supports 3-digit-integer, so "+200" is illegal.
355 response_headers_[":status"] = "+200"; 355 response_headers_[":status"] = "+200";
356 response_headers_["content-length"] = "5"; 356 response_headers_["content-length"] = "5";
357 string body = "Yummm"; 357 string body = "Yummm";
358 in_memory_cache_.AddResponse("www.google.com", "/bar", 358 response_cache_.AddResponse("www.google.com", "/bar",
359 std::move(response_headers_), body); 359 std::move(response_headers_), body);
360 360
361 stream_->set_fin_received(true); 361 stream_->set_fin_received(true);
362 362
363 InSequence s; 363 InSequence s;
364 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); 364 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr));
365 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) 365 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _))
366 .Times(1) 366 .Times(1)
367 .WillOnce(Return(QuicConsumedData( 367 .WillOnce(Return(QuicConsumedData(
368 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); 368 strlen(QuicSimpleServerStream::kErrorResponseBody), true)));
369 369
370 QuicSimpleServerStreamPeer::SendResponse(stream_); 370 QuicSimpleServerStreamPeer::SendResponse(stream_);
371 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); 371 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
372 EXPECT_TRUE(stream_->reading_stopped()); 372 EXPECT_TRUE(stream_->reading_stopped());
373 EXPECT_TRUE(stream_->write_side_closed()); 373 EXPECT_TRUE(stream_->write_side_closed());
374 } 374 }
375 375
376 TEST_P(QuicSimpleServerStreamTest, SendPushResponseWith404Response) { 376 TEST_P(QuicSimpleServerStreamTest, SendPushResponseWith404Response) {
377 // Create a new promised stream with even id(). 377 // Create a new promised stream with even id().
378 QuicSimpleServerStreamPeer* promised_stream = 378 QuicSimpleServerStreamPeer* promised_stream =
379 new QuicSimpleServerStreamPeer(2, &session_, &in_memory_cache_); 379 new QuicSimpleServerStreamPeer(2, &session_, &response_cache_);
380 session_.ActivateStream(base::WrapUnique(promised_stream)); 380 session_.ActivateStream(base::WrapUnique(promised_stream));
381 381
382 // Send a push response with response status 404, which will be regarded as 382 // Send a push response with response status 404, which will be regarded as
383 // invalid server push response. 383 // invalid server push response.
384 SpdyHeaderBlock* request_headers = promised_stream->mutable_headers(); 384 SpdyHeaderBlock* request_headers = promised_stream->mutable_headers();
385 (*request_headers)[":path"] = "/bar"; 385 (*request_headers)[":path"] = "/bar";
386 (*request_headers)[":authority"] = "www.google.com"; 386 (*request_headers)[":authority"] = "www.google.com";
387 (*request_headers)[":version"] = "HTTP/1.1"; 387 (*request_headers)[":version"] = "HTTP/1.1";
388 (*request_headers)[":method"] = "GET"; 388 (*request_headers)[":method"] = "GET";
389 389
390 response_headers_[":version"] = "HTTP/1.1"; 390 response_headers_[":version"] = "HTTP/1.1";
391 response_headers_[":status"] = "404"; 391 response_headers_[":status"] = "404";
392 response_headers_["content-length"] = "8"; 392 response_headers_["content-length"] = "8";
393 string body = "NotFound"; 393 string body = "NotFound";
394 in_memory_cache_.AddResponse("www.google.com", "/bar", 394 response_cache_.AddResponse("www.google.com", "/bar",
395 std::move(response_headers_), body); 395 std::move(response_headers_), body);
396 396
397 InSequence s; 397 InSequence s;
398 EXPECT_CALL(session_, 398 EXPECT_CALL(session_,
399 SendRstStream(promised_stream->id(), QUIC_STREAM_CANCELLED, 0)); 399 SendRstStream(promised_stream->id(), QUIC_STREAM_CANCELLED, 0));
400 400
401 QuicSimpleServerStreamPeer::SendResponse(promised_stream); 401 QuicSimpleServerStreamPeer::SendResponse(promised_stream);
402 } 402 }
403 403
404 TEST_P(QuicSimpleServerStreamTest, SendResponseWithValidHeaders) { 404 TEST_P(QuicSimpleServerStreamTest, SendResponseWithValidHeaders) {
405 // Add a request and response with valid headers. 405 // Add a request and response with valid headers.
406 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); 406 SpdyHeaderBlock* request_headers = stream_->mutable_headers();
407 (*request_headers)[":path"] = "/bar"; 407 (*request_headers)[":path"] = "/bar";
408 (*request_headers)[":authority"] = "www.google.com"; 408 (*request_headers)[":authority"] = "www.google.com";
409 (*request_headers)[":version"] = "HTTP/1.1"; 409 (*request_headers)[":version"] = "HTTP/1.1";
410 (*request_headers)[":method"] = "GET"; 410 (*request_headers)[":method"] = "GET";
411 411
412 response_headers_[":version"] = "HTTP/1.1"; 412 response_headers_[":version"] = "HTTP/1.1";
413 response_headers_[":status"] = "200"; 413 response_headers_[":status"] = "200";
414 response_headers_["content-length"] = "5"; 414 response_headers_["content-length"] = "5";
415 string body = "Yummm"; 415 string body = "Yummm";
416 in_memory_cache_.AddResponse("www.google.com", "/bar", 416 response_cache_.AddResponse("www.google.com", "/bar",
417 std::move(response_headers_), body); 417 std::move(response_headers_), body);
418 stream_->set_fin_received(true); 418 stream_->set_fin_received(true);
419 419
420 InSequence s; 420 InSequence s;
421 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); 421 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr));
422 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) 422 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _))
423 .Times(1) 423 .Times(1)
424 .WillOnce(Return(QuicConsumedData(body.length(), true))); 424 .WillOnce(Return(QuicConsumedData(body.length(), true)));
425 425
426 QuicSimpleServerStreamPeer::SendResponse(stream_); 426 QuicSimpleServerStreamPeer::SendResponse(stream_);
427 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); 427 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_));
428 EXPECT_TRUE(stream_->reading_stopped()); 428 EXPECT_TRUE(stream_->reading_stopped());
429 EXPECT_TRUE(stream_->write_side_closed()); 429 EXPECT_TRUE(stream_->write_side_closed());
430 } 430 }
431 431
432 TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { 432 TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) {
433 // Tests that if a reponse has push resources to be send, SendResponse() will 433 // Tests that if a reponse has push resources to be send, SendResponse() will
434 // call PromisePushResources() to handle these resources. 434 // call PromisePushResources() to handle these resources.
435 435
436 // Add a request and response with valid headers into cache. 436 // Add a request and response with valid headers into cache.
437 string host = "www.google.com"; 437 string host = "www.google.com";
438 string request_path = "/foo"; 438 string request_path = "/foo";
439 string body = "Yummm"; 439 string body = "Yummm";
440 string url = host + "/bar"; 440 string url = host + "/bar";
441 QuicInMemoryCache::ServerPushInfo push_info(GURL(url), SpdyHeaderBlock(), 441 QuicHttpResponseCache::ServerPushInfo push_info(
442 kDefaultPriority, "Push body"); 442 GURL(url), SpdyHeaderBlock(), kDefaultPriority, "Push body");
443 std::list<QuicInMemoryCache::ServerPushInfo> push_resources; 443 std::list<QuicHttpResponseCache::ServerPushInfo> push_resources;
444 push_resources.push_back(push_info); 444 push_resources.push_back(push_info);
445 in_memory_cache_.AddSimpleResponseWithServerPushResources( 445 response_cache_.AddSimpleResponseWithServerPushResources(
446 host, request_path, 200, body, push_resources); 446 host, request_path, 200, body, push_resources);
447 447
448 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); 448 SpdyHeaderBlock* request_headers = stream_->mutable_headers();
449 (*request_headers)[":path"] = request_path; 449 (*request_headers)[":path"] = request_path;
450 (*request_headers)[":authority"] = host; 450 (*request_headers)[":authority"] = host;
451 (*request_headers)[":version"] = "HTTP/1.1"; 451 (*request_headers)[":version"] = "HTTP/1.1";
452 (*request_headers)[":method"] = "GET"; 452 (*request_headers)[":method"] = "GET";
453 453
454 stream_->set_fin_received(true); 454 stream_->set_fin_received(true);
455 InSequence s; 455 InSequence s;
(...skipping 18 matching lines...) Expand all
474 474
475 TEST_P(QuicSimpleServerStreamTest, PushResponseOnServerInitiatedStream) { 475 TEST_P(QuicSimpleServerStreamTest, PushResponseOnServerInitiatedStream) {
476 // Tests that PushResponse() should take the given headers as request headers 476 // Tests that PushResponse() should take the given headers as request headers
477 // and fetch response from cache, and send it out. 477 // and fetch response from cache, and send it out.
478 478
479 // Create a stream with even stream id and test against this stream. 479 // Create a stream with even stream id and test against this stream.
480 const QuicStreamId kServerInitiatedStreamId = 2; 480 const QuicStreamId kServerInitiatedStreamId = 2;
481 // Create a server initiated stream and pass it to session_. 481 // Create a server initiated stream and pass it to session_.
482 QuicSimpleServerStreamPeer* server_initiated_stream = 482 QuicSimpleServerStreamPeer* server_initiated_stream =
483 new QuicSimpleServerStreamPeer(kServerInitiatedStreamId, &session_, 483 new QuicSimpleServerStreamPeer(kServerInitiatedStreamId, &session_,
484 &in_memory_cache_); 484 &response_cache_);
485 session_.ActivateStream(base::WrapUnique(server_initiated_stream)); 485 session_.ActivateStream(base::WrapUnique(server_initiated_stream));
486 486
487 const string kHost = "www.foo.com"; 487 const string kHost = "www.foo.com";
488 const string kPath = "/bar"; 488 const string kPath = "/bar";
489 SpdyHeaderBlock headers; 489 SpdyHeaderBlock headers;
490 headers[":path"] = kPath; 490 headers[":path"] = kPath;
491 headers[":authority"] = kHost; 491 headers[":authority"] = kHost;
492 headers[":version"] = "HTTP/1.1"; 492 headers[":version"] = "HTTP/1.1";
493 headers[":method"] = "GET"; 493 headers[":method"] = "GET";
494 494
495 response_headers_[":version"] = "HTTP/1.1"; 495 response_headers_[":version"] = "HTTP/1.1";
496 response_headers_[":status"] = "200"; 496 response_headers_[":status"] = "200";
497 response_headers_["content-length"] = "5"; 497 response_headers_["content-length"] = "5";
498 const string kBody = "Hello"; 498 const string kBody = "Hello";
499 in_memory_cache_.AddResponse(kHost, kPath, std::move(response_headers_), 499 response_cache_.AddResponse(kHost, kPath, std::move(response_headers_),
500 kBody); 500 kBody);
501 501
502 // Call PushResponse() should trigger stream to fetch response from cache 502 // Call PushResponse() should trigger stream to fetch response from cache
503 // and send it back. 503 // and send it back.
504 EXPECT_CALL(session_, 504 EXPECT_CALL(session_,
505 WriteHeadersMock(kServerInitiatedStreamId, _, false, 505 WriteHeadersMock(kServerInitiatedStreamId, _, false,
506 server_initiated_stream->priority(), nullptr)); 506 server_initiated_stream->priority(), nullptr));
507 EXPECT_CALL(session_, WritevData(_, kServerInitiatedStreamId, _, _, _, _)) 507 EXPECT_CALL(session_, WritevData(_, kServerInitiatedStreamId, _, _, _, _))
508 .Times(1) 508 .Times(1)
509 .WillOnce(Return(QuicConsumedData(kBody.size(), true))); 509 .WillOnce(Return(QuicConsumedData(kBody.size(), true)));
510 server_initiated_stream->PushResponse(std::move(headers)); 510 server_initiated_stream->PushResponse(std::move(headers));
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 }; 641 };
642 StringPiece data(arr, arraysize(arr)); 642 StringPiece data(arr, arraysize(arr));
643 QuicStreamFrame frame(stream_->id(), true, 0, data); 643 QuicStreamFrame frame(stream_->id(), true, 0, data);
644 // 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.
645 stream_->OnStreamFrame(frame); 645 stream_->OnStreamFrame(frame);
646 } 646 }
647 647
648 } // namespace 648 } // namespace
649 } // namespace test 649 } // namespace test
650 } // namespace net 650 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/quic_simple_server_stream.cc ('k') | net/tools/quic/quic_simple_server_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698