blob: 2ca327139f140b5208c6b8d823de30350af051f4 [file] [log] [blame]
// Copyright 2019 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 "osp/impl/quic/testing/quic_test_support.h"
#include <memory>
#include "osp/impl/quic/quic_client.h"
#include "osp/impl/quic/quic_server.h"
#include "osp/public/network_service_manager.h"
#include "platform/test/fake_task_runner.h"
namespace openscreen {
namespace osp {
FakeQuicBridge::FakeQuicBridge(FakeTaskRunner* task_runner,
ClockNowFunctionPtr now_function)
: task_runner_(task_runner) {
fake_bridge =
std::make_unique<FakeQuicConnectionFactoryBridge>(kControllerEndpoint);
controller_demuxer = std::make_unique<MessageDemuxer>(
now_function, MessageDemuxer::kDefaultBufferLimit);
receiver_demuxer = std::make_unique<MessageDemuxer>(
now_function, MessageDemuxer::kDefaultBufferLimit);
auto fake_client_factory =
std::make_unique<FakeClientQuicConnectionFactory>(fake_bridge.get());
client_socket_ =
std::make_unique<FakeUdpSocket>(task_runner_, fake_client_factory.get());
quic_client = std::make_unique<QuicClient>(
controller_demuxer.get(), std::move(fake_client_factory),
&mock_client_observer, now_function, task_runner);
auto fake_server_factory =
std::make_unique<FakeServerQuicConnectionFactory>(fake_bridge.get());
server_socket_ =
std::make_unique<FakeUdpSocket>(task_runner_, fake_server_factory.get());
ServerConfig config;
config.connection_endpoints.push_back(kReceiverEndpoint);
quic_server = std::make_unique<QuicServer>(
config, receiver_demuxer.get(), std::move(fake_server_factory),
&mock_server_observer, now_function, task_runner);
quic_client->Start();
quic_server->Start();
}
FakeQuicBridge::~FakeQuicBridge() = default;
void FakeQuicBridge::PostClientPacket() {
UdpPacket packet;
packet.set_socket(client_socket_.get());
client_socket_->MockReceivePacket(std::move(packet));
}
void FakeQuicBridge::PostServerPacket() {
UdpPacket packet;
packet.set_socket(server_socket_.get());
server_socket_->MockReceivePacket(std::move(packet));
}
void FakeQuicBridge::PostPacketsUntilIdle() {
bool client_idle = fake_bridge->client_idle();
bool server_idle = fake_bridge->server_idle();
if (!client_idle || !server_idle) {
PostClientPacket();
PostServerPacket();
task_runner_->PostTask([this]() { this->PostPacketsUntilIdle(); });
}
}
void FakeQuicBridge::RunTasksUntilIdle() {
PostClientPacket();
PostServerPacket();
task_runner_->PostTask(
std::bind(&FakeQuicBridge::PostPacketsUntilIdle, this));
task_runner_->RunTasksUntilIdle();
}
} // namespace osp
} // namespace openscreen