| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
| 10 #include "media/cast/cast_environment.h" | 10 #include "media/cast/cast_environment.h" |
| 11 #include "media/cast/net/cast_transport_defines.h" | 11 #include "media/cast/net/cast_transport_defines.h" |
| 12 #include "media/cast/net/rtcp/rtcp_utility.h" | 12 #include "media/cast/net/rtcp/rtcp_utility.h" |
| 13 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" | 13 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" |
| 14 #include "media/cast/test/fake_single_thread_task_runner.h" | 14 #include "media/cast/test/fake_single_thread_task_runner.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 namespace media { | 17 namespace media { |
| 18 namespace cast { | 18 namespace cast { |
| 19 | 19 |
| 20 static const uint32_t kSenderSsrc = 0x10203; | 20 static const uint32_t kRemoteSsrc = 0x10203; |
| 21 static const uint32_t kSourceSsrc = 0x40506; | 21 static const uint32_t kLocalSsrc = 0x40506; |
| 22 static const uint32_t kUnknownSsrc = 0xDEAD; | 22 static const uint32_t kUnknownSsrc = 0xDEAD; |
| 23 static const base::TimeDelta kTargetDelay = | 23 static const base::TimeDelta kTargetDelay = |
| 24 base::TimeDelta::FromMilliseconds(100); | 24 base::TimeDelta::FromMilliseconds(100); |
| 25 | 25 |
| 26 class RtcpParserTest : public ::testing::Test { | 26 class RtcpParserTest : public ::testing::Test { |
| 27 protected: | 27 protected: |
| 28 RtcpParserTest() | 28 RtcpParserTest() |
| 29 : testing_clock_(new base::SimpleTestTickClock()), | 29 : testing_clock_(new base::SimpleTestTickClock()), |
| 30 task_runner_(new test::FakeSingleThreadTaskRunner( | 30 task_runner_(new test::FakeSingleThreadTaskRunner( |
| 31 testing_clock_.get())) { | 31 testing_clock_.get())) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 50 } | 50 } |
| 51 | 51 |
| 52 void ExpectLastReport(const RtcpParser& parser) { | 52 void ExpectLastReport(const RtcpParser& parser) { |
| 53 EXPECT_TRUE(parser.has_last_report()); | 53 EXPECT_TRUE(parser.has_last_report()); |
| 54 EXPECT_EQ(kLastSr, parser.last_report()); | 54 EXPECT_EQ(kLastSr, parser.last_report()); |
| 55 EXPECT_EQ(kDelayLastSr, parser.delay_since_last_report()); | 55 EXPECT_EQ(kDelayLastSr, parser.delay_since_last_report()); |
| 56 } | 56 } |
| 57 | 57 |
| 58 void ExpectReceiverReference(const RtcpParser& parser) { | 58 void ExpectReceiverReference(const RtcpParser& parser) { |
| 59 EXPECT_TRUE(parser.has_receiver_reference_time_report()); | 59 EXPECT_TRUE(parser.has_receiver_reference_time_report()); |
| 60 EXPECT_EQ(kSenderSsrc, parser.receiver_reference_time_report().remote_ssrc); | 60 EXPECT_EQ(kRemoteSsrc, parser.receiver_reference_time_report().remote_ssrc); |
| 61 EXPECT_EQ(kNtpHigh, parser.receiver_reference_time_report().ntp_seconds); | 61 EXPECT_EQ(kNtpHigh, parser.receiver_reference_time_report().ntp_seconds); |
| 62 EXPECT_EQ(kNtpLow, parser.receiver_reference_time_report().ntp_fraction); | 62 EXPECT_EQ(kNtpLow, parser.receiver_reference_time_report().ntp_fraction); |
| 63 } | 63 } |
| 64 | 64 |
| 65 void ExpectCastFeedback(const RtcpParser& parser) { | 65 void ExpectCastFeedback(const RtcpParser& parser) { |
| 66 EXPECT_TRUE(parser.has_cast_message()); | 66 EXPECT_TRUE(parser.has_cast_message()); |
| 67 EXPECT_EQ(kSenderSsrc, parser.cast_message().media_ssrc); | 67 EXPECT_EQ(kRemoteSsrc, parser.cast_message().remote_ssrc); |
| 68 EXPECT_EQ(kAckFrameId, parser.cast_message().ack_frame_id); | 68 EXPECT_EQ(kAckFrameId, parser.cast_message().ack_frame_id); |
| 69 | 69 |
| 70 MissingFramesAndPacketsMap::const_iterator frame_it = | 70 MissingFramesAndPacketsMap::const_iterator frame_it = |
| 71 parser.cast_message().missing_frames_and_packets.begin(); | 71 parser.cast_message().missing_frames_and_packets.begin(); |
| 72 | 72 |
| 73 EXPECT_TRUE( | 73 EXPECT_TRUE( |
| 74 frame_it != parser.cast_message().missing_frames_and_packets.end()); | 74 frame_it != parser.cast_message().missing_frames_and_packets.end()); |
| 75 EXPECT_EQ(kLostFrameId, frame_it->first); | 75 EXPECT_EQ(kLostFrameId, frame_it->first); |
| 76 EXPECT_EQ(frame_it->second.size(), 1UL); | 76 EXPECT_EQ(frame_it->second.size(), 1UL); |
| 77 EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost); | 77 EXPECT_EQ(*frame_it->second.begin(), kRtcpCastAllPacketsLost); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 126 |
| 127 scoped_ptr<base::SimpleTestTickClock> testing_clock_; | 127 scoped_ptr<base::SimpleTestTickClock> testing_clock_; |
| 128 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | 128 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
| 129 | 129 |
| 130 private: | 130 private: |
| 131 DISALLOW_COPY_AND_ASSIGN(RtcpParserTest); | 131 DISALLOW_COPY_AND_ASSIGN(RtcpParserTest); |
| 132 }; | 132 }; |
| 133 | 133 |
| 134 TEST_F(RtcpParserTest, BrokenPacketIsIgnored) { | 134 TEST_F(RtcpParserTest, BrokenPacketIsIgnored) { |
| 135 const char bad_packet[] = {0, 0, 0, 0}; | 135 const char bad_packet[] = {0, 0, 0, 0}; |
| 136 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 136 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
| 137 base::BigEndianReader reader(bad_packet, sizeof(bad_packet)); | 137 base::BigEndianReader reader(bad_packet, sizeof(bad_packet)); |
| 138 EXPECT_FALSE(parser.Parse(&reader)); | 138 EXPECT_FALSE(parser.Parse(&reader)); |
| 139 } | 139 } |
| 140 | 140 |
| 141 TEST_F(RtcpParserTest, UnknownBlockIgnored) { | 141 TEST_F(RtcpParserTest, UnknownBlockIgnored) { |
| 142 // Only unknown data, nothing happens. | 142 // Only unknown data, nothing happens. |
| 143 TestRtcpPacketBuilder p; | 143 TestRtcpPacketBuilder p; |
| 144 p.AddUnknownBlock(); | 144 p.AddUnknownBlock(); |
| 145 RtcpParser parser1(kSourceSsrc, 0); | 145 RtcpParser parser1(kLocalSsrc, 0); |
| 146 EXPECT_TRUE(parser1.Parse(p.Reader())); | 146 EXPECT_TRUE(parser1.Parse(p.Reader())); |
| 147 EXPECT_FALSE(HasAnything(parser1)); | 147 EXPECT_FALSE(HasAnything(parser1)); |
| 148 | 148 |
| 149 // Add valid sender report *after* unknown data - should work fine. | 149 // Add valid sender report *after* unknown data - should work fine. |
| 150 p.AddSr(kSenderSsrc, 0); | 150 p.AddSr(kRemoteSsrc, 0); |
| 151 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 151 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 152 EXPECT_TRUE(parser2.Parse(p.Reader())); | 152 EXPECT_TRUE(parser2.Parse(p.Reader())); |
| 153 ExpectSenderInfo(parser2); | 153 ExpectSenderInfo(parser2); |
| 154 } | 154 } |
| 155 | 155 |
| 156 TEST_F(RtcpParserTest, InjectSenderReportPacket) { | 156 TEST_F(RtcpParserTest, InjectSenderReportPacket) { |
| 157 TestRtcpPacketBuilder p; | 157 TestRtcpPacketBuilder p; |
| 158 p.AddSr(kSenderSsrc, 0); | 158 p.AddSr(kRemoteSsrc, 0); |
| 159 | 159 |
| 160 // Expected to be ignored since the sender ssrc does not match our | 160 // Expected to be ignored since the sender ssrc does not match our |
| 161 // remote ssrc. | 161 // remote ssrc. |
| 162 RtcpParser parser1(kSourceSsrc, 0); | 162 RtcpParser parser1(kLocalSsrc, 0); |
| 163 EXPECT_TRUE(parser1.Parse(p.Reader())); | 163 EXPECT_TRUE(parser1.Parse(p.Reader())); |
| 164 EXPECT_FALSE(HasAnything(parser1)); | 164 EXPECT_FALSE(HasAnything(parser1)); |
| 165 | 165 |
| 166 // Expected to be pass through since the sender ssrc match our remote ssrc. | 166 // Expected to be pass through since the sender ssrc match our remote ssrc. |
| 167 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 167 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 168 EXPECT_TRUE(parser2.Parse(p.Reader())); | 168 EXPECT_TRUE(parser2.Parse(p.Reader())); |
| 169 ExpectSenderInfo(parser2); | 169 ExpectSenderInfo(parser2); |
| 170 } | 170 } |
| 171 | 171 |
| 172 TEST_F(RtcpParserTest, InjectReceiveReportPacket) { | 172 TEST_F(RtcpParserTest, InjectReceiveReportPacket) { |
| 173 TestRtcpPacketBuilder p1; | 173 TestRtcpPacketBuilder p1; |
| 174 p1.AddRr(kSenderSsrc, 1); | 174 p1.AddRr(kRemoteSsrc, 1); |
| 175 p1.AddRb(kUnknownSsrc); | 175 p1.AddRb(kUnknownSsrc); |
| 176 | 176 |
| 177 // Expected to be ignored since the source ssrc does not match our | 177 // Expected to be ignored since the source ssrc does not match our |
| 178 // local ssrc. | 178 // local ssrc. |
| 179 RtcpParser parser1(kSourceSsrc, kSenderSsrc); | 179 RtcpParser parser1(kLocalSsrc, kRemoteSsrc); |
| 180 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 180 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
| 181 EXPECT_FALSE(HasAnything(parser1)); | 181 EXPECT_FALSE(HasAnything(parser1)); |
| 182 | 182 |
| 183 TestRtcpPacketBuilder p2; | 183 TestRtcpPacketBuilder p2; |
| 184 p2.AddRr(kSenderSsrc, 1); | 184 p2.AddRr(kRemoteSsrc, 1); |
| 185 p2.AddRb(kSourceSsrc); | 185 p2.AddRb(kLocalSsrc); |
| 186 | 186 |
| 187 // Expected to be pass through since the sender ssrc match our local ssrc. | 187 // Expected to be pass through since the sender ssrc match our local ssrc. |
| 188 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 188 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 189 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 189 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
| 190 ExpectLastReport(parser2); | 190 ExpectLastReport(parser2); |
| 191 } | 191 } |
| 192 | 192 |
| 193 TEST_F(RtcpParserTest, InjectSenderReportWithReportBlockPacket) { | 193 TEST_F(RtcpParserTest, InjectSenderReportWithReportBlockPacket) { |
| 194 TestRtcpPacketBuilder p1; | 194 TestRtcpPacketBuilder p1; |
| 195 p1.AddSr(kSenderSsrc, 1); | 195 p1.AddSr(kRemoteSsrc, 1); |
| 196 p1.AddRb(kUnknownSsrc); | 196 p1.AddRb(kUnknownSsrc); |
| 197 | 197 |
| 198 // Sender report expected to be ignored since the sender ssrc does not match | 198 // Sender report expected to be ignored since the sender ssrc does not match |
| 199 // our remote ssrc. | 199 // our remote ssrc. |
| 200 // Report block expected to be ignored since the source ssrc does not match | 200 // Report block expected to be ignored since the source ssrc does not match |
| 201 // our local ssrc. | 201 // our local ssrc. |
| 202 RtcpParser parser1(kSourceSsrc, 0); | 202 RtcpParser parser1(kLocalSsrc, 0); |
| 203 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 203 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
| 204 EXPECT_FALSE(HasAnything(parser1)); | 204 EXPECT_FALSE(HasAnything(parser1)); |
| 205 | 205 |
| 206 // Sender report expected to be pass through since the sender ssrc match our | 206 // Sender report expected to be pass through since the sender ssrc match our |
| 207 // remote ssrc. | 207 // remote ssrc. |
| 208 // Report block expected to be ignored since the source ssrc does not match | 208 // Report block expected to be ignored since the source ssrc does not match |
| 209 // our local ssrc. | 209 // our local ssrc. |
| 210 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 210 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 211 EXPECT_TRUE(parser2.Parse(p1.Reader())); | 211 EXPECT_TRUE(parser2.Parse(p1.Reader())); |
| 212 ExpectSenderInfo(parser2); | 212 ExpectSenderInfo(parser2); |
| 213 EXPECT_FALSE(parser2.has_last_report()); | 213 EXPECT_FALSE(parser2.has_last_report()); |
| 214 | 214 |
| 215 // Sender report expected to be ignored since the sender ssrc does not match | 215 // Sender report expected to be ignored since the sender ssrc does not match |
| 216 // our remote ssrc. | 216 // our remote ssrc. |
| 217 // Report block expected to be ignored too since it's a part of the | 217 // Report block expected to be ignored too since it's a part of the |
| 218 // sender report. | 218 // sender report. |
| 219 TestRtcpPacketBuilder p2; | 219 TestRtcpPacketBuilder p2; |
| 220 p2.AddSr(kSenderSsrc, 1); | 220 p2.AddSr(kRemoteSsrc, 1); |
| 221 p2.AddRb(kSourceSsrc); | 221 p2.AddRb(kLocalSsrc); |
| 222 | 222 |
| 223 RtcpParser parser3(kSourceSsrc, 0); | 223 RtcpParser parser3(kLocalSsrc, 0); |
| 224 EXPECT_TRUE(parser3.Parse(p2.Reader())); | 224 EXPECT_TRUE(parser3.Parse(p2.Reader())); |
| 225 EXPECT_FALSE(parser3.has_last_report()); | 225 EXPECT_FALSE(parser3.has_last_report()); |
| 226 | 226 |
| 227 // Sender report expected to be pass through since the sender ssrc match our | 227 // Sender report expected to be pass through since the sender ssrc match our |
| 228 // remote ssrc. | 228 // remote ssrc. |
| 229 // Report block expected to be pass through since the sender ssrc match | 229 // Report block expected to be pass through since the sender ssrc match |
| 230 // our local ssrc. | 230 // our local ssrc. |
| 231 RtcpParser parser4(kSourceSsrc, kSenderSsrc); | 231 RtcpParser parser4(kLocalSsrc, kRemoteSsrc); |
| 232 EXPECT_TRUE(parser4.Parse(p2.Reader())); | 232 EXPECT_TRUE(parser4.Parse(p2.Reader())); |
| 233 ExpectSenderInfo(parser4); | 233 ExpectSenderInfo(parser4); |
| 234 ExpectLastReport(parser4); | 234 ExpectLastReport(parser4); |
| 235 } | 235 } |
| 236 | 236 |
| 237 TEST_F(RtcpParserTest, InjectSenderReportPacketWithDlrr) { | 237 TEST_F(RtcpParserTest, InjectSenderReportPacketWithDlrr) { |
| 238 TestRtcpPacketBuilder p; | 238 TestRtcpPacketBuilder p; |
| 239 p.AddSr(kSenderSsrc, 0); | 239 p.AddSr(kRemoteSsrc, 0); |
| 240 p.AddXrHeader(kSenderSsrc); | 240 p.AddXrHeader(kRemoteSsrc); |
| 241 p.AddXrUnknownBlock(); | 241 p.AddXrUnknownBlock(); |
| 242 p.AddXrExtendedDlrrBlock(kSenderSsrc); | 242 p.AddXrExtendedDlrrBlock(kRemoteSsrc); |
| 243 p.AddXrUnknownBlock(); | 243 p.AddXrUnknownBlock(); |
| 244 | 244 |
| 245 // Expected to be ignored since the source ssrc does not match our | 245 // Expected to be ignored since the source ssrc does not match our |
| 246 // local ssrc. | 246 // local ssrc. |
| 247 RtcpParser parser1(kSourceSsrc, 0); | 247 RtcpParser parser1(kLocalSsrc, 0); |
| 248 EXPECT_TRUE(parser1.Parse(p.Reader())); | 248 EXPECT_TRUE(parser1.Parse(p.Reader())); |
| 249 EXPECT_FALSE(HasAnything(parser1)); | 249 EXPECT_FALSE(HasAnything(parser1)); |
| 250 | 250 |
| 251 // Expected to be pass through since the sender ssrc match our local ssrc. | 251 // Expected to be pass through since the sender ssrc match our local ssrc. |
| 252 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 252 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 253 EXPECT_TRUE(parser2.Parse(p.Reader())); | 253 EXPECT_TRUE(parser2.Parse(p.Reader())); |
| 254 ExpectSenderInfo(parser2); | 254 ExpectSenderInfo(parser2); |
| 255 // DLRRs are ignored. | 255 // DLRRs are ignored. |
| 256 EXPECT_FALSE(parser2.has_last_report()); | 256 EXPECT_FALSE(parser2.has_last_report()); |
| 257 } | 257 } |
| 258 | 258 |
| 259 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithRrtr) { | 259 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithRrtr) { |
| 260 TestRtcpPacketBuilder p1; | 260 TestRtcpPacketBuilder p1; |
| 261 p1.AddRr(kSenderSsrc, 1); | 261 p1.AddRr(kRemoteSsrc, 1); |
| 262 p1.AddRb(kUnknownSsrc); | 262 p1.AddRb(kUnknownSsrc); |
| 263 p1.AddXrHeader(kSenderSsrc); | 263 p1.AddXrHeader(kRemoteSsrc); |
| 264 p1.AddXrRrtrBlock(); | 264 p1.AddXrRrtrBlock(); |
| 265 | 265 |
| 266 // Expected to be ignored since the source ssrc does not match our | 266 // Expected to be ignored since the source ssrc does not match our |
| 267 // local ssrc. | 267 // local ssrc. |
| 268 RtcpParser parser1(kSourceSsrc, 0); | 268 RtcpParser parser1(kLocalSsrc, 0); |
| 269 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 269 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
| 270 EXPECT_FALSE(HasAnything(parser1)); | 270 EXPECT_FALSE(HasAnything(parser1)); |
| 271 | 271 |
| 272 TestRtcpPacketBuilder p2; | 272 TestRtcpPacketBuilder p2; |
| 273 p2.AddRr(kSenderSsrc, 1); | 273 p2.AddRr(kRemoteSsrc, 1); |
| 274 p2.AddRb(kSourceSsrc); | 274 p2.AddRb(kLocalSsrc); |
| 275 p2.AddXrHeader(kSenderSsrc); | 275 p2.AddXrHeader(kRemoteSsrc); |
| 276 p2.AddXrRrtrBlock(); | 276 p2.AddXrRrtrBlock(); |
| 277 | 277 |
| 278 // Expected to be pass through since the sender ssrc match our local ssrc. | 278 // Expected to be pass through since the sender ssrc match our local ssrc. |
| 279 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 279 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 280 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 280 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
| 281 ExpectLastReport(parser2); | 281 ExpectLastReport(parser2); |
| 282 ExpectReceiverReference(parser2); | 282 ExpectReceiverReference(parser2); |
| 283 } | 283 } |
| 284 | 284 |
| 285 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithIntraFrameRequest) { | 285 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithIntraFrameRequest) { |
| 286 TestRtcpPacketBuilder p1; | 286 TestRtcpPacketBuilder p1; |
| 287 p1.AddRr(kSenderSsrc, 1); | 287 p1.AddRr(kRemoteSsrc, 1); |
| 288 p1.AddRb(kUnknownSsrc); | 288 p1.AddRb(kUnknownSsrc); |
| 289 | 289 |
| 290 // Expected to be ignored since the source ssrc does not match our | 290 // Expected to be ignored since the source ssrc does not match our |
| 291 // local ssrc. | 291 // local ssrc. |
| 292 RtcpParser parser1(kSourceSsrc, 0); | 292 RtcpParser parser1(kLocalSsrc, 0); |
| 293 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 293 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
| 294 EXPECT_FALSE(HasAnything(parser1)); | 294 EXPECT_FALSE(HasAnything(parser1)); |
| 295 | 295 |
| 296 TestRtcpPacketBuilder p2; | 296 TestRtcpPacketBuilder p2; |
| 297 p2.AddRr(kSenderSsrc, 1); | 297 p2.AddRr(kRemoteSsrc, 1); |
| 298 p2.AddRb(kSourceSsrc); | 298 p2.AddRb(kLocalSsrc); |
| 299 | 299 |
| 300 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 300 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 301 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 301 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
| 302 ExpectLastReport(parser2); | 302 ExpectLastReport(parser2); |
| 303 } | 303 } |
| 304 | 304 |
| 305 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithCastFeedback) { | 305 TEST_F(RtcpParserTest, InjectReceiverReportPacketWithCastFeedback) { |
| 306 TestRtcpPacketBuilder p1; | 306 TestRtcpPacketBuilder p1; |
| 307 p1.AddRr(kSenderSsrc, 1); | 307 p1.AddRr(kRemoteSsrc, 1); |
| 308 p1.AddRb(kUnknownSsrc); | 308 p1.AddRb(kUnknownSsrc); |
| 309 p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelay); | 309 p1.AddCast(kRemoteSsrc, kUnknownSsrc, kTargetDelay); |
| 310 | 310 |
| 311 // Expected to be ignored since the source ssrc does not match our | 311 // Expected to be ignored since the source ssrc does not match our |
| 312 // local ssrc. | 312 // local ssrc. |
| 313 RtcpParser parser1(kSourceSsrc, 0); | 313 RtcpParser parser1(kLocalSsrc, 0); |
| 314 EXPECT_TRUE(parser1.Parse(p1.Reader())); | 314 EXPECT_TRUE(parser1.Parse(p1.Reader())); |
| 315 EXPECT_FALSE(HasAnything(parser1)); | 315 EXPECT_FALSE(HasAnything(parser1)); |
| 316 | 316 |
| 317 TestRtcpPacketBuilder p2; | 317 TestRtcpPacketBuilder p2; |
| 318 p2.AddRr(kSenderSsrc, 1); | 318 p2.AddRr(kRemoteSsrc, 1); |
| 319 p2.AddRb(kSourceSsrc); | 319 p2.AddRb(kLocalSsrc); |
| 320 p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 320 p2.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
| 321 | 321 |
| 322 // Expected to be pass through since the sender ssrc match our local ssrc. | 322 // Expected to be pass through since the sender ssrc match our local ssrc. |
| 323 RtcpParser parser2(kSourceSsrc, kSenderSsrc); | 323 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 324 EXPECT_TRUE(parser2.Parse(p2.Reader())); | 324 EXPECT_TRUE(parser2.Parse(p2.Reader())); |
| 325 ExpectLastReport(parser2); | 325 ExpectLastReport(parser2); |
| 326 ExpectCastFeedback(parser2); | 326 ExpectCastFeedback(parser2); |
| 327 } | 327 } |
| 328 | 328 |
| 329 TEST_F(RtcpParserTest, ExtendedCastFeedbackDoesNotBreakParsing) { | 329 TEST_F(RtcpParserTest, ExtendedCastFeedbackDoesNotBreakParsing) { |
| 330 TestRtcpPacketBuilder builder; | 330 TestRtcpPacketBuilder builder; |
| 331 builder.AddRr(kSenderSsrc, 1); | 331 builder.AddRr(kRemoteSsrc, 1); |
| 332 builder.AddRb(kSourceSsrc); | 332 builder.AddRb(kLocalSsrc); |
| 333 builder.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); | 333 builder.AddCast(kRemoteSsrc, kLocalSsrc, kTargetDelay); |
| 334 builder.AddCst2(std::vector<uint32_t>{kAckFrameId + 2, kAckFrameId + 3}); | 334 builder.AddCst2(std::vector<uint32_t>{kAckFrameId + 2, kAckFrameId + 3}); |
| 335 | 335 |
| 336 // Parse should succeed with the added CST2 section in the feedback, even | 336 // Parse should succeed with the added CST2 section in the feedback, even |
| 337 // though we don't currently parse it directly. | 337 // though we don't currently parse it directly. |
| 338 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 338 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
| 339 EXPECT_TRUE(parser.Parse(builder.Reader())); | 339 EXPECT_TRUE(parser.Parse(builder.Reader())); |
| 340 ExpectLastReport(parser); | 340 ExpectLastReport(parser); |
| 341 ExpectCastFeedback(parser); | 341 ExpectCastFeedback(parser); |
| 342 } | 342 } |
| 343 | 343 |
| 344 TEST_F(RtcpParserTest, InjectReceiverReportPli) { |
| 345 // Expect to be ignored since the sender ssrc does not match. |
| 346 TestRtcpPacketBuilder builder1; |
| 347 builder1.AddPli(kUnknownSsrc, kLocalSsrc); |
| 348 RtcpParser parser1(kLocalSsrc, kRemoteSsrc); |
| 349 EXPECT_TRUE(parser1.Parse(builder1.Reader())); |
| 350 EXPECT_FALSE(parser1.has_picture_loss_indicator()); |
| 351 |
| 352 // Expect to be ignored since the receiver ssrc does not match. |
| 353 TestRtcpPacketBuilder builder2; |
| 354 builder2.AddPli(kRemoteSsrc, kUnknownSsrc); |
| 355 RtcpParser parser2(kLocalSsrc, kRemoteSsrc); |
| 356 EXPECT_TRUE(parser2.Parse(builder2.Reader())); |
| 357 EXPECT_FALSE(parser2.has_picture_loss_indicator()); |
| 358 |
| 359 TestRtcpPacketBuilder builder3; |
| 360 builder3.AddPli(kRemoteSsrc, kLocalSsrc); |
| 361 RtcpParser parser3(kLocalSsrc, kRemoteSsrc); |
| 362 EXPECT_TRUE(parser3.Parse(builder3.Reader())); |
| 363 EXPECT_TRUE(parser3.has_picture_loss_indicator()); |
| 364 } |
| 365 |
| 344 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationBase) { | 366 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationBase) { |
| 345 static const uint32_t kTimeBaseMs = 12345678; | 367 static const uint32_t kTimeBaseMs = 12345678; |
| 346 static const uint32_t kTimeDelayMs = 10; | 368 static const uint32_t kTimeDelayMs = 10; |
| 347 static const uint32_t kDelayDeltaMs = 123; | 369 static const uint32_t kDelayDeltaMs = 123; |
| 348 base::SimpleTestTickClock testing_clock; | 370 base::SimpleTestTickClock testing_clock; |
| 349 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 371 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 350 | 372 |
| 351 RtcpReceiverLogMessage receiver_log; | 373 RtcpReceiverLogMessage receiver_log; |
| 352 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); | 374 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); |
| 353 RtcpReceiverEventLogMessage event_log; | 375 RtcpReceiverEventLogMessage event_log; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 364 frame_log.event_log_messages_.push_back(event_log); | 386 frame_log.event_log_messages_.push_back(event_log); |
| 365 | 387 |
| 366 event_log.type = PACKET_RECEIVED; | 388 event_log.type = PACKET_RECEIVED; |
| 367 event_log.event_timestamp = testing_clock.NowTicks(); | 389 event_log.event_timestamp = testing_clock.NowTicks(); |
| 368 event_log.packet_id = kLostPacketId2; | 390 event_log.packet_id = kLostPacketId2; |
| 369 frame_log.event_log_messages_.push_back(event_log); | 391 frame_log.event_log_messages_.push_back(event_log); |
| 370 | 392 |
| 371 receiver_log.push_back(frame_log); | 393 receiver_log.push_back(frame_log); |
| 372 | 394 |
| 373 TestRtcpPacketBuilder p; | 395 TestRtcpPacketBuilder p; |
| 374 p.AddRr(kSenderSsrc, 1); | 396 p.AddRr(kRemoteSsrc, 1); |
| 375 p.AddRb(kSourceSsrc); | 397 p.AddRb(kLocalSsrc); |
| 376 p.AddReceiverLog(kSenderSsrc); | 398 p.AddReceiverLog(kRemoteSsrc); |
| 377 p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs); | 399 p.AddReceiverFrameLog(kRtpTimestamp, 3, kTimeBaseMs); |
| 378 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); | 400 p.AddReceiverEventLog(kDelayDeltaMs, FRAME_ACK_SENT, 0); |
| 379 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); | 401 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); |
| 380 p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs); | 402 p.AddReceiverEventLog(kLostPacketId2, PACKET_RECEIVED, kTimeDelayMs); |
| 381 | 403 |
| 382 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 404 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
| 383 EXPECT_TRUE(parser.Parse(p.Reader())); | 405 EXPECT_TRUE(parser.Parse(p.Reader())); |
| 384 ExpectReceiverLog(parser, receiver_log); | 406 ExpectReceiverLog(parser, receiver_log); |
| 385 } | 407 } |
| 386 | 408 |
| 387 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationMulti) { | 409 TEST_F(RtcpParserTest, InjectReceiverReportWithReceiverLogVerificationMulti) { |
| 388 static const uint32_t kTimeBaseMs = 12345678; | 410 static const uint32_t kTimeBaseMs = 12345678; |
| 389 static const uint32_t kTimeDelayMs = 10; | 411 static const uint32_t kTimeDelayMs = 10; |
| 390 static const int kDelayDeltaMs = 123; // To be varied for every frame. | 412 static const int kDelayDeltaMs = 123; // To be varied for every frame. |
| 391 base::SimpleTestTickClock testing_clock; | 413 base::SimpleTestTickClock testing_clock; |
| 392 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 414 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 393 | 415 |
| 394 RtcpReceiverLogMessage receiver_log; | 416 RtcpReceiverLogMessage receiver_log; |
| 395 | 417 |
| 396 for (int j = 0; j < 100; ++j) { | 418 for (int j = 0; j < 100; ++j) { |
| 397 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); | 419 RtcpReceiverFrameLogMessage frame_log(RtpTimeTicks().Expand(kRtpTimestamp)); |
| 398 RtcpReceiverEventLogMessage event_log; | 420 RtcpReceiverEventLogMessage event_log; |
| 399 event_log.type = FRAME_ACK_SENT; | 421 event_log.type = FRAME_ACK_SENT; |
| 400 event_log.event_timestamp = testing_clock.NowTicks(); | 422 event_log.event_timestamp = testing_clock.NowTicks(); |
| 401 event_log.delay_delta = | 423 event_log.delay_delta = |
| 402 base::TimeDelta::FromMilliseconds((j - 50) * kDelayDeltaMs); | 424 base::TimeDelta::FromMilliseconds((j - 50) * kDelayDeltaMs); |
| 403 frame_log.event_log_messages_.push_back(event_log); | 425 frame_log.event_log_messages_.push_back(event_log); |
| 404 receiver_log.push_back(frame_log); | 426 receiver_log.push_back(frame_log); |
| 405 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 427 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 406 } | 428 } |
| 407 | 429 |
| 408 TestRtcpPacketBuilder p; | 430 TestRtcpPacketBuilder p; |
| 409 p.AddRr(kSenderSsrc, 1); | 431 p.AddRr(kRemoteSsrc, 1); |
| 410 p.AddRb(kSourceSsrc); | 432 p.AddRb(kLocalSsrc); |
| 411 p.AddReceiverLog(kSenderSsrc); | 433 p.AddReceiverLog(kRemoteSsrc); |
| 412 for (int i = 0; i < 100; ++i) { | 434 for (int i = 0; i < 100; ++i) { |
| 413 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); | 435 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); |
| 414 const int delay = (i - 50) * kDelayDeltaMs; | 436 const int delay = (i - 50) * kDelayDeltaMs; |
| 415 p.AddReceiverEventLog(static_cast<uint16_t>(delay), FRAME_ACK_SENT, 0); | 437 p.AddReceiverEventLog(static_cast<uint16_t>(delay), FRAME_ACK_SENT, 0); |
| 416 } | 438 } |
| 417 | 439 |
| 418 RtcpParser parser(kSourceSsrc, kSenderSsrc); | 440 RtcpParser parser(kLocalSsrc, kRemoteSsrc); |
| 419 EXPECT_TRUE(parser.Parse(p.Reader())); | 441 EXPECT_TRUE(parser.Parse(p.Reader())); |
| 420 ExpectReceiverLog(parser, receiver_log); | 442 ExpectReceiverLog(parser, receiver_log); |
| 421 } | 443 } |
| 422 | 444 |
| 423 TEST(RtcpUtilityTest, NtpAndTime) { | 445 TEST(RtcpUtilityTest, NtpAndTime) { |
| 424 const int64_t kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); | 446 const int64_t kSecondsbetweenYear1900and2010 = INT64_C(40176 * 24 * 60 * 60); |
| 425 const int64_t kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); | 447 const int64_t kSecondsbetweenYear1900and2030 = INT64_C(47481 * 24 * 60 * 60); |
| 426 | 448 |
| 427 uint32_t ntp_seconds_1 = 0; | 449 uint32_t ntp_seconds_1 = 0; |
| 428 uint32_t ntp_fraction_1 = 0; | 450 uint32_t ntp_fraction_1 = 0; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); | 483 base::TimeTicks out_3 = ConvertNtpToTimeTicks(ntp_seconds_3, ntp_fraction_3); |
| 462 EXPECT_EQ(input_time, out_3); // Verify inverse. | 484 EXPECT_EQ(input_time, out_3); // Verify inverse. |
| 463 | 485 |
| 464 // Verify delta. | 486 // Verify delta. |
| 465 EXPECT_EQ((out_3 - out_2), time_delta); | 487 EXPECT_EQ((out_3 - out_2), time_delta); |
| 466 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); | 488 EXPECT_NEAR((ntp_fraction_3 - ntp_fraction_2), 0xffffffff / 2, 1); |
| 467 } | 489 } |
| 468 | 490 |
| 469 } // namespace cast | 491 } // namespace cast |
| 470 } // namespace media | 492 } // namespace media |
| OLD | NEW |