// 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 #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(kControllerEndpoint); controller_demuxer = std::make_unique( now_function, MessageDemuxer::kDefaultBufferLimit); receiver_demuxer = std::make_unique( now_function, MessageDemuxer::kDefaultBufferLimit); auto fake_client_factory = std::make_unique(fake_bridge.get()); client_socket_ = std::make_unique(task_runner_, fake_client_factory.get()); quic_client = std::make_unique( controller_demuxer.get(), std::move(fake_client_factory), &mock_client_observer, now_function, task_runner); auto fake_server_factory = std::make_unique(fake_bridge.get()); server_socket_ = std::make_unique(task_runner_, fake_server_factory.get()); ServerConfig config; config.connection_endpoints.push_back(kReceiverEndpoint); quic_server = std::make_unique( 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