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

Side by Side Diff: net/quic/chromium/quic_chromium_client_session_test.cc

Issue 2458793002: Server push cancellation: add PushPromiseHelper which reflects information on the push promise. (Closed)
Patch Set: sync and fix tests Created 4 years, 1 month 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/chromium/quic_chromium_client_session.h" 5 #include "net/quic/chromium/quic_chromium_client_session.h"
6 6
7 #include "base/base64.h" 7 #include "base/base64.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/rand_util.h" 10 #include "base/rand_util.h"
(...skipping 26 matching lines...) Expand all
37 #include "net/quic/test_tools/quic_client_promised_info_peer.h" 37 #include "net/quic/test_tools/quic_client_promised_info_peer.h"
38 #include "net/quic/test_tools/quic_spdy_session_peer.h" 38 #include "net/quic/test_tools/quic_spdy_session_peer.h"
39 #include "net/quic/test_tools/quic_test_packet_maker.h" 39 #include "net/quic/test_tools/quic_test_packet_maker.h"
40 #include "net/quic/test_tools/quic_test_utils.h" 40 #include "net/quic/test_tools/quic_test_utils.h"
41 #include "net/quic/test_tools/simple_quic_framer.h" 41 #include "net/quic/test_tools/simple_quic_framer.h"
42 #include "net/socket/socket_test_util.h" 42 #include "net/socket/socket_test_util.h"
43 #include "net/spdy/spdy_test_utils.h" 43 #include "net/spdy/spdy_test_utils.h"
44 #include "net/test/cert_test_util.h" 44 #include "net/test/cert_test_util.h"
45 #include "net/test/gtest_util.h" 45 #include "net/test/gtest_util.h"
46 #include "net/test/test_data_directory.h" 46 #include "net/test/test_data_directory.h"
47 #include "net/tools/quic/test_tools/push_promise_delegate.h"
47 #include "net/udp/datagram_client_socket.h" 48 #include "net/udp/datagram_client_socket.h"
48 #include "testing/gmock/include/gmock/gmock.h" 49 #include "testing/gmock/include/gmock/gmock.h"
49 50
50 using testing::_; 51 using testing::_;
51 52
52 namespace net { 53 namespace net {
53 namespace test { 54 namespace test {
54 namespace { 55 namespace {
55 56
56 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); 57 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 BoundTestNetLog bound_test_net_log_; 159 BoundTestNetLog bound_test_net_log_;
159 MockClientSocketFactory socket_factory_; 160 MockClientSocketFactory socket_factory_;
160 std::unique_ptr<MockRead> default_read_; 161 std::unique_ptr<MockRead> default_read_;
161 std::unique_ptr<SequencedSocketData> socket_data_; 162 std::unique_ptr<SequencedSocketData> socket_data_;
162 MockClock clock_; 163 MockClock clock_;
163 MockRandom random_; 164 MockRandom random_;
164 QuicChromiumConnectionHelper helper_; 165 QuicChromiumConnectionHelper helper_;
165 MockAlarmFactory alarm_factory_; 166 MockAlarmFactory alarm_factory_;
166 TransportSecurityState transport_security_state_; 167 TransportSecurityState transport_security_state_;
167 MockCryptoClientStreamFactory crypto_client_stream_factory_; 168 MockCryptoClientStreamFactory crypto_client_stream_factory_;
169 QuicClientPushPromiseIndex push_promise_index_;
168 std::unique_ptr<QuicChromiumClientSession> session_; 170 std::unique_ptr<QuicChromiumClientSession> session_;
169 QuicConnectionVisitorInterface* visitor_; 171 QuicConnectionVisitorInterface* visitor_;
170 TestCompletionCallback callback_; 172 TestCompletionCallback callback_;
171 QuicTestPacketMaker client_maker_; 173 QuicTestPacketMaker client_maker_;
172 QuicTestPacketMaker server_maker_; 174 QuicTestPacketMaker server_maker_;
173 ProofVerifyDetailsChromium verify_details_; 175 ProofVerifyDetailsChromium verify_details_;
174 QuicClientPushPromiseIndex push_promise_index_;
175 }; 176 };
176 177
177 INSTANTIATE_TEST_CASE_P(Tests, 178 INSTANTIATE_TEST_CASE_P(Tests,
178 QuicChromiumClientSessionTest, 179 QuicChromiumClientSessionTest,
179 ::testing::ValuesIn(AllSupportedVersions())); 180 ::testing::ValuesIn(AllSupportedVersions()));
180 181
181 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { 182 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) {
182 Initialize(); 183 Initialize();
183 CompleteCryptoHandshake(); 184 CompleteCryptoHandshake();
184 } 185 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 session_->CreateOutgoingDynamicStream(kDefaultPriority); 242 session_->CreateOutgoingDynamicStream(kDefaultPriority);
242 EXPECT_TRUE(stream); 243 EXPECT_TRUE(stream);
243 244
244 SpdyHeaderBlock promise_headers; 245 SpdyHeaderBlock promise_headers;
245 promise_headers[":method"] = "GET"; 246 promise_headers[":method"] = "GET";
246 promise_headers[":authority"] = "www.example.org"; 247 promise_headers[":authority"] = "www.example.org";
247 promise_headers[":scheme"] = "https"; 248 promise_headers[":scheme"] = "https";
248 promise_headers[":path"] = "/pushed.jpg"; 249 promise_headers[":path"] = "/pushed.jpg";
249 250
250 // Receive a PUSH PROMISE from the server. 251 // Receive a PUSH PROMISE from the server.
251 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); 252 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1,
253 promise_headers));
252 254
253 QuicClientPromisedInfo* promised = 255 QuicClientPromisedInfo* promised =
254 session_->GetPromisedById(kServerDataStreamId1); 256 session_->GetPromisedById(kServerDataStreamId1);
255 EXPECT_TRUE(promised); 257 EXPECT_TRUE(promised);
256 // Fire alarm to time out the push stream. 258 // Fire alarm to time out the push stream.
257 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised)); 259 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised));
258 EXPECT_FALSE( 260 EXPECT_FALSE(
259 session_->GetPromisedByUrl("https://www.example.org/pushed.jpg")); 261 session_->GetPromisedByUrl("https://www.example.org/pushed.jpg"));
260 EXPECT_EQ(0u, 262 EXPECT_EQ(0u,
261 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); 263 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get()));
(...skipping 25 matching lines...) Expand all
287 EXPECT_TRUE(stream); 289 EXPECT_TRUE(stream);
288 290
289 SpdyHeaderBlock promise_headers; 291 SpdyHeaderBlock promise_headers;
290 promise_headers[":method"] = "GET"; 292 promise_headers[":method"] = "GET";
291 promise_headers[":authority"] = "www.example.org"; 293 promise_headers[":authority"] = "www.example.org";
292 promise_headers[":scheme"] = "https"; 294 promise_headers[":scheme"] = "https";
293 promise_headers[":path"] = "/pushed.jpg"; 295 promise_headers[":path"] = "/pushed.jpg";
294 296
295 session_->GetOrCreateStream(kServerDataStreamId1); 297 session_->GetOrCreateStream(kServerDataStreamId1);
296 // Receive a PUSH PROMISE from the server. 298 // Receive a PUSH PROMISE from the server.
297 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); 299 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1,
300 promise_headers));
298 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); 301 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock());
299 // Read data on the pushed stream. 302 // Read data on the pushed stream.
300 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); 303 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP"));
301 session_->OnStreamFrame(data); 304 session_->OnStreamFrame(data);
302 305
303 QuicClientPromisedInfo* promised = 306 QuicClientPromisedInfo* promised =
304 session_->GetPromisedById(kServerDataStreamId1); 307 session_->GetPromisedById(kServerDataStreamId1);
305 EXPECT_TRUE(promised); 308 EXPECT_TRUE(promised);
306 // Fire alarm to time out the push stream. 309 // Fire alarm to time out the push stream.
307 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised)); 310 alarm_factory_.FireAlarm(QuicClientPromisedInfoPeer::GetAlarm(promised));
308 EXPECT_EQ(2u, 311 EXPECT_EQ(2u,
309 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get())); 312 QuicChromiumClientSessionPeer::GetPushedBytesCount(session_.get()));
310 EXPECT_EQ(2u, QuicChromiumClientSessionPeer::GetPushedAndUnclaimedBytesCount( 313 EXPECT_EQ(2u, QuicChromiumClientSessionPeer::GetPushedAndUnclaimedBytesCount(
311 session_.get())); 314 session_.get()));
312 } 315 }
313 316
317 TEST_P(QuicChromiumClientSessionTest, CancelPushWhenPendingValidation) {
318 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
319 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
320 1, true, kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT));
321
322 MockWrite writes[] = {
323 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)};
324 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes,
325 arraysize(writes)));
326 Initialize();
327
328 ProofVerifyDetailsChromium details;
329 details.cert_verify_result.verified_cert =
330 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
331 ASSERT_TRUE(details.cert_verify_result.verified_cert.get());
332
333 CompleteCryptoHandshake();
334 session_->OnProofVerifyDetailsAvailable(details);
335
336 QuicChromiumClientStream* stream =
337 session_->CreateOutgoingDynamicStream(kDefaultPriority);
338 EXPECT_TRUE(stream);
339
340 SpdyHeaderBlock promise_headers;
341 promise_headers[":method"] = "GET";
342 promise_headers[":authority"] = "www.example.org";
343 promise_headers[":scheme"] = "https";
344 promise_headers[":path"] = "/pushed.jpg";
345
346 // Receive a PUSH PROMISE from the server.
347 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1,
348 promise_headers));
349
350 QuicClientPromisedInfo* promised =
351 session_->GetPromisedById(kServerDataStreamId1);
352 EXPECT_TRUE(promised);
353
354 // Initiate rendezvous.
355 SpdyHeaderBlock client_request = promise_headers.Clone();
356 PushPromiseDelegate delegate(/*match=*/true);
357 promised->HandleClientRequest(client_request, &delegate);
358
359 // Cancel the push before receiving the response to the pushed request.
360 GURL pushed_url("https://www.example.org/pushed.jpg");
361 session_->CancelPush(pushed_url);
362 EXPECT_TRUE(session_->GetPromisedByUrl(pushed_url.spec()));
363
364 // Reset the stream now before tear down.
365 session_->CloseStream(kClientDataStreamId1);
366 }
367
314 TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceivingResponse) { 368 TEST_P(QuicChromiumClientSessionTest, CancelPushBeforeReceivingResponse) {
315 base::HistogramTester histogram_tester; 369 base::HistogramTester histogram_tester;
316 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 370 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
317 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( 371 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
318 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED)); 372 1, true, kServerDataStreamId1, QUIC_STREAM_CANCELLED));
319 MockWrite writes[] = { 373 MockWrite writes[] = {
320 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)}; 374 MockWrite(ASYNC, client_rst->data(), client_rst->length(), 1)};
321 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, 375 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes,
322 arraysize(writes))); 376 arraysize(writes)));
323 Initialize(); 377 Initialize();
(...skipping 10 matching lines...) Expand all
334 session_->CreateOutgoingDynamicStream(kDefaultPriority); 388 session_->CreateOutgoingDynamicStream(kDefaultPriority);
335 EXPECT_TRUE(stream); 389 EXPECT_TRUE(stream);
336 390
337 SpdyHeaderBlock promise_headers; 391 SpdyHeaderBlock promise_headers;
338 promise_headers[":method"] = "GET"; 392 promise_headers[":method"] = "GET";
339 promise_headers[":authority"] = "www.example.org"; 393 promise_headers[":authority"] = "www.example.org";
340 promise_headers[":scheme"] = "https"; 394 promise_headers[":scheme"] = "https";
341 promise_headers[":path"] = "/pushed.jpg"; 395 promise_headers[":path"] = "/pushed.jpg";
342 396
343 // Receive a PUSH PROMISE from the server. 397 // Receive a PUSH PROMISE from the server.
344 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); 398 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1,
399 promise_headers));
345 400
346 QuicClientPromisedInfo* promised = 401 QuicClientPromisedInfo* promised =
347 session_->GetPromisedById(kServerDataStreamId1); 402 session_->GetPromisedById(kServerDataStreamId1);
348 EXPECT_TRUE(promised); 403 EXPECT_TRUE(promised);
349 // Cancel the push before receiving the response to the pushed request. 404 // Cancel the push before receiving the response to the pushed request.
350 GURL pushed_url("https://www.example.org/pushed.jpg"); 405 GURL pushed_url("https://www.example.org/pushed.jpg");
351 session_->CancelPush(pushed_url); 406 session_->CancelPush(pushed_url);
352 407
353 EXPECT_FALSE(session_->GetPromisedByUrl(pushed_url.spec())); 408 EXPECT_FALSE(session_->GetPromisedByUrl(pushed_url.spec()));
354 EXPECT_EQ(0u, 409 EXPECT_EQ(0u,
(...skipping 26 matching lines...) Expand all
381 EXPECT_TRUE(stream); 436 EXPECT_TRUE(stream);
382 437
383 SpdyHeaderBlock promise_headers; 438 SpdyHeaderBlock promise_headers;
384 promise_headers[":method"] = "GET"; 439 promise_headers[":method"] = "GET";
385 promise_headers[":authority"] = "www.example.org"; 440 promise_headers[":authority"] = "www.example.org";
386 promise_headers[":scheme"] = "https"; 441 promise_headers[":scheme"] = "https";
387 promise_headers[":path"] = "/pushed.jpg"; 442 promise_headers[":path"] = "/pushed.jpg";
388 443
389 session_->GetOrCreateStream(kServerDataStreamId1); 444 session_->GetOrCreateStream(kServerDataStreamId1);
390 // Receive a PUSH PROMISE from the server. 445 // Receive a PUSH PROMISE from the server.
391 session_->HandlePromised(stream->id(), kServerDataStreamId1, promise_headers); 446 EXPECT_TRUE(session_->HandlePromised(stream->id(), kServerDataStreamId1,
447 promise_headers));
392 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock()); 448 session_->OnInitialHeadersComplete(kServerDataStreamId1, SpdyHeaderBlock());
393 // Read data on the pushed stream. 449 // Read data on the pushed stream.
394 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP")); 450 QuicStreamFrame data(kServerDataStreamId1, false, 0, StringPiece("SP"));
395 session_->OnStreamFrame(data); 451 session_->OnStreamFrame(data);
396 452
397 QuicClientPromisedInfo* promised = 453 QuicClientPromisedInfo* promised =
398 session_->GetPromisedById(kServerDataStreamId1); 454 session_->GetPromisedById(kServerDataStreamId1);
399 EXPECT_TRUE(promised); 455 EXPECT_TRUE(promised);
400 // Cancel the push after receiving data on the push stream. 456 // Cancel the push after receiving data on the push stream.
401 GURL pushed_url("https://www.example.org/pushed.jpg"); 457 GURL pushed_url("https://www.example.org/pushed.jpg");
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 807
752 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); 808 EXPECT_TRUE(socket_data_->AllReadDataConsumed());
753 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); 809 EXPECT_TRUE(socket_data_->AllWriteDataConsumed());
754 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); 810 EXPECT_TRUE(new_socket_data.AllReadDataConsumed());
755 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); 811 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed());
756 } 812 }
757 813
758 } // namespace 814 } // namespace
759 } // namespace test 815 } // namespace test
760 } // namespace net 816 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_chromium_client_session.cc ('k') | net/quic/core/quic_client_promised_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698