| 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(Perspective::IS_CLIENT, | 49 : connection_(new PacketSavingConnection(Perspective::IS_CLIENT, |
| 50 SupportedVersions(GetParam()))), | 50 SupportedVersions(GetParam()))), |
| 51 session_(connection_, | 51 crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), |
| 52 GetSocket().Pass(), | 52 session_( |
| 53 /*stream_factory=*/nullptr, | 53 connection_, |
| 54 /*crypto_client_stream_factory=*/nullptr, | 54 GetSocket().Pass(), |
| 55 &clock_, | 55 /*stream_factory=*/nullptr, |
| 56 &transport_security_state_, | 56 /*crypto_client_stream_factory=*/nullptr, |
| 57 make_scoped_ptr((QuicServerInfo*)nullptr), | 57 &clock_, |
| 58 QuicServerId(kServerHostname, | 58 &transport_security_state_, |
| 59 kServerPort, | 59 make_scoped_ptr((QuicServerInfo*)nullptr), |
| 60 /*is_secure=*/false, | 60 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), |
| 61 PRIVACY_MODE_DISABLED), | 61 kQuicYieldAfterPacketsRead, |
| 62 kQuicYieldAfterPacketsRead, | 62 QuicTime::Delta::FromMilliseconds( |
| 63 QuicTime::Delta::FromMilliseconds( | 63 kQuicYieldAfterDurationMilliseconds), |
| 64 kQuicYieldAfterDurationMilliseconds), | 64 /*cert_verify_flags=*/0, |
| 65 /*cert_verify_flags=*/0, | 65 DefaultQuicConfig(), |
| 66 DefaultQuicConfig(), | 66 &crypto_config_, |
| 67 &crypto_config_, | 67 "CONNECTION_UNKNOWN", |
| 68 "CONNECTION_UNKNOWN", | 68 base::TimeTicks::Now(), |
| 69 base::TimeTicks::Now(), | 69 base::ThreadTaskRunnerHandle::Get().get(), |
| 70 base::ThreadTaskRunnerHandle::Get().get(), | 70 /*socket_performance_watcher=*/nullptr, |
| 71 /*socket_performance_watcher=*/nullptr, | 71 &net_log_) { |
| 72 &net_log_) { | |
| 73 session_.Initialize(); | 72 session_.Initialize(); |
| 74 // Advance the time, because timers do not like uninitialized times. | 73 // Advance the time, because timers do not like uninitialized times. |
| 75 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 74 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 76 } | 75 } |
| 77 | 76 |
| 78 void TearDown() override { | 77 void TearDown() override { |
| 79 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); | 78 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); |
| 80 } | 79 } |
| 81 | 80 |
| 82 scoped_ptr<DatagramClientSocket> GetSocket() { | 81 scoped_ptr<DatagramClientSocket> GetSocket() { |
| 83 socket_factory_.AddSocketDataProvider(&socket_data_); | 82 socket_factory_.AddSocketDataProvider(&socket_data_); |
| 84 return socket_factory_.CreateDatagramClientSocket( | 83 return socket_factory_.CreateDatagramClientSocket( |
| 85 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), &net_log_, | 84 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), &net_log_, |
| 86 NetLog::Source()); | 85 NetLog::Source()); |
| 87 } | 86 } |
| 88 | 87 |
| 89 void CompleteCryptoHandshake() { | 88 void CompleteCryptoHandshake() { |
| 90 ASSERT_EQ(ERR_IO_PENDING, | 89 ASSERT_EQ(ERR_IO_PENDING, |
| 91 session_.CryptoConnect(false, callback_.callback())); | 90 session_.CryptoConnect(false, callback_.callback())); |
| 92 CryptoTestUtils::HandshakeWithFakeServer(connection_, | 91 CryptoTestUtils::HandshakeWithFakeServer(connection_, |
| 93 session_.GetCryptoStream()); | 92 session_.GetCryptoStream()); |
| 94 ASSERT_EQ(OK, callback_.WaitForResult()); | 93 ASSERT_EQ(OK, callback_.WaitForResult()); |
| 95 } | 94 } |
| 96 | 95 |
| 97 PacketSavingConnection* connection_; | 96 PacketSavingConnection* connection_; |
| 98 TestNetLog net_log_; | 97 TestNetLog net_log_; |
| 99 MockClientSocketFactory socket_factory_; | 98 MockClientSocketFactory socket_factory_; |
| 100 StaticSocketDataProvider socket_data_; | 99 StaticSocketDataProvider socket_data_; |
| 101 TransportSecurityState transport_security_state_; | 100 TransportSecurityState transport_security_state_; |
| 101 QuicCryptoClientConfig crypto_config_; |
| 102 QuicChromiumClientSession session_; | 102 QuicChromiumClientSession session_; |
| 103 MockClock clock_; | 103 MockClock clock_; |
| 104 MockRandom random_; | 104 MockRandom random_; |
| 105 QuicConnectionVisitorInterface* visitor_; | 105 QuicConnectionVisitorInterface* visitor_; |
| 106 TestCompletionCallback callback_; | 106 TestCompletionCallback callback_; |
| 107 QuicCryptoClientConfig crypto_config_; | |
| 108 }; | 107 }; |
| 109 | 108 |
| 110 INSTANTIATE_TEST_CASE_P(Tests, | 109 INSTANTIATE_TEST_CASE_P(Tests, |
| 111 QuicChromiumClientSessionTest, | 110 QuicChromiumClientSessionTest, |
| 112 ::testing::ValuesIn(QuicSupportedVersions())); | 111 ::testing::ValuesIn(QuicSupportedVersions())); |
| 113 | 112 |
| 114 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { | 113 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { |
| 115 CompleteCryptoHandshake(); | 114 CompleteCryptoHandshake(); |
| 116 } | 115 } |
| 117 | 116 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 | 159 |
| 161 // After receiving a GoAway, I should no longer be able to create outgoing | 160 // After receiving a GoAway, I should no longer be able to create outgoing |
| 162 // streams. | 161 // streams. |
| 163 session_.connection()->OnGoAwayFrame( | 162 session_.connection()->OnGoAwayFrame( |
| 164 QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); | 163 QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); |
| 165 EXPECT_EQ(nullptr, session_.CreateOutgoingDynamicStream()); | 164 EXPECT_EQ(nullptr, session_.CreateOutgoingDynamicStream()); |
| 166 } | 165 } |
| 167 | 166 |
| 168 TEST_P(QuicChromiumClientSessionTest, CanPool) { | 167 TEST_P(QuicChromiumClientSessionTest, CanPool) { |
| 169 // Load a cert that is valid for: | 168 // Load a cert that is valid for: |
| 170 // www.example.org | 169 // test.example.com |
| 171 // mail.example.org | 170 // mail.example.org |
| 172 // www.example.com | 171 // test.example.org |
| 173 | 172 |
| 174 ProofVerifyDetailsChromium details; | 173 ProofVerifyDetailsChromium details; |
| 175 details.cert_verify_result.verified_cert = | 174 details.cert_verify_result.verified_cert = |
| 176 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 175 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 177 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 176 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 178 | 177 |
| 179 session_.OnProofVerifyDetailsAvailable(details); | 178 session_.OnProofVerifyDetailsAvailable(details); |
| 180 CompleteCryptoHandshake(); | 179 CompleteCryptoHandshake(); |
| 181 | 180 |
| 182 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); | 181 EXPECT_TRUE(session_.CanPool("test.example.com", PRIVACY_MODE_DISABLED)); |
| 183 EXPECT_FALSE(session_.CanPool("www.example.org", PRIVACY_MODE_ENABLED)); | 182 EXPECT_FALSE(session_.CanPool("test.example.com", PRIVACY_MODE_ENABLED)); |
| 184 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | 183 // All URL's are secure QUIC. |
| 185 EXPECT_TRUE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); | 184 EXPECT_FALSE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 185 EXPECT_FALSE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); |
| 186 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); | 186 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); |
| 187 } | 187 } |
| 188 | 188 |
| 189 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithTlsChannelId) { | 189 TEST_P(QuicChromiumClientSessionTest, ConnectionPooledWithTlsChannelId) { |
| 190 // Load a cert that is valid for: | 190 // Load a cert that is valid for: |
| 191 // www.example.org | 191 // test.example.com |
| 192 // mail.example.org | 192 // mail.example.org |
| 193 // www.example.com | 193 // www.example.com |
| 194 | 194 |
| 195 ProofVerifyDetailsChromium details; | 195 ProofVerifyDetailsChromium details; |
| 196 details.cert_verify_result.verified_cert = | 196 details.cert_verify_result.verified_cert = |
| 197 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); | 197 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); |
| 198 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 198 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 199 | 199 |
| 200 session_.OnProofVerifyDetailsAvailable(details); | 200 session_.OnProofVerifyDetailsAvailable(details); |
| 201 CompleteCryptoHandshake(); | 201 CompleteCryptoHandshake(); |
| 202 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); | 202 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); |
| 203 | 203 |
| 204 EXPECT_TRUE(session_.CanPool("www.example.org", PRIVACY_MODE_DISABLED)); | 204 EXPECT_TRUE(session_.CanPool("test.example.com", PRIVACY_MODE_DISABLED)); |
| 205 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | |
| 206 EXPECT_FALSE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); | 205 EXPECT_FALSE(session_.CanPool("mail.example.com", PRIVACY_MODE_DISABLED)); |
| 206 EXPECT_FALSE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 207 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); | 207 EXPECT_FALSE(session_.CanPool("mail.google.com", PRIVACY_MODE_DISABLED)); |
| 208 } | 208 } |
| 209 | 209 |
| 210 TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) { | 210 TEST_P(QuicChromiumClientSessionTest, ConnectionNotPooledWithDifferentPin) { |
| 211 uint8 primary_pin = 1; | 211 uint8 primary_pin = 1; |
| 212 uint8 backup_pin = 2; | 212 uint8 backup_pin = 2; |
| 213 uint8 bad_pin = 3; | 213 uint8 bad_pin = 3; |
| 214 AddPin(&transport_security_state_, "mail.example.org", primary_pin, | 214 AddPin(&transport_security_state_, "mail.example.org", primary_pin, |
| 215 backup_pin); | 215 backup_pin); |
| 216 | 216 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 242 details.cert_verify_result.is_issued_by_known_root = true; | 242 details.cert_verify_result.is_issued_by_known_root = true; |
| 243 details.cert_verify_result.public_key_hashes.push_back( | 243 details.cert_verify_result.public_key_hashes.push_back( |
| 244 GetTestHashValue(primary_pin)); | 244 GetTestHashValue(primary_pin)); |
| 245 | 245 |
| 246 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); | 246 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); |
| 247 | 247 |
| 248 session_.OnProofVerifyDetailsAvailable(details); | 248 session_.OnProofVerifyDetailsAvailable(details); |
| 249 CompleteCryptoHandshake(); | 249 CompleteCryptoHandshake(); |
| 250 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); | 250 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); |
| 251 | 251 |
| 252 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); | 252 EXPECT_FALSE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); |
| 253 } | 253 } |
| 254 | 254 |
| 255 } // namespace | 255 } // namespace |
| 256 } // namespace test | 256 } // namespace test |
| 257 } // namespace net | 257 } // namespace net |
| OLD | NEW |