| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <sys/epoll.h> |
| 7 #include <vector> | 8 #include <vector> |
| 8 | 9 |
| 9 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 10 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/memory/singleton.h" | 12 #include "base/memory/singleton.h" |
| 12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/synchronization/waitable_event.h" | 14 #include "base/synchronization/waitable_event.h" |
| 14 #include "net/base/ip_endpoint.h" | 15 #include "net/base/ip_endpoint.h" |
| 15 #include "net/quic/congestion_control/tcp_cubic_sender.h" | 16 #include "net/quic/congestion_control/tcp_cubic_sender.h" |
| 16 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" | 17 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 params.push_back(TestParams(all_supported_versions, | 140 params.push_back(TestParams(all_supported_versions, |
| 140 server_supported_versions, | 141 server_supported_versions, |
| 141 server_supported_versions[0], | 142 server_supported_versions[0], |
| 142 use_pacing != 0)); | 143 use_pacing != 0)); |
| 143 } | 144 } |
| 144 #endif | 145 #endif |
| 145 } | 146 } |
| 146 return params; | 147 return params; |
| 147 } | 148 } |
| 148 | 149 |
| 150 class ServerDelegate : public PacketDroppingTestWriter::Delegate { |
| 151 public: |
| 152 explicit ServerDelegate(QuicDispatcher* dispatcher) |
| 153 : dispatcher_(dispatcher) {} |
| 154 virtual ~ServerDelegate() {} |
| 155 virtual void OnCanWrite() OVERRIDE { dispatcher_->OnCanWrite(); } |
| 156 private: |
| 157 QuicDispatcher* dispatcher_; |
| 158 }; |
| 159 |
| 160 class ClientDelegate : public PacketDroppingTestWriter::Delegate { |
| 161 public: |
| 162 explicit ClientDelegate(QuicClient* client) : client_(client) {} |
| 163 virtual ~ClientDelegate() {} |
| 164 virtual void OnCanWrite() OVERRIDE { |
| 165 EpollEvent event(EPOLLOUT, false); |
| 166 client_->OnEvent(client_->fd(), &event); |
| 167 } |
| 168 private: |
| 169 QuicClient* client_; |
| 170 }; |
| 171 |
| 149 class EndToEndTest : public ::testing::TestWithParam<TestParams> { | 172 class EndToEndTest : public ::testing::TestWithParam<TestParams> { |
| 150 protected: | 173 protected: |
| 151 EndToEndTest() | 174 EndToEndTest() |
| 152 : server_hostname_("example.com"), | 175 : server_hostname_("example.com"), |
| 153 server_started_(false), | 176 server_started_(false), |
| 154 strike_register_no_startup_period_(false) { | 177 strike_register_no_startup_period_(false) { |
| 155 net::IPAddressNumber ip; | 178 net::IPAddressNumber ip; |
| 156 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); | 179 CHECK(net::ParseIPLiteralToNumber("127.0.0.1", &ip)); |
| 157 server_address_ = IPEndPoint(ip, 0); | 180 server_address_ = IPEndPoint(ip, 0); |
| 158 | 181 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 173 AddToCache("GET", "https://www.google.com/bar", | 196 AddToCache("GET", "https://www.google.com/bar", |
| 174 "HTTP/1.1", "200", "OK", kBarResponseBody); | 197 "HTTP/1.1", "200", "OK", kBarResponseBody); |
| 175 } | 198 } |
| 176 | 199 |
| 177 virtual ~EndToEndTest() { | 200 virtual ~EndToEndTest() { |
| 178 // TODO(rtenneti): port RecycleUnusedPort if needed. | 201 // TODO(rtenneti): port RecycleUnusedPort if needed. |
| 179 // RecycleUnusedPort(server_address_.port()); | 202 // RecycleUnusedPort(server_address_.port()); |
| 180 QuicInMemoryCachePeer::ResetForTests(); | 203 QuicInMemoryCachePeer::ResetForTests(); |
| 181 } | 204 } |
| 182 | 205 |
| 183 virtual QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) { | 206 QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) { |
| 184 QuicTestClient* client = new QuicTestClient(server_address_, | 207 QuicTestClient* client = new QuicTestClient(server_address_, |
| 185 server_hostname_, | 208 server_hostname_, |
| 186 false, // not secure | 209 false, // not secure |
| 187 client_config_, | 210 client_config_, |
| 188 client_supported_versions_); | 211 client_supported_versions_); |
| 189 client->UseWriter(writer); | 212 client->UseWriter(writer); |
| 190 client->Connect(); | 213 client->Connect(); |
| 191 return client; | 214 return client; |
| 192 } | 215 } |
| 193 | 216 |
| 194 virtual bool Initialize() { | 217 bool Initialize() { |
| 195 // Start the server first, because CreateQuicClient() attempts | 218 // Start the server first, because CreateQuicClient() attempts |
| 196 // to connect to the server. | 219 // to connect to the server. |
| 197 StartServer(); | 220 StartServer(); |
| 198 client_.reset(CreateQuicClient(client_writer_)); | 221 client_.reset(CreateQuicClient(client_writer_)); |
| 199 QuicEpollConnectionHelper* helper = | 222 static EpollEvent event(EPOLLOUT, false); |
| 223 client_writer_->Initialize( |
| 200 reinterpret_cast<QuicEpollConnectionHelper*>( | 224 reinterpret_cast<QuicEpollConnectionHelper*>( |
| 201 QuicConnectionPeer::GetHelper( | 225 QuicConnectionPeer::GetHelper( |
| 202 client_->client()->session()->connection())); | 226 client_->client()->session()->connection())), |
| 203 client_writer_->SetConnectionHelper(helper); | 227 new ClientDelegate(client_->client())); |
| 204 return client_->client()->connected(); | 228 return client_->client()->connected(); |
| 205 } | 229 } |
| 206 | 230 |
| 207 virtual void SetUp() { | 231 virtual void SetUp() OVERRIDE { |
| 208 // The ownership of these gets transferred to the QuicPacketWriterWrapper | 232 // The ownership of these gets transferred to the QuicPacketWriterWrapper |
| 209 // and QuicDispatcher when Initialize() is executed. | 233 // and QuicDispatcher when Initialize() is executed. |
| 210 client_writer_ = new PacketDroppingTestWriter(); | 234 client_writer_ = new PacketDroppingTestWriter(); |
| 211 server_writer_ = new PacketDroppingTestWriter(); | 235 server_writer_ = new PacketDroppingTestWriter(); |
| 212 } | 236 } |
| 213 | 237 |
| 214 virtual void TearDown() { | 238 virtual void TearDown() OVERRIDE { |
| 215 StopServer(); | 239 StopServer(); |
| 216 } | 240 } |
| 217 | 241 |
| 218 void StartServer() { | 242 void StartServer() { |
| 219 server_thread_.reset(new ServerThread(server_address_, server_config_, | 243 server_thread_.reset(new ServerThread(server_address_, server_config_, |
| 220 server_supported_versions_, | 244 server_supported_versions_, |
| 221 strike_register_no_startup_period_)); | 245 strike_register_no_startup_period_)); |
| 222 server_thread_->Initialize(); | 246 server_thread_->Initialize(); |
| 223 server_address_ = IPEndPoint(server_address_.address(), | 247 server_address_ = IPEndPoint(server_address_.address(), |
| 224 server_thread_->GetPort()); | 248 server_thread_->GetPort()); |
| 225 QuicDispatcher* dispatcher = | 249 QuicDispatcher* dispatcher = |
| 226 QuicServerPeer::GetDispatcher(server_thread_->server()); | 250 QuicServerPeer::GetDispatcher(server_thread_->server()); |
| 227 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_); | 251 QuicDispatcherPeer::UseWriter(dispatcher, server_writer_); |
| 228 server_writer_->SetConnectionHelper( | 252 server_writer_->Initialize( |
| 229 QuicDispatcherPeer::GetHelper(dispatcher)); | 253 QuicDispatcherPeer::GetHelper(dispatcher), |
| 254 new ServerDelegate(dispatcher)); |
| 230 server_thread_->Start(); | 255 server_thread_->Start(); |
| 231 server_started_ = true; | 256 server_started_ = true; |
| 232 } | 257 } |
| 233 | 258 |
| 234 void StopServer() { | 259 void StopServer() { |
| 235 if (!server_started_) | 260 if (!server_started_) |
| 236 return; | 261 return; |
| 237 if (server_thread_.get()) { | 262 if (server_thread_.get()) { |
| 238 server_thread_->Quit(); | 263 server_thread_->Quit(); |
| 239 server_thread_->Join(); | 264 server_thread_->Join(); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 string body; | 484 string body; |
| 460 GenerateBody(&body, 1024 * 1024); | 485 GenerateBody(&body, 1024 * 1024); |
| 461 | 486 |
| 462 HTTPMessage request(HttpConstants::HTTP_1_1, | 487 HTTPMessage request(HttpConstants::HTTP_1_1, |
| 463 HttpConstants::POST, "/foo"); | 488 HttpConstants::POST, "/foo"); |
| 464 request.AddBody(body, true); | 489 request.AddBody(body, true); |
| 465 | 490 |
| 466 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); | 491 EXPECT_EQ(kFooResponseBody, client_->SendCustomSynchronousRequest(request)); |
| 467 } | 492 } |
| 468 | 493 |
| 469 // TODO(ianswett): Re-enable once b/12646613 and b/11206052 are fixed. | 494 TEST_P(EndToEndTest, LargePostWithPacketLossAndBlockedSocket) { |
| 470 TEST_P(EndToEndTest, DISABLED_LargePostWithPacketLossAndBlockedSocket) { | |
| 471 // Connect with lower fake packet loss than we'd like to test. Until | 495 // Connect with lower fake packet loss than we'd like to test. Until |
| 472 // b/10126687 is fixed, losing handshake packets is pretty brutal. | 496 // b/10126687 is fixed, losing handshake packets is pretty brutal. |
| 473 SetPacketLossPercentage(5); | 497 SetPacketLossPercentage(5); |
| 474 ASSERT_TRUE(Initialize()); | 498 ASSERT_TRUE(Initialize()); |
| 475 | 499 |
| 476 // Wait for the server SHLO before upping the packet loss. | 500 // Wait for the server SHLO before upping the packet loss. |
| 477 client_->client()->WaitForCryptoHandshakeConfirmed(); | 501 client_->client()->WaitForCryptoHandshakeConfirmed(); |
| 478 SetPacketLossPercentage(30); | 502 SetPacketLossPercentage(10); |
| 479 client_writer_->set_fake_blocked_socket_percentage(10); | 503 client_writer_->set_fake_blocked_socket_percentage(10); |
| 480 | 504 |
| 481 // 10 Kb body. | 505 // 10 Kb body. |
| 482 string body; | 506 string body; |
| 483 GenerateBody(&body, 1024 * 10); | 507 GenerateBody(&body, 1024 * 10); |
| 484 | 508 |
| 485 HTTPMessage request(HttpConstants::HTTP_1_1, | 509 HTTPMessage request(HttpConstants::HTTP_1_1, |
| 486 HttpConstants::POST, "/foo"); | 510 HttpConstants::POST, "/foo"); |
| 487 request.AddBody(body, true); | 511 request.AddBody(body, true); |
| 488 | 512 |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 client_->SendSynchronousRequest("/bar"); | 868 client_->SendSynchronousRequest("/bar"); |
| 845 | 869 |
| 846 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); | 870 EXPECT_EQ(QUIC_STREAM_CONNECTION_ERROR, client_->stream_error()); |
| 847 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); | 871 EXPECT_EQ(QUIC_ERROR_MIGRATING_ADDRESS, client_->connection_error()); |
| 848 } | 872 } |
| 849 | 873 |
| 850 } // namespace | 874 } // namespace |
| 851 } // namespace test | 875 } // namespace test |
| 852 } // namespace tools | 876 } // namespace tools |
| 853 } // namespace net | 877 } // namespace net |
| OLD | NEW |