blob: a49823f4e49e778167c11d6e2339a99bc7cf7be5 [file] [edit]
// Copyright 2026 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 "quiche/quic/tools/quic_simple_client_session.h"
#include <memory>
#include "quiche/quic/core/crypto/quic_crypto_client_config.h"
#include "quiche/quic/core/http/quic_header_list.h"
#include "quiche/quic/core/quic_connection.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_versions.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/crypto_test_utils.h"
#include "quiche/quic/test_tools/quic_session_peer.h"
#include "quiche/quic/test_tools/quic_test_utils.h"
#include "quiche/common/http/http_header_block.h"
namespace quic {
namespace test {
namespace {
class QuicSimpleClientSessionTest
: public QuicTestWithParam<ParsedQuicVersion> {
public:
QuicSimpleClientSessionTest()
: helper_(),
connection_(new ::testing::NiceMock<MockQuicConnection>(
&helper_, &alarm_factory_, Perspective::IS_CLIENT,
SupportedVersions(GetParam()))),
crypto_config_(std::make_unique<QuicCryptoClientConfig>(
crypto_test_utils::ProofVerifierForTesting())),
session_(QuicConfig(), SupportedVersions(GetParam()), connection_,
/*network_helper=*/nullptr, QuicServerId("example.com", 443),
crypto_config_.get(),
/*drop_response_body=*/false,
/*enable_web_transport=*/false) {
session_.Initialize();
if (VersionIsIetfQuic(connection_->transport_version())) {
QuicSessionPeer::SetMaxOpenOutgoingBidirectionalStreams(&session_, 100);
} else {
QuicSessionPeer::SetMaxOpenOutgoingStreams(&session_, 100);
}
}
~QuicSimpleClientSessionTest() override = default;
MockQuicConnectionHelper helper_;
MockAlarmFactory alarm_factory_;
MockQuicConnection* connection_; // Owned by session_
std::unique_ptr<QuicCryptoClientConfig> crypto_config_;
QuicSimpleClientSession session_;
};
INSTANTIATE_TEST_SUITE_P(
Tests, QuicSimpleClientSessionTest,
::testing::ValuesIn(CurrentSupportedVersionsForClients()),
::testing::PrintToStringParamName());
TEST_P(QuicSimpleClientSessionTest, OnInterimHeaders) {
auto stream = session_.CreateClientStream();
quiche::HttpHeaderBlock headers;
headers[":status"] = "103";
QuicHeaderList header_list = AsHeaderList(headers);
bool callback_called = false;
session_.set_on_interim_headers(
[&callback_called](const quiche::HttpHeaderBlock& h) {
callback_called = true;
auto it = h.find(":status");
EXPECT_NE(it, h.end());
if (it != h.end()) {
EXPECT_EQ(it->second, "103");
}
});
stream->OnStreamHeaderList(/*fin=*/false, 0, header_list);
EXPECT_TRUE(callback_called);
}
TEST_P(QuicSimpleClientSessionTest, OnInterimHeadersWithoutCallback) {
auto stream = session_.CreateClientStream();
quiche::HttpHeaderBlock headers;
headers[":status"] = "103";
QuicHeaderList header_list = AsHeaderList(headers);
// Deliver headers to stream. This should parse status 103, add a preliminary
// header block, and try to invoke session's interim headers callback.
// This should not crash even if no callback is registered.
stream->OnStreamHeaderList(/*fin=*/false, 0, header_list);
}
} // namespace
} // namespace test
} // namespace quic