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

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: update testcases Created 4 years, 12 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
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);
238 } 239 }
239 240
240 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( 241 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
242 QuicPacketNumber packet_number,
243 QuicPacketNumber largest_received,
244 QuicPacketNumber ack_least_unacked,
245 QuicPacketNumber stop_least_unacked) {
246 return maker_.MakeAckPacket(packet_number, largest_received,
247 ack_least_unacked, stop_least_unacked, true);
248 }
249
250 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket(
241 QuicPacketNumber num, 251 QuicPacketNumber num,
242 QuicTime::Delta delta_time_largest_observed, 252 QuicTime::Delta delta_time_largest_observed,
243 QuicPacketNumber largest_received, 253 QuicPacketNumber largest_received,
244 QuicPacketNumber least_unacked, 254 QuicPacketNumber least_unacked,
245 QuicErrorCode quic_error, 255 QuicErrorCode quic_error,
246 std::string& quic_error_details) { 256 std::string& quic_error_details) {
247 return maker_.MakeAckAndConnectionClosePacket( 257 return maker_.MakeAckAndConnectionClosePacket(
248 num, false, delta_time_largest_observed, largest_received, 258 num, false, delta_time_largest_observed, largest_received,
249 least_unacked, quic_error, quic_error_details); 259 least_unacked, quic_error, quic_error_details);
250 } 260 }
(...skipping 25 matching lines...) Expand all
276 base::StringPiece data) { 286 base::StringPiece data) {
277 return maker_.MakeDataPacket(packet_number, stream_id, 287 return maker_.MakeDataPacket(packet_number, stream_id,
278 should_include_version, fin, offset, data); 288 should_include_version, fin, offset, data);
279 } 289 }
280 290
281 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( 291 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
282 QuicPacketNumber packet_number, 292 QuicPacketNumber packet_number,
283 QuicStreamId stream_id, 293 QuicStreamId stream_id,
284 bool should_include_version, 294 bool should_include_version,
285 bool fin, 295 bool fin,
296 const SpdyHeaderBlock& headers,
297 QuicStreamOffset offset) {
298 SpdyPriority priority =
299 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
300 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
301 should_include_version, fin,
302 priority, headers, offset);
303 }
304
305 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
306 QuicPacketNumber packet_number,
307 QuicStreamId stream_id,
308 bool should_include_version,
309 bool fin,
286 const SpdyHeaderBlock& headers) { 310 const SpdyHeaderBlock& headers) {
287 SpdyPriority priority = 311 return ConstructRequestHeadersPacket(
288 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); 312 packet_number, stream_id, should_include_version, fin, headers, 0);
289 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
290 should_include_version, fin,
291 priority, headers);
292 } 313 }
293 314
294 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( 315 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
295 QuicPacketNumber packet_number, 316 QuicPacketNumber packet_number,
296 QuicStreamId stream_id, 317 QuicStreamId stream_id,
297 bool should_include_version, 318 bool should_include_version,
298 bool fin, 319 bool fin,
299 const SpdyHeaderBlock& headers) { 320 const SpdyHeaderBlock& headers) {
321 return ConstructResponseHeadersPacket(
322 packet_number, stream_id, should_include_version, fin, headers, 0);
323 }
324
325 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
326 QuicPacketNumber packet_number,
327 QuicStreamId stream_id,
328 bool should_include_version,
329 bool fin,
330 const SpdyHeaderBlock& headers,
331 QuicStreamOffset offset) {
300 return maker_.MakeResponseHeadersPacket( 332 return maker_.MakeResponseHeadersPacket(
301 packet_number, stream_id, should_include_version, fin, headers); 333 packet_number, stream_id, should_include_version, fin, headers, offset);
302 } 334 }
303 335
304 void CreateSession() { 336 void CreateSession() {
305 CreateSessionWithFactory(&socket_factory_, false); 337 CreateSessionWithFactory(&socket_factory_, false);
306 } 338 }
307 339
308 void CreateSessionWithNextProtos() { 340 void CreateSessionWithNextProtos() {
309 CreateSessionWithFactory(&socket_factory_, true); 341 CreateSessionWithFactory(&socket_factory_, true);
310 } 342 }
311 343
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 socket_factory_.AddSocketDataProvider(&http_data); 796 socket_factory_.AddSocketDataProvider(&http_data);
765 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); 797 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
766 798
767 CreateSessionWithNextProtos(); 799 CreateSessionWithNextProtos();
768 800
769 SendRequestAndExpectHttpResponse("hello world"); 801 SendRequestAndExpectHttpResponse("hello world");
770 SendRequestAndExpectHttpResponse("hello world"); 802 SendRequestAndExpectHttpResponse("hello world");
771 } 803 }
772 804
773 // When multiple alternative services are advertised, 805 // When multiple alternative services are advertised,
774 // HttpStreamFactoryImpl::RequestStreamInternal() only passes the first one to 806 // HttpStreamFactoryImpl::RequestStreamInternal() should select the alternative
775 // Job. This is what the following test verifies. 807 // service which uses existing QUIC session if available. If no existing QUIC
776 // TODO(bnc): Update this test when multiple alternative services are handled 808 // session can be used, use the first alternative service from the list.
777 // properly. 809 TEST_P(QuicNetworkTransactionTest, UseBestAlternativeServiceForQuic) {
778 TEST_P(QuicNetworkTransactionTest, UseFirstAlternativeServiceForQuic) {
779 MockRead http_reads[] = { 810 MockRead http_reads[] = {
780 MockRead("HTTP/1.1 200 OK\r\n"), 811 MockRead("HTTP/1.1 200 OK\r\n"),
781 MockRead("Alt-Svc: quic=\":443\", quic=\":1234\"\r\n\r\n"), 812 MockRead("Alt-Svc: quic=\"foo.example.com:443\", quic=\":1234\"\r\n\r\n"),
782 MockRead("hello world"), 813 MockRead("hello world"),
783 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 814 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
784 MockRead(ASYNC, OK)}; 815 MockRead(ASYNC, OK)};
785 816
786 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, 817 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr,
787 0); 818 0);
788 socket_factory_.AddSocketDataProvider(&http_data); 819 socket_factory_.AddSocketDataProvider(&http_data);
789 socket_factory_.AddSSLSocketDataProvider(&ssl_data_); 820 socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
790 821
822 // First QUIC request data.
823 // Open a session to mail.example.org:443 using the first entry of the
Ryan Hamilton 2015/12/30 21:51:41 The Alt-Svc: header seems to be foo.example.com no
824 // alternative service list.
791 MockQuicData mock_quic_data; 825 MockQuicData mock_quic_data;
792 mock_quic_data.AddWrite( 826 mock_quic_data.AddWrite(
793 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, 827 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true,
794 GetRequestHeaders("GET", "https", "/"))); 828 GetRequestHeaders("GET", "https", "/")));
795 mock_quic_data.AddRead(ConstructResponseHeadersPacket( 829 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
796 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); 830 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
797 mock_quic_data.AddRead( 831 mock_quic_data.AddRead(
798 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!")); 832 ConstructDataPacket(2, kClientDataStreamId1, false, true, 0, "hello!"));
799 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); 833 mock_quic_data.AddWrite(ConstructAckPacket(2, 1));
834
835 // Second QUIC request data.
836 // Connection pooling, using existing session, no need to include version
837 // as version negotiation has been completed.
838 mock_quic_data.AddWrite(ConstructRequestHeadersPacket(
839 3, kClientDataStreamId2, false, true,
840 GetRequestHeaders("GET", "https", "/"), 31));
841 mock_quic_data.AddRead(ConstructResponseHeadersPacket(
842 3, kClientDataStreamId2, false, false, GetResponseHeaders("200 OK"), 31));
843 mock_quic_data.AddRead(
844 ConstructDataPacket(4, kClientDataStreamId2, false, true, 0, "hello!"));
845 mock_quic_data.AddWrite(ConstructAckAndConnectionClosePacket(4, 4, 3, 1));
800 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read 846 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read
801 mock_quic_data.AddRead(ASYNC, 0); // EOF 847 mock_quic_data.AddRead(ASYNC, 0); // EOF
802 848
803 mock_quic_data.AddSocketDataToFactory(&socket_factory_); 849 mock_quic_data.AddSocketDataToFactory(&socket_factory_);
804 850
805 AddHangingNonAlternateProtocolSocketData(); 851 AddHangingNonAlternateProtocolSocketData();
806 CreateSessionWithNextProtos(); 852 CreateSessionWithNextProtos();
807 853
808 SendRequestAndExpectHttpResponse("hello world"); 854 SendRequestAndExpectHttpResponse("hello world");
855
856 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
857
858 session_->http_server_properties()->ClearAlternativeServices(
859 HostPortPair::FromURL(request_.url));
860
861 // Manually reset the alternative service map where an existing QUIC session
862 // is in the second entry of the list.
863 HostPortPair alternative1("mail.example.com", 1234);
864 HostPortPair alternative2("foo.example.com", 443);
865 HostPortPair alternative3("bar.example.com", 443);
866
867 AlternativeServiceInfoVector alternative_service_info_vector;
868 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
869 AlternativeService alternative_service1(QUIC, alternative1);
870 AlternativeServiceInfo alternative_service_info1(alternative_service1, 1.0,
871 expiration);
872 alternative_service_info_vector.push_back(alternative_service_info1);
873 AlternativeService alternative_service2(QUIC, alternative2);
874 AlternativeServiceInfo alternative_service_info2(alternative_service2, 1.0,
875 expiration);
876 alternative_service_info_vector.push_back(alternative_service_info2);
877 AlternativeService alternative_service3(QUIC, alternative3);
878 AlternativeServiceInfo alternative_service_info3(alternative_service3, 1.0,
879 expiration);
880 alternative_service_info_vector.push_back(alternative_service_info3);
881 session_->http_server_properties()->SetAlternativeServices(
882 HostPortPair::FromURL(request_.url), alternative_service_info_vector);
883
809 SendRequestAndExpectQuicResponseOnPort("hello!", 443); 884 SendRequestAndExpectQuicResponseOnPort("hello!", 443);
810 } 885 }
811 886
812 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) { 887 TEST_P(QuicNetworkTransactionTest, AlternativeServiceDifferentPort) {
813 MockRead http_reads[] = { 888 MockRead http_reads[] = {
814 MockRead("HTTP/1.1 200 OK\r\n"), 889 MockRead("HTTP/1.1 200 OK\r\n"),
815 MockRead(kQuicAlternativeServiceDifferentPortHeader), 890 MockRead(kQuicAlternativeServiceDifferentPortHeader),
816 MockRead("hello world"), 891 MockRead("hello world"),
817 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 892 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
818 MockRead(ASYNC, OK)}; 893 MockRead(ASYNC, OK)};
(...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after
1874 request_.url = GURL("https://www.example.org:443"); 1949 request_.url = GURL("https://www.example.org:443");
1875 AddHangingNonAlternateProtocolSocketData(); 1950 AddHangingNonAlternateProtocolSocketData();
1876 CreateSessionWithNextProtos(); 1951 CreateSessionWithNextProtos();
1877 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE); 1952 AddQuicAlternateProtocolMapping(MockCryptoClientStream::CONFIRM_HANDSHAKE);
1878 SendRequestAndExpectQuicResponse("hello!"); 1953 SendRequestAndExpectQuicResponse("hello!");
1879 EXPECT_TRUE(rtt_observer_.rtt_notification_received()); 1954 EXPECT_TRUE(rtt_observer_.rtt_notification_received());
1880 } 1955 }
1881 1956
1882 } // namespace test 1957 } // namespace test
1883 } // namespace net 1958 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698