| OLD | NEW |
| 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/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 PlatformTest::TearDown(); | 226 PlatformTest::TearDown(); |
| 227 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 227 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 228 base::MessageLoop::current()->RunUntilIdle(); | 228 base::MessageLoop::current()->RunUntilIdle(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 231 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 232 QuicPacketNumber num) { | 232 QuicPacketNumber num) { |
| 233 return maker_.MakeConnectionClosePacket(num); | 233 return maker_.MakeConnectionClosePacket(num); |
| 234 } | 234 } |
| 235 | 235 |
| 236 scoped_ptr<QuicEncryptedPacket> ConstructGoAwayPacket( |
| 237 QuicPacketNumber num, |
| 238 QuicErrorCode error_code, |
| 239 std::string reason_phrase) { |
| 240 return maker_.MakeGoAwayPacket(num, error_code, reason_phrase); |
| 241 } |
| 242 |
| 236 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 243 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 237 QuicPacketNumber largest_received, | 244 QuicPacketNumber largest_received, |
| 238 QuicPacketNumber least_unacked) { | 245 QuicPacketNumber least_unacked) { |
| 239 return maker_.MakeAckPacket(2, largest_received, least_unacked, | 246 return maker_.MakeAckPacket(2, largest_received, least_unacked, |
| 240 least_unacked, true); | 247 least_unacked, true); |
| 241 } | 248 } |
| 242 | 249 |
| 250 scoped_ptr<QuicEncryptedPacket> ConstructAckAndRstPacket( |
| 251 QuicPacketNumber num, |
| 252 QuicStreamId stream_id, |
| 253 QuicRstStreamErrorCode error_code, |
| 254 QuicPacketNumber largest_received, |
| 255 QuicPacketNumber ack_least_unacked, |
| 256 QuicPacketNumber stop_least_unacked) { |
| 257 return maker_.MakeAckAndRstPacket(num, false, stream_id, error_code, |
| 258 largest_received, ack_least_unacked, |
| 259 stop_least_unacked, true); |
| 260 } |
| 261 |
| 243 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 262 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 244 QuicPacketNumber largest_received, | 263 QuicPacketNumber largest_received, |
| 245 QuicPacketNumber least_unacked, | 264 QuicPacketNumber least_unacked, |
| 246 QuicTestPacketMaker* maker) { | 265 QuicTestPacketMaker* maker) { |
| 247 return maker->MakeAckPacket(2, largest_received, least_unacked, | 266 return maker->MakeAckPacket(2, largest_received, least_unacked, |
| 248 least_unacked, true); | 267 least_unacked, true); |
| 249 } | 268 } |
| 250 | 269 |
| 251 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( | 270 scoped_ptr<QuicEncryptedPacket> ConstructAckAndConnectionClosePacket( |
| 252 QuicPacketNumber packet_number, | 271 QuicPacketNumber packet_number, |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 | 927 |
| 909 mock_quic_data.AddSocketDataToFactory(&socket_factory_); | 928 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 910 | 929 |
| 911 AddHangingNonAlternateProtocolSocketData(); | 930 AddHangingNonAlternateProtocolSocketData(); |
| 912 CreateSession(); | 931 CreateSession(); |
| 913 | 932 |
| 914 SendRequestAndExpectHttpResponse("hello world"); | 933 SendRequestAndExpectHttpResponse("hello world"); |
| 915 SendRequestAndExpectQuicResponse("hello!"); | 934 SendRequestAndExpectQuicResponse("hello!"); |
| 916 } | 935 } |
| 917 | 936 |
| 937 TEST_P(QuicNetworkTransactionTest, GoAwayWithConnectionMigrationOnPortsOnly) { |
| 938 MockQuicData mock_quic_data; |
| 939 mock_quic_data.AddWrite( |
| 940 ConstructRequestHeadersPacket(1, kClientDataStreamId1, true, true, |
| 941 GetRequestHeaders("GET", "https", "/"))); |
| 942 mock_quic_data.AddRead(ConstructResponseHeadersPacket( |
| 943 1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK"))); |
| 944 // Read a GoAway packet with |
| 945 // QuicErrorCode: QUIC_ERROR_MIGRATING_PORT from the peer. |
| 946 mock_quic_data.AddRead( |
| 947 ConstructGoAwayPacket(2, QUIC_ERROR_MIGRATING_PORT, |
| 948 "connection migration with port change only")); |
| 949 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 950 mock_quic_data.AddRead( |
| 951 ConstructDataPacket(3, kClientDataStreamId1, false, true, 0, "hello!")); |
| 952 mock_quic_data.AddWrite(ConstructAckAndRstPacket( |
| 953 3, kClientDataStreamId1, QUIC_STREAM_CANCELLED, 3, 3, 1)); |
| 954 mock_quic_data.AddRead(ASYNC, ERR_IO_PENDING); // No more data to read |
| 955 mock_quic_data.AddRead(ASYNC, 0); // EOF |
| 956 |
| 957 mock_quic_data.AddSocketDataToFactory(&socket_factory_); |
| 958 |
| 959 // The non-alternate protocol job needs to hang in order to guarantee that |
| 960 // the alternate-protocol job will "win". |
| 961 AddHangingNonAlternateProtocolSocketData(); |
| 962 |
| 963 // In order for a new QUIC session to be established via alternate-protocol |
| 964 // without racing an HTTP connection, we need the host resolution to happen |
| 965 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 966 // connection to the the server, in this test we require confirmation |
| 967 // before encrypting so the HTTP job will still start. |
| 968 host_resolver_.set_synchronous_mode(true); |
| 969 host_resolver_.rules()->AddIPLiteralRule("mail.example.org", "192.168.0.1", |
| 970 ""); |
| 971 HostResolver::RequestInfo info(HostPortPair("mail.example.org", 443)); |
| 972 AddressList address; |
| 973 host_resolver_.Resolve(info, DEFAULT_PRIORITY, &address, CompletionCallback(), |
| 974 nullptr, net_log_.bound()); |
| 975 |
| 976 CreateSession(); |
| 977 session_->quic_stream_factory()->set_require_confirmation(true); |
| 978 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 979 |
| 980 scoped_ptr<HttpNetworkTransaction> trans( |
| 981 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 982 TestCompletionCallback callback; |
| 983 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 984 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 985 |
| 986 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 987 QuicSession::HANDSHAKE_CONFIRMED); |
| 988 EXPECT_EQ(OK, callback.WaitForResult()); |
| 989 |
| 990 // Check whether this transaction is correctly marked as received a go-away |
| 991 // because of migrating port. |
| 992 NetErrorDetails details; |
| 993 EXPECT_FALSE(details.quic_port_migration_detected); |
| 994 trans->PopulateNetErrorDetails(&details); |
| 995 EXPECT_TRUE(details.quic_port_migration_detected); |
| 996 } |
| 997 |
| 918 TEST_P(QuicNetworkTransactionTest, | 998 TEST_P(QuicNetworkTransactionTest, |
| 919 DoNotUseAlternativeServiceQuicUnsupportedVersion) { | 999 DoNotUseAlternativeServiceQuicUnsupportedVersion) { |
| 920 std::string altsvc_header = base::StringPrintf( | 1000 std::string altsvc_header = base::StringPrintf( |
| 921 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1); | 1001 "Alt-Svc: quic=\":443\"; v=\"%u\"\r\n\r\n", GetParam() - 1); |
| 922 MockRead http_reads[] = { | 1002 MockRead http_reads[] = { |
| 923 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), | 1003 MockRead("HTTP/1.1 200 OK\r\n"), MockRead(altsvc_header.c_str()), |
| 924 MockRead("hello world"), | 1004 MockRead("hello world"), |
| 925 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 1005 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 926 MockRead(ASYNC, OK)}; | 1006 MockRead(ASYNC, OK)}; |
| 927 | 1007 |
| (...skipping 1419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2347 scoped_ptr<HttpNetworkTransaction> trans( | 2427 scoped_ptr<HttpNetworkTransaction> trans( |
| 2348 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 2428 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 2349 TestCompletionCallback callback; | 2429 TestCompletionCallback callback; |
| 2350 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 2430 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 2351 EXPECT_EQ(ERR_IO_PENDING, rv); | 2431 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 2352 EXPECT_NE(OK, callback.WaitForResult()); | 2432 EXPECT_NE(OK, callback.WaitForResult()); |
| 2353 } | 2433 } |
| 2354 | 2434 |
| 2355 } // namespace test | 2435 } // namespace test |
| 2356 } // namespace net | 2436 } // namespace net |
| OLD | NEW |