blob: 845ac402184cbd1fbde500df3ed9e4fc9f52e960 [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
11#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
14#include "webrtc/modules/pacing/include/paced_sender.h"
15
16namespace {
17 const int kTargetBitrate = 800;
18};
19
20namespace webrtc {
21
22class MockPacedSenderCallback : public PacedSender::Callback {
23 public:
24 MOCK_METHOD3(TimeToSendPacket,
25 void(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms));
26 MOCK_METHOD1(TimeToSendPadding,
27 void(int bytes));
28};
29
30class PacedSenderTest : public ::testing::Test {
31 protected:
32 PacedSenderTest() {
33 TickTime::UseFakeClock(123456);
34 // Need to initialize PacedSender after we initialize clock.
35 send_bucket_.reset(new PacedSender(&callback_, kTargetBitrate));
36 send_bucket_->SetStatus(true);
37 }
38 MockPacedSenderCallback callback_;
39 scoped_ptr<PacedSender> send_bucket_;
40};
41
42TEST_F(PacedSenderTest, QueuePacket) {
43 uint32_t ssrc = 12345;
44 uint16_t sequence_number = 1234;
45 int64_t capture_time_ms = 56789;
46
47 // Due to the multiplicative factor we can send 3 packets not 2 packets.
48 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
49 sequence_number++, capture_time_ms, 250));
50 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
51 sequence_number++, capture_time_ms, 250));
52 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
53 sequence_number++, capture_time_ms, 250));
54 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
55 sequence_number, capture_time_ms, 250));
56 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
57 EXPECT_CALL(callback_, TimeToSendPadding(testing::_)).Times(0);
58 EXPECT_CALL(callback_,
59 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
60 TickTime::AdvanceFakeClock(4);
61 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
62 EXPECT_CALL(callback_,
63 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(1);
64 TickTime::AdvanceFakeClock(1);
65 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
66 EXPECT_EQ(0, send_bucket_->Process());
67 sequence_number++;
68 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
69 sequence_number++, capture_time_ms, 250));
70 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
71 sequence_number++, capture_time_ms, 250));
72 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
73 sequence_number++, capture_time_ms, 250));
74}
75
76TEST_F(PacedSenderTest, PaceQueuedPackets) {
77 uint32_t ssrc = 12345;
78 uint16_t sequence_number = 1234;
79 int64_t capture_time_ms = 56789;
80
81 // Due to the multiplicative factor we can send 3 packets not 2 packets.
82 for (int i = 0; i < 3; ++i) {
83 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
84 sequence_number++, capture_time_ms, 250));
85 }
86 for (int j = 0; j < 30; ++j) {
87 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
88 sequence_number++, capture_time_ms, 250));
89 }
90 EXPECT_CALL(callback_, TimeToSendPadding(testing::_)).Times(0);
91 for (int k = 0; k < 10; ++k) {
92 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
93 TickTime::AdvanceFakeClock(5);
94 EXPECT_CALL(callback_,
95 TimeToSendPacket(ssrc, testing::_, capture_time_ms)).Times(3);
96 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
97 EXPECT_EQ(0, send_bucket_->Process());
98 }
99 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
100 TickTime::AdvanceFakeClock(5);
101 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
102 EXPECT_EQ(0, send_bucket_->Process());
103 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
104 sequence_number++, capture_time_ms, 250));
105 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
106 sequence_number++, capture_time_ms, 250));
107 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
108 sequence_number++, capture_time_ms, 250));
109 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
110 sequence_number++, capture_time_ms, 250));
111}
112
113TEST_F(PacedSenderTest, Padding) {
114 uint32_t ssrc = 12345;
115 uint16_t sequence_number = 1234;
116 int64_t capture_time_ms = 56789;
117
118 // Due to the multiplicative factor we can send 3 packets not 2 packets.
119 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
120 sequence_number++, capture_time_ms, 250));
121 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
122 sequence_number++, capture_time_ms, 250));
123 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
124 sequence_number++, capture_time_ms, 250));
125 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1);
126 EXPECT_CALL(callback_,
127 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
128 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
129 TickTime::AdvanceFakeClock(5);
130 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
131 EXPECT_EQ(0, send_bucket_->Process());
132
133 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1);
134 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
135 TickTime::AdvanceFakeClock(5);
136 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
137 EXPECT_EQ(0, send_bucket_->Process());
138}
139
140TEST_F(PacedSenderTest, Priority) {
141 uint32_t ssrc_low_priority = 12345;
142 uint32_t ssrc = 12346;
143 uint16_t sequence_number = 1234;
144 int64_t capture_time_ms = 56789;
145 int64_t capture_time_ms_low_priority = 1234567;
146
147 // Due to the multiplicative factor we can send 3 packets not 2 packets.
148 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
149 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
150 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
151 ssrc, sequence_number++, capture_time_ms, 250));
152 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
153 ssrc, sequence_number++, capture_time_ms, 250));
154
155 // Expect normal and low priority to be queued and high to pass through.
156 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
157 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
158 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
159 ssrc, sequence_number++, capture_time_ms, 250));
160 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
161 ssrc, sequence_number++, capture_time_ms, 250));
162 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kHighPriority,
163 ssrc, sequence_number++, capture_time_ms, 250));
164
165 // Expect all normal priority to be sent out first.
166 EXPECT_CALL(callback_, TimeToSendPadding(testing::_)).Times(0);
167 EXPECT_CALL(callback_,
168 TimeToSendPacket(ssrc, testing::_, capture_time_ms)).Times(2);
169
170 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
171 TickTime::AdvanceFakeClock(5);
172 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
173 EXPECT_EQ(0, send_bucket_->Process());
174
175 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority,
176 testing::_, capture_time_ms_low_priority)).Times(1);
177
178 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
179 TickTime::AdvanceFakeClock(5);
180 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
181 EXPECT_EQ(0, send_bucket_->Process());
182}
183
184} // namespace webrtc