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

Side by Side Diff: net/quic/quic_network_transaction_unittest.cc

Issue 1540463003: Change the interface of GetAlternativeServicesFor, always return the best Alt-Svc entry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add a new testcase: use first exisiting quic session when multiple are available Created 4 years, 11 months 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/http/http_stream_factory_impl_request_unittest.cc ('k') | net/quic/quic_stream_factory.h » ('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) 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 <vector> 5 #include <vector>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 } 227 }
228 228
229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( 229 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket(
230 QuicPacketNumber num) { 230 QuicPacketNumber num) {
231 return maker_.MakeConnectionClosePacket(num); 231 return maker_.MakeConnectionClosePacket(num);
232 } 232 }
233 233
234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( 234 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
235 QuicPacketNumber largest_received, 235 QuicPacketNumber largest_received,
236 QuicPacketNumber least_unacked) { 236 QuicPacketNumber least_unacked) {
237 return maker_.MakeAckPacket(2, largest_received, least_unacked, true); 237 return maker_.MakeAckPacket(2, largest_received, least_unacked,
238 least_unacked, true);
239 }
240
241 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
242 QuicPacketNumber largest_received,
243 QuicPacketNumber least_unacked,
244 QuicTestPacketMaker* maker) {
245 return maker->MakeAckPacket(2, largest_received, least_unacked,
246 least_unacked, true);
238 } 247 }
239 248
240 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( 249 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
250 QuicPacketNumber packet_number,
251 QuicPacketNumber largest_received,
252 QuicPacketNumber ack_least_unacked,
253 QuicPacketNumber stop_least_unacked) {
254 return maker_.MakeAckPacket(packet_number, largest_received,
255 ack_least_unacked, stop_least_unacked, true);
256 }
257
258 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
241 QuicPacketNumber num, 259 QuicPacketNumber num,
242 QuicTime::Delta delta_time_largest_observed, 260 QuicTime::Delta delta_time_largest_observed,
243 QuicPacketNumber largest_received, 261 QuicPacketNumber largest_received,
244 QuicPacketNumber least_unacked, 262 QuicPacketNumber least_unacked,
245 QuicErrorCode quic_error, 263 QuicErrorCode quic_error,
246 std::string& quic_error_details) { 264 std::string& quic_error_details) {
247 return maker_.MakeAckAndConnectionClosePacket( 265 return maker_.MakeAckAndConnectionClosePacket(
248 num, false, delta_time_largest_observed, largest_received, 266 num, false, delta_time_largest_observed, largest_received,
249 least_unacked, quic_error, quic_error_details); 267 least_unacked, quic_error, quic_error_details);
250 } 268 }
251 269
252 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( 270 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket(
253 QuicPacketNumber num, 271 QuicPacketNumber num,
254 bool include_version, 272 bool include_version,
255 QuicStreamId stream_id, 273 QuicStreamId stream_id,
256 QuicRstStreamErrorCode error_code) { 274 QuicRstStreamErrorCode error_code) {
257 return maker_.MakeRstPacket(num, include_version, stream_id, error_code); 275 return maker_.MakeRstPacket(num, include_version, stream_id, error_code);
258 } 276 }
259 277
260 SpdyHeaderBlock GetRequestHeaders(const std::string& method, 278 SpdyHeaderBlock GetRequestHeaders(const std::string& method,
261 const std::string& scheme, 279 const std::string& scheme,
262 const std::string& path) { 280 const std::string& path) {
263 return maker_.GetRequestHeaders(method, scheme, path); 281 return maker_.GetRequestHeaders(method, scheme, path);
264 } 282 }
265 283
266 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { 284 SpdyHeaderBlock GetResponseHeaders(const std::string& status) {
267 return maker_.GetResponseHeaders(status); 285 return maker_.GetResponseHeaders(status);
268 } 286 }
269 287
288 SpdyHeaderBlock GetResponseHeaders(const std::string& status,
289 const std::string& alt_svc) {
290 return maker_.GetResponseHeaders(status, alt_svc);
291 }
292
270 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( 293 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
271 QuicPacketNumber packet_number, 294 QuicPacketNumber packet_number,
272 QuicStreamId stream_id, 295 QuicStreamId stream_id,
273 bool should_include_version, 296 bool should_include_version,
274 bool fin, 297 bool fin,
275 QuicStreamOffset offset, 298 QuicStreamOffset offset,
276 base::StringPiece data) { 299 base::StringPiece data) {
277 return maker_.MakeDataPacket(packet_number, stream_id, 300 return maker_.MakeDataPacket(packet_number, stream_id,
278 should_include_version, fin, offset, data); 301 should_include_version, fin, offset, data);
279 } 302 }
280 303
281 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( 304 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
282 QuicPacketNumber packet_number, 305 QuicPacketNumber packet_number,
283 QuicStreamId stream_id, 306 QuicStreamId stream_id,
284 bool should_include_version, 307 bool should_include_version,
285 bool fin, 308 bool fin,
309 const SpdyHeaderBlock& headers,
310 QuicStreamOffset* offset) {
311 SpdyPriority priority =
312 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
313 return maker_.MakeRequestHeadersPacketWithOffsetTracking(
314 packet_number, stream_id, should_include_version, fin, priority,
315 headers, offset);
316 }
317
318 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
319 QuicPacketNumber packet_number,
320 QuicStreamId stream_id,
321 bool should_include_version,
322 bool fin,
323 const SpdyHeaderBlock& headers,
324 QuicStreamOffset* offset,
325 QuicTestPacketMaker* maker) {
326 SpdyPriority priority =
327 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
328 return maker->MakeRequestHeadersPacketWithOffsetTracking(
329 packet_number, stream_id, should_include_version, fin, priority,
330 headers, offset);
331 }
332
333 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
334 QuicPacketNumber packet_number,
335 QuicStreamId stream_id,
336 bool should_include_version,
337 bool fin,
286 const SpdyHeaderBlock& headers) { 338 const SpdyHeaderBlock& headers) {
287 SpdyPriority priority = 339 return ConstructRequestHeadersPacket(packet_number, stream_id,
288 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); 340 should_include_version, fin, headers,
289 return maker_.MakeRequestHeadersPacket(packet_number, stream_id, 341 nullptr, &maker_);
290 should_include_version, fin, 342 }
291 priority, headers); 343 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
344 QuicPacketNumber packet_number,
345 QuicStreamId stream_id,
346 bool should_include_version,
347 bool fin,
348 const SpdyHeaderBlock& headers,
349 QuicTestPacketMaker* maker) {
350 return ConstructRequestHeadersPacket(packet_number, stream_id,
351 should_include_version, fin, headers,
352 nullptr, maker);
292 } 353 }
293 354
294 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( 355 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
295 QuicPacketNumber packet_number, 356 QuicPacketNumber packet_number,
296 QuicStreamId stream_id, 357 QuicStreamId stream_id,
297 bool should_include_version, 358 bool should_include_version,
298 bool fin, 359 bool fin,
299 const SpdyHeaderBlock& headers) { 360 const SpdyHeaderBlock& headers) {
300 return maker_.MakeResponseHeadersPacket( 361 return ConstructResponseHeadersPacket(packet_number, stream_id,
301 packet_number, stream_id, should_include_version, fin, headers); 362 should_include_version, fin, headers,
363 nullptr, &maker_);
364 }
365
366 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
367 QuicPacketNumber packet_number,
368 QuicStreamId stream_id,
369 bool should_include_version,
370 bool fin,
371 const SpdyHeaderBlock& headers,
372 QuicTestPacketMaker* maker) {
373 return ConstructResponseHeadersPacket(packet_number, stream_id,
374 should_include_version, fin, headers,
375 nullptr, maker);
376 }
377
378 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
379 QuicPacketNumber packet_number,
380 QuicStreamId stream_id,
381 bool should_include_version,
382 bool fin,
383 const SpdyHeaderBlock& headers,
384 QuicStreamOffset* offset) {
385 return maker_.MakeResponseHeadersPacketWithOffsetTracking(
386 packet_number, stream_id, should_include_version, fin, headers, offset);
387 }
388
389 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
390 QuicPacketNumber packet_number,
391 QuicStreamId stream_id,
392 bool should_include_version,
393 bool fin,
394 const SpdyHeaderBlock& headers,
395 QuicStreamOffset* offset,
396 QuicTestPacketMaker* maker) {
397 return maker->MakeResponseHeadersPacketWithOffsetTracking(
398 packet_number, stream_id, should_include_version, fin, headers, offset);
302 } 399 }
303 400
304 void CreateSession() { 401 void CreateSession() {
305 CreateSessionWithFactory(&socket_factory_, false); 402 CreateSessionWithFactory(&socket_factory_, false);
306 } 403 }
307 404
308 void CreateSessionWithNextProtos() { 405 void CreateSessionWithNextProtos() {
309 CreateSessionWithFactory(&socket_factory_, true); 406 CreateSessionWithFactory(&socket_factory_, true);
310 } 407 }
311 408
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol); 532 EXPECT_EQ(QUIC, alternative_service_vector[0].protocol);
436 } 533 }
437 534
438 void AddHangingNonAlternateProtocolSocketData() { 535 void AddHangingNonAlternateProtocolSocketData() {
439 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); 536 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
440 hanging_data_.set_connect_data(hanging_connect); 537 hanging_data_.set_connect_data(hanging_connect);
441 socket_factory_.AddSocketDataProvider(&hanging_data_); 538 socket_factory_.AddSocketDataProvider(&hanging_data_);
442 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); 539 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
443 } 540 }
444 541
542 void AddNewHangingNonAlternateProtocolSocketData() {
543 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING);
544 StaticSocketDataProvider* hanging_data = new StaticSocketDataProvider();
Ryan Hamilton 2015/12/30 21:51:42 I think this leaks memory, doesn't it?
Zhongyi Shi 2016/01/05 22:54:20 Ahhh, yes. I fix it with passing the hanging_data
Ryan Hamilton 2016/01/05 23:51:58 Instead of requiring the caller to pass in a new D
Zhongyi Shi 2016/01/06 02:31:40 The StaticSocketDataProvider is DISALLOW_COPY_AND_
Ryan Hamilton 2016/01/06 17:06:23 That's true, but you can do std::vector<scoped_p
545 hanging_data->set_connect_data(hanging_connect);
546 socket_factory_.AddSocketDataProvider(hanging_data);
547 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
548 }
549
445 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. 550 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession.
446 QuicTestPacketMaker maker_; 551 QuicTestPacketMaker maker_;
447 scoped_ptr<HttpNetworkSession> session_; 552 scoped_ptr<HttpNetworkSession> session_;
448 MockClientSocketFactory socket_factory_; 553 MockClientSocketFactory socket_factory_;
449 ProofVerifyDetailsChromium verify_details_; 554 ProofVerifyDetailsChromium verify_details_;
450 MockCryptoClientStreamFactory crypto_client_stream_factory_; 555 MockCryptoClientStreamFactory crypto_client_stream_factory_;
451 MockHostResolver host_resolver_; 556 MockHostResolver host_resolver_;
452 MockCertVerifier cert_verifier_; 557 MockCertVerifier cert_verifier_;
453 TransportSecurityState transport_security_state_; 558 TransportSecurityState transport_security_state_;
454 scoped_ptr<CTVerifier> cert_transparency_verifier_; 559 scoped_ptr<CTVerifier> cert_transparency_verifier_;
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 socket_factory_.AddSocketDataProvider(&http_data); 869 socket_factory_.AddSocketDataProvider(&http_data);
765 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); 870 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
766 871
767 CreateSessionWithNextProtos(); 872 CreateSessionWithNextProtos();
768 873
769 SendRequestAndExpectHttpResponse("hello world"); 874 SendRequestAndExpectHttpResponse("hello world");
770 SendRequestAndExpectHttpResponse("hello world"); 875 SendRequestAndExpectHttpResponse("hello world");
771 } 876 }
772 877
773 // When multiple alternative services are advertised, 878 // When multiple alternative services are advertised,
774 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to 879 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
775 // Job. This is what the following test verifies. 880 // service which uses existing QUIC session if available. If no existing QUIC
776 // TODO(bnc): Update this test when multiple alternative services are handled 881 // session can be used, use the first alternative service from the list.
777 // properly. 882 TEST_P(QuicNetworkTransactionTest, UseExistingAlternativeServiceForQuic) {
778 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) {
779 MockRead http_reads[] = { 883 MockRead http_reads[] = {
780 MockRead("HTTP/1.1 200 OK\r\n"), 884 MockRead("HTTP/1.1 200 OK\r\n"),
781 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), 885 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":1234\"\r\n\r\n"),
782 MockRead("hello world"), 886 MockRead("hello world"),
783 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 887 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
784 MockRead(ASYNC, OK)}; 888 MockRead(ASYNC, OK)};
785 889
786 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, 890 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
787 0); 891 0);
788 socket_factory_.AddSocketDataProvider(&http_data); 892 socket_factory_.AddSocketDataProvider(&http_data);
789 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); 893 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
790 894
895 QuicStreamOffset request_header_offset = 0;
896 QuicStreamOffset response_header_offset = 0;
897 // First QUIC request data.
898 // Open a session to mail.example.org:443 using the first entry of the
Ryan Hamilton 2015/12/30 21:51:42 This actually opens a QUIC session to foo.example.
Zhongyi Shi 2016/01/05 22:54:20 Yes. Comment updated.
899 // alternative service list.
791 MockQuicData mock_quic_data; 900 MockQuicData mock_quic_data;
792 mock_quic_data.AddWrite( 901 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
793 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, 902 1, kClientDataStreamId1, true, true,
794 GetRequestHeaders("GET", "https", "/"))); 903 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
904
905 std::string alt_svc_list =
906 "quic=\"mail.example.com:1234\", quic=\"foo.example.com:443\", "
907 "quic=\"bar.example.com:8080\"";
795 mock_quic_data.AddRead(ConstructResponseHeadersPacket( 908 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
796 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); 909 1, kClientDataStreamId1, false, false,
910 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
797 mock_quic_data.AddRead( 911 mock_quic_data.AddRead(
798 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); 912 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
799 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 913 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
914
915 // Second QUIC request data.
916 // Connection pooling, using existing session, no need to include version
917 // as version negotiation has been completed.
918 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
919 3, kClientDataStreamId2, false, true,
920 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
921 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
922 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
923 &response_header_offset));
924 mock_quic_data.AddRead(
925 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
926 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
800 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read 927 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
801 mock_quic_data.AddRead(ASYNC, 0); // EOF 928 mock_quic_data.AddRead(ASYNC, 0); // EOF
802 929
803 mock_quic_data.AddSocketDataToFactory(&socket_factory_); 930 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
804 931
805 AddHangingNonAlternateProtocolSocketData(); 932 AddHangingNonAlternateProtocolSocketData();
806 CreateSessionWithNextProtos(); 933 CreateSessionWithNextProtos();
807 934
808 SendRequestAndExpectHttpResponse("hello world"); 935 SendRequestAndExpectHttpResponse("hello world");
936
809 SendRequestAndExpectQuicResponseOnPort("hello!", 443); 937 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
938 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
939 }
940
941 // When multiple alternative services that has existing QUIC session.
942 // HttpStreamFactoryImpl::RequestStreamInternal() should select the first
943 // alternative service which uses existing QUIC session.
944 TEST_P(QuicNetworkTransactionTest, UseFirstExistingAlternativeServiceForQuic) {
945 MockRead http_reads[] = {
946 MockRead("HTTP/1.1 200 OK\r\n"),
947 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":1234\"\r\n\r\n"),
948 MockRead("hello world"),
949 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
950 MockRead(ASYNC, OK)};
951
952 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
953 0);
954 socket_factory_.AddSocketDataProvider(&http_data);
955 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
956
957 QuicStreamOffset request_header_offset = 0;
958 QuicStreamOffset response_header_offset = 0;
959
960 QuicTestPacketMaker maker(GetParam(), 0, clock_, kDefaultServerHostName);
961
962 MockQuicData mock_quic_data;
963 MockQuicData mock_quic_data2;
964 // First QUIC request data.
965 // Open a session to foo.example.com:443.
966 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
967 1, kClientDataStreamId1, true, true,
968 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
969
970 std::string alt_svc_list =
971 "quic=\"bar.example.com:443\", quic=\"frog.example.com:443\", "
Ryan Hamilton 2015/12/30 21:51:42 I think each alternative should have a different p
Zhongyi Shi 2016/01/05 22:54:20 Done.
972 "quic=\"mail.example.com:8080\"";
973 // Response header from the server resets the alt_svc list for the origin.
974 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
975 1, kClientDataStreamId1, false, false,
976 GetResponseHeaders("200 OK", alt_svc_list), &response_header_offset));
977 mock_quic_data.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
978 true, 0, "hello from foo!"));
979 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
980
981 // Second QUIC request data.
982 // No connection pooling. Open a new session to bar.example.com:443.
Ryan Hamilton 2015/12/30 21:51:42 Can you expand on "No connection pooling". I think
Zhongyi Shi 2016/01/05 22:54:20 Done.
983 mock_quic_data2.AddWrite(ConstructRequestHeadersPacket(
984 1, kClientDataStreamId1, true, true,
985 GetRequestHeaders("GET", "https", "/"), &maker));
986 alt_svc_list =
987 "quic=\"foo.example.com:443\", quic=\"mail.example.com:1234\", "
988 "quic=\"bar.example.com:443\"";
989 // Response header from the server resets the alt_svc list for the origin.
990 mock_quic_data2.AddRead(ConstructResponseHeadersPacket(
991 1, kClientDataStreamId1, false, false,
992 GetResponseHeaders("200 OK", alt_svc_list), &maker));
993 mock_quic_data2.AddRead(ConstructDataPacket(2, kClientDataStreamId1, false,
994 true, 0, "hello from bar!"));
995 mock_quic_data2.AddWrite(ConstructAckPacket(2, 1, &maker));
996 mock_quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
997 mock_quic_data2.AddRead(ASYNC, 0); // EOF
998
999 // Third QUIC request data.
1000 // Connection pooling, using the first existing session to foo.example.com
1001 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
1002 3, kClientDataStreamId2, false, true,
1003 GetRequestHeaders("GET", "https", "/"), &request_header_offset));
1004 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
1005 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"),
1006 &response_header_offset));
1007 mock_quic_data.AddRead(ConstructDataPacket(4, kClientDataStreamId2, false,
1008 true, 0, "hello from foo!"));
1009 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
1010 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
1011 mock_quic_data.AddRead(ASYNC, 0); // EOF
1012
1013 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
1014 AddHangingNonAlternateProtocolSocketData();
1015
1016 mock_quic_data2.AddSocketDataToFactory(&socket_factory_);
1017 AddNewHangingNonAlternateProtocolSocketData();
1018
1019 CreateSessionWithNextProtos();
1020
1021 SendRequestAndExpectHttpResponse("hello world");
1022 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
1023 SendRequestAndExpectQuicResponseOnPort("hello from bar!", 443);
1024 SendRequestAndExpectQuicResponseOnPort("hello from foo!", 443);
Ryan Hamilton 2015/12/30 21:51:42 Overall this test look good. I wonder, though, if
810 } 1025 }
811 1026
812 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { 1027 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
813 MockRead http_reads[] = { 1028 MockRead http_reads[] = {
814 MockRead("HTTP/1.1 200 OK\r\n"), 1029 MockRead("HTTP/1.1 200 OK\r\n"),
815 MockRead(kQuicAlternativeServiceDifferentPortHeader), 1030 MockRead(kQuicAlternativeServiceDifferentPortHeader),
816 MockRead("hello world"), 1031 MockRead("hello world"),
817 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 1032 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
818 MockRead(ASYNC, OK)}; 1033 MockRead(ASYNC, OK)};
819 1034
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after
1874 request_.url = GURL("https://www.example.org:443"); 2089 request_.url = GURL("https://www.example.org:443");
1875 AddHangingNonAlternateProtocolSocketData(); 2090 AddHangingNonAlternateProtocolSocketData();
1876 CreateSessionWithNextProtos(); 2091 CreateSessionWithNextProtos();
1877 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); 2092 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1878 SendRequestAndExpectQuicResponse("hello!"); 2093 SendRequestAndExpectQuicResponse("hello!");
1879 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); 2094 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
1880 } 2095 }
1881 2096
1882 } // namespace test 2097 } // namespace test
1883 } // namespace net 2098 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl_request_unittest.cc ('k') | net/quic/quic_stream_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698