| 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 "net/quic/quic_chromium_client_session.h" | 5 #include "net/quic/quic_chromium_client_session.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "net/spdy/spdy_test_utils.h" | 32 #include "net/spdy/spdy_test_utils.h" |
| 33 #include "net/test/cert_test_util.h" | 33 #include "net/test/cert_test_util.h" |
| 34 #include "net/udp/datagram_client_socket.h" | 34 #include "net/udp/datagram_client_socket.h" |
| 35 | 35 |
| 36 using testing::_; | 36 using testing::_; |
| 37 | 37 |
| 38 namespace net { | 38 namespace net { |
| 39 namespace test { | 39 namespace test { |
| 40 namespace { | 40 namespace { |
| 41 | 41 |
| 42 const char kServerHostname[] = "www.example.org"; | 42 const char kServerHostname[] = "test.example.com"; |
| 43 const uint16 kServerPort = 80; | 43 const uint16 kServerPort = 443; |
| 44 | 44 |
| 45 class QuicChromiumClientSessionTest | 45 class QuicChromiumClientSessionTest |
| 46 : public ::testing::TestWithParam<QuicVersion> { | 46 : public ::testing::TestWithParam<QuicVersion> { |
| 47 protected: | 47 protected: |
| 48 QuicChromiumClientSessionTest() | 48 QuicChromiumClientSessionTest() |
| 49 : connection_(new PacketSavingConnection(&helper_, | 49 : crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), |
| 50 connection_(new PacketSavingConnection(&helper_, |
| 50 Perspective::IS_CLIENT, | 51 Perspective::IS_CLIENT, |
| 51 SupportedVersions(GetParam()))), | 52 SupportedVersions(GetParam()))), |
| 52 session_(connection_, | 53 session_( |
| 53 GetSocket().Pass(), | 54 connection_, |
| 54 /*stream_factory=*/nullptr, | 55 GetSocket().Pass(), |
| 55 /*crypto_client_stream_factory=*/nullptr, | 56 /*stream_factory=*/nullptr, |
| 56 &clock_, | 57 /*crypto_client_stream_factory=*/nullptr, |
| 57 &transport_security_state_, | 58 &clock_, |
| 58 make_scoped_ptr((QuicServerInfo*)nullptr), | 59 &transport_security_state_, |
| 59 QuicServerId(kServerHostname, | 60 make_scoped_ptr((QuicServerInfo*)nullptr), |
| 60 kServerPort, | 61 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), |
| 61 /*is_secure=*/false, | 62 kQuicYieldAfterPacketsRead, |
| 62 PRIVACY_MODE_DISABLED), | 63 QuicTime::Delta::FromMilliseconds( |
| 63 kQuicYieldAfterPacketsRead, | 64 kQuicYieldAfterDurationMilliseconds), |
| 64 QuicTime::Delta::FromMilliseconds( | 65 /*cert_verify_flags=*/0, |
| 65 kQuicYieldAfterDurationMilliseconds), | 66 DefaultQuicConfig(), |
| 66 /*cert_verify_flags=*/0, | 67 &crypto_config_, |
| 67 DefaultQuicConfig(), | 68 "CONNECTION_UNKNOWN", |
| 68 &crypto_config_, | 69 base::TimeTicks::Now(), |
| 69 "CONNECTION_UNKNOWN", | 70 base::ThreadTaskRunnerHandle::Get().get(), |
| 70 base::TimeTicks::Now(), | 71 /*socket_performance_watcher=*/nullptr, |
| 71 base::ThreadTaskRunnerHandle::Get().get(), | 72 &net_log_) { |
| 72 /*socket_performance_watcher=*/nullptr, | |
| 73 &net_log_) { | |
| 74 session_.Initialize(); | 73 session_.Initialize(); |
| 75 // Advance the time, because timers do not like uninitialized times. | 74 // Advance the time, because timers do not like uninitialized times. |
| 76 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 75 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 77 } | 76 } |
| 78 | 77 |
| 79 void TearDown() override { | 78 void TearDown() override { |
| 80 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); | 79 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); |
| 81 } | 80 } |
| 82 | 81 |
| 83 scoped_ptr<DatagramClientSocket> GetSocket() { | 82 scoped_ptr<DatagramClientSocket> GetSocket() { |
| 84 socket_factory_.AddSocketDataProvider(&socket_data_); | 83 socket_factory_.AddSocketDataProvider(&socket_data_); |
| 85 return socket_factory_.CreateDatagramClientSocket( | 84 return socket_factory_.CreateDatagramClientSocket( |
| 86 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), &net_log_, | 85 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), &net_log_, |
| 87 NetLog::Source()); | 86 NetLog::Source()); |
| 88 } | 87 } |
| 89 | 88 |
| 90 void CompleteCryptoHandshake() { | 89 void CompleteCryptoHandshake() { |
| 91 ASSERT_EQ(ERR_IO_PENDING, | 90 ASSERT_EQ(ERR_IO_PENDING, |
| 92 session_.CryptoConnect(false, callback_.callback())); | 91 session_.CryptoConnect(false, callback_.callback())); |
| 93 CryptoTestUtils::HandshakeWithFakeServer(&helper_, connection_, | 92 CryptoTestUtils::HandshakeWithFakeServer(&helper_, connection_, |
| 94 session_.GetCryptoStream()); | 93 session_.GetCryptoStream()); |
| 95 ASSERT_EQ(OK, callback_.WaitForResult()); | 94 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 96 } | 95 } |
| 97 | 96 |
| 98 MockHelper helper_; | 97 MockHelper helper_; |
| 98 QuicCryptoClientConfig crypto_config_; |
| 99 PacketSavingConnection* connection_; | 99 PacketSavingConnection* connection_; |
| 100 TestNetLog net_log_; | 100 TestNetLog net_log_; |
| 101 MockClientSocketFactory socket_factory_; | 101 MockClientSocketFactory socket_factory_; |
| 102 StaticSocketDataProvider socket_data_; | 102 StaticSocketDataProvider socket_data_; |
| 103 TransportSecurityState transport_security_state_; | 103 TransportSecurityState transport_security_state_; |
| 104 QuicChromiumClientSession session_; | 104 QuicChromiumClientSession session_; |
| 105 MockClock clock_; | 105 MockClock clock_; |
| 106 MockRandom random_; | 106 MockRandom random_; |
| 107 QuicConnectionVisitorInterface* visitor_; | 107 QuicConnectionVisitorInterface* visitor_; |
| 108 TestCompletionCallback callback_; | 108 TestCompletionCallback callback_; |
| 109 QuicCryptoClientConfig crypto_config_; | |
| 110 }; | 109 }; |
| 111 | 110 |
| 112 INSTANTIATE_TEST_CASE_P(Tests, | 111 INSTANTIATE_TEST_CASE_P(Tests, |
| 113 QuicChromiumClientSessionTest, | 112 QuicChromiumClientSessionTest, |
| 114 ::testing::ValuesIn(QuicSupportedVersions())); | 113 ::testing::ValuesIn(QuicSupportedVersions())); |
| 115 | 114 |
| 115 #if defined(OPENSSL) |
| 116 |
| 116 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { | 117 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { |
| 117 CompleteCryptoHandshake(); | 118 CompleteCryptoHandshake(); |
| 118 } | 119 } |
| 119 | 120 |
| 120 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { | 121 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { |
| 121 CompleteCryptoHandshake(); | 122 CompleteCryptoHandshake(); |
| 122 | 123 |
| 123 std::vector<QuicReliableClientStream*> streams; | 124 std::vector<QuicReliableClientStream*> streams; |
| 124 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { | 125 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { |
| 125 QuicReliableClientStream* stream = session_.CreateOutgoingDynamicStream(); | 126 QuicReliableClientStream* stream = session_.CreateOutgoingDynamicStream(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 // Load a cert that is valid for: | 172 // Load a cert that is valid for: |
| 172 // www.example.org | 173 // www.example.org |
| 173 // mail.example.org | 174 // mail.example.org |
| 174 // www.example.com | 175 // www.example.com |
| 175 | 176 |
| 176 ProofVerifyDetailsChromium details; | 177 ProofVerifyDetailsChromium details; |
| 177 details.cert_verify_result.verified_cert = | 178 details.cert_verify_result.verified_cert = |
| 178 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 179 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 179 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 180 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 180 | 181 |
| 182 CompleteCryptoHandshake(); |
| 181 session_.OnProofVerifyDetailsAvailable(details); | 183 session_.OnProofVerifyDetailsAvailable(details); |
| 182 CompleteCryptoHandshake(); | |
| 183 | 184 |
| 184 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); | 185 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); |
| 185 EXPECT_FALSE(session_.CanPool("www.example.org", PRIVACY_MODE_ENABLED)); | 186 EXPECT_FALSE(session_.CanPool("www.example.org", PRIVACY_MODE_ENABLED)); |
| 186 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | 187 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 187 EXPECT_TRUE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); | 188 EXPECT_TRUE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); |
| 188 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); | 189 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); |
| 189 } | 190 } |
| 190 | 191 |
| 191 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithTlsChannelId) { | 192 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithTlsChannelId) { |
| 192 // Load a cert that is valid for: | 193 // Load a cert that is valid for: |
| 193 // www.example.org | 194 // www.example.org |
| 194 // mail.example.org | 195 // mail.example.org |
| 195 // www.example.com | 196 // www.example.com |
| 196 | 197 |
| 197 ProofVerifyDetailsChromium details; | 198 ProofVerifyDetailsChromium details; |
| 198 details.cert_verify_result.verified_cert = | 199 details.cert_verify_result.verified_cert = |
| 199 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 200 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 200 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 201 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 201 | 202 |
| 203 CompleteCryptoHandshake(); |
| 202 session_.OnProofVerifyDetailsAvailable(details); | 204 session_.OnProofVerifyDetailsAvailable(details); |
| 203 CompleteCryptoHandshake(); | 205 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); |
| 204 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); | 206 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); |
| 205 | 207 |
| 206 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); | 208 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); |
| 207 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | 209 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 208 EXPECT_FALSE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); | 210 EXPECT_FALSE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); |
| 209 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); | 211 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); |
| 210 } | 212 } |
| 211 | 213 |
| 212 TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) { | 214 TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) { |
| 213 uint8 primary_pin = 1; | 215 uint8 primary_pin = 1; |
| 214 uint8 backup_pin = 2; | 216 uint8 backup_pin = 2; |
| 215 uint8 bad_pin = 3; | 217 uint8 bad_pin = 3; |
| 216 AddPin(&transport_security_state_, "mail.example.org", primary_pin, | 218 AddPin(&transport_security_state_, "mail.example.org", primary_pin, |
| 217 backup_pin); | 219 backup_pin); |
| 218 | 220 |
| 219 ProofVerifyDetailsChromium details; | 221 ProofVerifyDetailsChromium details; |
| 220 details.cert_verify_result.verified_cert = | 222 details.cert_verify_result.verified_cert = |
| 221 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 223 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 222 details.cert_verify_result.is_issued_by_known_root = true; | 224 details.cert_verify_result.is_issued_by_known_root = true; |
| 223 details.cert_verify_result.public_key_hashes.push_back( | 225 details.cert_verify_result.public_key_hashes.push_back( |
| 224 GetTestHashValue(bad_pin)); | 226 GetTestHashValue(bad_pin)); |
| 225 | 227 |
| 226 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 228 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 227 | 229 |
| 230 CompleteCryptoHandshake(); |
| 228 session_.OnProofVerifyDetailsAvailable(details); | 231 session_.OnProofVerifyDetailsAvailable(details); |
| 229 CompleteCryptoHandshake(); | 232 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); |
| 230 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); | 233 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); |
| 231 | 234 |
| 232 EXPECT_FALSE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | 235 EXPECT_FALSE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 233 } | 236 } |
| 234 | 237 |
| 235 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithMatchingPin) { | 238 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithMatchingPin) { |
| 236 uint8 primary_pin = 1; | 239 uint8 primary_pin = 1; |
| 237 uint8 backup_pin = 2; | 240 uint8 backup_pin = 2; |
| 238 AddPin(&transport_security_state_, "mail.example.org", primary_pin, | 241 AddPin(&transport_security_state_, "mail.example.org", primary_pin, |
| 239 backup_pin); | 242 backup_pin); |
| 240 | 243 |
| 241 ProofVerifyDetailsChromium details; | 244 ProofVerifyDetailsChromium details; |
| 242 details.cert_verify_result.verified_cert = | 245 details.cert_verify_result.verified_cert = |
| 243 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 246 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 244 details.cert_verify_result.is_issued_by_known_root = true; | 247 details.cert_verify_result.is_issued_by_known_root = true; |
| 245 details.cert_verify_result.public_key_hashes.push_back( | 248 details.cert_verify_result.public_key_hashes.push_back( |
| 246 GetTestHashValue(primary_pin)); | 249 GetTestHashValue(primary_pin)); |
| 247 | 250 |
| 248 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 251 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 249 | 252 |
| 253 CompleteCryptoHandshake(); |
| 250 session_.OnProofVerifyDetailsAvailable(details); | 254 session_.OnProofVerifyDetailsAvailable(details); |
| 251 CompleteCryptoHandshake(); | 255 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); |
| 252 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); | 256 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); |
| 253 | 257 |
| 254 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | 258 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 255 } | 259 } |
| 256 | 260 |
| 261 #endif |
| 262 |
| 257 } // namespace | 263 } // namespace |
| 258 } // namespace test | 264 } // namespace test |
| 259 } // namespace net | 265 } // namespace net |
| OLD | NEW |