blob: 3b252524dd900a80552d94d80c7c5362d88ab1e9 [file] [log] [blame]
minyue939df962017-04-19 01:58:38 -07001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "rtc_tools/network_tester/packet_sender.h"
minyue939df962017-04-19 01:58:38 -070012
tschumimd4aebb02017-05-22 00:04:30 -070013#include <algorithm>
minyue939df962017-04-19 01:58:38 -070014#include <string>
15#include <utility>
16
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "rtc_base/timeutils.h"
18#include "rtc_tools/network_tester/config_reader.h"
19#include "rtc_tools/network_tester/test_controller.h"
minyue939df962017-04-19 01:58:38 -070020
21namespace webrtc {
22
23namespace {
24
25class SendPacketTask : public rtc::QueuedTask {
26 public:
27 explicit SendPacketTask(PacketSender* packet_sender)
tschumimd4aebb02017-05-22 00:04:30 -070028 : target_time_ms_(rtc::TimeMillis()), packet_sender_(packet_sender) {}
minyue939df962017-04-19 01:58:38 -070029
30 private:
31 bool Run() override {
32 if (packet_sender_->IsSending()) {
33 packet_sender_->SendPacket();
tschumimd4aebb02017-05-22 00:04:30 -070034 target_time_ms_ += packet_sender_->GetSendIntervalMs();
35 int64_t delay_ms = std::max(static_cast<int64_t>(0),
36 target_time_ms_ - rtc::TimeMillis());
minyue939df962017-04-19 01:58:38 -070037 rtc::TaskQueue::Current()->PostDelayedTask(
tschumimd4aebb02017-05-22 00:04:30 -070038 std::unique_ptr<QueuedTask>(this), delay_ms);
minyue939df962017-04-19 01:58:38 -070039 return false;
40 } else {
41 return true;
42 }
43 }
tschumimd4aebb02017-05-22 00:04:30 -070044 int64_t target_time_ms_;
minyue939df962017-04-19 01:58:38 -070045 PacketSender* const packet_sender_;
46};
47
48class UpdateTestSettingTask : public rtc::QueuedTask {
49 public:
50 UpdateTestSettingTask(PacketSender* packet_sender,
51 std::unique_ptr<ConfigReader> config_reader)
52 : packet_sender_(packet_sender),
53 config_reader_(std::move(config_reader)) {}
54
55 private:
56 bool Run() override {
57 auto config = config_reader_->GetNextConfig();
58 if (config) {
59 packet_sender_->UpdateTestSetting((*config).packet_size,
60 (*config).packet_send_interval_ms);
61 rtc::TaskQueue::Current()->PostDelayedTask(
62 std::unique_ptr<QueuedTask>(this), (*config).execution_time_ms);
63 return false;
64 } else {
65 packet_sender_->StopSending();
66 return true;
67 }
68 }
69 PacketSender* const packet_sender_;
70 const std::unique_ptr<ConfigReader> config_reader_;
71};
72
73} // namespace
74
75PacketSender::PacketSender(TestController* test_controller,
76 const std::string& config_file_path)
77 : packet_size_(0),
78 send_interval_ms_(0),
79 sequence_number_(0),
80 sending_(false),
81 config_file_path_(config_file_path),
82 test_controller_(test_controller),
83 worker_queue_("Packet Sender", rtc::TaskQueue::Priority::HIGH) {}
84
85PacketSender::~PacketSender() = default;
86
87void PacketSender::StartSending() {
88 worker_queue_checker_.Detach();
89 worker_queue_.PostTask([this]() {
90 RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
91 sending_ = true;
92 });
93 worker_queue_.PostTask(
94 std::unique_ptr<rtc::QueuedTask>(new UpdateTestSettingTask(
95 this,
96 std::unique_ptr<ConfigReader>(new ConfigReader(config_file_path_)))));
97 worker_queue_.PostTask(
98 std::unique_ptr<rtc::QueuedTask>(new SendPacketTask(this)));
99}
100
101void PacketSender::StopSending() {
102 RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
103 sending_ = false;
104 test_controller_->OnTestDone();
105}
106
107bool PacketSender::IsSending() const {
108 RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
109 return sending_;
110}
111
112void PacketSender::SendPacket() {
113 RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
114 NetworkTesterPacket packet;
115 packet.set_type(NetworkTesterPacket::TEST_DATA);
116 packet.set_sequence_number(sequence_number_++);
117 packet.set_send_timestamp(rtc::TimeMicros());
118 test_controller_->SendData(packet, rtc::Optional<size_t>(packet_size_));
119}
120
121int64_t PacketSender::GetSendIntervalMs() const {
122 RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
123 return send_interval_ms_;
124}
125
126void PacketSender::UpdateTestSetting(size_t packet_size,
127 int64_t send_interval_ms) {
128 RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
129 send_interval_ms_ = send_interval_ms;
130 packet_size_ = packet_size;
131}
132
133} // namespace webrtc