1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
// 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 {
FakeQuicBridge::FakeQuicBridge(platform::FakeTaskRunner* task_runner,
platform::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<platform::MockUdpSocket>(
task_runner_, fake_client_factory.get());
// TODO(rwkeane): Pass actual task runner instead of nullptr once the fake
// task runner correctly respects the time delay for delayed tasks.
quic_client = std::make_unique<QuicClient>(controller_demuxer.get(),
std::move(fake_client_factory),
&mock_client_observer, nullptr);
auto fake_server_factory =
std::make_unique<FakeServerQuicConnectionFactory>(fake_bridge.get());
server_socket_ = std::make_unique<platform::MockUdpSocket>(
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, nullptr);
quic_client->Start();
quic_server->Start();
}
FakeQuicBridge::~FakeQuicBridge() = default;
void FakeQuicBridge::PostClientPacket() {
platform::UdpPacket packet;
packet.set_socket(client_socket_.get());
client_socket_->MockReceivePacket(std::move(packet));
}
void FakeQuicBridge::PostServerPacket() {
platform::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 openscreen
|