blob: 04c887da7ec3253e87915688aa98d81f62449afe [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.
#ifndef COMPONENTS_MIRRORING_SERVICE_FAKE_NETWORK_SERVICE_H_
#define COMPONENTS_MIRRORING_SERVICE_FAKE_NETWORK_SERVICE_H_
#include "base/functional/callback.h"
#include "media/cast/common/packet.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/base/ip_endpoint.h"
#include "services/network/public/mojom/udp_socket.mojom.h"
#include "services/network/test/test_network_context.h"
#include "services/network/test/test_udp_socket.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mirroring {
// Determine a unused UDP port.
// Method: Bind a UDP socket on port 0, and then check which port the
// operating system assigned to it.
net::IPEndPoint GetFreeLocalPort();
class MockUdpSocket final : public network::TestUDPSocket {
public:
MockUdpSocket(
mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
mojo::PendingRemote<network::mojom::UDPSocketListener> listener);
MockUdpSocket(const MockUdpSocket&) = delete;
MockUdpSocket& operator=(const MockUdpSocket&) = delete;
~MockUdpSocket() override;
MOCK_METHOD0(OnSend, void());
MOCK_METHOD0(OnSendTo, void());
// network::mojom::UDPSocket implementation.
void Bind(const net::IPEndPoint& local_addr,
network::mojom::UDPSocketOptionsPtr options,
BindCallback callback) override;
void Connect(const net::IPEndPoint& remote_addr,
network::mojom::UDPSocketOptionsPtr options,
ConnectCallback callback) override;
void ReceiveMore(uint32_t num_additional_datagrams) override;
void SendTo(const net::IPEndPoint& dest_addr,
base::span<const uint8_t> data,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
SendToCallback callback) override;
void Send(base::span<const uint8_t> data,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
SendCallback callback) override;
// Simulate receiving a packet from the network.
void OnReceivedPacket(const media::cast::Packet& packet);
void VerifySendingPacket(const media::cast::Packet& packet);
private:
mojo::Receiver<network::mojom::UDPSocket> receiver_;
mojo::Remote<network::mojom::UDPSocketListener> listener_;
std::unique_ptr<media::cast::Packet> sending_packet_;
int num_ask_for_receive_ = 0;
};
class MockNetworkContext : public network::TestNetworkContext {
public:
explicit MockNetworkContext(
mojo::PendingReceiver<network::mojom::NetworkContext> receiver);
MockNetworkContext(const MockNetworkContext&) = delete;
MockNetworkContext& operator=(const MockNetworkContext&) = delete;
~MockNetworkContext() override;
MOCK_METHOD0(OnUDPSocketCreated, void());
// network::mojom::NetworkContext implementation:
void CreateUDPSocket(
mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
mojo::PendingRemote<network::mojom::UDPSocketListener> listener) override;
void CreateURLLoaderFactory(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
network::mojom::URLLoaderFactoryParamsPtr params) override;
MockUdpSocket* udp_socket() const { return udp_socket_.get(); }
private:
mojo::Receiver<network::mojom::NetworkContext> receiver_;
std::unique_ptr<MockUdpSocket> udp_socket_;
};
} // namespace mirroring
#endif // COMPONENTS_MIRRORING_SERVICE_FAKE_NETWORK_SERVICE_H_