blob: a5ba349e1a57cbce581c0971292a8b79e10f06fd [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/mirroring/service/fake_network_service.h"
#include <algorithm>
#include <memory>
#include "base/compiler_specific.h"
// #include "media/cast/test/utility/net_utility.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "net/base/ip_address.h"
#include "net/base/net_errors.h"
#include "net/log/net_log_source.h"
#include "net/socket/udp_server_socket.h"
#include "services/network/public/mojom/clear_data_filter.mojom.h"
#include "services/network/test/test_url_loader_factory.h"
namespace mirroring {
net::IPEndPoint GetFreeLocalPort() {
std::unique_ptr<net::UDPServerSocket> receive_socket(
new net::UDPServerSocket(nullptr, net::NetLogSource()));
receive_socket->AllowAddressReuse();
CHECK_EQ(net::OK, receive_socket->Listen(
net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0)));
net::IPEndPoint endpoint;
CHECK_EQ(net::OK, receive_socket->GetLocalAddress(&endpoint));
return endpoint;
}
MockUdpSocket::MockUdpSocket(
mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
mojo::PendingRemote<network::mojom::UDPSocketListener> listener)
: receiver_(this, std::move(receiver)), listener_(std::move(listener)) {}
MockUdpSocket::~MockUdpSocket() = default;
void MockUdpSocket::Bind(const net::IPEndPoint& local_addr,
network::mojom::UDPSocketOptionsPtr options,
BindCallback callback) {
std::move(callback).Run(net::OK, GetFreeLocalPort());
}
void MockUdpSocket::Connect(const net::IPEndPoint& remote_addr,
network::mojom::UDPSocketOptionsPtr options,
ConnectCallback callback) {
std::move(callback).Run(net::OK, GetFreeLocalPort());
}
void MockUdpSocket::ReceiveMore(uint32_t num_additional_datagrams) {
num_ask_for_receive_ += num_additional_datagrams;
}
void MockUdpSocket::SendTo(
const net::IPEndPoint& dest_addr,
base::span<const uint8_t> data,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
SendToCallback callback) {
sending_packet_ =
std::make_unique<media::cast::Packet>(data.begin(), data.end());
std::move(callback).Run(net::OK);
OnSendTo();
}
void MockUdpSocket::Send(
base::span<const uint8_t> data,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
SendCallback callback) {
sending_packet_ =
std::make_unique<media::cast::Packet>(data.begin(), data.end());
std::move(callback).Run(net::OK);
OnSend();
}
void MockUdpSocket::OnReceivedPacket(const media::cast::Packet& packet) {
if (num_ask_for_receive_) {
listener_->OnReceived(
net::OK, std::nullopt,
UNSAFE_TODO(base::span<const uint8_t>(
reinterpret_cast<const uint8_t*>(packet.data()), packet.size())));
ASSERT_LT(0, num_ask_for_receive_);
--num_ask_for_receive_;
}
}
void MockUdpSocket::VerifySendingPacket(const media::cast::Packet& packet) {
EXPECT_TRUE(std::ranges::equal(packet, *sending_packet_));
}
MockNetworkContext::MockNetworkContext(
mojo::PendingReceiver<network::mojom::NetworkContext> receiver)
: receiver_(this, std::move(receiver)) {}
MockNetworkContext::~MockNetworkContext() = default;
void MockNetworkContext::CreateUDPSocket(
mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
mojo::PendingRemote<network::mojom::UDPSocketListener> listener) {
udp_socket_ =
std::make_unique<MockUdpSocket>(std::move(receiver), std::move(listener));
OnUDPSocketCreated();
}
void MockNetworkContext::CreateURLLoaderFactory(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
network::mojom::URLLoaderFactoryParamsPtr params) {
ASSERT_TRUE(params);
mojo::MakeSelfOwnedReceiver(std::make_unique<network::TestURLLoaderFactory>(),
std::move(receiver));
}
} // namespace mirroring