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 3 // found in the LICENSE file. 4 5 #include <stddef.h> 6 #include <string> 7 #include <sys/epoll.h> 8 #include <vector> 9 10 #include "base/basictypes.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/singleton.h" 13 #include "base/strings/string_number_conversions.h" 14 #include "base/synchronization/waitable_event.h" 15 #include "base/time/time.h" 16 #include "net/base/ip_endpoint.h" 17 #include "net/quic/congestion_control/tcp_cubic_sender.h" 18 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" 19 #include "net/quic/crypto/null_encrypter.h" 20 #include "net/quic/quic_flags.h" 21 #include "net/quic/quic_framer.h" 22 #include "net/quic/quic_packet_creator.h" 23 #include "net/quic/quic_protocol.h" 24 #include "net/quic/quic_server_id.h" 25 #include "net/quic/quic_utils.h" 26 #include "net/quic/test_tools/quic_connection_peer.h" 27 #include "net/quic/test_tools/quic_flow_controller_peer.h" 28 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" 29 #include "net/quic/test_tools/quic_session_peer.h" 30 #include "net/quic/test_tools/quic_test_utils.h" 31 #include "net/quic/test_tools/reliable_quic_stream_peer.h" 32 #include "net/test/gtest_util.h" 33 #include "net/tools/epoll_server/epoll_server.h" 34 #include "net/tools/quic/quic_epoll_connection_helper.h" 35 #include "net/tools/quic/quic_in_memory_cache.h" 36 #include "net/tools/quic/quic_packet_writer_wrapper.h" 37 #include "net/tools/quic/quic_server.h" 38 #include "net/tools/quic/quic_socket_utils.h" 39 #include "net/tools/quic/quic_spdy_client_stream.h" 40 #include "net/tools/quic/test_tools/http_message.h" 41 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" 42 #include "net/tools/quic/test_tools/quic_client_peer.h" 43 #include "net/tools/quic/test_tools/quic_dispatcher_peer.h" 44 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" 45 #include "net/tools/quic/test_tools/quic_server_peer.h" 46 #include "net/tools/quic/test_tools/quic_test_client.h" 47 #include "net/tools/quic/test_tools/server_thread.h" 48 #include "testing/gtest/include/gtest/gtest.h" 49 50 using base::StringPiece; 51 using base::WaitableEvent; 52 using net::EpollServer; 53 using net::test::GenerateBody; 54 using net::test::QuicConnectionPeer; 55 using net::test::QuicFlowControllerPeer; 56 using net::test::QuicSentPacketManagerPeer; 57 using net::test::QuicSessionPeer; 58 using net::test::ReliableQuicStreamPeer; 59 using net::test::ValueRestore; 60 using net::test::kClientDataStreamId1; 61 using net::tools::test::PacketDroppingTestWriter; 62 using net::tools::test::QuicDispatcherPeer; 63 using net::tools::test::QuicServerPeer; 64 using std::ostream; 65 using std::string; 66 using std::vector; 67 68 namespace net { 69 namespace tools { 70 namespace test { 71 namespace { 72 73 const char* kFooResponseBody = "Artichoke hearts make me happy."; 74 const char* kBarResponseBody = "Palm hearts are pretty delicious, also."; 75 76 // Run all tests with the cross products of all versions. 77 struct TestParams { 78 TestParams(const QuicVersionVector& client_supported_versions, 79 const QuicVersionVector& server_supported_versions, 80 QuicVersion negotiated_version, 81 bool use_pacing, 82 bool use_fec, 83 QuicTag congestion_control_tag) 84 : client_supported_versions(client_supported_versions), 85 server_supported_versions(server_supported_versions), 86 negotiated_version(negotiated_version), 87 use_pacing(use_pacing), 88 use_fec(use_fec), 89 congestion_control_tag(congestion_control_tag) { 90 } 91 92 friend ostream& operator<<(ostream& os, const TestParams& p) { 93 os << "{ server_supported_versions: " 94 << QuicVersionVectorToString(p.server_supported_versions); 95 os << " client_supported_versions: " 96 << QuicVersionVectorToString(p.client_supported_versions); 97 os << " negotiated_version: " << QuicVersionToString(p.negotiated_version); 98 os << " use_pacing: " << p.use_pacing; 99 os << " use_fec: " << p.use_fec; 100 os << " congestion_control_tag: " 101 << QuicUtils::TagToString(p.congestion_control_tag) << " }"; 102 return os; 103 } 104 105 QuicVersionVector client_supported_versions; 106 QuicVersionVector server_supported_versions; 107 QuicVersion negotiated_version; 108 bool use_pacing; 109 bool use_fec; 110 QuicTag congestion_control_tag; 111 }; 112 113 // Constructs various test permutations. 114 vector<TestParams> GetTestParams() { 115 vector<TestParams> params; 116 QuicVersionVector all_supported_versions = QuicSupportedVersions(); 117 // TODO(rtenneti): Add kTBBR after BBR code is checked in. 118 // QuicTag congestion_control_tags[] = {kRENO, kTBBR, kQBIC}; 119 QuicTag congestion_control_tags[] = {kRENO, kQBIC}; 120 for (size_t congestion_control_index = 0; 121 congestion_control_index < arraysize(congestion_control_tags); 122 congestion_control_index++) { 123 QuicTag congestion_control_tag = 124 congestion_control_tags[congestion_control_index]; 125 for (int use_fec = 0; use_fec < 2; ++use_fec) { 126 for (int use_pacing = 0; use_pacing < 2; ++use_pacing) { 127 // Add an entry for server and client supporting all versions. 128 params.push_back(TestParams(all_supported_versions, 129 all_supported_versions, 130 all_supported_versions[0], 131 use_pacing != 0, 132 use_fec != 0, 133 congestion_control_tag)); 134 135 // Test client supporting all versions and server supporting 1 version. 136 // Simulate an old server and exercise version downgrade in the client. 137 // Protocol negotiation should occur. Skip the i = 0 case because it is 138 // essentially the same as the default case. 139 for (size_t i = 1; i < all_supported_versions.size(); ++i) { 140 QuicVersionVector server_supported_versions; 141 server_supported_versions.push_back(all_supported_versions[i]); 142 if (all_supported_versions[i] >= QUIC_VERSION_18) { 143 // Until flow control is globally rolled out and we remove 144 // QUIC_VERSION_16, the server MUST support at least one QUIC 145 // version that does not use flow control. 146 server_supported_versions.push_back(QUIC_VERSION_16); 147 } 148 params.push_back(TestParams(all_supported_versions, 149 server_supported_versions, 150 server_supported_versions[0], 151 use_pacing != 0, 152 use_fec != 0, 153 congestion_control_tag)); 154 } 155 } 156 } 157 } 158 return params; 159 } 160 161 class ServerDelegate : public PacketDroppingTestWriter::Delegate { 162 public: 163 ServerDelegate(TestWriterFactory* writer_factory, 164 QuicDispatcher* dispatcher) 165 : writer_factory_(writer_factory), 166 dispatcher_(dispatcher) {} 167 virtual ~ServerDelegate() {} 168 virtual void OnPacketSent(WriteResult result) OVERRIDE { 169 writer_factory_->OnPacketSent(result); 170 } 171 virtual void OnCanWrite() OVERRIDE { dispatcher_->OnCanWrite(); } 172 private: 173 TestWriterFactory* writer_factory_; 174 QuicDispatcher* dispatcher_; 175 }; 176 177 class ClientDelegate : public PacketDroppingTestWriter::Delegate { 178 public: 179 explicit ClientDelegate(QuicClient* client) : client_(client) {} 180 virtual ~ClientDelegate() {} 181 virtual void OnPacketSent(WriteResult result) OVERRIDE {} 182 virtual void OnCanWrite() OVERRIDE { 183 EpollEvent event(EPOLLOUT, false); 184 client_->OnEvent(client_->fd(), &event); 185 } 186 private: 187 QuicClient* client_; 188 }; 189 190 class EndToEndTest : public ::testing::TestWithParam<TestParams> { 191 protected: 192 EndToEndTest() 193 : server_hostname_("example.com"), 194 server_started_(false), 195 strike_register_no_startup_period_(false) { 196 net::IPAddressNumber ip; 197 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); 198 server_address_ = IPEndPoint(ip, 0); 199 200 client_supported_versions_ = GetParam().client_supported_versions; 201 server_supported_versions_ = GetParam().server_supported_versions; 202 negotiated_version_ = GetParam().negotiated_version; 203 FLAGS_enable_quic_fec = GetParam().use_fec; 204 205 VLOG(1) << "Using Configuration: " << GetParam(); 206 207 client_config_.SetDefaults(); 208 server_config_.SetDefaults(); 209 210 // Use different flow control windows for client/server. 211 client_config_.SetInitialFlowControlWindowToSend( 212 2 * kInitialSessionFlowControlWindowForTest); 213 client_config_.SetInitialStreamFlowControlWindowToSend( 214 2 * kInitialStreamFlowControlWindowForTest); 215 client_config_.SetInitialSessionFlowControlWindowToSend( 216 2 * kInitialSessionFlowControlWindowForTest); 217 server_config_.SetInitialFlowControlWindowToSend( 218 3 * kInitialSessionFlowControlWindowForTest); 219 server_config_.SetInitialStreamFlowControlWindowToSend( 220 3 * kInitialStreamFlowControlWindowForTest); 221 server_config_.SetInitialSessionFlowControlWindowToSend( 222 3 * kInitialSessionFlowControlWindowForTest); 223 224 QuicInMemoryCachePeer::ResetForTests(); 225 AddToCache("GET", "https://www.google.com/foo", 226 "HTTP/1.1", "200", "OK", kFooResponseBody); 227 AddToCache("GET", "https://www.google.com/bar", 228 "HTTP/1.1", "200", "OK", kBarResponseBody); 229 } 230 231 virtual ~EndToEndTest() { 232 // TODO(rtenneti): port RecycleUnusedPort if needed. 233 // RecycleUnusedPort(server_address_.port()); 234 QuicInMemoryCachePeer::ResetForTests(); 235 } 236 237 QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) { 238 QuicTestClient* client = new QuicTestClient( 239 server_address_, 240 server_hostname_, 241 false, // not secure 242 client_config_, 243 client_supported_versions_); 244 client->UseWriter(writer); 245 client->Connect(); 246 return client; 247 } 248 249 void set_client_initial_flow_control_receive_window(uint32 window) { 250 CHECK(client_.get() == NULL); 251 DVLOG(1) << "Setting client initial flow control window: " << window; 252 client_config_.SetInitialFlowControlWindowToSend(window); 253 } 254 255 void set_client_initial_stream_flow_control_receive_window(uint32 window) { 256 CHECK(client_.get() == NULL); 257 DVLOG(1) << "Setting client initial stream flow control window: " << window; 258 client_config_.SetInitialStreamFlowControlWindowToSend(window); 259 } 260 261 void set_client_initial_session_flow_control_receive_window(uint32 window) { 262 CHECK(client_.get() == NULL); 263 DVLOG(1) << "Setting client initial session flow control window: " 264 << window; 265 client_config_.SetInitialSessionFlowControlWindowToSend(window); 266 } 267 268 void set_server_initial_flow_control_receive_window(uint32 window) { 269 CHECK(server_thread_.get() == NULL); 270 DVLOG(1) << "Setting server initial flow control window: " << window; 271 server_config_.SetInitialFlowControlWindowToSend(window); 272 } 273 274 void set_server_initial_stream_flow_control_receive_window(uint32 window) { 275 CHECK(server_thread_.get() == NULL); 276 DVLOG(1) << "Setting server initial stream flow control window: " 277 << window; 278 server_config_.SetInitialStreamFlowControlWindowToSend(window); 279 } 280 281 void set_server_initial_session_flow_control_receive_window(uint32 window) { 282 CHECK(server_thread_.get() == NULL); 283 DVLOG(1) << "Setting server initial session flow control window: " 284 << window; 285 server_config_.SetInitialSessionFlowControlWindowToSend(window); 286 } 287 288 const QuicSentPacketManager * 289 GetSentPacketManagerFromFirstServerSession() const { 290 QuicDispatcher* dispatcher = 291 QuicServerPeer::GetDispatcher(server_thread_->server()); 292 QuicSession* session = dispatcher->session_map().begin()->second; 293 return &session->connection()->sent_packet_manager(); 294 } 295 296 bool Initialize() { 297 QuicTagVector copt; 298 299 if (GetParam().use_pacing) { 300 copt.push_back(kPACE); 301 } 302 server_config_.SetConnectionOptionsToSend(copt); 303 304 // TODO(nimia): Consider setting the congestion control algorithm for the 305 // client as well according to the test parameter. 306 copt.push_back(GetParam().congestion_control_tag); 307 308 if (GetParam().use_fec) { 309 // Set FEC config in client's connection options and in client session. 310 copt.push_back(kFHDR); 311 } 312 313 client_config_.SetConnectionOptionsToSend(copt); 314 315 // Start the server first, because CreateQuicClient() attempts 316 // to connect to the server. 317 StartServer(); 318 client_.reset(CreateQuicClient(client_writer_)); 319 if (GetParam().use_fec) { 320 // Set FecPolicy to always protect data on all streams. 321 client_->SetFecPolicy(FEC_PROTECT_ALWAYS); 322 } 323 static EpollEvent event(EPOLLOUT, false); 324 client_writer_->Initialize( 325 reinterpret_cast<QuicEpollConnectionHelper*>( 326 QuicConnectionPeer::GetHelper( 327 client_->client()->session()->connection())), 328 new ClientDelegate(client_->client())); 329 return client_->client()->connected(); 330 } 331 332 virtual void SetUp() OVERRIDE { 333 // The ownership of these gets transferred to the QuicPacketWriterWrapper 334 // and TestWriterFactory when Initialize() is executed. 335 client_writer_ = new PacketDroppingTestWriter(); 336 server_writer_ = new PacketDroppingTestWriter(); 337 } 338 339 virtual void TearDown() OVERRIDE { 340 StopServer(); 341 } 342 343 void StartServer() { 344 server_thread_.reset( 345 new ServerThread( 346 new QuicServer(server_config_, server_supported_versions_), 347 server_address_, 348 strike_register_no_startup_period_)); 349 server_thread_->Initialize(); 350 server_address_ = IPEndPoint(server_address_.address(), 351 server_thread_->GetPort()); 352 QuicDispatcher* dispatcher = 353 QuicServerPeer::GetDispatcher(server_thread_->server()); 354 TestWriterFactory* packet_writer_factory = new TestWriterFactory(); 355 QuicDispatcherPeer::SetPacketWriterFactory(dispatcher, 356 packet_writer_factory); 357 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_); 358 server_writer_->Initialize( 359 QuicDispatcherPeer::GetHelper(dispatcher), 360 new ServerDelegate(packet_writer_factory, dispatcher)); 361 server_thread_->Start(); 362 server_started_ = true; 363 } 364 365 void StopServer() { 366 if (!server_started_) 367 return; 368 if (server_thread_.get()) { 369 server_thread_->Quit(); 370 server_thread_->Join(); 371 } 372 } 373 374 void AddToCache(StringPiece method, 375 StringPiece path, 376 StringPiece version, 377 StringPiece response_code, 378 StringPiece response_detail, 379 StringPiece body) { 380 QuicInMemoryCache::GetInstance()->AddSimpleResponse( 381 method, path, version, response_code, response_detail, body); 382 } 383 384 void SetPacketLossPercentage(int32 loss) { 385 // TODO(rtenneti): enable when we can do random packet loss tests in 386 // chrome's tree. 387 if (loss != 0 && loss != 100) 388 return; 389 client_writer_->set_fake_packet_loss_percentage(loss); 390 server_writer_->set_fake_packet_loss_percentage(loss); 391 } 392 393 void SetPacketSendDelay(QuicTime::Delta delay) { 394 // TODO(rtenneti): enable when we can do random packet send delay tests in 395 // chrome's tree. 396 // client_writer_->set_fake_packet_delay(delay); 397 // server_writer_->set_fake_packet_delay(delay); 398 } 399 400 void SetReorderPercentage(int32 reorder) { 401 // TODO(rtenneti): enable when we can do random packet reorder tests in 402 // chrome's tree. 403 // client_writer_->set_fake_reorder_percentage(reorder); 404 // server_writer_->set_fake_reorder_percentage(reorder); 405 } 406 407 // Verifies that the client and server connections were both free of packets 408 // being discarded, based on connection stats. 409 // Calls server_thread_ Pause() and Resume(), which may only be called once 410 // per test. 411 void VerifyCleanConnection(bool had_packet_loss) { 412 QuicConnectionStats client_stats = 413 client_->client()->session()->connection()->GetStats(); 414 if (!had_packet_loss) { 415 EXPECT_EQ(0u, client_stats.packets_lost); 416 } 417 EXPECT_EQ(0u, client_stats.packets_discarded); 418 EXPECT_EQ(0u, client_stats.packets_dropped); 419 EXPECT_EQ(client_stats.packets_received, client_stats.packets_processed); 420 421 server_thread_->Pause(); 422 QuicDispatcher* dispatcher = 423 QuicServerPeer::GetDispatcher(server_thread_->server()); 424 ASSERT_EQ(1u, dispatcher->session_map().size()); 425 QuicSession* session = dispatcher->session_map().begin()->second; 426 QuicConnectionStats server_stats = session->connection()->GetStats(); 427 if (!had_packet_loss) { 428 EXPECT_EQ(0u, server_stats.packets_lost); 429 } 430 EXPECT_EQ(0u, server_stats.packets_discarded); 431 // TODO(ianswett): Restore the check for packets_dropped equals 0. 432 // The expect for packets received is equal to packets processed fails 433 // due to version negotiation packets. 434 server_thread_->Resume(); 435 } 436 437 IPEndPoint server_address_; 438 string server_hostname_; 439 scoped_ptr<ServerThread> server_thread_; 440 scoped_ptr<QuicTestClient> client_; 441 PacketDroppingTestWriter* client_writer_; 442 PacketDroppingTestWriter* server_writer_; 443 bool server_started_; 444 QuicConfig client_config_; 445 QuicConfig server_config_; 446 QuicVersionVector client_supported_versions_; 447 QuicVersionVector server_supported_versions_; 448 QuicVersion negotiated_version_; 449 bool strike_register_no_startup_period_; 450 }; 451 452 // Run all end to end tests with all supported versions. 453 INSTANTIATE_TEST_CASE_P(EndToEndTests, 454 EndToEndTest, 455 ::testing::ValuesIn(GetTestParams())); 456 457 TEST_P(EndToEndTest, SimpleRequestResponse) { 458 ASSERT_TRUE(Initialize()); 459 460 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 461 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 462 } 463 464 // TODO(rch): figure out how to detect missing v6 supprt (like on the linux 465 // try bots) and selectively disable this test. 466 TEST_P(EndToEndTest, DISABLED_SimpleRequestResponsev6) { 467 IPAddressNumber ip; 468 CHECK(net::ParseIPLiteralToNumber("::1", &ip)); 469 server_address_ = IPEndPoint(ip, server_address_.port()); 470 ASSERT_TRUE(Initialize()); 471 472 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 473 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 474 } 475 476 TEST_P(EndToEndTest, SeparateFinPacket) { 477 ASSERT_TRUE(Initialize()); 478 479 HTTPMessage request(HttpConstants::HTTP_1_1, 480 HttpConstants::POST, "/foo"); 481 request.set_has_complete_message(false); 482 483 client_->SendMessage(request); 484 485 client_->SendData(string(), true); 486 487 client_->WaitForResponse(); 488 EXPECT_EQ(kFooResponseBody, client_->response_body()); 489 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 490 491 request.AddBody("foo", true); 492 493 client_->SendMessage(request); 494 client_->SendData(string(), true); 495 client_->WaitForResponse(); 496 EXPECT_EQ(kFooResponseBody, client_->response_body()); 497 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 498 } 499 500 TEST_P(EndToEndTest, MultipleRequestResponse) { 501 ASSERT_TRUE(Initialize()); 502 503 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 504 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 505 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar")); 506 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 507 } 508 509 TEST_P(EndToEndTest, MultipleClients) { 510 ASSERT_TRUE(Initialize()); 511 scoped_ptr<QuicTestClient> client2(CreateQuicClient(NULL)); 512 513 HTTPMessage request(HttpConstants::HTTP_1_1, 514 HttpConstants::POST, "/foo"); 515 request.AddHeader("content-length", "3"); 516 request.set_has_complete_message(false); 517 518 client_->SendMessage(request); 519 client2->SendMessage(request); 520 521 client_->SendData("bar", true); 522 client_->WaitForResponse(); 523 EXPECT_EQ(kFooResponseBody, client_->response_body()); 524 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 525 526 client2->SendData("eep", true); 527 client2->WaitForResponse(); 528 EXPECT_EQ(kFooResponseBody, client2->response_body()); 529 EXPECT_EQ(200u, client2->response_headers()->parsed_response_code()); 530 } 531 532 TEST_P(EndToEndTest, RequestOverMultiplePackets) { 533 // Send a large enough request to guarantee fragmentation. 534 string huge_request = 535 "https://www.google.com/some/path?query=" + string(kMaxPacketSize, '.'); 536 AddToCache("GET", huge_request, "HTTP/1.1", "200", "OK", kBarResponseBody); 537 538 ASSERT_TRUE(Initialize()); 539 540 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest(huge_request)); 541 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 542 } 543 544 TEST_P(EndToEndTest, MultiplePacketsRandomOrder) { 545 // Send a large enough request to guarantee fragmentation. 546 string huge_request = 547 "https://www.google.com/some/path?query=" + string(kMaxPacketSize, '.'); 548 AddToCache("GET", huge_request, "HTTP/1.1", "200", "OK", kBarResponseBody); 549 550 ASSERT_TRUE(Initialize()); 551 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); 552 SetReorderPercentage(50); 553 554 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest(huge_request)); 555 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 556 } 557 558 TEST_P(EndToEndTest, PostMissingBytes) { 559 ASSERT_TRUE(Initialize()); 560 561 // Add a content length header with no body. 562 HTTPMessage request(HttpConstants::HTTP_1_1, 563 HttpConstants::POST, "/foo"); 564 request.AddHeader("content-length", "3"); 565 request.set_skip_message_validation(true); 566 567 // This should be detected as stream fin without complete request, 568 // triggering an error response. 569 client_->SendCustomSynchronousRequest(request); 570 EXPECT_EQ("bad", client_->response_body()); 571 EXPECT_EQ(500u, client_->response_headers()->parsed_response_code()); 572 } 573 574 // TODO(rtenneti): DISABLED_LargePostNoPacketLoss seems to be flaky. 575 // http://crbug.com/297040. 576 TEST_P(EndToEndTest, DISABLED_LargePostNoPacketLoss) { 577 ASSERT_TRUE(Initialize()); 578 579 client_->client()->WaitForCryptoHandshakeConfirmed(); 580 581 // 1 MB body. 582 string body; 583 GenerateBody(&body, 1024 * 1024); 584 585 HTTPMessage request(HttpConstants::HTTP_1_1, 586 HttpConstants::POST, "/foo"); 587 request.AddBody(body, true); 588 589 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 590 VerifyCleanConnection(false); 591 } 592 593 TEST_P(EndToEndTest, LargePostNoPacketLoss1sRTT) { 594 ASSERT_TRUE(Initialize()); 595 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(1000)); 596 597 client_->client()->WaitForCryptoHandshakeConfirmed(); 598 599 // 100 KB body. 600 string body; 601 GenerateBody(&body, 100 * 1024); 602 603 HTTPMessage request(HttpConstants::HTTP_1_1, 604 HttpConstants::POST, "/foo"); 605 request.AddBody(body, true); 606 607 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 608 VerifyCleanConnection(false); 609 } 610 611 TEST_P(EndToEndTest, LargePostWithPacketLoss) { 612 // Connect with lower fake packet loss than we'd like to test. Until 613 // b/10126687 is fixed, losing handshake packets is pretty brutal. 614 SetPacketLossPercentage(5); 615 ASSERT_TRUE(Initialize()); 616 617 // Wait for the server SHLO before upping the packet loss. 618 client_->client()->WaitForCryptoHandshakeConfirmed(); 619 SetPacketLossPercentage(30); 620 621 // 10 KB body. 622 string body; 623 GenerateBody(&body, 1024 * 10); 624 625 HTTPMessage request(HttpConstants::HTTP_1_1, 626 HttpConstants::POST, "/foo"); 627 request.AddBody(body, true); 628 629 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 630 VerifyCleanConnection(true); 631 } 632 633 TEST_P(EndToEndTest, LargePostWithPacketLossAndBlockedSocket) { 634 // Connect with lower fake packet loss than we'd like to test. Until 635 // b/10126687 is fixed, losing handshake packets is pretty brutal. 636 SetPacketLossPercentage(5); 637 ASSERT_TRUE(Initialize()); 638 639 // Wait for the server SHLO before upping the packet loss. 640 client_->client()->WaitForCryptoHandshakeConfirmed(); 641 SetPacketLossPercentage(10); 642 client_writer_->set_fake_blocked_socket_percentage(10); 643 644 // 10 KB body. 645 string body; 646 GenerateBody(&body, 1024 * 10); 647 648 HTTPMessage request(HttpConstants::HTTP_1_1, 649 HttpConstants::POST, "/foo"); 650 request.AddBody(body, true); 651 652 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 653 } 654 655 TEST_P(EndToEndTest, LargePostNoPacketLossWithDelayAndReordering) { 656 ASSERT_TRUE(Initialize()); 657 658 client_->client()->WaitForCryptoHandshakeConfirmed(); 659 // Both of these must be called when the writer is not actively used. 660 SetPacketSendDelay(QuicTime::Delta::FromMilliseconds(2)); 661 SetReorderPercentage(30); 662 663 // 1 MB body. 664 string body; 665 GenerateBody(&body, 1024 * 1024); 666 667 HTTPMessage request(HttpConstants::HTTP_1_1, 668 HttpConstants::POST, "/foo"); 669 request.AddBody(body, true); 670 671 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 672 } 673 674 TEST_P(EndToEndTest, LargePostZeroRTTFailure) { 675 // Have the server accept 0-RTT without waiting a startup period. 676 strike_register_no_startup_period_ = true; 677 678 // Send a request and then disconnect. This prepares the client to attempt 679 // a 0-RTT handshake for the next request. 680 ASSERT_TRUE(Initialize()); 681 682 string body; 683 GenerateBody(&body, 20480); 684 685 HTTPMessage request(HttpConstants::HTTP_1_1, 686 HttpConstants::POST, "/foo"); 687 request.AddBody(body, true); 688 689 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 690 EXPECT_EQ(2, client_->client()->session()->GetNumSentClientHellos()); 691 692 client_->Disconnect(); 693 694 // The 0-RTT handshake should succeed. 695 client_->Connect(); 696 if (client_supported_versions_[0] >= QUIC_VERSION_18 && 697 negotiated_version_ <= QUIC_VERSION_16) { 698 // If the version negotiation has resulted in a downgrade, then the client 699 // must wait for the handshake to complete before sending any data. 700 // Otherwise it may have queued frames which will trigger a 701 // DFATAL when they are serialized after the downgrade. 702 client_->client()->WaitForCryptoHandshakeConfirmed(); 703 } 704 client_->WaitForResponseForMs(-1); 705 ASSERT_TRUE(client_->client()->connected()); 706 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 707 EXPECT_EQ(1, client_->client()->session()->GetNumSentClientHellos()); 708 709 client_->Disconnect(); 710 711 // Restart the server so that the 0-RTT handshake will take 1 RTT. 712 StopServer(); 713 server_writer_ = new PacketDroppingTestWriter(); 714 StartServer(); 715 716 client_->Connect(); 717 if (client_supported_versions_[0] >= QUIC_VERSION_18 && 718 negotiated_version_ <= QUIC_VERSION_16) { 719 // If the version negotiation has resulted in a downgrade, then the client 720 // must wait for the handshake to complete before sending any data. 721 // Otherwise it may have queued frames which will trigger a 722 // DFATAL when they are serialized after the downgrade. 723 client_->client()->WaitForCryptoHandshakeConfirmed(); 724 } 725 ASSERT_TRUE(client_->client()->connected()); 726 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 727 EXPECT_EQ(2, client_->client()->session()->GetNumSentClientHellos()); 728 VerifyCleanConnection(false); 729 } 730 731 TEST_P(EndToEndTest, CorrectlyConfiguredFec) { 732 ASSERT_TRUE(Initialize()); 733 client_->client()->WaitForCryptoHandshakeConfirmed(); 734 server_thread_->WaitForCryptoHandshakeConfirmed(); 735 736 FecPolicy expected_policy = 737 GetParam().use_fec ? FEC_PROTECT_ALWAYS : FEC_PROTECT_OPTIONAL; 738 739 // Verify that server's FEC configuration is correct. 740 server_thread_->Pause(); 741 QuicDispatcher* dispatcher = 742 QuicServerPeer::GetDispatcher(server_thread_->server()); 743 ASSERT_EQ(1u, dispatcher->session_map().size()); 744 QuicSession* session = dispatcher->session_map().begin()->second; 745 EXPECT_EQ(expected_policy, 746 QuicSessionPeer::GetHeadersStream(session)->fec_policy()); 747 server_thread_->Resume(); 748 749 // Verify that client's FEC configuration is correct. 750 EXPECT_EQ(expected_policy, 751 QuicSessionPeer::GetHeadersStream( 752 client_->client()->session())->fec_policy()); 753 EXPECT_EQ(expected_policy, 754 client_->GetOrCreateStream()->fec_policy()); 755 } 756 757 // TODO(shess): This is flaky on ChromiumOS bots. 758 // http://crbug.com/374871 759 TEST_P(EndToEndTest, DISABLED_LargePostSmallBandwidthLargeBuffer) { 760 ASSERT_TRUE(Initialize()); 761 SetPacketSendDelay(QuicTime::Delta::FromMicroseconds(1)); 762 // 256KB per second with a 256KB buffer from server to client. Wireless 763 // clients commonly have larger buffers, but our max CWND is 200. 764 server_writer_->set_max_bandwidth_and_buffer_size( 765 QuicBandwidth::FromBytesPerSecond(256 * 1024), 256 * 1024); 766 767 client_->client()->WaitForCryptoHandshakeConfirmed(); 768 769 // 1 MB body. 770 string body; 771 GenerateBody(&body, 1024 * 1024); 772 773 HTTPMessage request(HttpConstants::HTTP_1_1, 774 HttpConstants::POST, "/foo"); 775 request.AddBody(body, true); 776 777 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 778 // This connection will not drop packets, because the buffer size is larger 779 // than the default receive window. 780 VerifyCleanConnection(false); 781 } 782 783 TEST_P(EndToEndTest, DoNotSetResumeWriteAlarmIfConnectionFlowControlBlocked) { 784 // Regression test for b/14677858. 785 // Test that the resume write alarm is not set in QuicConnection::OnCanWrite 786 // if currently connection level flow control blocked. If set, this results in 787 // an infinite loop in the EpollServer, as the alarm fires and is immediately 788 // rescheduled. 789 ASSERT_TRUE(Initialize()); 790 if (negotiated_version_ < QUIC_VERSION_19) { 791 return; 792 } 793 client_->client()->WaitForCryptoHandshakeConfirmed(); 794 795 // Ensure both stream and connection level are flow control blocked by setting 796 // the send window offset to 0. 797 const uint64 kFlowControlWindow = 798 server_config_.GetInitialFlowControlWindowToSend(); 799 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); 800 QuicSession* session = client_->client()->session(); 801 QuicFlowControllerPeer::SetSendWindowOffset(stream->flow_controller(), 0); 802 QuicFlowControllerPeer::SetSendWindowOffset(session->flow_controller(), 0); 803 EXPECT_TRUE(stream->flow_controller()->IsBlocked()); 804 EXPECT_TRUE(session->flow_controller()->IsBlocked()); 805 806 // Make sure that the stream has data pending so that it will be marked as 807 // write blocked when it receives a stream level WINDOW_UPDATE. 808 stream->SendBody("hello", false); 809 810 // The stream now attempts to write, fails because it is still connection 811 // level flow control blocked, and is added to the write blocked list. 812 QuicWindowUpdateFrame window_update(stream->id(), 2 * kFlowControlWindow); 813 stream->OnWindowUpdateFrame(window_update); 814 815 // Prior to fixing b/14677858 this call would result in an infinite loop in 816 // Chromium. As a proxy for detecting this, we now check whether the 817 // resume_writes_alarm is set after OnCanWrite. It should not be, as the 818 // connection is still flow control blocked. 819 session->connection()->OnCanWrite(); 820 821 QuicAlarm* resume_writes_alarm = 822 QuicConnectionPeer::GetResumeWritesAlarm(session->connection()); 823 EXPECT_FALSE(resume_writes_alarm->IsSet()); 824 } 825 826 TEST_P(EndToEndTest, InvalidStream) { 827 ASSERT_TRUE(Initialize()); 828 client_->client()->WaitForCryptoHandshakeConfirmed(); 829 830 string body; 831 GenerateBody(&body, kMaxPacketSize); 832 833 HTTPMessage request(HttpConstants::HTTP_1_1, 834 HttpConstants::POST, "/foo"); 835 request.AddBody(body, true); 836 // Force the client to write with a stream ID belonging to a nonexistent 837 // server-side stream. 838 QuicSessionPeer::SetNextStreamId(client_->client()->session(), 2); 839 840 client_->SendCustomSynchronousRequest(request); 841 // EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); 842 EXPECT_EQ(QUIC_PACKET_FOR_NONEXISTENT_STREAM, client_->connection_error()); 843 } 844 845 // TODO(rch): this test seems to cause net_unittests timeouts :| 846 TEST_P(EndToEndTest, DISABLED_MultipleTermination) { 847 ASSERT_TRUE(Initialize()); 848 849 HTTPMessage request(HttpConstants::HTTP_1_1, 850 HttpConstants::POST, "/foo"); 851 request.AddHeader("content-length", "3"); 852 request.set_has_complete_message(false); 853 854 // Set the offset so we won't frame. Otherwise when we pick up termination 855 // before HTTP framing is complete, we send an error and close the stream, 856 // and the second write is picked up as writing on a closed stream. 857 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); 858 ASSERT_TRUE(stream != NULL); 859 ReliableQuicStreamPeer::SetStreamBytesWritten(3, stream); 860 861 client_->SendData("bar", true); 862 client_->WaitForWriteToFlush(); 863 864 // By default the stream protects itself from writes after terminte is set. 865 // Override this to test the server handling buggy clients. 866 ReliableQuicStreamPeer::SetWriteSideClosed( 867 false, client_->GetOrCreateStream()); 868 869 EXPECT_DFATAL(client_->SendData("eep", true), "Fin already buffered"); 870 } 871 872 TEST_P(EndToEndTest, Timeout) { 873 client_config_.set_idle_connection_state_lifetime( 874 QuicTime::Delta::FromMicroseconds(500), 875 QuicTime::Delta::FromMicroseconds(500)); 876 // Note: we do NOT ASSERT_TRUE: we may time out during initial handshake: 877 // that's enough to validate timeout in this case. 878 Initialize(); 879 while (client_->client()->connected()) { 880 client_->client()->WaitForEvents(); 881 } 882 } 883 884 TEST_P(EndToEndTest, NegotiateMaxOpenStreams) { 885 // Negotiate 1 max open stream. 886 client_config_.set_max_streams_per_connection(1, 1); 887 ASSERT_TRUE(Initialize()); 888 client_->client()->WaitForCryptoHandshakeConfirmed(); 889 890 // Make the client misbehave after negotiation. 891 QuicSessionPeer::SetMaxOpenStreams(client_->client()->session(), 10); 892 893 HTTPMessage request(HttpConstants::HTTP_1_1, 894 HttpConstants::POST, "/foo"); 895 request.AddHeader("content-length", "3"); 896 request.set_has_complete_message(false); 897 898 // Open two simultaneous streams. 899 client_->SendMessage(request); 900 client_->SendMessage(request); 901 client_->WaitForResponse(); 902 903 EXPECT_FALSE(client_->connected()); 904 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); 905 EXPECT_EQ(QUIC_TOO_MANY_OPEN_STREAMS, client_->connection_error()); 906 } 907 908 TEST_P(EndToEndTest, NegotiateCongestionControl) { 909 ASSERT_TRUE(Initialize()); 910 client_->client()->WaitForCryptoHandshakeConfirmed(); 911 912 CongestionControlType expected_congestion_control_type; 913 switch (GetParam().congestion_control_tag) { 914 case kRENO: 915 expected_congestion_control_type = kReno; 916 break; 917 case kTBBR: 918 expected_congestion_control_type = kBBR; 919 break; 920 case kQBIC: 921 expected_congestion_control_type = kCubic; 922 break; 923 default: 924 DLOG(FATAL) << "Unexpected congestion control tag"; 925 } 926 927 EXPECT_EQ(expected_congestion_control_type, 928 QuicSentPacketManagerPeer::GetCongestionControlAlgorithm( 929 *GetSentPacketManagerFromFirstServerSession()) 930 ->GetCongestionControlType()); 931 } 932 933 TEST_P(EndToEndTest, LimitMaxOpenStreams) { 934 // Server limits the number of max streams to 2. 935 server_config_.set_max_streams_per_connection(2, 2); 936 // Client tries to negotiate for 10. 937 client_config_.set_max_streams_per_connection(10, 5); 938 939 ASSERT_TRUE(Initialize()); 940 client_->client()->WaitForCryptoHandshakeConfirmed(); 941 QuicConfig* client_negotiated_config = client_->client()->session()->config(); 942 EXPECT_EQ(2u, client_negotiated_config->max_streams_per_connection()); 943 } 944 945 TEST_P(EndToEndTest, LimitCongestionWindowAndRTT) { 946 // Client tries to request twice the server's max initial window, and the 947 // server limits it to the max. 948 client_config_.SetInitialCongestionWindowToSend(2 * kMaxInitialWindow); 949 client_config_.SetInitialRoundTripTimeUsToSend(1000); 950 951 ASSERT_TRUE(Initialize()); 952 client_->client()->WaitForCryptoHandshakeConfirmed(); 953 server_thread_->WaitForCryptoHandshakeConfirmed(); 954 955 // Pause the server so we can access the server's internals without races. 956 server_thread_->Pause(); 957 QuicDispatcher* dispatcher = 958 QuicServerPeer::GetDispatcher(server_thread_->server()); 959 ASSERT_EQ(1u, dispatcher->session_map().size()); 960 const QuicSentPacketManager& client_sent_packet_manager = 961 client_->client()->session()->connection()->sent_packet_manager(); 962 const QuicSentPacketManager& server_sent_packet_manager = 963 *GetSentPacketManagerFromFirstServerSession(); 964 965 // The client shouldn't set it's initial window based on the negotiated value. 966 EXPECT_EQ(kDefaultInitialWindow * kDefaultTCPMSS, 967 client_sent_packet_manager.GetCongestionWindow()); 968 EXPECT_EQ(kMaxInitialWindow * kDefaultTCPMSS, 969 server_sent_packet_manager.GetCongestionWindow()); 970 971 EXPECT_EQ(GetParam().use_pacing, server_sent_packet_manager.using_pacing()); 972 EXPECT_EQ(GetParam().use_pacing, client_sent_packet_manager.using_pacing()); 973 974 // The client *should* set the intitial RTT. 975 EXPECT_EQ(1000u, client_sent_packet_manager.GetRttStats()->initial_rtt_us()); 976 EXPECT_EQ(1000u, server_sent_packet_manager.GetRttStats()->initial_rtt_us()); 977 978 // Now use the negotiated limits with packet loss. 979 SetPacketLossPercentage(30); 980 981 // 10 KB body. 982 string body; 983 GenerateBody(&body, 1024 * 10); 984 985 HTTPMessage request(HttpConstants::HTTP_1_1, 986 HttpConstants::POST, "/foo"); 987 request.AddBody(body, true); 988 989 server_thread_->Resume(); 990 991 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); 992 } 993 994 TEST_P(EndToEndTest, MaxInitialRTT) { 995 // Client tries to suggest twice the server's max initial rtt and the server 996 // uses the max. 997 client_config_.SetInitialRoundTripTimeUsToSend( 998 2 * kMaxInitialRoundTripTimeUs); 999 1000 ASSERT_TRUE(Initialize()); 1001 client_->client()->WaitForCryptoHandshakeConfirmed(); 1002 server_thread_->WaitForCryptoHandshakeConfirmed(); 1003 1004 // Pause the server so we can access the server's internals without races. 1005 server_thread_->Pause(); 1006 QuicDispatcher* dispatcher = 1007 QuicServerPeer::GetDispatcher(server_thread_->server()); 1008 ASSERT_EQ(1u, dispatcher->session_map().size()); 1009 QuicSession* session = dispatcher->session_map().begin()->second; 1010 const QuicSentPacketManager& client_sent_packet_manager = 1011 client_->client()->session()->connection()->sent_packet_manager(); 1012 const QuicSentPacketManager& server_sent_packet_manager = 1013 session->connection()->sent_packet_manager(); 1014 1015 // Now that acks have been exchanged, the RTT estimate has decreased on the 1016 // server and is not infinite on the client. 1017 EXPECT_FALSE( 1018 client_sent_packet_manager.GetRttStats()->SmoothedRtt().IsInfinite()); 1019 EXPECT_EQ(static_cast<int64>(kMaxInitialRoundTripTimeUs), 1020 server_sent_packet_manager.GetRttStats()->initial_rtt_us()); 1021 EXPECT_GE( 1022 static_cast<int64>(kMaxInitialRoundTripTimeUs), 1023 server_sent_packet_manager.GetRttStats()->SmoothedRtt().ToMicroseconds()); 1024 server_thread_->Resume(); 1025 } 1026 1027 TEST_P(EndToEndTest, MinInitialRTT) { 1028 // Client tries to suggest 0 and the server uses the default. 1029 client_config_.SetInitialRoundTripTimeUsToSend(0); 1030 1031 ASSERT_TRUE(Initialize()); 1032 client_->client()->WaitForCryptoHandshakeConfirmed(); 1033 server_thread_->WaitForCryptoHandshakeConfirmed(); 1034 1035 // Pause the server so we can access the server's internals without races. 1036 server_thread_->Pause(); 1037 QuicDispatcher* dispatcher = 1038 QuicServerPeer::GetDispatcher(server_thread_->server()); 1039 ASSERT_EQ(1u, dispatcher->session_map().size()); 1040 QuicSession* session = dispatcher->session_map().begin()->second; 1041 const QuicSentPacketManager& client_sent_packet_manager = 1042 client_->client()->session()->connection()->sent_packet_manager(); 1043 const QuicSentPacketManager& server_sent_packet_manager = 1044 session->connection()->sent_packet_manager(); 1045 1046 // Now that acks have been exchanged, the RTT estimate has decreased on the 1047 // server and is not infinite on the client. 1048 EXPECT_FALSE( 1049 client_sent_packet_manager.GetRttStats()->SmoothedRtt().IsInfinite()); 1050 // Expect the default rtt of 100ms. 1051 EXPECT_EQ(static_cast<int64>(100 * base::Time::kMicrosecondsPerMillisecond), 1052 server_sent_packet_manager.GetRttStats()->initial_rtt_us()); 1053 // Ensure the bandwidth is valid. 1054 client_sent_packet_manager.BandwidthEstimate(); 1055 server_sent_packet_manager.BandwidthEstimate(); 1056 server_thread_->Resume(); 1057 } 1058 1059 TEST_P(EndToEndTest, ResetConnection) { 1060 ASSERT_TRUE(Initialize()); 1061 client_->client()->WaitForCryptoHandshakeConfirmed(); 1062 1063 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1064 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 1065 client_->ResetConnection(); 1066 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar")); 1067 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 1068 } 1069 1070 TEST_P(EndToEndTest, MaxStreamsUberTest) { 1071 SetPacketLossPercentage(1); 1072 ASSERT_TRUE(Initialize()); 1073 string large_body; 1074 GenerateBody(&large_body, 10240); 1075 int max_streams = 100; 1076 1077 AddToCache("GET", "/large_response", "HTTP/1.1", "200", "OK", large_body);; 1078 1079 client_->client()->WaitForCryptoHandshakeConfirmed(); 1080 SetPacketLossPercentage(10); 1081 1082 for (int i = 0; i < max_streams; ++i) { 1083 EXPECT_LT(0, client_->SendRequest("/large_response")); 1084 } 1085 1086 // WaitForEvents waits 50ms and returns true if there are outstanding 1087 // requests. 1088 while (client_->client()->WaitForEvents() == true) { 1089 } 1090 } 1091 1092 TEST_P(EndToEndTest, StreamCancelErrorTest) { 1093 ASSERT_TRUE(Initialize()); 1094 string small_body; 1095 GenerateBody(&small_body, 256); 1096 1097 AddToCache("GET", "/small_response", "HTTP/1.1", "200", "OK", small_body); 1098 1099 client_->client()->WaitForCryptoHandshakeConfirmed(); 1100 1101 QuicSession* session = client_->client()->session(); 1102 // Lose the request. 1103 SetPacketLossPercentage(100); 1104 EXPECT_LT(0, client_->SendRequest("/small_response")); 1105 client_->client()->WaitForEvents(); 1106 // Transmit the cancel, and ensure the connection is torn down properly. 1107 SetPacketLossPercentage(0); 1108 QuicStreamId stream_id = kClientDataStreamId1; 1109 session->SendRstStream(stream_id, QUIC_STREAM_CANCELLED, 0); 1110 1111 // WaitForEvents waits 50ms and returns true if there are outstanding 1112 // requests. 1113 while (client_->client()->WaitForEvents() == true) { 1114 } 1115 // It should be completely fine to RST a stream before any data has been 1116 // received for that stream. 1117 EXPECT_EQ(QUIC_NO_ERROR, client_->connection_error()); 1118 } 1119 1120 class WrongAddressWriter : public QuicPacketWriterWrapper { 1121 public: 1122 WrongAddressWriter() { 1123 IPAddressNumber ip; 1124 CHECK(net::ParseIPLiteralToNumber("127.0.0.2", &ip)); 1125 self_address_ = IPEndPoint(ip, 0); 1126 } 1127 1128 virtual WriteResult WritePacket( 1129 const char* buffer, 1130 size_t buf_len, 1131 const IPAddressNumber& real_self_address, 1132 const IPEndPoint& peer_address) OVERRIDE { 1133 // Use wrong address! 1134 return QuicPacketWriterWrapper::WritePacket( 1135 buffer, buf_len, self_address_.address(), peer_address); 1136 } 1137 1138 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { 1139 return false; 1140 } 1141 1142 IPEndPoint self_address_; 1143 }; 1144 1145 TEST_P(EndToEndTest, ConnectionMigrationClientIPChanged) { 1146 // Tests that the client's IP can not change during an established QUIC 1147 // connection. If it changes, the connection is closed by the server as we do 1148 // not yet support IP migration. 1149 ASSERT_TRUE(Initialize()); 1150 1151 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1152 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 1153 1154 WrongAddressWriter* writer = new WrongAddressWriter(); 1155 1156 writer->set_writer(new QuicDefaultPacketWriter(client_->client()->fd())); 1157 QuicConnectionPeer::SetWriter(client_->client()->session()->connection(), 1158 writer, 1159 /* owns_writer= */ true); 1160 1161 client_->SendSynchronousRequest("/bar"); 1162 1163 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); 1164 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); 1165 } 1166 1167 TEST_P(EndToEndTest, ConnectionMigrationClientPortChanged) { 1168 // Tests that the client's port can change during an established QUIC 1169 // connection, and that doing so does not result in the connection being 1170 // closed by the server. 1171 ASSERT_TRUE(Initialize()); 1172 1173 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1174 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 1175 1176 // Store the client address which was used to send the first request. 1177 IPEndPoint old_address = client_->client()->client_address(); 1178 1179 // Stop listening on the old FD. 1180 EpollServer* eps = client_->epoll_server(); 1181 int old_fd = client_->client()->fd(); 1182 eps->UnregisterFD(old_fd); 1183 // Create a new socket before closing the old one, which will result in a new 1184 // ephemeral port. 1185 QuicClientPeer::CreateUDPSocket(client_->client()); 1186 close(old_fd); 1187 1188 // The packet writer needs to be updated to use the new FD. 1189 client_->client()->CreateQuicPacketWriter(); 1190 1191 // Change the internal state of the client and connection to use the new port, 1192 // this is done because in a real NAT rebinding the client wouldn't see any 1193 // port change, and so expects no change to incoming port. 1194 // This is kind of ugly, but needed as we are simply swapping out the client 1195 // FD rather than any more complex NAT rebinding simulation. 1196 int new_port = client_->client()->client_address().port(); 1197 QuicClientPeer::SetClientPort(client_->client(), new_port); 1198 QuicConnectionPeer::SetSelfAddress( 1199 client_->client()->session()->connection(), 1200 IPEndPoint( 1201 client_->client()->session()->connection()->self_address().address(), 1202 new_port)); 1203 1204 // Register the new FD for epoll events. 1205 int new_fd = client_->client()->fd(); 1206 eps->RegisterFD(new_fd, client_->client(), EPOLLIN | EPOLLOUT | EPOLLET); 1207 1208 // Send a second request, using the new FD. 1209 EXPECT_EQ(kBarResponseBody, client_->SendSynchronousRequest("/bar")); 1210 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 1211 1212 // Verify that the client's ephemeral port is different. 1213 IPEndPoint new_address = client_->client()->client_address(); 1214 EXPECT_EQ(old_address.address(), new_address.address()); 1215 EXPECT_NE(old_address.port(), new_address.port()); 1216 } 1217 1218 1219 TEST_P(EndToEndTest, DifferentFlowControlWindowsQ019) { 1220 // TODO(rjshade): Remove this test when removing QUIC_VERSION_19. 1221 // Client and server can set different initial flow control receive windows. 1222 // These are sent in CHLO/SHLO. Tests that these values are exchanged properly 1223 // in the crypto handshake. 1224 1225 const uint32 kClientIFCW = 123456; 1226 set_client_initial_flow_control_receive_window(kClientIFCW); 1227 1228 const uint32 kServerIFCW = 654321; 1229 set_server_initial_flow_control_receive_window(kServerIFCW); 1230 1231 ASSERT_TRUE(Initialize()); 1232 if (negotiated_version_ > QUIC_VERSION_19) { 1233 return; 1234 } 1235 1236 // Values are exchanged during crypto handshake, so wait for that to finish. 1237 client_->client()->WaitForCryptoHandshakeConfirmed(); 1238 server_thread_->WaitForCryptoHandshakeConfirmed(); 1239 1240 // Client should have the right value for server's receive window. 1241 EXPECT_EQ(kServerIFCW, client_->client() 1242 ->session() 1243 ->config() 1244 ->ReceivedInitialFlowControlWindowBytes()); 1245 1246 // Server should have the right value for client's receive window. 1247 server_thread_->Pause(); 1248 QuicDispatcher* dispatcher = 1249 QuicServerPeer::GetDispatcher(server_thread_->server()); 1250 QuicSession* session = dispatcher->session_map().begin()->second; 1251 EXPECT_EQ(kClientIFCW, 1252 session->config()->ReceivedInitialFlowControlWindowBytes()); 1253 server_thread_->Resume(); 1254 } 1255 1256 TEST_P(EndToEndTest, DifferentFlowControlWindowsQ020) { 1257 // TODO(rjshade): Rename to DifferentFlowControlWindows when removing 1258 // QUIC_VERSION_19. 1259 // Client and server can set different initial flow control receive windows. 1260 // These are sent in CHLO/SHLO. Tests that these values are exchanged properly 1261 // in the crypto handshake. 1262 const uint32 kClientStreamIFCW = 123456; 1263 const uint32 kClientSessionIFCW = 234567; 1264 set_client_initial_stream_flow_control_receive_window(kClientStreamIFCW); 1265 set_client_initial_session_flow_control_receive_window(kClientSessionIFCW); 1266 1267 const uint32 kServerStreamIFCW = 654321; 1268 const uint32 kServerSessionIFCW = 765432; 1269 set_server_initial_stream_flow_control_receive_window(kServerStreamIFCW); 1270 set_server_initial_session_flow_control_receive_window(kServerSessionIFCW); 1271 1272 ASSERT_TRUE(Initialize()); 1273 if (negotiated_version_ <= QUIC_VERSION_19) { 1274 return; 1275 } 1276 1277 // Values are exchanged during crypto handshake, so wait for that to finish. 1278 client_->client()->WaitForCryptoHandshakeConfirmed(); 1279 server_thread_->WaitForCryptoHandshakeConfirmed(); 1280 1281 // Open a data stream to make sure the stream level flow control is updated. 1282 QuicSpdyClientStream* stream = client_->GetOrCreateStream(); 1283 stream->SendBody("hello", false); 1284 1285 // Client should have the right values for server's receive window. 1286 EXPECT_EQ(kServerStreamIFCW, 1287 client_->client() 1288 ->session() 1289 ->config() 1290 ->ReceivedInitialStreamFlowControlWindowBytes()); 1291 EXPECT_EQ(kServerSessionIFCW, 1292 client_->client() 1293 ->session() 1294 ->config() 1295 ->ReceivedInitialSessionFlowControlWindowBytes()); 1296 EXPECT_EQ(kServerStreamIFCW, QuicFlowControllerPeer::SendWindowOffset( 1297 stream->flow_controller())); 1298 EXPECT_EQ(kServerSessionIFCW, 1299 QuicFlowControllerPeer::SendWindowOffset( 1300 client_->client()->session()->flow_controller())); 1301 1302 // Server should have the right values for client's receive window. 1303 server_thread_->Pause(); 1304 QuicDispatcher* dispatcher = 1305 QuicServerPeer::GetDispatcher(server_thread_->server()); 1306 QuicSession* session = dispatcher->session_map().begin()->second; 1307 EXPECT_EQ(kClientStreamIFCW, 1308 session->config()->ReceivedInitialStreamFlowControlWindowBytes()); 1309 EXPECT_EQ(kClientSessionIFCW, 1310 session->config()->ReceivedInitialSessionFlowControlWindowBytes()); 1311 EXPECT_EQ(kClientSessionIFCW, QuicFlowControllerPeer::SendWindowOffset( 1312 session->flow_controller())); 1313 server_thread_->Resume(); 1314 } 1315 1316 TEST_P(EndToEndTest, HeadersAndCryptoStreamsNoConnectionFlowControl) { 1317 // The special headers and crypto streams should be subject to per-stream flow 1318 // control limits, but should not be subject to connection level flow control. 1319 const uint32 kStreamIFCW = 123456; 1320 const uint32 kSessionIFCW = 234567; 1321 set_client_initial_stream_flow_control_receive_window(kStreamIFCW); 1322 set_client_initial_session_flow_control_receive_window(kSessionIFCW); 1323 set_server_initial_stream_flow_control_receive_window(kStreamIFCW); 1324 set_server_initial_session_flow_control_receive_window(kSessionIFCW); 1325 1326 ASSERT_TRUE(Initialize()); 1327 if (negotiated_version_ < QUIC_VERSION_21) { 1328 return; 1329 } 1330 1331 // Wait for crypto handshake to finish. This should have contributed to the 1332 // crypto stream flow control window, but not affected the session flow 1333 // control window. 1334 client_->client()->WaitForCryptoHandshakeConfirmed(); 1335 server_thread_->WaitForCryptoHandshakeConfirmed(); 1336 1337 QuicCryptoStream* crypto_stream = 1338 QuicSessionPeer::GetCryptoStream(client_->client()->session()); 1339 EXPECT_LT( 1340 QuicFlowControllerPeer::SendWindowSize(crypto_stream->flow_controller()), 1341 kStreamIFCW); 1342 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::SendWindowSize( 1343 client_->client()->session()->flow_controller())); 1344 1345 // Send a request with no body, and verify that the connection level window 1346 // has not been affected. 1347 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1348 1349 QuicHeadersStream* headers_stream = 1350 QuicSessionPeer::GetHeadersStream(client_->client()->session()); 1351 EXPECT_LT( 1352 QuicFlowControllerPeer::SendWindowSize(headers_stream->flow_controller()), 1353 kStreamIFCW); 1354 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::SendWindowSize( 1355 client_->client()->session()->flow_controller())); 1356 1357 // Server should be in a similar state: connection flow control window should 1358 // not have any bytes marked as received. 1359 server_thread_->Pause(); 1360 QuicDispatcher* dispatcher = 1361 QuicServerPeer::GetDispatcher(server_thread_->server()); 1362 QuicSession* session = dispatcher->session_map().begin()->second; 1363 QuicFlowController* server_connection_flow_controller = 1364 session->flow_controller(); 1365 EXPECT_EQ(kSessionIFCW, QuicFlowControllerPeer::ReceiveWindowSize( 1366 server_connection_flow_controller)); 1367 server_thread_->Resume(); 1368 } 1369 1370 TEST_P(EndToEndTest, RequestWithNoBodyWillNeverSendStreamFrameWithFIN) { 1371 // Regression test for b/16010251. 1372 // A stream created on receipt of a simple request with no body will never get 1373 // a stream frame with a FIN. Verify that we don't keep track of the stream in 1374 // the locally closed streams map: it will never be removed if so. 1375 ASSERT_TRUE(Initialize()); 1376 1377 // Send a simple headers only request, and receive response. 1378 EXPECT_EQ(kFooResponseBody, client_->SendSynchronousRequest("/foo")); 1379 EXPECT_EQ(200u, client_->response_headers()->parsed_response_code()); 1380 1381 // Now verify that the server is not waiting for a final FIN or RST. 1382 server_thread_->Pause(); 1383 QuicDispatcher* dispatcher = 1384 QuicServerPeer::GetDispatcher(server_thread_->server()); 1385 QuicSession* session = dispatcher->session_map().begin()->second; 1386 EXPECT_EQ(0u, QuicSessionPeer::GetLocallyClosedStreamsHighestOffset( 1387 session).size()); 1388 server_thread_->Resume(); 1389 } 1390 1391 } // namespace 1392 } // namespace test 1393 } // namespace tools 1394 } // namespace net 1395