blob: 06fd56098cc7da1ca085678758009266096ed058 [file] [log] [blame] [edit]
// Copyright 2025 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/moqt/tools/moqt_server.h"
#include <utility>
#include "absl/base/nullability.h"
#include "absl/memory/memory.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "quiche/quic/core/http/web_transport_only_server_session.h"
#include "quiche/quic/core/quic_alarm.h"
#include "quiche/quic/core/quic_time.h"
#include "quiche/quic/moqt/moqt_session.h"
#include "quiche/quic/moqt/test_tools/moqt_session_peer.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/crypto_test_utils.h"
#include "quiche/quic/tools/web_transport_only_backend.h"
#include "quiche/common/http/http_header_block.h"
#include "quiche/common/quiche_ip_address.h"
#include "quiche/common/test_tools/quiche_test_utils.h"
#include "quiche/web_transport/test_tools/mock_web_transport.h"
#include "quiche/web_transport/web_transport.h"
namespace moqt::test {
class MoqtServerPeer {
public:
static absl::StatusOr<quic::WebTransportConnectResponse> CallHandlerFactory(
MoqtServer& server, webtransport::Session* session,
const quic::WebTransportIncomingRequestDetails& details) {
return server.dispatcher_.parameters().handler_factory(session, details);
}
};
class MockAlarmDelegate : public quic::QuicAlarm::DelegateWithoutContext {
public:
MOCK_METHOD(void, OnAlarm, (), (override));
};
class MoqtServerTest : public quic::test::QuicTest {
public:
MoqtServerTest()
: server_(quic::test::crypto_test_utils::ProofSourceForTesting(),
[&](absl::string_view /*path*/) {
return [&](MoqtSession* session) { session_ = session; };
}) {
quiche::QuicheIpAddress bind_address;
bind_address.FromString("127.0.0.1");
// This will create an event loop that makes alarm factories.
QUICHE_EXPECT_OK(server_.CreateUDPSocketAndListen(
quic::QuicSocketAddress(bind_address, 0)));
}
MoqtServer server_;
MoqtSession* session_ = nullptr;
webtransport::test::MockSession mock_session_;
};
// Test that new sessions are correctly populated with an alarm factory.
TEST_F(MoqtServerTest, NewSessionHasAlarmFactory) {
quiche::HttpHeaderBlock headers;
headers.AppendValueOrAddHeader(":path", "/foo");
absl::StatusOr<quic::WebTransportConnectResponse> response =
MoqtServerPeer::CallHandlerFactory(
server_, &mock_session_,
quic::WebTransportIncomingRequestDetails{.headers =
std::move(headers)});
QUICHE_EXPECT_OK(response.status());
ASSERT_NE(session_, nullptr);
ASSERT_NE(MoqtSessionPeer::GetAlarmFactory(session_), nullptr);
auto delegate = new MockAlarmDelegate();
auto alarm = absl::WrapUnique(
MoqtSessionPeer::GetAlarmFactory(session_)->CreateAlarm(delegate));
alarm->Set(quic::QuicTime::Infinite());
EXPECT_TRUE(alarm->IsSet());
}
} // namespace moqt::test