OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 namespace webrtc { | 26 namespace webrtc { |
27 | 27 |
28 class PacketRouterTest : public ::testing::Test { | 28 class PacketRouterTest : public ::testing::Test { |
29 public: | 29 public: |
30 PacketRouterTest() : packet_router_(new PacketRouter()) {} | 30 PacketRouterTest() : packet_router_(new PacketRouter()) {} |
31 protected: | 31 protected: |
32 const rtc::scoped_ptr<PacketRouter> packet_router_; | 32 const rtc::scoped_ptr<PacketRouter> packet_router_; |
33 }; | 33 }; |
34 | 34 |
35 TEST_F(PacketRouterTest, TimeToSendPacket) { | 35 TEST_F(PacketRouterTest, TimeToSendPacket) { |
| 36 const uint16_t kSsrc1 = 1234; |
| 37 const uint16_t kSsrc2 = 4567; |
| 38 |
36 MockRtpRtcp rtp_1; | 39 MockRtpRtcp rtp_1; |
| 40 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1)); |
37 MockRtpRtcp rtp_2; | 41 MockRtpRtcp rtp_2; |
| 42 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2)); |
38 packet_router_->AddRtpModule(&rtp_1); | 43 packet_router_->AddRtpModule(&rtp_1); |
39 packet_router_->AddRtpModule(&rtp_2); | 44 packet_router_->AddRtpModule(&rtp_2); |
40 | 45 |
41 const uint16_t kSsrc1 = 1234; | |
42 uint16_t sequence_number = 17; | 46 uint16_t sequence_number = 17; |
43 uint64_t timestamp = 7890; | 47 uint64_t timestamp = 7890; |
44 bool retransmission = false; | 48 bool retransmission = false; |
45 | 49 |
46 // Send on the first module by letting rtp_1 be sending with correct ssrc. | 50 // Send on the first module by letting rtp_1 be sending with correct ssrc. |
47 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); | 51 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); |
48 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1)); | |
49 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp, | 52 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp, |
50 retransmission)) | 53 retransmission)) |
51 .Times(1) | 54 .Times(1) |
52 .WillOnce(Return(true)); | 55 .WillOnce(Return(true)); |
53 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); | 56 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); |
54 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, | 57 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, |
55 timestamp, retransmission)); | 58 timestamp, retransmission)); |
56 | 59 |
57 // Send on the second module by letting rtp_2 be sending, but not rtp_1. | 60 // Send on the second module by letting rtp_2 be sending, but not rtp_1. |
58 ++sequence_number; | 61 ++sequence_number; |
59 timestamp += 30; | 62 timestamp += 30; |
60 retransmission = true; | 63 retransmission = true; |
61 const uint16_t kSsrc2 = 4567; | |
62 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); | 64 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); |
63 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); | 65 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); |
64 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2)); | |
65 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); | 66 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); |
66 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp, | 67 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp, |
67 retransmission)) | 68 retransmission)) |
68 .Times(1) | 69 .Times(1) |
69 .WillOnce(Return(true)); | 70 .WillOnce(Return(true)); |
| 71 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, |
| 72 timestamp, retransmission)); |
70 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number, | 73 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number, |
71 timestamp, retransmission)); | 74 timestamp, retransmission)); |
72 | 75 |
73 // No module is sending, hence no packet should be sent. | 76 // No module is sending, hence no packet should be sent. |
74 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); | 77 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); |
75 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); | 78 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); |
76 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false)); | 79 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false)); |
77 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); | 80 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); |
78 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, | 81 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, |
79 timestamp, retransmission)); | 82 timestamp, retransmission)); |
| 83 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number, |
| 84 timestamp, retransmission)); |
80 | 85 |
81 // Add a packet with incorrect ssrc and test it's dropped in the router. | 86 // Add a packet with incorrect ssrc and test it's dropped in the router. |
82 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); | |
83 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1)); | |
84 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); | |
85 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2)); | |
86 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); | 87 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0); |
87 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); | 88 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); |
88 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1 + kSsrc2, sequence_number, | 89 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1 + kSsrc2, sequence_number, |
89 timestamp, retransmission)); | 90 timestamp, retransmission)); |
90 | 91 |
91 packet_router_->RemoveRtpModule(&rtp_1); | 92 packet_router_->RemoveRtpModule(&rtp_1); |
92 | 93 |
93 // rtp_1 has been removed, try sending a packet on that ssrc and make sure | 94 // rtp_1 has been removed, try sending a packet on that ssrc and make sure |
94 // it is dropped as expected by not expecting any calls to rtp_1. | 95 // it is dropped as expected by not expecting any calls to rtp_1. |
95 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); | |
96 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2)); | |
97 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); | 96 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0); |
98 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, | 97 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, |
99 timestamp, retransmission)); | 98 timestamp, retransmission)); |
100 | 99 |
101 packet_router_->RemoveRtpModule(&rtp_2); | 100 packet_router_->RemoveRtpModule(&rtp_2); |
102 } | 101 } |
103 | 102 |
104 TEST_F(PacketRouterTest, TimeToSendPadding) { | 103 TEST_F(PacketRouterTest, TimeToSendPadding) { |
| 104 const uint16_t kSsrc1 = 1234; |
| 105 const uint16_t kSsrc2 = 4567; |
| 106 |
105 MockRtpRtcp rtp_1; | 107 MockRtpRtcp rtp_1; |
| 108 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1)); |
106 MockRtpRtcp rtp_2; | 109 MockRtpRtcp rtp_2; |
| 110 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2)); |
107 packet_router_->AddRtpModule(&rtp_1); | 111 packet_router_->AddRtpModule(&rtp_1); |
108 packet_router_->AddRtpModule(&rtp_2); | 112 packet_router_->AddRtpModule(&rtp_2); |
109 | 113 |
110 // Default configuration, sending padding on the first sending module. | 114 // Default configuration, sending padding on all modules sending media, |
| 115 // ordered by SSRC. |
111 const size_t requested_padding_bytes = 1000; | 116 const size_t requested_padding_bytes = 1000; |
112 const size_t sent_padding_bytes = 890; | 117 const size_t sent_padding_bytes = 890; |
113 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); | 118 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); |
114 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)) | 119 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)) |
115 .Times(1) | 120 .Times(1) |
116 .WillOnce(Return(sent_padding_bytes)); | 121 .WillOnce(Return(sent_padding_bytes)); |
117 EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0); | 122 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); |
118 EXPECT_EQ(sent_padding_bytes, | 123 EXPECT_CALL(rtp_2, |
| 124 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes)) |
| 125 .Times(1) |
| 126 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes)); |
| 127 EXPECT_EQ(requested_padding_bytes, |
119 packet_router_->TimeToSendPadding(requested_padding_bytes)); | 128 packet_router_->TimeToSendPadding(requested_padding_bytes)); |
120 | 129 |
121 // Let only the second module be sending and verify the padding request is | 130 // Let only the second module be sending and verify the padding request is |
122 // routed there. | 131 // routed there. |
123 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); | 132 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); |
124 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0); | 133 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0); |
125 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); | 134 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); |
126 EXPECT_CALL(rtp_2, TimeToSendPadding(_)) | 135 EXPECT_CALL(rtp_2, TimeToSendPadding(_)) |
127 .Times(1) | 136 .Times(1) |
128 .WillOnce(Return(sent_padding_bytes)); | 137 .WillOnce(Return(sent_padding_bytes)); |
129 EXPECT_EQ(sent_padding_bytes, | 138 EXPECT_EQ(sent_padding_bytes, |
130 packet_router_->TimeToSendPadding(requested_padding_bytes)); | 139 packet_router_->TimeToSendPadding(requested_padding_bytes)); |
131 | 140 |
132 // No sending module at all. | 141 // No sending module at all. |
133 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); | 142 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false)); |
134 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0); | 143 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0); |
135 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false)); | 144 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false)); |
136 EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0); | 145 EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0); |
137 EXPECT_EQ(static_cast<size_t>(0), | 146 EXPECT_EQ(0u, packet_router_->TimeToSendPadding(requested_padding_bytes)); |
138 packet_router_->TimeToSendPadding(requested_padding_bytes)); | |
139 | 147 |
140 packet_router_->RemoveRtpModule(&rtp_1); | 148 packet_router_->RemoveRtpModule(&rtp_1); |
141 | 149 |
142 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked | 150 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked |
143 // to send by not expecting any calls. Instead verify rtp_2 is called. | 151 // to send by not expecting any calls. Instead verify rtp_2 is called. |
144 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); | 152 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); |
145 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes)).Times(1); | 153 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes)).Times(1); |
146 EXPECT_EQ(static_cast<size_t>(0), | 154 EXPECT_EQ(0u, packet_router_->TimeToSendPadding(requested_padding_bytes)); |
147 packet_router_->TimeToSendPadding(requested_padding_bytes)); | |
148 | 155 |
149 packet_router_->RemoveRtpModule(&rtp_2); | 156 packet_router_->RemoveRtpModule(&rtp_2); |
150 } | 157 } |
| 158 |
| 159 TEST_F(PacketRouterTest, ChangingSsrc) { |
| 160 const uint16_t kSsrc1 = 1234; |
| 161 const uint16_t kSsrc2 = 4567; |
| 162 uint16_t sequence_number = 17; |
| 163 uint64_t timestamp = 7890; |
| 164 bool retransmission = false; |
| 165 |
| 166 MockRtpRtcp rtp_1; |
| 167 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true)); |
| 168 |
| 169 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1)); |
| 170 packet_router_->AddRtpModule(&rtp_1); |
| 171 |
| 172 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp, |
| 173 retransmission)) |
| 174 .Times(1) |
| 175 .WillOnce(Return(true)); |
| 176 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number, |
| 177 timestamp, retransmission)); |
| 178 |
| 179 packet_router_->OnSsrcChanged(); |
| 180 |
| 181 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc2)); |
| 182 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc2, sequence_number, timestamp, |
| 183 retransmission)) |
| 184 .Times(1) |
| 185 .WillOnce(Return(true)); |
| 186 EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number, |
| 187 timestamp, retransmission)); |
| 188 |
| 189 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc2)); |
| 190 packet_router_->RemoveRtpModule(&rtp_1); |
| 191 } |
| 192 |
| 193 TEST_F(PacketRouterTest, TransportSeqNotEnabled) { |
| 194 packet_router_->SetTransportWideSequenceNumber(1000); |
| 195 EXPECT_EQ(0u, packet_router_->AllocateSequenceNumber()); |
| 196 |
| 197 const uint16_t kSeq = 1; |
| 198 packet_router_->OnPacketSent(kSeq, 1); |
| 199 std::vector<PacketInfo> packet_vec; |
| 200 packet_vec.push_back(PacketInfo(0, 0, kSeq, 0, false)); |
| 201 EXPECT_EQ(0u, packet_router_->PopulateSendTimes(&packet_vec)); |
| 202 } |
| 203 |
| 204 TEST_F(PacketRouterTest, AddAndPopulateTransportSeq) { |
| 205 packet_router_->EnableTransportWideFeedback(); |
| 206 |
| 207 const uint16_t kStartSeq = 0xFFF0; |
| 208 const int64_t kStartTime = 2000; |
| 209 const size_t kNumPackets = 32; |
| 210 |
| 211 packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1); |
| 212 std::vector<PacketInfo> packet_vec; |
| 213 |
| 214 for (size_t i = 0; i < kNumPackets; ++i) { |
| 215 uint16_t seq = packet_router_->AllocateSequenceNumber(); |
| 216 packet_router_->OnPacketSent(seq, kStartTime + i); |
| 217 packet_vec.push_back(PacketInfo(0, 0, seq, 0, false)); |
| 218 } |
| 219 |
| 220 EXPECT_EQ(kNumPackets, packet_router_->PopulateSendTimes(&packet_vec)); |
| 221 for (size_t i = 0; i < kNumPackets; ++i) { |
| 222 EXPECT_EQ(static_cast<uint16_t>(kStartSeq + i), |
| 223 packet_vec[i].sequence_number); |
| 224 EXPECT_EQ(static_cast<int64_t>(kStartTime + i), packet_vec[i].send_time_ms); |
| 225 } |
| 226 } |
| 227 |
| 228 TEST_F(PacketRouterTest, AddAndPopulateTransportSeqWithLosses) { |
| 229 packet_router_->EnableTransportWideFeedback(); |
| 230 |
| 231 const uint16_t kStartSeq = 0xFFF0; |
| 232 const int64_t kStartTime = 2000; |
| 233 const size_t kNumPackets = 32; |
| 234 |
| 235 packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1); |
| 236 std::vector<PacketInfo> packet_vec; |
| 237 |
| 238 for (size_t i = 0; i < kNumPackets; ++i) { |
| 239 uint16_t seq = packet_router_->AllocateSequenceNumber(); |
| 240 packet_router_->OnPacketSent(seq, kStartTime + i); |
| 241 packet_vec.push_back(PacketInfo(0, 0, seq, 0, false)); |
| 242 } |
| 243 |
| 244 const size_t kNumReceivedPackets = 16; |
| 245 const size_t kFirstLossPos = 5; |
| 246 packet_vec.erase( |
| 247 packet_vec.begin() + kFirstLossPos, |
| 248 packet_vec.begin() + kFirstLossPos + (kNumPackets - kNumReceivedPackets)); |
| 249 |
| 250 EXPECT_EQ(kNumReceivedPackets, |
| 251 packet_router_->PopulateSendTimes(&packet_vec)); |
| 252 for (const PacketInfo& info : packet_vec) { |
| 253 uint16_t seq_delta = info.sequence_number - kStartSeq; |
| 254 EXPECT_EQ(static_cast<int64_t>(kStartTime + seq_delta), info.send_time_ms); |
| 255 } |
| 256 } |
| 257 |
151 } // namespace webrtc | 258 } // namespace webrtc |
OLD | NEW |