Index: net/quic/quic_crypto_server_stream_test.cc |
diff --git a/net/quic/quic_crypto_server_stream_test.cc b/net/quic/quic_crypto_server_stream_test.cc |
deleted file mode 100644 |
index 2b885fa8b3fdb69ff9d94db2263276658572e863..0000000000000000000000000000000000000000 |
--- a/net/quic/quic_crypto_server_stream_test.cc |
+++ /dev/null |
@@ -1,283 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/quic/quic_crypto_server_stream.h" |
- |
-#include <map> |
-#include <vector> |
- |
-#include "base/memory/scoped_ptr.h" |
-#include "net/quic/crypto/aes_128_gcm_12_encrypter.h" |
-#include "net/quic/crypto/crypto_framer.h" |
-#include "net/quic/crypto/crypto_handshake.h" |
-#include "net/quic/crypto/crypto_protocol.h" |
-#include "net/quic/crypto/crypto_utils.h" |
-#include "net/quic/crypto/quic_crypto_server_config.h" |
-#include "net/quic/crypto/quic_decrypter.h" |
-#include "net/quic/crypto/quic_encrypter.h" |
-#include "net/quic/crypto/quic_random.h" |
-#include "net/quic/quic_crypto_client_stream.h" |
-#include "net/quic/quic_protocol.h" |
-#include "net/quic/quic_session.h" |
-#include "net/quic/test_tools/crypto_test_utils.h" |
-#include "net/quic/test_tools/delayed_verify_strike_register_client.h" |
-#include "net/quic/test_tools/quic_test_utils.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace net { |
-class QuicConnection; |
-class ReliableQuicStream; |
-} // namespace net |
- |
-using std::pair; |
-using std::string; |
-using testing::_; |
- |
-namespace net { |
-namespace test { |
- |
-class QuicCryptoServerConfigPeer { |
- public: |
- static string GetPrimaryOrbit(const QuicCryptoServerConfig& config) { |
- base::AutoLock lock(config.configs_lock_); |
- CHECK(config.primary_config_.get() != nullptr); |
- return string(reinterpret_cast<const char*>(config.primary_config_->orbit), |
- kOrbitSize); |
- } |
-}; |
- |
-namespace { |
- |
-const char kServerHostname[] = "test.example.com"; |
-const uint16 kServerPort = 80; |
- |
-class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
- public: |
- QuicCryptoServerStreamTest() |
- : connection_(new PacketSavingConnection(/*is_server=*/true)), |
- session_(connection_, DefaultQuicConfig()), |
- crypto_config_(QuicCryptoServerConfig::TESTING, |
- QuicRandom::GetInstance()), |
- stream_(crypto_config_, &session_), |
- strike_register_client_(nullptr) { |
- session_.SetCryptoStream(&stream_); |
- // We advance the clock initially because the default time is zero and the |
- // strike register worries that we've just overflowed a uint32 time. |
- connection_->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); |
- // TODO(wtc): replace this with ProofSourceForTesting() when Chromium has |
- // a working ProofSourceForTesting(). |
- crypto_config_.SetProofSource(CryptoTestUtils::FakeProofSourceForTesting()); |
- crypto_config_.set_strike_register_no_startup_period(); |
- |
- CryptoTestUtils::SetupCryptoServerConfigForTest( |
- connection_->clock(), connection_->random_generator(), |
- session_.config(), &crypto_config_); |
- |
- if (AsyncStrikeRegisterVerification()) { |
- string orbit = |
- QuicCryptoServerConfigPeer::GetPrimaryOrbit(crypto_config_); |
- strike_register_client_ = new DelayedVerifyStrikeRegisterClient( |
- 10000, // strike_register_max_entries |
- static_cast<uint32>(connection_->clock()->WallNow().ToUNIXSeconds()), |
- 60, // strike_register_window_secs |
- reinterpret_cast<const uint8 *>(orbit.data()), |
- StrikeRegister::NO_STARTUP_PERIOD_NEEDED); |
- strike_register_client_->StartDelayingVerification(); |
- crypto_config_.SetStrikeRegisterClient(strike_register_client_); |
- } |
- } |
- |
- bool AsyncStrikeRegisterVerification() { |
- return GetParam(); |
- } |
- |
- void ConstructHandshakeMessage() { |
- CryptoFramer framer; |
- message_data_.reset(framer.ConstructHandshakeMessage(message_)); |
- } |
- |
- int CompleteCryptoHandshake() { |
- return CryptoTestUtils::HandshakeWithFakeClient(connection_, &stream_, |
- client_options_); |
- } |
- |
- protected: |
- PacketSavingConnection* connection_; |
- TestClientSession session_; |
- QuicConfig config_; |
- QuicCryptoServerConfig crypto_config_; |
- QuicCryptoServerStream stream_; |
- CryptoHandshakeMessage message_; |
- scoped_ptr<QuicData> message_data_; |
- CryptoTestUtils::FakeClientOptions client_options_; |
- DelayedVerifyStrikeRegisterClient* strike_register_client_; |
-}; |
- |
-INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); |
- |
-TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { |
- EXPECT_FALSE(stream_.encryption_established()); |
- EXPECT_FALSE(stream_.handshake_confirmed()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { |
- // CompleteCryptoHandshake returns the number of client hellos sent. This |
- // test should send: |
- // * One to get a source-address token and certificates. |
- // * One to complete the handshake. |
- EXPECT_EQ(2, CompleteCryptoHandshake()); |
- EXPECT_TRUE(stream_.encryption_established()); |
- EXPECT_TRUE(stream_.handshake_confirmed()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, ZeroRTT) { |
- PacketSavingConnection* client_conn = |
- new PacketSavingConnection(/*is_server=*/false); |
- PacketSavingConnection* server_conn = |
- new PacketSavingConnection(/*is_server=*/true); |
- client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); |
- server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); |
- |
- QuicConfig client_config; |
- scoped_ptr<TestClientSession> client_session( |
- new TestClientSession(client_conn, client_config)); |
- QuicCryptoClientConfig client_crypto_config; |
- |
- QuicServerId server_id(kServerHostname, kServerPort, false, |
- PRIVACY_MODE_DISABLED); |
- scoped_ptr<QuicCryptoClientStream> client(new QuicCryptoClientStream( |
- server_id, client_session.get(), nullptr, &client_crypto_config)); |
- client_session->SetCryptoStream(client.get()); |
- |
- // Do a first handshake in order to prime the client config with the server's |
- // information. |
- client->CryptoConnect(); |
- CHECK_EQ(1u, client_conn->encrypted_packets_.size()); |
- |
- scoped_ptr<TestSession> server_session(new TestSession(server_conn, config_)); |
- scoped_ptr<QuicCryptoServerStream> server( |
- new QuicCryptoServerStream(crypto_config_, server_session.get())); |
- server_session->SetCryptoStream(server.get()); |
- |
- CryptoTestUtils::CommunicateHandshakeMessages( |
- client_conn, client.get(), server_conn, server.get()); |
- EXPECT_EQ(2, client->num_sent_client_hellos()); |
- |
- // Now do another handshake, hopefully in 0-RTT. |
- LOG(INFO) << "Resetting for 0-RTT handshake attempt"; |
- |
- client_conn = new PacketSavingConnection(/*is_server=*/false); |
- server_conn = new PacketSavingConnection(/*is_server=*/true); |
- // We need to advance time past the strike-server window so that it's |
- // authoritative in this time span. |
- client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); |
- server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); |
- |
- // This causes the client's nonce to be different and thus stops the |
- // strike-register from rejecting the repeated nonce. |
- reinterpret_cast<MockRandom*>(client_conn->random_generator())->ChangeValue(); |
- client_session.reset(new TestClientSession(client_conn, client_config)); |
- server_session.reset(new TestSession(server_conn, config_)); |
- client.reset(new QuicCryptoClientStream(server_id, client_session.get(), |
- nullptr, &client_crypto_config)); |
- client_session->SetCryptoStream(client.get()); |
- |
- server.reset(new QuicCryptoServerStream(crypto_config_, |
- server_session.get())); |
- server_session->SetCryptoStream(server.get()); |
- |
- client->CryptoConnect(); |
- |
- if (AsyncStrikeRegisterVerification()) { |
- EXPECT_FALSE(client->handshake_confirmed()); |
- EXPECT_FALSE(server->handshake_confirmed()); |
- |
- // Advance the handshake. Expect that the server will be stuck |
- // waiting for client nonce verification to complete. |
- pair<size_t, size_t> messages_moved = CryptoTestUtils::AdvanceHandshake( |
- client_conn, client.get(), 0, server_conn, server.get(), 0); |
- EXPECT_EQ(1u, messages_moved.first); |
- EXPECT_EQ(0u, messages_moved.second); |
- EXPECT_EQ(1, strike_register_client_->PendingVerifications()); |
- EXPECT_FALSE(client->handshake_confirmed()); |
- EXPECT_FALSE(server->handshake_confirmed()); |
- |
- // The server handshake completes once the nonce verification completes. |
- strike_register_client_->RunPendingVerifications(); |
- EXPECT_FALSE(client->handshake_confirmed()); |
- EXPECT_TRUE(server->handshake_confirmed()); |
- |
- messages_moved = CryptoTestUtils::AdvanceHandshake( |
- client_conn, client.get(), messages_moved.first, |
- server_conn, server.get(), messages_moved.second); |
- EXPECT_EQ(1u, messages_moved.first); |
- EXPECT_EQ(1u, messages_moved.second); |
- EXPECT_TRUE(client->handshake_confirmed()); |
- EXPECT_TRUE(server->handshake_confirmed()); |
- } else { |
- CryptoTestUtils::CommunicateHandshakeMessages( |
- client_conn, client.get(), server_conn, server.get()); |
- } |
- |
- EXPECT_EQ(1, client->num_sent_client_hellos()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) { |
- CompleteCryptoHandshake(); |
- EXPECT_CALL(*connection_, SendConnectionClose( |
- QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE)); |
- message_.set_tag(kCHLO); |
- ConstructHandshakeMessage(); |
- stream_.ProcessRawData(message_data_->data(), message_data_->length()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, BadMessageType) { |
- message_.set_tag(kSHLO); |
- ConstructHandshakeMessage(); |
- EXPECT_CALL(*connection_, SendConnectionClose( |
- QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); |
- stream_.ProcessRawData(message_data_->data(), message_data_->length()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, WithoutCertificates) { |
- crypto_config_.SetProofSource(nullptr); |
- client_options_.dont_verify_certs = true; |
- |
- // Only 2 client hellos need to be sent in the no-certs case: one to get the |
- // source-address token and the second to finish. |
- EXPECT_EQ(2, CompleteCryptoHandshake()); |
- EXPECT_TRUE(stream_.encryption_established()); |
- EXPECT_TRUE(stream_.handshake_confirmed()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, ChannelID) { |
- client_options_.channel_id_enabled = true; |
- client_options_.channel_id_source_async = false; |
- // CompleteCryptoHandshake verifies |
- // stream_.crypto_negotiated_params().channel_id is correct. |
- EXPECT_EQ(2, CompleteCryptoHandshake()); |
- EXPECT_TRUE(stream_.encryption_established()); |
- EXPECT_TRUE(stream_.handshake_confirmed()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, ChannelIDAsync) { |
- client_options_.channel_id_enabled = true; |
- client_options_.channel_id_source_async = true; |
- // CompleteCryptoHandshake verifies |
- // stream_.crypto_negotiated_params().channel_id is correct. |
- EXPECT_EQ(2, CompleteCryptoHandshake()); |
- EXPECT_TRUE(stream_.encryption_established()); |
- EXPECT_TRUE(stream_.handshake_confirmed()); |
-} |
- |
-TEST_P(QuicCryptoServerStreamTest, OnlySendSCUPAfterHandshakeComplete) { |
- // An attempt to send a SCUP before completing handshake should fail. |
- stream_.SendServerConfigUpdate(nullptr); |
- EXPECT_EQ(0, stream_.num_server_config_update_messages_sent()); |
-} |
- |
-} // namespace |
-} // namespace test |
-} // namespace net |