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 |
index 2cc8e2930925d162990f144c0c38ca28b09a1d47..6874612dd1bf0d5541fb84f0a86a3fe0e64c5ece 100644 |
--- a/net/quic/quic_crypto_server_stream_test.cc |
+++ b/net/quic/quic_crypto_server_stream_test.cc |
@@ -18,6 +18,7 @@ |
#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_flags.h" |
#include "net/quic/quic_protocol.h" |
#include "net/quic/quic_session.h" |
#include "net/quic/test_tools/crypto_test_utils.h" |
@@ -48,6 +49,15 @@ class QuicCryptoServerConfigPeer { |
} |
}; |
+class QuicCryptoServerStreamPeer { |
+ public: |
+ static bool DoesPeerSupportStatelessRejects( |
+ const CryptoHandshakeMessage& message) { |
+ return net::QuicCryptoServerStream::DoesPeerSupportStatelessRejects( |
+ message); |
+ } |
+}; |
+ |
namespace { |
const char kServerHostname[] = "test.example.com"; |
@@ -56,39 +66,65 @@ const uint16 kServerPort = 80; |
class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
public: |
QuicCryptoServerStreamTest() |
- : connection_(new PacketSavingConnection(Perspective::IS_SERVER)), |
- 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)); |
+ : server_crypto_config_(QuicCryptoServerConfig::TESTING, |
+ QuicRandom::GetInstance()), |
+ server_id_(kServerHostname, kServerPort, false, PRIVACY_MODE_DISABLED) { |
// 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(); |
+ server_crypto_config_.SetProofSource( |
+ CryptoTestUtils::FakeProofSourceForTesting()); |
+ server_crypto_config_.set_strike_register_no_startup_period(); |
- CryptoTestUtils::SetupCryptoServerConfigForTest( |
- connection_->clock(), connection_->random_generator(), |
- session_.config(), &crypto_config_); |
+ InitializeServer(); |
if (AsyncStrikeRegisterVerification()) { |
string orbit = |
- QuicCryptoServerConfigPeer::GetPrimaryOrbit(crypto_config_); |
+ QuicCryptoServerConfigPeer::GetPrimaryOrbit(server_crypto_config_); |
strike_register_client_ = new DelayedVerifyStrikeRegisterClient( |
10000, // strike_register_max_entries |
- static_cast<uint32>(connection_->clock()->WallNow().ToUNIXSeconds()), |
+ static_cast<uint32>( |
+ server_connection_->clock()->WallNow().ToUNIXSeconds()), |
60, // strike_register_window_secs |
- reinterpret_cast<const uint8 *>(orbit.data()), |
+ reinterpret_cast<const uint8*>(orbit.data()), |
StrikeRegister::NO_STARTUP_PERIOD_NEEDED); |
strike_register_client_->StartDelayingVerification(); |
- crypto_config_.SetStrikeRegisterClient(strike_register_client_); |
+ server_crypto_config_.SetStrikeRegisterClient(strike_register_client_); |
} |
} |
+ // Initializes the crypto server stream state for testing. May be |
+ // called multiple times. |
+ void InitializeServer() { |
+ TestServerSession* server_session = nullptr; |
+ QuicCryptoServerStream* server_stream = nullptr; |
+ SetupCryptoServerStreamForTest(server_id_, |
+ QuicTime::Delta::FromSeconds(100000), |
+ &server_crypto_config_, &server_connection_, |
+ &server_session, &server_stream); |
+ CHECK(server_session); |
+ CHECK(server_stream); |
+ server_session_.reset(server_session); |
+ server_stream_.reset(server_stream); |
+ CryptoTestUtils::SetupCryptoServerConfigForTest( |
+ server_connection_->clock(), server_connection_->random_generator(), |
+ server_session_->config(), &server_crypto_config_); |
+ } |
+ |
+ // Initializes a fake client, and all its associated state, for |
+ // testing. May be called multiple times. |
+ void InitializeFakeClient(bool supports_stateless_rejects) { |
+ TestClientSession* client_session = nullptr; |
+ QuicCryptoClientStream* client_stream = nullptr; |
+ SetupCryptoClientStreamForTest(server_id_, supports_stateless_rejects, |
+ QuicTime::Delta::FromSeconds(100000), |
+ &client_crypto_config_, &client_connection_, |
+ &client_session, &client_stream); |
+ CHECK(client_session); |
+ CHECK(client_stream); |
+ client_session_.reset(client_session); |
+ client_stream_.reset(client_stream); |
+ } |
+ |
bool AsyncStrikeRegisterVerification() { |
return GetParam(); |
} |
@@ -99,16 +135,41 @@ class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
} |
int CompleteCryptoHandshake() { |
- return CryptoTestUtils::HandshakeWithFakeClient(connection_, &stream_, |
- client_options_); |
+ CHECK(server_connection_); |
+ CHECK(server_stream_ != nullptr); |
+ return CryptoTestUtils::HandshakeWithFakeClient( |
+ server_connection_, server_stream_.get(), client_options_); |
+ } |
+ |
+ // Performs a single round of handshake message-exchange between the |
+ // client and server. |
+ void AdvanceHandshakeWithFakeClient() { |
+ CHECK(server_connection_); |
+ CHECK(server_stream_ != nullptr); |
+ CHECK(client_session_ != nullptr); |
+ CHECK(client_stream_ != nullptr); |
+ |
+ EXPECT_CALL(*client_session_, OnProofValid(_)).Times(testing::AnyNumber()); |
+ client_stream_->CryptoConnect(); |
+ CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream_.get(), |
+ 0, server_connection_, |
+ server_stream_.get(), 0); |
} |
protected: |
- PacketSavingConnection* connection_; |
- TestClientSession session_; |
- QuicConfig config_; |
- QuicCryptoServerConfig crypto_config_; |
- QuicCryptoServerStream stream_; |
+ // Server state |
+ PacketSavingConnection* server_connection_; |
+ scoped_ptr<TestServerSession> server_session_; |
+ QuicCryptoServerConfig server_crypto_config_; |
+ scoped_ptr<QuicCryptoServerStream> server_stream_; |
+ QuicServerId server_id_; |
+ |
+ // Client state |
+ PacketSavingConnection* client_connection_; |
+ QuicCryptoClientConfig client_crypto_config_; |
+ scoped_ptr<TestClientSession> client_session_; |
+ scoped_ptr<QuicCryptoClientStream> client_stream_; |
+ |
CryptoHandshakeMessage message_; |
scoped_ptr<QuicData> message_data_; |
CryptoTestUtils::FakeClientOptions client_options_; |
@@ -118,8 +179,13 @@ class QuicCryptoServerStreamTest : public ::testing::TestWithParam<bool> { |
INSTANTIATE_TEST_CASE_P(Tests, QuicCryptoServerStreamTest, testing::Bool()); |
TEST_P(QuicCryptoServerStreamTest, NotInitiallyConected) { |
- EXPECT_FALSE(stream_.encryption_established()); |
- EXPECT_FALSE(stream_.handshake_confirmed()); |
+ EXPECT_FALSE(server_stream_->encryption_established()); |
+ EXPECT_FALSE(server_stream_->handshake_confirmed()); |
+} |
+ |
+TEST_P(QuicCryptoServerStreamTest, NotInitiallySendingStatelessRejects) { |
+ EXPECT_FALSE(server_stream_->use_stateless_rejects_if_peer_supported()); |
+ EXPECT_FALSE(server_stream_->peer_supports_stateless_rejects()); |
} |
TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { |
@@ -128,154 +194,248 @@ TEST_P(QuicCryptoServerStreamTest, ConnectedAfterCHLO) { |
// * 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()); |
+ EXPECT_TRUE(server_stream_->encryption_established()); |
+ EXPECT_TRUE(server_stream_->handshake_confirmed()); |
+} |
+ |
+TEST_P(QuicCryptoServerStreamTest, StatelessRejectAfterCHLO) { |
+ ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
+ true); |
+ server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
+ |
+ InitializeFakeClient(/* supports_stateless_rejects= */ true); |
+ AdvanceHandshakeWithFakeClient(); |
+ |
+ // Check the server to make the sure the handshake did not succeed. |
+ EXPECT_FALSE(server_stream_->encryption_established()); |
+ EXPECT_FALSE(server_stream_->handshake_confirmed()); |
+ |
+ // Check the client state to make sure that it received a |
+ // server-designated connection id. |
+ QuicCryptoClientConfig::CachedState* client_state = |
+ client_crypto_config_.LookupOrCreate(server_id_); |
+ |
+ ASSERT_TRUE(client_state->has_server_designated_connection_id()); |
+ const QuicConnectionId server_designated_connection_id = |
+ client_state->GetNextServerDesignatedConnectionId(); |
+ const QuicConnectionId expected_id = |
+ reinterpret_cast<MockRandom*>(server_connection_->random_generator()) |
+ ->RandUint64(); |
+ EXPECT_EQ(expected_id, server_designated_connection_id); |
+ EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
+ ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
+} |
+ |
+TEST_P(QuicCryptoServerStreamTest, ConnectedAfterStatelessHandshake) { |
+ ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
+ true); |
+ server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
+ |
+ InitializeFakeClient(/* supports_stateless_rejects= */ true); |
+ AdvanceHandshakeWithFakeClient(); |
+ |
+ // On the first round, encryption will not be established. |
+ EXPECT_FALSE(server_stream_->encryption_established()); |
+ EXPECT_FALSE(server_stream_->handshake_confirmed()); |
+ |
+ // Now check the client state. |
+ QuicCryptoClientConfig::CachedState* client_state = |
+ client_crypto_config_.LookupOrCreate(server_id_); |
+ |
+ ASSERT_TRUE(client_state->has_server_designated_connection_id()); |
+ const QuicConnectionId server_designated_connection_id = |
+ client_state->GetNextServerDesignatedConnectionId(); |
+ const QuicConnectionId expected_id = |
+ reinterpret_cast<MockRandom*>(server_connection_->random_generator()) |
+ ->RandUint64(); |
+ EXPECT_EQ(expected_id, server_designated_connection_id); |
+ EXPECT_FALSE(client_state->has_server_designated_connection_id()); |
+ ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
+ |
+ // Now create new client and server streams with the existing config |
+ // and try the handshake again (0-RTT handshake). |
+ InitializeServer(); |
+ server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
+ |
+ InitializeFakeClient(/* supports_stateless_rejects= */ true); |
+ |
+ client_stream_->CryptoConnect(); |
+ if (AsyncStrikeRegisterVerification()) { |
+ EXPECT_FALSE(client_stream_->handshake_confirmed()); |
+ EXPECT_FALSE(server_stream_->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_connection_, client_stream_.get(), 0, server_connection_, |
+ server_stream_.get(), 0); |
+ EXPECT_EQ(1u, messages_moved.first); |
+ EXPECT_EQ(0u, messages_moved.second); |
+ EXPECT_EQ(1, strike_register_client_->PendingVerifications()); |
+ EXPECT_FALSE(client_stream_->handshake_confirmed()); |
+ EXPECT_FALSE(server_stream_->handshake_confirmed()); |
+ |
+ // The server handshake completes once the nonce verification completes. |
+ strike_register_client_->RunPendingVerifications(); |
+ EXPECT_FALSE(client_stream_->handshake_confirmed()); |
+ EXPECT_TRUE(server_stream_->handshake_confirmed()); |
+ |
+ messages_moved = CryptoTestUtils::AdvanceHandshake( |
+ client_connection_, client_stream_.get(), messages_moved.first, |
+ server_connection_, server_stream_.get(), messages_moved.second); |
+ EXPECT_EQ(1u, messages_moved.first); |
+ EXPECT_EQ(1u, messages_moved.second); |
+ } else { |
+ AdvanceHandshakeWithFakeClient(); |
+ } |
+ |
+ // On the second round, encryption will be established. |
+ EXPECT_TRUE(server_stream_->encryption_established()); |
+ EXPECT_TRUE(server_stream_->handshake_confirmed()); |
+} |
+ |
+TEST_P(QuicCryptoServerStreamTest, NoStatelessRejectIfNoClientSupport) { |
+ ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support, |
+ true); |
+ server_stream_->set_use_stateless_rejects_if_peer_supported(true); |
+ |
+ // The server is configured to use stateless rejects, but the client |
+ // does not support it. |
+ InitializeFakeClient(/* supports_stateless_rejects= */ false); |
+ AdvanceHandshakeWithFakeClient(); |
+ |
+ // Check the server to make the sure the handshake did not succeed. |
+ EXPECT_FALSE(server_stream_->encryption_established()); |
+ EXPECT_FALSE(server_stream_->handshake_confirmed()); |
+ |
+ // Check the client state to make sure that it did not receive a |
+ // server-designated connection id. |
+ QuicCryptoClientConfig::CachedState* client_state = |
+ client_crypto_config_.LookupOrCreate(server_id_); |
+ |
+ ASSERT_FALSE(client_state->has_server_designated_connection_id()); |
+ ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); |
} |
TEST_P(QuicCryptoServerStreamTest, ZeroRTT) { |
- PacketSavingConnection* client_conn = |
- new PacketSavingConnection(Perspective::IS_CLIENT); |
- PacketSavingConnection* server_conn = |
- new PacketSavingConnection(Perspective::IS_SERVER); |
- 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()); |
+ InitializeFakeClient(/* supports_stateless_rejects= */ false); |
// 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()); |
+ AdvanceHandshakeWithFakeClient(); |
// Now do another handshake, hopefully in 0-RTT. |
- LOG(INFO) << "Resetting for 0-RTT handshake attempt"; |
- |
- client_conn = new PacketSavingConnection(Perspective::IS_CLIENT); |
- server_conn = new PacketSavingConnection(Perspective::IS_SERVER); |
- // 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(); |
+ DVLOG(1) << "Resetting for 0-RTT handshake attempt"; |
+ InitializeFakeClient(/* supports_stateless_rejects= */ false); |
+ InitializeServer(); |
+ |
+ client_stream_->CryptoConnect(); |
if (AsyncStrikeRegisterVerification()) { |
- EXPECT_FALSE(client->handshake_confirmed()); |
- EXPECT_FALSE(server->handshake_confirmed()); |
+ EXPECT_FALSE(client_stream_->handshake_confirmed()); |
+ EXPECT_FALSE(server_stream_->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); |
+ client_connection_, client_stream_.get(), 0, server_connection_, |
+ server_stream_.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()); |
+ EXPECT_FALSE(client_stream_->handshake_confirmed()); |
+ EXPECT_FALSE(server_stream_->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()); |
+ EXPECT_FALSE(client_stream_->handshake_confirmed()); |
+ EXPECT_TRUE(server_stream_->handshake_confirmed()); |
messages_moved = CryptoTestUtils::AdvanceHandshake( |
- client_conn, client.get(), messages_moved.first, |
- server_conn, server.get(), messages_moved.second); |
+ client_connection_, client_stream_.get(), messages_moved.first, |
+ server_connection_, server_stream_.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()); |
+ EXPECT_TRUE(client_stream_->handshake_confirmed()); |
+ EXPECT_TRUE(server_stream_->handshake_confirmed()); |
} else { |
CryptoTestUtils::CommunicateHandshakeMessages( |
- client_conn, client.get(), server_conn, server.get()); |
+ client_connection_, client_stream_.get(), server_connection_, |
+ server_stream_.get()); |
} |
- EXPECT_EQ(1, client->num_sent_client_hellos()); |
+ EXPECT_EQ(1, client_stream_->num_sent_client_hellos()); |
} |
TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) { |
CompleteCryptoHandshake(); |
- EXPECT_CALL(*connection_, SendConnectionClose( |
- QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE)); |
+ EXPECT_CALL( |
+ *server_connection_, |
+ SendConnectionClose(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE)); |
message_.set_tag(kCHLO); |
ConstructHandshakeMessage(); |
- stream_.ProcessRawData(message_data_->data(), message_data_->length()); |
+ server_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()); |
+ EXPECT_CALL(*server_connection_, |
+ SendConnectionClose(QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); |
+ server_stream_->ProcessRawData(message_data_->data(), |
+ message_data_->length()); |
} |
TEST_P(QuicCryptoServerStreamTest, WithoutCertificates) { |
- crypto_config_.SetProofSource(nullptr); |
+ server_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()); |
+ EXPECT_TRUE(server_stream_->encryption_established()); |
+ EXPECT_TRUE(server_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. |
+ // server_stream_->crypto_negotiated_params().channel_id is correct. |
EXPECT_EQ(2, CompleteCryptoHandshake()); |
- EXPECT_TRUE(stream_.encryption_established()); |
- EXPECT_TRUE(stream_.handshake_confirmed()); |
+ EXPECT_TRUE(server_stream_->encryption_established()); |
+ EXPECT_TRUE(server_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. |
+ // server_stream_->crypto_negotiated_params().channel_id is correct. |
EXPECT_EQ(2, CompleteCryptoHandshake()); |
- EXPECT_TRUE(stream_.encryption_established()); |
- EXPECT_TRUE(stream_.handshake_confirmed()); |
+ EXPECT_TRUE(server_stream_->encryption_established()); |
+ EXPECT_TRUE(server_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()); |
+ server_stream_->SendServerConfigUpdate(nullptr); |
+ EXPECT_EQ(0, server_stream_->num_server_config_update_messages_sent()); |
+} |
+ |
+TEST_P(QuicCryptoServerStreamTest, DoesPeerSupportStatelessRejects) { |
+ ConstructHandshakeMessage(); |
+ QuicConfig stateless_reject_config = DefaultQuicConfigStatelessRejects(); |
+ stateless_reject_config.ToHandshakeMessage(&message_); |
+ EXPECT_TRUE( |
+ QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
+ |
+ message_.Clear(); |
+ QuicConfig stateful_reject_config = DefaultQuicConfig(); |
+ stateful_reject_config.ToHandshakeMessage(&message_); |
+ EXPECT_FALSE( |
+ QuicCryptoServerStreamPeer::DoesPeerSupportStatelessRejects(message_)); |
} |
} // namespace |