| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "net/base/elements_upload_data_stream.h" | 10 #include "net/base/elements_upload_data_stream.h" |
| 11 #include "net/base/test_completion_callback.h" | 11 #include "net/base/test_completion_callback.h" |
| 12 #include "net/base/test_data_directory.h" |
| 12 #include "net/base/upload_bytes_element_reader.h" | 13 #include "net/base/upload_bytes_element_reader.h" |
| 13 #include "net/base/upload_data_stream.h" | 14 #include "net/base/upload_data_stream.h" |
| 14 #include "net/cert/mock_cert_verifier.h" | 15 #include "net/cert/mock_cert_verifier.h" |
| 15 #include "net/dns/mapped_host_resolver.h" | 16 #include "net/dns/mapped_host_resolver.h" |
| 16 #include "net/dns/mock_host_resolver.h" | 17 #include "net/dns/mock_host_resolver.h" |
| 17 #include "net/http/http_auth_handler_factory.h" | 18 #include "net/http/http_auth_handler_factory.h" |
| 18 #include "net/http/http_network_session.h" | 19 #include "net/http/http_network_session.h" |
| 19 #include "net/http/http_network_transaction.h" | 20 #include "net/http/http_network_transaction.h" |
| 20 #include "net/http/http_server_properties_impl.h" | 21 #include "net/http/http_server_properties_impl.h" |
| 21 #include "net/http/http_transaction_test_util.h" | 22 #include "net/http/http_transaction_test_util.h" |
| 22 #include "net/http/transport_security_state.h" | 23 #include "net/http/transport_security_state.h" |
| 23 #include "net/proxy/proxy_service.h" | 24 #include "net/proxy/proxy_service.h" |
| 25 #include "net/quic/test_tools/crypto_test_utils.h" |
| 24 #include "net/quic/test_tools/quic_test_utils.h" | 26 #include "net/quic/test_tools/quic_test_utils.h" |
| 25 #include "net/ssl/ssl_config_service_defaults.h" | 27 #include "net/ssl/ssl_config_service_defaults.h" |
| 28 #include "net/test/cert_test_util.h" |
| 26 #include "net/tools/quic/quic_in_memory_cache.h" | 29 #include "net/tools/quic/quic_in_memory_cache.h" |
| 27 #include "net/tools/quic/quic_server.h" | 30 #include "net/tools/quic/quic_server.h" |
| 28 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" | 31 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" |
| 29 #include "net/tools/quic/test_tools/server_thread.h" | 32 #include "net/tools/quic/test_tools/server_thread.h" |
| 30 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 31 #include "testing/platform_test.h" | 34 #include "testing/platform_test.h" |
| 32 | 35 |
| 33 using base::StringPiece; | 36 using base::StringPiece; |
| 34 | 37 |
| 35 namespace net { | 38 namespace net { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 protected: | 77 protected: |
| 75 QuicEndToEndTest() | 78 QuicEndToEndTest() |
| 76 : host_resolver_impl_(CreateResolverImpl()), | 79 : host_resolver_impl_(CreateResolverImpl()), |
| 77 host_resolver_(host_resolver_impl_.Pass()), | 80 host_resolver_(host_resolver_impl_.Pass()), |
| 78 ssl_config_service_(new SSLConfigServiceDefaults), | 81 ssl_config_service_(new SSLConfigServiceDefaults), |
| 79 proxy_service_(ProxyService::CreateDirect()), | 82 proxy_service_(ProxyService::CreateDirect()), |
| 80 auth_handler_factory_( | 83 auth_handler_factory_( |
| 81 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), | 84 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
| 82 strike_register_no_startup_period_(false) { | 85 strike_register_no_startup_period_(false) { |
| 83 request_.method = "GET"; | 86 request_.method = "GET"; |
| 84 request_.url = GURL("http://www.google.com/"); | 87 request_.url = GURL("https://test.example.com/"); |
| 85 request_.load_flags = 0; | 88 request_.load_flags = 0; |
| 86 | 89 |
| 87 params_.enable_quic = true; | 90 params_.enable_quic = true; |
| 88 params_.quic_clock = nullptr; | 91 params_.quic_clock = nullptr; |
| 89 params_.quic_random = nullptr; | 92 params_.quic_random = nullptr; |
| 90 params_.host_resolver = &host_resolver_; | 93 params_.host_resolver = &host_resolver_; |
| 91 params_.cert_verifier = &cert_verifier_; | 94 params_.cert_verifier = &cert_verifier_; |
| 92 params_.transport_security_state = &transport_security_state_; | 95 params_.transport_security_state = &transport_security_state_; |
| 93 params_.proxy_service = proxy_service_.get(); | 96 params_.proxy_service = proxy_service_.get(); |
| 94 params_.ssl_config_service = ssl_config_service_.get(); | 97 params_.ssl_config_service = ssl_config_service_.get(); |
| 95 params_.http_auth_handler_factory = auth_handler_factory_.get(); | 98 params_.http_auth_handler_factory = auth_handler_factory_.get(); |
| 96 params_.http_server_properties = http_server_properties.GetWeakPtr(); | 99 params_.http_server_properties = http_server_properties.GetWeakPtr(); |
| 100 |
| 101 net::CertVerifyResult verify_result; |
| 102 verify_result.verified_cert = ImportCertFromFile( |
| 103 GetTestCertsDirectory(), "quic_test.example.com.crt"); |
| 104 cert_verifier_.AddResultForCertAndHost(verify_result.verified_cert.get(), |
| 105 "test.example.com", verify_result, |
| 106 OK); |
| 107 verify_result.verified_cert = ImportCertFromFile( |
| 108 GetTestCertsDirectory(), "quic_test_ecc.example.com.crt"); |
| 109 cert_verifier_.AddResultForCertAndHost(verify_result.verified_cert.get(), |
| 110 "test.example.com", verify_result, |
| 111 OK); |
| 97 } | 112 } |
| 98 | 113 |
| 99 // Creates a mock host resolver in which www.google.com | 114 // Creates a mock host resolver in which test.example.com |
| 100 // resolves to localhost. | 115 // resolves to localhost. |
| 101 static MockHostResolver* CreateResolverImpl() { | 116 static MockHostResolver* CreateResolverImpl() { |
| 102 MockHostResolver* resolver = new MockHostResolver(); | 117 MockHostResolver* resolver = new MockHostResolver(); |
| 103 resolver->rules()->AddRule("www.google.com", "127.0.0.1"); | 118 resolver->rules()->AddRule("test.example.com", "127.0.0.1"); |
| 104 return resolver; | 119 return resolver; |
| 105 } | 120 } |
| 106 | 121 |
| 107 void SetUp() override { | 122 void SetUp() override { |
| 108 QuicInMemoryCachePeer::ResetForTests(); | 123 QuicInMemoryCachePeer::ResetForTests(); |
| 109 StartServer(); | 124 StartServer(); |
| 110 | 125 |
| 111 // Use a mapped host resolver so that request for www.google.com (port 80) | 126 // Use a mapped host resolver so that request for test.example.com (port 80) |
| 112 // reach the server running on localhost. | 127 // reach the server running on localhost. |
| 113 std::string map_rule = "MAP www.google.com www.google.com:" + | 128 std::string map_rule = "MAP test.example.com test.example.com:" + |
| 114 base::IntToString(server_thread_->GetPort()); | 129 base::IntToString(server_thread_->GetPort()); |
| 115 EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule)); | 130 EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule)); |
| 116 | 131 |
| 117 // To simplify the test, and avoid the race with the HTTP request, we force | 132 // To simplify the test, and avoid the race with the HTTP request, we force |
| 118 // QUIC for these requests. | 133 // QUIC for these requests. |
| 119 params_.origin_to_force_quic_on = | 134 params_.origin_to_force_quic_on = |
| 120 HostPortPair::FromString("www.google.com:80"); | 135 HostPortPair::FromString("test.example.com:443"); |
| 121 | 136 |
| 122 transaction_factory_.reset(new TestTransactionFactory(params_)); | 137 transaction_factory_.reset(new TestTransactionFactory(params_)); |
| 123 } | 138 } |
| 124 | 139 |
| 125 void TearDown() override { | 140 void TearDown() override { |
| 126 StopServer(); | 141 StopServer(); |
| 127 QuicInMemoryCachePeer::ResetForTests(); | 142 QuicInMemoryCachePeer::ResetForTests(); |
| 128 } | 143 } |
| 129 | 144 |
| 130 // Starts the QUIC server listening on a random port. | 145 // Starts the QUIC server listening on a random port. |
| 131 void StartServer() { | 146 void StartServer() { |
| 132 IPAddressNumber ip; | 147 IPAddressNumber ip; |
| 133 CHECK(ParseIPLiteralToNumber("127.0.0.1", &ip)); | 148 CHECK(ParseIPLiteralToNumber("127.0.0.1", &ip)); |
| 134 server_address_ = IPEndPoint(ip, 0); | 149 server_address_ = IPEndPoint(ip, 0); |
| 135 server_config_.SetInitialStreamFlowControlWindowToSend( | 150 server_config_.SetInitialStreamFlowControlWindowToSend( |
| 136 kInitialStreamFlowControlWindowForTest); | 151 kInitialStreamFlowControlWindowForTest); |
| 137 server_config_.SetInitialSessionFlowControlWindowToSend( | 152 server_config_.SetInitialSessionFlowControlWindowToSend( |
| 138 kInitialSessionFlowControlWindowForTest); | 153 kInitialSessionFlowControlWindowForTest); |
| 139 server_thread_.reset(new ServerThread( | 154 QuicServer* server = |
| 140 new QuicServer(server_config_, QuicSupportedVersions()), | 155 new QuicServer(server_config_, QuicSupportedVersions()); |
| 141 /*is_secure=*/true, server_address_, | 156 server_thread_.reset(new ServerThread(server, /*is_secure=*/true, |
| 142 strike_register_no_startup_period_)); | 157 server_address_, |
| 158 strike_register_no_startup_period_)); |
| 159 server->SetProofSource(CryptoTestUtils::ProofSourceForTesting()); |
| 143 server_thread_->Initialize(); | 160 server_thread_->Initialize(); |
| 144 server_address_ = IPEndPoint(server_address_.address(), | 161 server_address_ = IPEndPoint(server_address_.address(), |
| 145 server_thread_->GetPort()); | 162 server_thread_->GetPort()); |
| 146 server_thread_->Start(); | 163 server_thread_->Start(); |
| 147 server_started_ = true; | 164 server_started_ = true; |
| 148 } | 165 } |
| 149 | 166 |
| 150 // Stops the QUIC server. | 167 // Stops the QUIC server. |
| 151 void StopServer() { | 168 void StopServer() { |
| 152 if (!server_started_) { | 169 if (!server_started_) { |
| 153 return; | 170 return; |
| 154 } | 171 } |
| 155 if (server_thread_.get()) { | 172 if (server_thread_.get()) { |
| 156 server_thread_->Quit(); | 173 server_thread_->Quit(); |
| 157 server_thread_->Join(); | 174 server_thread_->Join(); |
| 158 } | 175 } |
| 159 } | 176 } |
| 160 | 177 |
| 161 // Adds an entry to the cache used by the QUIC server to serve | 178 // Adds an entry to the cache used by the QUIC server to serve |
| 162 // responses. | 179 // responses. |
| 163 void AddToCache(StringPiece path, | 180 void AddToCache(StringPiece path, |
| 164 int response_code, | 181 int response_code, |
| 165 StringPiece response_detail, | 182 StringPiece response_detail, |
| 166 StringPiece body) { | 183 StringPiece body) { |
| 167 QuicInMemoryCache::GetInstance()->AddSimpleResponse( | 184 QuicInMemoryCache::GetInstance()->AddSimpleResponse( |
| 168 "www.google.com", path, response_code, response_detail, body); | 185 "test.example.com", path, response_code, response_detail, body); |
| 169 } | 186 } |
| 170 | 187 |
| 171 // Populates |request_body_| with |length_| ASCII bytes. | 188 // Populates |request_body_| with |length_| ASCII bytes. |
| 172 void GenerateBody(size_t length) { | 189 void GenerateBody(size_t length) { |
| 173 request_body_.clear(); | 190 request_body_.clear(); |
| 174 request_body_.reserve(length); | 191 request_body_.reserve(length); |
| 175 for (size_t i = 0; i < length; ++i) { | 192 for (size_t i = 0; i < length; ++i) { |
| 176 request_body_.append(1, static_cast<char>(32 + i % (126 - 32))); | 193 request_body_.append(1, static_cast<char>(32 + i % (126 - 32))); |
| 177 } | 194 } |
| 178 } | 195 } |
| 179 | 196 |
| 180 // Initializes |request_| for a post of |length| bytes. | 197 // Initializes |request_| for a post of |length| bytes. |
| 181 void InitializePostRequest(size_t length) { | 198 void InitializePostRequest(size_t length) { |
| 182 GenerateBody(length); | 199 GenerateBody(length); |
| 183 ScopedVector<UploadElementReader> element_readers; | 200 ScopedVector<UploadElementReader> element_readers; |
| 184 element_readers.push_back( | 201 element_readers.push_back( |
| 185 new UploadBytesElementReader(request_body_.data(), | 202 new UploadBytesElementReader(request_body_.data(), |
| 186 request_body_.length())); | 203 request_body_.length())); |
| 187 upload_data_stream_.reset( | 204 upload_data_stream_.reset( |
| 188 new ElementsUploadDataStream(element_readers.Pass(), 0)); | 205 new ElementsUploadDataStream(element_readers.Pass(), 0)); |
| 189 request_.method = "POST"; | 206 request_.method = "POST"; |
| 190 request_.url = GURL("http://www.google.com/"); | 207 request_.url = GURL("https://test.example.com/"); |
| 191 request_.upload_data_stream = upload_data_stream_.get(); | 208 request_.upload_data_stream = upload_data_stream_.get(); |
| 192 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); | 209 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); |
| 193 } | 210 } |
| 194 | 211 |
| 195 // Checks that |consumer| completed and received |status_line| and |body|. | 212 // Checks that |consumer| completed and received |status_line| and |body|. |
| 196 void CheckResponse(const TestTransactionConsumer& consumer, | 213 void CheckResponse(const TestTransactionConsumer& consumer, |
| 197 const std::string& status_line, | 214 const std::string& status_line, |
| 198 const std::string& body) { | 215 const std::string& body) { |
| 199 ASSERT_TRUE(consumer.is_done()); | 216 ASSERT_TRUE(consumer.is_done()); |
| 200 EXPECT_EQ(OK, consumer.error()); | 217 ASSERT_EQ(OK, consumer.error()); |
| 201 EXPECT_EQ(status_line, | 218 EXPECT_EQ(status_line, |
| 202 consumer.response_info()->headers->GetStatusLine()); | 219 consumer.response_info()->headers->GetStatusLine()); |
| 203 EXPECT_EQ(body, consumer.content()); | 220 EXPECT_EQ(body, consumer.content()); |
| 204 } | 221 } |
| 205 | 222 |
| 206 scoped_ptr<MockHostResolver> host_resolver_impl_; | 223 scoped_ptr<MockHostResolver> host_resolver_impl_; |
| 207 MappedHostResolver host_resolver_; | 224 MappedHostResolver host_resolver_; |
| 208 MockCertVerifier cert_verifier_; | 225 MockCertVerifier cert_verifier_; |
| 209 TransportSecurityState transport_security_state_; | 226 TransportSecurityState transport_security_state_; |
| 210 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 227 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 base::MessageLoop::current()->Run(); | 315 base::MessageLoop::current()->Run(); |
| 299 | 316 |
| 300 for (size_t i = 0; i < num_requests; ++i) { | 317 for (size_t i = 0; i < num_requests; ++i) { |
| 301 CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody); | 318 CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody); |
| 302 } | 319 } |
| 303 STLDeleteElements(&consumers); | 320 STLDeleteElements(&consumers); |
| 304 } | 321 } |
| 305 | 322 |
| 306 } // namespace test | 323 } // namespace test |
| 307 } // namespace net | 324 } // namespace net |
| OLD | NEW |