Prepare crypto stream tests for reordering versions
This CL paves the way for having TLS before QUIC_CRYPTO.
gfe-relnote: n/a, test-only
PiperOrigin-RevId: 298385523
Change-Id: I9e94e2d4662586b62c35cfd77ec68761eee50d61
diff --git a/quic/core/quic_crypto_client_stream_test.cc b/quic/core/quic_crypto_client_stream_test.cc
index 0cfdbe9..bcd6a1f 100644
--- a/quic/core/quic_crypto_client_stream_test.cc
+++ b/quic/core/quic_crypto_client_stream_test.cc
@@ -46,13 +46,7 @@
CreateConnection();
}
- void CreateConnection() {
- connection_ =
- new PacketSavingConnection(&client_helper_, &alarm_factory_,
- Perspective::IS_CLIENT, supported_versions_);
- // Advance the time, because timers do not like uninitialized times.
- connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
-
+ void CreateSession() {
session_ = std::make_unique<TestQuicSpdyClientSession>(
connection_, DefaultQuicConfig(), supported_versions_, server_id_,
&crypto_config_);
@@ -61,6 +55,15 @@
{AlpnForVersion(connection_->version())})));
}
+ void CreateConnection() {
+ connection_ =
+ new PacketSavingConnection(&client_helper_, &alarm_factory_,
+ Perspective::IS_CLIENT, supported_versions_);
+ // Advance the time, because timers do not like uninitialized times.
+ connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
+ CreateSession();
+ }
+
void UseTlsHandshake() {
supported_versions_.clear();
for (ParsedQuicVersion version : AllSupportedVersions()) {
@@ -71,6 +74,16 @@
}
}
+ void UseQuicCryptoHandshake() {
+ supported_versions_.clear();
+ for (ParsedQuicVersion version : AllSupportedVersions()) {
+ if (version.handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
+ continue;
+ }
+ supported_versions_.push_back(version);
+ }
+ }
+
void CompleteCryptoHandshake() {
int proof_verify_details_calls = 1;
if (stream()->handshake_protocol() != PROTOCOL_TLS1_3) {
@@ -165,6 +178,8 @@
}
TEST_F(QuicCryptoClientStreamTest, MessageAfterHandshake) {
+ UseQuicCryptoHandshake();
+ CreateConnection();
CompleteCryptoHandshake();
EXPECT_CALL(
@@ -176,6 +191,8 @@
}
TEST_F(QuicCryptoClientStreamTest, BadMessageType) {
+ UseQuicCryptoHandshake();
+ CreateConnection();
stream()->CryptoConnect();
message_.set_tag(kCHLO);
@@ -187,6 +204,8 @@
}
TEST_F(QuicCryptoClientStreamTest, NegotiatedParameters) {
+ UseQuicCryptoHandshake();
+ CreateConnection();
CompleteCryptoHandshake();
const QuicConfig* config = session_->config();
@@ -199,6 +218,8 @@
}
TEST_F(QuicCryptoClientStreamTest, ExpiredServerConfig) {
+ UseQuicCryptoHandshake();
+ CreateConnection();
// Seed the config with a cached server config.
CompleteCryptoHandshake();
@@ -257,6 +278,8 @@
TEST_F(QuicCryptoClientStreamTest, ServerConfigUpdate) {
// Test that the crypto client stream can receive server config updates after
// the connection has been established.
+ UseQuicCryptoHandshake();
+ CreateConnection();
CompleteCryptoHandshake();
QuicCryptoClientConfig::CachedState* state =
@@ -308,6 +331,8 @@
TEST_F(QuicCryptoClientStreamTest, ServerConfigUpdateWithCert) {
// Test that the crypto client stream can receive and use server config
// updates with certificates after the connection has been established.
+ UseQuicCryptoHandshake();
+ CreateConnection();
CompleteCryptoHandshake();
// Build a server config update message with certificates
@@ -363,6 +388,8 @@
}
TEST_F(QuicCryptoClientStreamTest, ServerConfigUpdateBeforeHandshake) {
+ UseQuicCryptoHandshake();
+ CreateConnection();
EXPECT_CALL(
*connection_,
CloseConnection(QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE, _, _));
@@ -375,14 +402,13 @@
TEST_F(QuicCryptoClientStreamTest, PreferredVersion) {
// This mimics the case where client receives version negotiation packet, such
// that, the preferred version is different from the packets' version.
+ UseQuicCryptoHandshake();
connection_ = new PacketSavingConnection(
&client_helper_, &alarm_factory_, Perspective::IS_CLIENT,
ParsedVersionOfIndex(supported_versions_, 1));
connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
- session_ = std::make_unique<TestQuicSpdyClientSession>(
- connection_, DefaultQuicConfig(), supported_versions_, server_id_,
- &crypto_config_);
+ CreateSession();
CompleteCryptoHandshake();
// 2 CHLOs are sent.
ASSERT_EQ(2u, session_->sent_crypto_handshake_messages().size());
diff --git a/quic/core/quic_crypto_server_stream_test.cc b/quic/core/quic_crypto_server_stream_test.cc
index 86ad6df..60882b8 100644
--- a/quic/core/quic_crypto_server_stream_test.cc
+++ b/quic/core/quic_crypto_server_stream_test.cc
@@ -152,6 +152,28 @@
server_connection_, server_stream(), 0);
}
+ void UseTlsHandshake() {
+ client_options_.only_tls_versions = true;
+ supported_versions_.clear();
+ for (ParsedQuicVersion version : AllSupportedVersions()) {
+ if (version.handshake_protocol != PROTOCOL_TLS1_3) {
+ continue;
+ }
+ supported_versions_.push_back(version);
+ }
+ }
+
+ void UseQuicCryptoHandshake() {
+ client_options_.only_quic_crypto_versions = true;
+ supported_versions_.clear();
+ for (ParsedQuicVersion version : AllSupportedVersions()) {
+ if (version.handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
+ continue;
+ }
+ supported_versions_.push_back(version);
+ }
+ }
+
protected:
// Every connection gets its own MockQuicConnectionHelper and
// MockAlarmFactory, tracked separately from the server and client state so
@@ -194,6 +216,7 @@
// test should send:
// * One to get a source-address token and certificates.
// * One to complete the handshake.
+ UseQuicCryptoHandshake();
Initialize();
EXPECT_EQ(2, CompleteCryptoHandshake());
EXPECT_TRUE(server_stream()->encryption_established());
@@ -201,14 +224,7 @@
}
TEST_P(QuicCryptoServerStreamTest, ConnectedAfterTlsHandshake) {
- client_options_.only_tls_versions = true;
- supported_versions_.clear();
- for (ParsedQuicVersion version : AllSupportedVersions()) {
- if (version.handshake_protocol != PROTOCOL_TLS1_3) {
- continue;
- }
- supported_versions_.push_back(version);
- }
+ UseTlsHandshake();
Initialize();
CompleteCryptoHandshake();
EXPECT_EQ(PROTOCOL_TLS1_3, server_stream()->handshake_protocol());
@@ -217,6 +233,7 @@
}
TEST_P(QuicCryptoServerStreamTest, ForwardSecureAfterCHLO) {
+ UseQuicCryptoHandshake();
Initialize();
InitializeFakeClient();
@@ -238,6 +255,7 @@
}
TEST_P(QuicCryptoServerStreamTest, ZeroRTT) {
+ UseQuicCryptoHandshake();
Initialize();
InitializeFakeClient();
@@ -269,6 +287,7 @@
}
TEST_P(QuicCryptoServerStreamTest, FailByPolicy) {
+ UseQuicCryptoHandshake();
Initialize();
InitializeFakeClient();
@@ -281,6 +300,7 @@
}
TEST_P(QuicCryptoServerStreamTest, MessageAfterHandshake) {
+ UseQuicCryptoHandshake();
Initialize();
CompleteCryptoHandshake();
EXPECT_CALL(
@@ -292,6 +312,7 @@
}
TEST_P(QuicCryptoServerStreamTest, BadMessageType) {
+ UseQuicCryptoHandshake();
Initialize();
message_.set_tag(kSHLO);
@@ -310,6 +331,7 @@
}
TEST_P(QuicCryptoServerStreamTest, SendSCUPAfterHandshakeComplete) {
+ UseQuicCryptoHandshake();
Initialize();
InitializeFakeClient();
@@ -347,6 +369,7 @@
::testing::PrintToStringParamName());
TEST_P(QuicCryptoServerStreamTestWithFailingProofSource, Test) {
+ UseQuicCryptoHandshake();
Initialize();
InitializeFakeClient();
@@ -385,6 +408,7 @@
// connection in close succession could cause a crash, especially when the use
// of Mentat signing meant that it took a while for each CHLO to be processed.
TEST_P(QuicCryptoServerStreamTestWithFakeProofSource, MultipleChlo) {
+ UseQuicCryptoHandshake();
Initialize();
GetFakeProofSource()->Activate();
EXPECT_CALL(*server_session_->helper(), CanAcceptClientHello(_, _, _, _, _))
diff --git a/quic/test_tools/crypto_test_utils.cc b/quic/test_tools/crypto_test_utils.cc
index 1379944..9537ec7 100644
--- a/quic/test_tools/crypto_test_utils.cc
+++ b/quic/test_tools/crypto_test_utils.cc
@@ -280,6 +280,15 @@
}
supported_versions.push_back(version);
}
+ CHECK(!options.only_quic_crypto_versions);
+ } else if (options.only_quic_crypto_versions) {
+ supported_versions.clear();
+ for (ParsedQuicVersion version : AllSupportedVersions()) {
+ if (version.handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
+ continue;
+ }
+ supported_versions.push_back(version);
+ }
}
PacketSavingConnection* client_conn = new PacketSavingConnection(
helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);
diff --git a/quic/test_tools/crypto_test_utils.h b/quic/test_tools/crypto_test_utils.h
index d80210a..3d58837 100644
--- a/quic/test_tools/crypto_test_utils.h
+++ b/quic/test_tools/crypto_test_utils.h
@@ -62,6 +62,10 @@
// If only_tls_versions is set, then the client will only use TLS for the
// crypto handshake.
bool only_tls_versions = false;
+
+ // If only_quic_crypto_versions is set, then the client will only use
+ // PROTOCOL_QUIC_CRYPTO for the crypto handshake.
+ bool only_quic_crypto_versions = false;
};
// Returns a QuicCryptoServerConfig that is in a reasonable configuration to