This is a useful tool to use for unittests of code that uses TransportFeedback as input. Bug: webrtc:10498 Change-Id: I171b22841eb9e16a5d5b785ff45ae9df5a6ccd7f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/137423 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Jonas Olsson <jonasolsson@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27975}
100 lines
3.5 KiB
C++
100 lines
3.5 KiB
C++
/*
|
|
* Copyright 2019 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
#include "test/scenario/network/feedback_generator.h"
|
|
|
|
#include "absl/memory/memory.h"
|
|
#include "rtc_base/checks.h"
|
|
|
|
namespace webrtc {
|
|
|
|
FeedbackGeneratorImpl::FeedbackGeneratorImpl(
|
|
FeedbackGeneratorImpl::Config config)
|
|
: conf_(config),
|
|
time_controller_{Timestamp::seconds(100000)},
|
|
net_{&time_controller_},
|
|
send_link_{new SimulatedNetwork(conf_.send_link)},
|
|
ret_link_{new SimulatedNetwork(conf_.return_link)},
|
|
send_ep_{net_.CreateEndpoint(EmulatedEndpointConfig())},
|
|
ret_ep_{net_.CreateEndpoint(EmulatedEndpointConfig())},
|
|
send_route_{net_.CreateRoute(
|
|
send_ep_,
|
|
{net_.CreateEmulatedNode(absl::WrapUnique(send_link_))},
|
|
ret_ep_)},
|
|
ret_route_{net_.CreateRoute(
|
|
ret_ep_,
|
|
{net_.CreateEmulatedNode(absl::WrapUnique(ret_link_))},
|
|
send_ep_)},
|
|
send_addr_{rtc::SocketAddress(send_ep_->GetPeerLocalAddress(), 0)},
|
|
ret_addr_{rtc::SocketAddress(ret_ep_->GetPeerLocalAddress(), 0)},
|
|
received_packet_handler_{send_route_,
|
|
[&](SentPacket packet, Timestamp arrival_time) {
|
|
OnPacketReceived(std::move(packet),
|
|
arrival_time);
|
|
}},
|
|
received_feedback_handler_{
|
|
ret_route_,
|
|
[&](TransportPacketsFeedback packet, Timestamp arrival_time) {
|
|
packet.feedback_time = arrival_time;
|
|
feedback_.push_back(packet);
|
|
}} {}
|
|
|
|
Timestamp FeedbackGeneratorImpl::Now() {
|
|
return Timestamp::ms(time_controller_.GetClock()->TimeInMilliseconds());
|
|
}
|
|
|
|
void FeedbackGeneratorImpl::Sleep(TimeDelta duration) {
|
|
time_controller_.Sleep(duration);
|
|
}
|
|
|
|
void FeedbackGeneratorImpl::SendPacket(size_t size) {
|
|
SentPacket sent;
|
|
sent.send_time = Now();
|
|
sent.size = DataSize::bytes(size);
|
|
received_packet_handler_.SendPacket(send_ep_, size, sent);
|
|
}
|
|
|
|
std::vector<TransportPacketsFeedback> FeedbackGeneratorImpl::PopFeedback() {
|
|
std::vector<TransportPacketsFeedback> ret;
|
|
ret.swap(feedback_);
|
|
return ret;
|
|
}
|
|
|
|
void FeedbackGeneratorImpl::SetSendConfig(BuiltInNetworkBehaviorConfig config) {
|
|
conf_.send_link = config;
|
|
send_link_->SetConfig(conf_.send_link);
|
|
}
|
|
|
|
void FeedbackGeneratorImpl::SetReturnConfig(
|
|
BuiltInNetworkBehaviorConfig config) {
|
|
conf_.return_link = config;
|
|
ret_link_->SetConfig(conf_.return_link);
|
|
}
|
|
|
|
void FeedbackGeneratorImpl::SetSendLinkCapacity(DataRate capacity) {
|
|
conf_.send_link.link_capacity_kbps = capacity.kbps<int>();
|
|
send_link_->SetConfig(conf_.send_link);
|
|
}
|
|
|
|
void FeedbackGeneratorImpl::OnPacketReceived(SentPacket packet,
|
|
Timestamp arrival_time) {
|
|
PacketResult result;
|
|
result.sent_packet = packet;
|
|
result.receive_time = arrival_time;
|
|
builder_.packet_feedbacks.push_back(result);
|
|
Timestamp first_recv = builder_.packet_feedbacks.front().receive_time;
|
|
if (Now() - first_recv > conf_.feedback_interval) {
|
|
received_feedback_handler_.SendPacket(
|
|
ret_ep_, conf_.feedback_packet_size.bytes<size_t>(), builder_);
|
|
builder_ = {};
|
|
}
|
|
}
|
|
|
|
} // namespace webrtc
|