Chromium Code Reviews| 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 cert_verifier_.AddResultForCertAndHost(verify_result.verified_cert.get(), | |
|
ramant (doing other things)
2015/10/07 16:57:05
nit: lines 104-106 and 107-109 are the same.
Ryan Hamilton
2015/10/07 22:14:13
Done.
| |
| 108 "test.example.com", verify_result, | |
| 109 OK); | |
| 110 verify_result.verified_cert = ImportCertFromFile( | |
| 111 GetTestCertsDirectory(), "quic_test_ecc.example.com.crt"); | |
| 112 cert_verifier_.AddResultForCertAndHost(verify_result.verified_cert.get(), | |
| 113 "test.example.com", verify_result, | |
| 114 OK); | |
| 97 } | 115 } |
| 98 | 116 |
| 99 // Creates a mock host resolver in which www.google.com | 117 // Creates a mock host resolver in which test.example.com |
| 100 // resolves to localhost. | 118 // resolves to localhost. |
| 101 static MockHostResolver* CreateResolverImpl() { | 119 static MockHostResolver* CreateResolverImpl() { |
| 102 MockHostResolver* resolver = new MockHostResolver(); | 120 MockHostResolver* resolver = new MockHostResolver(); |
| 103 resolver->rules()->AddRule("www.google.com", "127.0.0.1"); | 121 resolver->rules()->AddRule("test.example.com", "127.0.0.1"); |
| 104 return resolver; | 122 return resolver; |
| 105 } | 123 } |
| 106 | 124 |
| 107 void SetUp() override { | 125 void SetUp() override { |
| 108 QuicInMemoryCachePeer::ResetForTests(); | 126 QuicInMemoryCachePeer::ResetForTests(); |
| 109 StartServer(); | 127 StartServer(); |
| 110 | 128 |
| 111 // Use a mapped host resolver so that request for www.google.com (port 80) | 129 // Use a mapped host resolver so that request for test.example.com (port 80) |
| 112 // reach the server running on localhost. | 130 // reach the server running on localhost. |
| 113 std::string map_rule = "MAP www.google.com www.google.com:" + | 131 std::string map_rule = "MAP test.example.com test.example.com:" + |
| 114 base::IntToString(server_thread_->GetPort()); | 132 base::IntToString(server_thread_->GetPort()); |
| 115 EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule)); | 133 EXPECT_TRUE(host_resolver_.AddRuleFromString(map_rule)); |
| 116 | 134 |
| 117 // To simplify the test, and avoid the race with the HTTP request, we force | 135 // To simplify the test, and avoid the race with the HTTP request, we force |
| 118 // QUIC for these requests. | 136 // QUIC for these requests. |
| 119 params_.origin_to_force_quic_on = | 137 params_.origin_to_force_quic_on = |
| 120 HostPortPair::FromString("www.google.com:80"); | 138 HostPortPair::FromString("test.example.com:443"); |
| 121 | 139 |
| 122 transaction_factory_.reset(new TestTransactionFactory(params_)); | 140 transaction_factory_.reset(new TestTransactionFactory(params_)); |
| 123 } | 141 } |
| 124 | 142 |
| 125 void TearDown() override { | 143 void TearDown() override { |
| 126 StopServer(); | 144 StopServer(); |
| 127 QuicInMemoryCachePeer::ResetForTests(); | 145 QuicInMemoryCachePeer::ResetForTests(); |
| 128 } | 146 } |
| 129 | 147 |
| 130 // Starts the QUIC server listening on a random port. | 148 // Starts the QUIC server listening on a random port. |
| 131 void StartServer() { | 149 void StartServer() { |
| 132 IPAddressNumber ip; | 150 IPAddressNumber ip; |
| 133 CHECK(ParseIPLiteralToNumber("127.0.0.1", &ip)); | 151 CHECK(ParseIPLiteralToNumber("127.0.0.1", &ip)); |
| 134 server_address_ = IPEndPoint(ip, 0); | 152 server_address_ = IPEndPoint(ip, 0); |
| 135 server_config_.SetInitialStreamFlowControlWindowToSend( | 153 server_config_.SetInitialStreamFlowControlWindowToSend( |
| 136 kInitialStreamFlowControlWindowForTest); | 154 kInitialStreamFlowControlWindowForTest); |
| 137 server_config_.SetInitialSessionFlowControlWindowToSend( | 155 server_config_.SetInitialSessionFlowControlWindowToSend( |
| 138 kInitialSessionFlowControlWindowForTest); | 156 kInitialSessionFlowControlWindowForTest); |
| 139 server_thread_.reset(new ServerThread( | 157 QuicServer* server = |
| 140 new QuicServer(server_config_, QuicSupportedVersions()), | 158 new QuicServer(server_config_, QuicSupportedVersions()); |
| 141 /*is_secure=*/true, server_address_, | 159 server_thread_.reset(new ServerThread(server, /*is_secure=*/true, |
| 142 strike_register_no_startup_period_)); | 160 server_address_, |
| 161 strike_register_no_startup_period_)); | |
| 162 server->SetProofSource(CryptoTestUtils::ProofSourceForTesting()); | |
| 143 server_thread_->Initialize(); | 163 server_thread_->Initialize(); |
| 144 server_address_ = IPEndPoint(server_address_.address(), | 164 server_address_ = IPEndPoint(server_address_.address(), |
| 145 server_thread_->GetPort()); | 165 server_thread_->GetPort()); |
| 146 server_thread_->Start(); | 166 server_thread_->Start(); |
| 147 server_started_ = true; | 167 server_started_ = true; |
| 148 } | 168 } |
| 149 | 169 |
| 150 // Stops the QUIC server. | 170 // Stops the QUIC server. |
| 151 void StopServer() { | 171 void StopServer() { |
| 152 if (!server_started_) { | 172 if (!server_started_) { |
| 153 return; | 173 return; |
| 154 } | 174 } |
| 155 if (server_thread_.get()) { | 175 if (server_thread_.get()) { |
| 156 server_thread_->Quit(); | 176 server_thread_->Quit(); |
| 157 server_thread_->Join(); | 177 server_thread_->Join(); |
| 158 } | 178 } |
| 159 } | 179 } |
| 160 | 180 |
| 161 // Adds an entry to the cache used by the QUIC server to serve | 181 // Adds an entry to the cache used by the QUIC server to serve |
| 162 // responses. | 182 // responses. |
| 163 void AddToCache(StringPiece path, | 183 void AddToCache(StringPiece path, |
| 164 int response_code, | 184 int response_code, |
| 165 StringPiece response_detail, | 185 StringPiece response_detail, |
| 166 StringPiece body) { | 186 StringPiece body) { |
| 167 QuicInMemoryCache::GetInstance()->AddSimpleResponse( | 187 QuicInMemoryCache::GetInstance()->AddSimpleResponse( |
| 168 "www.google.com", path, response_code, response_detail, body); | 188 "test.example.com", path, response_code, response_detail, body); |
| 169 } | 189 } |
| 170 | 190 |
| 171 // Populates |request_body_| with |length_| ASCII bytes. | 191 // Populates |request_body_| with |length_| ASCII bytes. |
| 172 void GenerateBody(size_t length) { | 192 void GenerateBody(size_t length) { |
| 173 request_body_.clear(); | 193 request_body_.clear(); |
| 174 request_body_.reserve(length); | 194 request_body_.reserve(length); |
| 175 for (size_t i = 0; i < length; ++i) { | 195 for (size_t i = 0; i < length; ++i) { |
| 176 request_body_.append(1, static_cast<char>(32 + i % (126 - 32))); | 196 request_body_.append(1, static_cast<char>(32 + i % (126 - 32))); |
| 177 } | 197 } |
| 178 } | 198 } |
| 179 | 199 |
| 180 // Initializes |request_| for a post of |length| bytes. | 200 // Initializes |request_| for a post of |length| bytes. |
| 181 void InitializePostRequest(size_t length) { | 201 void InitializePostRequest(size_t length) { |
| 182 GenerateBody(length); | 202 GenerateBody(length); |
| 183 ScopedVector<UploadElementReader> element_readers; | 203 ScopedVector<UploadElementReader> element_readers; |
| 184 element_readers.push_back( | 204 element_readers.push_back( |
| 185 new UploadBytesElementReader(request_body_.data(), | 205 new UploadBytesElementReader(request_body_.data(), |
| 186 request_body_.length())); | 206 request_body_.length())); |
| 187 upload_data_stream_.reset( | 207 upload_data_stream_.reset( |
| 188 new ElementsUploadDataStream(element_readers.Pass(), 0)); | 208 new ElementsUploadDataStream(element_readers.Pass(), 0)); |
| 189 request_.method = "POST"; | 209 request_.method = "POST"; |
| 190 request_.url = GURL("http://www.google.com/"); | 210 request_.url = GURL("https://test.example.com/"); |
| 191 request_.upload_data_stream = upload_data_stream_.get(); | 211 request_.upload_data_stream = upload_data_stream_.get(); |
| 192 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); | 212 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); |
| 193 } | 213 } |
| 194 | 214 |
| 195 // Checks that |consumer| completed and received |status_line| and |body|. | 215 // Checks that |consumer| completed and received |status_line| and |body|. |
| 196 void CheckResponse(const TestTransactionConsumer& consumer, | 216 void CheckResponse(const TestTransactionConsumer& consumer, |
| 197 const std::string& status_line, | 217 const std::string& status_line, |
| 198 const std::string& body) { | 218 const std::string& body) { |
| 199 ASSERT_TRUE(consumer.is_done()); | 219 ASSERT_TRUE(consumer.is_done()); |
| 200 EXPECT_EQ(OK, consumer.error()); | 220 ASSERT_EQ(OK, consumer.error()); |
| 201 EXPECT_EQ(status_line, | 221 EXPECT_EQ(status_line, |
| 202 consumer.response_info()->headers->GetStatusLine()); | 222 consumer.response_info()->headers->GetStatusLine()); |
| 203 EXPECT_EQ(body, consumer.content()); | 223 EXPECT_EQ(body, consumer.content()); |
| 204 } | 224 } |
| 205 | 225 |
| 206 scoped_ptr<MockHostResolver> host_resolver_impl_; | 226 scoped_ptr<MockHostResolver> host_resolver_impl_; |
| 207 MappedHostResolver host_resolver_; | 227 MappedHostResolver host_resolver_; |
| 208 MockCertVerifier cert_verifier_; | 228 MockCertVerifier cert_verifier_; |
| 209 TransportSecurityState transport_security_state_; | 229 TransportSecurityState transport_security_state_; |
| 210 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 230 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 298 base::MessageLoop::current()->Run(); | 318 base::MessageLoop::current()->Run(); |
| 299 | 319 |
| 300 for (size_t i = 0; i < num_requests; ++i) { | 320 for (size_t i = 0; i < num_requests; ++i) { |
| 301 CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody); | 321 CheckResponse(*consumers[i], "HTTP/1.1 200 OK", kResponseBody); |
| 302 } | 322 } |
| 303 STLDeleteElements(&consumers); | 323 STLDeleteElements(&consumers); |
| 304 } | 324 } |
| 305 | 325 |
| 306 } // namespace test | 326 } // namespace test |
| 307 } // namespace net | 327 } // namespace net |
| OLD | NEW |