blob: 23f1d6014ef813b06afc203deab19415d93eba47 [file] [log] [blame]
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001/*
2 * Copyright (c) 2012 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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/pacing/paced_sender.h"
12
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000013#include <list>
kwiberg22feaa32016-03-17 09:17:43 -070014#include <memory>
philipelccdfcca2017-10-23 12:42:17 +020015#include <string>
Erik Språngb88fd312019-07-15 19:28:31 +020016#include <utility>
17#include <vector>
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000018
Erik Språnge7942432019-06-12 13:30:02 +020019#include "modules/pacing/packet_router.h"
Tommi55dd72c2019-08-29 18:32:31 +020020#include "modules/utility/include/mock/mock_process_thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "system_wrappers/include/clock.h"
philipelccdfcca2017-10-23 12:42:17 +020022#include "system_wrappers/include/field_trial.h"
23#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/gmock.h"
25#include "test/gtest.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000026
Mirko Bonadei6a489f22019-04-09 15:11:12 +020027using ::testing::_;
Mirko Bonadei6a489f22019-04-09 15:11:12 +020028using ::testing::Return;
Tommi55dd72c2019-08-29 18:32:31 +020029using ::testing::SaveArg;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000030
isheriffcc5903e2016-10-04 08:29:38 -070031namespace {
Erik Språng58ee1872019-06-18 16:20:11 +020032constexpr uint32_t kAudioSsrc = 12345;
33constexpr uint32_t kVideoSsrc = 234565;
34constexpr uint32_t kVideoRtxSsrc = 34567;
35constexpr uint32_t kFlexFecSsrc = 45678;
Erik Språng185243b2019-08-19 11:34:57 +020036constexpr size_t kDefaultPacketSize = 234;
isheriffcc5903e2016-10-04 08:29:38 -070037} // namespace
38
Danil Chapovalov74a369c2018-02-14 10:48:49 +000039namespace webrtc {
40namespace test {
41
Erik Språngb88fd312019-07-15 19:28:31 +020042// Mock callback implementing the raw api.
43class MockCallback : public PacketRouter {
44 public:
Erik Språngb88fd312019-07-15 19:28:31 +020045 MOCK_METHOD2(SendPacket,
46 void(std::unique_ptr<RtpPacketToSend> packet,
47 const PacedPacketInfo& cluster_info));
48 MOCK_METHOD1(
49 GeneratePadding,
50 std::vector<std::unique_ptr<RtpPacketToSend>>(size_t target_size_bytes));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000051};
52
Erik Språng74f35e42019-11-14 18:04:49 +010053class PacedSenderTest
54 : public ::testing::TestWithParam<PacingController::ProcessMode> {
55 public:
56 PacedSenderTest() : clock_(0), paced_module_(nullptr) {}
57
58 void SetUp() override {
59 EXPECT_CALL(process_thread_, RegisterModule)
60 .WillOnce(SaveArg<0>(&paced_module_));
61
62 pacer_ = std::make_unique<PacedSender>(&clock_, &callback_, nullptr,
63 nullptr, &process_thread_);
64 EXPECT_CALL(process_thread_, DeRegisterModule(paced_module_)).Times(1);
Erik Språng185243b2019-08-19 11:34:57 +020065 }
66
Erik Språng74f35e42019-11-14 18:04:49 +010067 protected:
68 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketToSend::Type type) {
69 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
70 packet->set_packet_type(type);
71 switch (type) {
72 case RtpPacketToSend::Type::kAudio:
73 packet->SetSsrc(kAudioSsrc);
74 break;
75 case RtpPacketToSend::Type::kVideo:
76 packet->SetSsrc(kVideoSsrc);
77 break;
78 case RtpPacketToSend::Type::kRetransmission:
79 case RtpPacketToSend::Type::kPadding:
80 packet->SetSsrc(kVideoRtxSsrc);
81 break;
82 case RtpPacketToSend::Type::kForwardErrorCorrection:
83 packet->SetSsrc(kFlexFecSsrc);
84 break;
85 }
Erik Språngb88fd312019-07-15 19:28:31 +020086
Erik Språng74f35e42019-11-14 18:04:49 +010087 packet->SetPayloadSize(kDefaultPacketSize);
88 return packet;
89 }
Erik Språngb88fd312019-07-15 19:28:31 +020090
Erik Språng74f35e42019-11-14 18:04:49 +010091 SimulatedClock clock_;
92 MockCallback callback_;
93 MockProcessThread process_thread_;
94 Module* paced_module_;
95 std::unique_ptr<PacedSender> pacer_;
96};
97
98TEST_P(PacedSenderTest, PacesPackets) {
Erik Språng185243b2019-08-19 11:34:57 +020099 // Insert a number of packets, covering one second.
100 static constexpr size_t kPacketsToSend = 42;
Erik Språng74f35e42019-11-14 18:04:49 +0100101 pacer_->SetPacingRates(DataRate::bps(kDefaultPacketSize * 8 * kPacketsToSend),
102 DataRate::Zero());
Erik Språngea55b082019-10-02 14:57:46 +0200103 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språng185243b2019-08-19 11:34:57 +0200104 for (size_t i = 0; i < kPacketsToSend; ++i) {
Erik Språngea55b082019-10-02 14:57:46 +0200105 packets.emplace_back(BuildRtpPacket(RtpPacketToSend::Type::kVideo));
Erik Språng58ee1872019-06-18 16:20:11 +0200106 }
Erik Språng74f35e42019-11-14 18:04:49 +0100107 pacer_->EnqueuePackets(std::move(packets));
Erik Språng58ee1872019-06-18 16:20:11 +0200108
Erik Språng185243b2019-08-19 11:34:57 +0200109 // Expect all of them to be sent.
110 size_t packets_sent = 0;
Erik Språng74f35e42019-11-14 18:04:49 +0100111 clock_.AdvanceTimeMilliseconds(paced_module_->TimeUntilNextProcess());
112 EXPECT_CALL(callback_, SendPacket)
Erik Språng185243b2019-08-19 11:34:57 +0200113 .WillRepeatedly(
114 [&](std::unique_ptr<RtpPacketToSend> packet,
115 const PacedPacketInfo& cluster_info) { ++packets_sent; });
Erik Språng97b6c752019-07-25 09:16:34 +0200116
Erik Språng74f35e42019-11-14 18:04:49 +0100117 const Timestamp start_time = clock_.CurrentTime();
Erik Språng97b6c752019-07-25 09:16:34 +0200118
Erik Språng185243b2019-08-19 11:34:57 +0200119 while (packets_sent < kPacketsToSend) {
Erik Språng74f35e42019-11-14 18:04:49 +0100120 clock_.AdvanceTimeMilliseconds(paced_module_->TimeUntilNextProcess());
121 paced_module_->Process();
Erik Språng185243b2019-08-19 11:34:57 +0200122 }
Erik Språng58ee1872019-06-18 16:20:11 +0200123
Erik Språng185243b2019-08-19 11:34:57 +0200124 // Packets should be sent over a period of close to 1s. Expect a little lower
125 // than this since initial probing is a bit quicker.
Erik Språng74f35e42019-11-14 18:04:49 +0100126 TimeDelta duration = clock_.CurrentTime() - start_time;
Erik Språng185243b2019-08-19 11:34:57 +0200127 EXPECT_GT(duration, TimeDelta::ms(900));
Erik Språng58ee1872019-06-18 16:20:11 +0200128}
129
Erik Språng74f35e42019-11-14 18:04:49 +0100130INSTANTIATE_TEST_SUITE_P(
131 WithAndWithoutDynamicProcess,
132 PacedSenderTest,
133 ::testing::Values(PacingController::ProcessMode::kPeriodic,
134 PacingController::ProcessMode::kDynamic));
135
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000136} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000137} // namespace webrtc