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

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

Issue 1775283002: [Domain Reliabiliy: net stack] Plumb received go away from server due to connection migration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove conditional assignment Created 4 years, 9 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/quic/quic_http_stream.cc ('k') | net/quic/quic_stream_factory_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) 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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_http_stream.cc ('k') | net/quic/quic_stream_factory_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698