| Index: net/quic/quic_crypto_client_stream_test.cc
|
| diff --git a/net/quic/quic_crypto_client_stream_test.cc b/net/quic/quic_crypto_client_stream_test.cc
|
| index 417652d096a86684052a6d69e97f375f7f1a5a9d..de3d68e251dfce50fa1ab554b689cf01e813752f 100644
|
| --- a/net/quic/quic_crypto_client_stream_test.cc
|
| +++ b/net/quic/quic_crypto_client_stream_test.cc
|
| @@ -200,6 +200,92 @@ TEST_F(QuicCryptoClientStreamTest, ServerConfigUpdateBeforeHandshake) {
|
| stream_->ProcessRawData(data->data(), data->length());
|
| }
|
|
|
| +class QuicCryptoClientStreamStatelessTest : public ::testing::Test {
|
| + public:
|
| + QuicCryptoClientStreamStatelessTest()
|
| + : server_crypto_config_(QuicCryptoServerConfig::TESTING,
|
| + QuicRandom::GetInstance()),
|
| + server_id_(kServerHostname, kServerPort, false, PRIVACY_MODE_DISABLED) {
|
| + TestClientSession* client_session = nullptr;
|
| + QuicCryptoClientStream* client_stream = nullptr;
|
| + SetupCryptoClientStreamForTest(server_id_,
|
| + /* supports_stateless_rejects= */ true,
|
| + 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);
|
| + }
|
| +
|
| + void AdvanceHandshakeWithFakeServer() {
|
| + client_stream_->CryptoConnect();
|
| + CryptoTestUtils::AdvanceHandshake(client_connection_, client_stream_.get(),
|
| + 0, server_connection_,
|
| + server_stream_.get(), 0);
|
| + }
|
| +
|
| + // Initializes the server_stream_ for stateless rejects.
|
| + void InitializeFakeStatelessRejectServer() {
|
| + 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_);
|
| + server_stream_->set_use_stateless_rejects_if_peer_supported(true);
|
| + }
|
| +
|
| + // Client crypto stream state
|
| + PacketSavingConnection* client_connection_;
|
| + scoped_ptr<TestClientSession> client_session_;
|
| + scoped_ptr<QuicCryptoClientStream> client_stream_;
|
| + QuicCryptoClientConfig client_crypto_config_;
|
| +
|
| + // Server crypto stream state
|
| + PacketSavingConnection* server_connection_;
|
| + scoped_ptr<TestServerSession> server_session_;
|
| + QuicCryptoServerConfig server_crypto_config_;
|
| + scoped_ptr<QuicCryptoServerStream> server_stream_;
|
| + QuicServerId server_id_;
|
| +};
|
| +
|
| +TEST_F(QuicCryptoClientStreamStatelessTest, StatelessReject) {
|
| + ValueRestore<bool> old_flag(&FLAGS_enable_quic_stateless_reject_support,
|
| + true);
|
| +
|
| + QuicCryptoClientConfig::CachedState* client_state =
|
| + client_crypto_config_.LookupOrCreate(server_id_);
|
| +
|
| + EXPECT_FALSE(client_state->has_server_designated_connection_id());
|
| + EXPECT_CALL(*client_session_, OnProofValid(testing::_));
|
| +
|
| + InitializeFakeStatelessRejectServer();
|
| + AdvanceHandshakeWithFakeServer();
|
| +
|
| + EXPECT_FALSE(client_stream_->encryption_established());
|
| + EXPECT_FALSE(client_stream_->handshake_confirmed());
|
| + // Even though the handshake was not complete, the cached client_state is
|
| + // complete, and can be used for a subsequent successful handshake.
|
| + EXPECT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
|
| +
|
| + ASSERT_TRUE(client_state->has_server_designated_connection_id());
|
| + QuicConnectionId server_designated_id =
|
| + client_state->GetNextServerDesignatedConnectionId();
|
| + QuicConnectionId expected_id =
|
| + server_session_->connection()->random_generator()->RandUint64();
|
| + EXPECT_EQ(expected_id, server_designated_id);
|
| + EXPECT_FALSE(client_state->has_server_designated_connection_id());
|
| +}
|
| +
|
| } // namespace
|
| } // namespace test
|
| } // namespace net
|
|
|