blob: da6e6732782bb348501c359f590ad119387a8a10 [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
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000016using testing::_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000017
18namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000019namespace test {
20
21static const int kTargetBitrate = 800;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000022
23class MockPacedSenderCallback : public PacedSender::Callback {
24 public:
25 MOCK_METHOD3(TimeToSendPacket,
26 void(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms));
27 MOCK_METHOD1(TimeToSendPadding,
28 void(int bytes));
29};
30
31class PacedSenderTest : public ::testing::Test {
32 protected:
33 PacedSenderTest() {
34 TickTime::UseFakeClock(123456);
35 // Need to initialize PacedSender after we initialize clock.
36 send_bucket_.reset(new PacedSender(&callback_, kTargetBitrate));
37 send_bucket_->SetStatus(true);
38 }
39 MockPacedSenderCallback callback_;
40 scoped_ptr<PacedSender> send_bucket_;
41};
42
43TEST_F(PacedSenderTest, QueuePacket) {
44 uint32_t ssrc = 12345;
45 uint16_t sequence_number = 1234;
46 int64_t capture_time_ms = 56789;
47
48 // Due to the multiplicative factor we can send 3 packets not 2 packets.
49 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
50 sequence_number++, capture_time_ms, 250));
51 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
52 sequence_number++, capture_time_ms, 250));
53 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
54 sequence_number++, capture_time_ms, 250));
55 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
56 sequence_number, capture_time_ms, 250));
57 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000058 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000059 EXPECT_CALL(callback_,
60 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
61 TickTime::AdvanceFakeClock(4);
62 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
63 EXPECT_CALL(callback_,
64 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(1);
65 TickTime::AdvanceFakeClock(1);
66 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
67 EXPECT_EQ(0, send_bucket_->Process());
68 sequence_number++;
69 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
70 sequence_number++, capture_time_ms, 250));
71 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
72 sequence_number++, capture_time_ms, 250));
73 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
74 sequence_number++, capture_time_ms, 250));
75}
76
77TEST_F(PacedSenderTest, PaceQueuedPackets) {
78 uint32_t ssrc = 12345;
79 uint16_t sequence_number = 1234;
80 int64_t capture_time_ms = 56789;
81
82 // Due to the multiplicative factor we can send 3 packets not 2 packets.
83 for (int i = 0; i < 3; ++i) {
84 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
85 sequence_number++, capture_time_ms, 250));
86 }
87 for (int j = 0; j < 30; ++j) {
88 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
89 sequence_number++, capture_time_ms, 250));
90 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000091 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000092 for (int k = 0; k < 10; ++k) {
93 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
94 TickTime::AdvanceFakeClock(5);
95 EXPECT_CALL(callback_,
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000096 TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000097 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
98 EXPECT_EQ(0, send_bucket_->Process());
99 }
100 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
101 TickTime::AdvanceFakeClock(5);
102 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
103 EXPECT_EQ(0, send_bucket_->Process());
104 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
105 sequence_number++, capture_time_ms, 250));
106 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
107 sequence_number++, capture_time_ms, 250));
108 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
109 sequence_number++, capture_time_ms, 250));
110 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
111 sequence_number++, capture_time_ms, 250));
112}
113
114TEST_F(PacedSenderTest, Padding) {
115 uint32_t ssrc = 12345;
116 uint16_t sequence_number = 1234;
117 int64_t capture_time_ms = 56789;
118
119 // Due to the multiplicative factor we can send 3 packets not 2 packets.
120 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
121 sequence_number++, capture_time_ms, 250));
122 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
123 sequence_number++, capture_time_ms, 250));
124 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
125 sequence_number++, capture_time_ms, 250));
126 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1);
127 EXPECT_CALL(callback_,
128 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
129 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
130 TickTime::AdvanceFakeClock(5);
131 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
132 EXPECT_EQ(0, send_bucket_->Process());
133
134 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1);
135 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
136 TickTime::AdvanceFakeClock(5);
137 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
138 EXPECT_EQ(0, send_bucket_->Process());
139}
140
141TEST_F(PacedSenderTest, Priority) {
142 uint32_t ssrc_low_priority = 12345;
143 uint32_t ssrc = 12346;
144 uint16_t sequence_number = 1234;
145 int64_t capture_time_ms = 56789;
146 int64_t capture_time_ms_low_priority = 1234567;
147
148 // Due to the multiplicative factor we can send 3 packets not 2 packets.
149 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
150 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
151 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
152 ssrc, sequence_number++, capture_time_ms, 250));
153 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
154 ssrc, sequence_number++, capture_time_ms, 250));
155
156 // Expect normal and low priority to be queued and high to pass through.
157 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
158 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
159 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
160 ssrc, sequence_number++, capture_time_ms, 250));
161 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
162 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000163 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000164 ssrc, sequence_number++, capture_time_ms, 250));
165
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000166 // Expect all high and normal priority to be sent out first.
167 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
168 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000169
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
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000175 EXPECT_CALL(callback_, TimeToSendPacket(
176 ssrc_low_priority, _, capture_time_ms_low_priority)).Times(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000177
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
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000184TEST_F(PacedSenderTest, Pause) {
185 uint32_t ssrc_low_priority = 12345;
186 uint32_t ssrc = 12346;
187 uint16_t sequence_number = 1234;
188 int64_t capture_time_ms = 56789;
189 int64_t second_capture_time_ms = 67890;
190
191 // Due to the multiplicative factor we can send 3 packets not 2 packets.
192 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
193 ssrc_low_priority, sequence_number++, capture_time_ms, 250));
194 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
195 ssrc, sequence_number++, capture_time_ms, 250));
196 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
197 ssrc, sequence_number++, capture_time_ms, 250));
198
199 send_bucket_->Pause();
200
201 // Expect everything to be queued.
202 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
203 ssrc_low_priority, sequence_number++, capture_time_ms, 250));
204 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
205 ssrc, sequence_number++, capture_time_ms, 250));
206 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
207 ssrc, sequence_number++, second_capture_time_ms, 250));
208 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
209 ssrc, sequence_number++, capture_time_ms, 250));
210
211 // Expect no packet to come out while paused.
212 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
213 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _)).Times(0);
214
215 for (int i = 0; i < 10; ++i) {
216 TickTime::AdvanceFakeClock(5);
217 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
218 EXPECT_EQ(0, send_bucket_->Process());
219 }
220 // Expect high prio packets to come out first followed by all packets in the
221 // way they were added.
222 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms)).Times(3);
223
224 send_bucket_->Resume();
225
226 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
227 TickTime::AdvanceFakeClock(5);
228 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
229 EXPECT_EQ(0, send_bucket_->Process());
230
231 EXPECT_CALL(callback_,
232 TimeToSendPacket(_, _, second_capture_time_ms)).Times(1);
233
234 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
235 TickTime::AdvanceFakeClock(5);
236 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
237 EXPECT_EQ(0, send_bucket_->Process());
238}
239
240} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000241} // namespace webrtc