Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(974)

Side by Side Diff: webrtc/call/rtc_event_log_unittest.cc

Issue 2228493002: Generate random rtp packets with RtpPacketToSend instead of RtpSender (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 #ifdef ENABLE_RTC_EVENT_LOG 11 #ifdef ENABLE_RTC_EVENT_LOG
12 12
13 #include <map> 13 #include <map>
14 #include <memory> 14 #include <memory>
15 #include <string> 15 #include <string>
16 #include <utility> 16 #include <utility>
17 #include <vector> 17 #include <vector>
18 18
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "webrtc/base/buffer.h" 20 #include "webrtc/base/buffer.h"
21 #include "webrtc/base/checks.h" 21 #include "webrtc/base/checks.h"
22 #include "webrtc/base/random.h" 22 #include "webrtc/base/random.h"
23 #include "webrtc/base/rate_limiter.h"
24 #include "webrtc/call.h" 23 #include "webrtc/call.h"
25 #include "webrtc/call/rtc_event_log.h" 24 #include "webrtc/call/rtc_event_log.h"
26 #include "webrtc/call/rtc_event_log_parser.h" 25 #include "webrtc/call/rtc_event_log_parser.h"
27 #include "webrtc/call/rtc_event_log_unittest_helper.h" 26 #include "webrtc/call/rtc_event_log_unittest_helper.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" 29 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
31 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
31 #include "webrtc/system_wrappers/include/clock.h" 32 #include "webrtc/system_wrappers/include/clock.h"
32 #include "webrtc/test/test_suite.h" 33 #include "webrtc/test/test_suite.h"
33 #include "webrtc/test/testsupport/fileutils.h" 34 #include "webrtc/test/testsupport/fileutils.h"
34 35
35 // Files generated at build-time by the protobuf compiler. 36 // Files generated at build-time by the protobuf compiler.
36 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD 37 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD
37 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h" 38 #include "external/webrtc/webrtc/call/rtc_event_log.pb.h"
38 #else 39 #else
39 #include "webrtc/call/rtc_event_log.pb.h" 40 #include "webrtc/call/rtc_event_log.pb.h"
40 #endif 41 #endif
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 } 99 }
99 printf("end \n"); 100 printf("end \n");
100 } 101 }
101 } // namespace 102 } // namespace
102 103
103 /* 104 /*
104 * Bit number i of extension_bitvector is set to indicate the 105 * Bit number i of extension_bitvector is set to indicate the
105 * presence of extension number i from kExtensionTypes / kExtensionNames. 106 * presence of extension number i from kExtensionTypes / kExtensionNames.
106 * The least significant bit extension_bitvector has number 0. 107 * The least significant bit extension_bitvector has number 0.
107 */ 108 */
108 size_t GenerateRtpPacket(uint32_t extensions_bitvector, 109 RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions,
109 uint32_t csrcs_count, 110 uint32_t csrcs_count,
110 uint8_t* packet, 111 size_t packet_size,
111 size_t packet_size, 112 Random* prng) {
112 Random* prng) {
113 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); 113 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions);
114 Clock* clock = Clock::GetRealTimeClock();
115 RateLimiter retranmission_rate_limiter(clock, 1000);
116
117 RTPSender rtp_sender(false, // bool audio
118 clock, // Clock* clock
119 nullptr, // Transport*
120 nullptr, // PacedSender*
121 nullptr, // PacketRouter*
122 nullptr, // SendTimeObserver*
123 nullptr, // BitrateStatisticsObserver*
124 nullptr, // FrameCountObserver*
125 nullptr, // SendSideDelayObserver*
126 nullptr, // RtcEventLog*
127 nullptr, // SendPacketObserver*
128 &retranmission_rate_limiter);
129 114
130 std::vector<uint32_t> csrcs; 115 std::vector<uint32_t> csrcs;
131 for (unsigned i = 0; i < csrcs_count; i++) { 116 for (unsigned i = 0; i < csrcs_count; i++) {
132 csrcs.push_back(prng->Rand<uint32_t>()); 117 csrcs.push_back(prng->Rand<uint32_t>());
133 } 118 }
134 rtp_sender.SetCsrcs(csrcs);
135 rtp_sender.SetSSRC(prng->Rand<uint32_t>());
136 rtp_sender.SetStartTimestamp(prng->Rand<uint32_t>(), true);
137 rtp_sender.SetSequenceNumber(prng->Rand<uint16_t>());
138 119
139 for (unsigned i = 0; i < kNumExtensions; i++) { 120 RtpPacketToSend rtp_packet(extensions, packet_size);
140 if (extensions_bitvector & (1u << i)) { 121 rtp_packet.SetPayloadType(prng->Rand(127));
141 rtp_sender.RegisterRtpHeaderExtension(kExtensionTypes[i], i + 1); 122 rtp_packet.SetMarker(prng->Rand<bool>());
142 } 123 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>());
124 rtp_packet.SetSsrc(prng->Rand<uint32_t>());
125 rtp_packet.SetTimestamp(prng->Rand<uint32_t>());
126 rtp_packet.SetCsrcs(csrcs);
127
128 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff));
terelius 2016/08/09 11:43:00 These functions set the extension if and only if t
danilchap 2016/08/09 12:49:23 In this case (calling functions before setting pay
terelius 2016/08/09 13:31:32 So you can only set new extensions before payload,
129 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127));
130 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand<int32_t>());
131 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2));
132 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>());
133
134 size_t payload_size = packet_size - rtp_packet.headers_size();
135 uint8_t* payload = rtp_packet.AllocatePayload(payload_size);
136 for (size_t i = 0; i < payload_size; i++) {
137 payload[i] = prng->Rand<uint8_t>();
143 } 138 }
144 139 return rtp_packet;
145 int8_t payload_type = prng->Rand(0, 127);
146 bool marker_bit = prng->Rand<bool>();
147 uint32_t capture_timestamp = prng->Rand<uint32_t>();
148 int64_t capture_time_ms = prng->Rand<uint32_t>();
149
150 size_t header_size = rtp_sender.BuildRtpHeader(
151 packet, payload_type, marker_bit, capture_timestamp, capture_time_ms);
152 for (size_t i = header_size; i < packet_size; i++) {
153 packet[i] = prng->Rand<uint8_t>();
154 }
155
156 return header_size;
157 } 140 }
158 141
159 rtc::Buffer GenerateRtcpPacket(Random* prng) { 142 rtc::Buffer GenerateRtcpPacket(Random* prng) {
160 rtcp::ReportBlock report_block; 143 rtcp::ReportBlock report_block;
161 report_block.To(prng->Rand<uint32_t>()); // Remote SSRC. 144 report_block.To(prng->Rand<uint32_t>()); // Remote SSRC.
162 report_block.WithFractionLost(prng->Rand(50)); 145 report_block.WithFractionLost(prng->Rand(50));
163 146
164 rtcp::SenderReport sender_report; 147 rtcp::SenderReport sender_report;
165 sender_report.From(prng->Rand<uint32_t>()); // Sender SSRC. 148 sender_report.From(prng->Rand<uint32_t>()); // Sender SSRC.
166 sender_report.WithNtp( 149 sender_report.WithNtp(
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 void LogSessionAndReadBack(size_t rtp_count, 208 void LogSessionAndReadBack(size_t rtp_count,
226 size_t rtcp_count, 209 size_t rtcp_count,
227 size_t playout_count, 210 size_t playout_count,
228 size_t bwe_loss_count, 211 size_t bwe_loss_count,
229 uint32_t extensions_bitvector, 212 uint32_t extensions_bitvector,
230 uint32_t csrcs_count, 213 uint32_t csrcs_count,
231 unsigned int random_seed) { 214 unsigned int random_seed) {
232 ASSERT_LE(rtcp_count, rtp_count); 215 ASSERT_LE(rtcp_count, rtp_count);
233 ASSERT_LE(playout_count, rtp_count); 216 ASSERT_LE(playout_count, rtp_count);
234 ASSERT_LE(bwe_loss_count, rtp_count); 217 ASSERT_LE(bwe_loss_count, rtp_count);
235 std::vector<rtc::Buffer> rtp_packets; 218 std::vector<RtpPacketToSend> rtp_packets;
236 std::vector<rtc::Buffer> rtcp_packets; 219 std::vector<rtc::Buffer> rtcp_packets;
237 std::vector<size_t> rtp_header_sizes;
238 std::vector<uint32_t> playout_ssrcs; 220 std::vector<uint32_t> playout_ssrcs;
239 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; 221 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates;
240 222
241 VideoReceiveStream::Config receiver_config(nullptr); 223 VideoReceiveStream::Config receiver_config(nullptr);
242 VideoSendStream::Config sender_config(nullptr); 224 VideoSendStream::Config sender_config(nullptr);
243 225
244 Random prng(random_seed); 226 Random prng(random_seed);
245 227
228 // Initialize rtp header extensions to be used in generated rtp packets.
229 RtpHeaderExtensionMap extensions;
230 for (unsigned i = 0; i < kNumExtensions; i++) {
231 if (extensions_bitvector & (1u << i)) {
232 extensions.Register(kExtensionTypes[i], i + 1);
233 }
234 }
246 // Create rtp_count RTP packets containing random data. 235 // Create rtp_count RTP packets containing random data.
247 for (size_t i = 0; i < rtp_count; i++) { 236 for (size_t i = 0; i < rtp_count; i++) {
248 size_t packet_size = prng.Rand(1000, 1100); 237 size_t packet_size = prng.Rand(1000, 1100);
249 rtp_packets.push_back(rtc::Buffer(packet_size)); 238 rtp_packets.push_back(
250 size_t header_size = 239 GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng));
251 GenerateRtpPacket(extensions_bitvector, csrcs_count,
252 rtp_packets[i].data(), packet_size, &prng);
253 rtp_header_sizes.push_back(header_size);
254 } 240 }
255 // Create rtcp_count RTCP packets containing random data. 241 // Create rtcp_count RTCP packets containing random data.
256 for (size_t i = 0; i < rtcp_count; i++) { 242 for (size_t i = 0; i < rtcp_count; i++) {
257 rtcp_packets.push_back(GenerateRtcpPacket(&prng)); 243 rtcp_packets.push_back(GenerateRtcpPacket(&prng));
258 } 244 }
259 // Create playout_count random SSRCs to use when logging AudioPlayout events. 245 // Create playout_count random SSRCs to use when logging AudioPlayout events.
260 for (size_t i = 0; i < playout_count; i++) { 246 for (size_t i = 0; i < playout_count; i++) {
261 playout_ssrcs.push_back(prng.Rand<uint32_t>()); 247 playout_ssrcs.push_back(prng.Rand<uint32_t>());
262 } 248 }
263 // Create bwe_loss_count random bitrate updates for BwePacketLoss. 249 // Create bwe_loss_count random bitrate updates for BwePacketLoss.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 RtcEventLogTestHelper::VerifySendStreamConfig(parsed_log, 2, sender_config); 332 RtcEventLogTestHelper::VerifySendStreamConfig(parsed_log, 2, sender_config);
347 size_t event_index = config_count + 1; 333 size_t event_index = config_count + 1;
348 size_t rtcp_index = 1; 334 size_t rtcp_index = 1;
349 size_t playout_index = 1; 335 size_t playout_index = 1;
350 size_t bwe_loss_index = 1; 336 size_t bwe_loss_index = 1;
351 for (size_t i = 1; i <= rtp_count; i++) { 337 for (size_t i = 1; i <= rtp_count; i++) {
352 RtcEventLogTestHelper::VerifyRtpEvent( 338 RtcEventLogTestHelper::VerifyRtpEvent(
353 parsed_log, event_index, 339 parsed_log, event_index,
354 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, 340 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket,
355 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, 341 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO,
356 rtp_packets[i - 1].data(), rtp_header_sizes[i - 1], 342 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(),
357 rtp_packets[i - 1].size()); 343 rtp_packets[i - 1].size());
358 event_index++; 344 event_index++;
359 if (i * rtcp_count >= rtcp_index * rtp_count) { 345 if (i * rtcp_count >= rtcp_index * rtp_count) {
360 RtcEventLogTestHelper::VerifyRtcpEvent( 346 RtcEventLogTestHelper::VerifyRtcpEvent(
361 parsed_log, event_index, 347 parsed_log, event_index,
362 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket, 348 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket,
363 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, 349 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO,
364 rtcp_packets[rtcp_index - 1].data(), 350 rtcp_packets[rtcp_index - 1].data(),
365 rtcp_packets[rtcp_index - 1].size()); 351 rtcp_packets[rtcp_index - 1].size());
366 event_index++; 352 event_index++;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 extensions * 3 + csrcs_count + 1); // Random seed. 402 extensions * 3 + csrcs_count + 1); // Random seed.
417 } 403 }
418 } 404 }
419 } 405 }
420 406
421 TEST(RtcEventLogTest, LogEventAndReadBack) { 407 TEST(RtcEventLogTest, LogEventAndReadBack) {
422 Random prng(987654321); 408 Random prng(987654321);
423 409
424 // Create one RTP and one RTCP packet containing random data. 410 // Create one RTP and one RTCP packet containing random data.
425 size_t packet_size = prng.Rand(1000, 1100); 411 size_t packet_size = prng.Rand(1000, 1100);
426 rtc::Buffer rtp_packet(packet_size); 412 RtpPacketToSend rtp_packet =
427 size_t header_size = 413 GenerateRtpPacket(nullptr, 0, packet_size, &prng);
428 GenerateRtpPacket(0, 0, rtp_packet.data(), packet_size, &prng);
429 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); 414 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng);
430 415
431 // Find the name of the current test, in order to use it as a temporary 416 // Find the name of the current test, in order to use it as a temporary
432 // filename. 417 // filename.
433 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 418 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
434 const std::string temp_filename = 419 const std::string temp_filename =
435 test::OutputPath() + test_info->test_case_name() + test_info->name(); 420 test::OutputPath() + test_info->test_case_name() + test_info->name();
436 421
437 // Add RTP, start logging, add RTCP and then stop logging 422 // Add RTP, start logging, add RTCP and then stop logging
438 SimulatedClock fake_clock(prng.Rand<uint32_t>()); 423 SimulatedClock fake_clock(prng.Rand<uint32_t>());
(...skipping 15 matching lines...) Expand all
454 // Read the generated file from disk. 439 // Read the generated file from disk.
455 ParsedRtcEventLog parsed_log; 440 ParsedRtcEventLog parsed_log;
456 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); 441 ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
457 442
458 // Verify that what we read back from the event log is the same as 443 // Verify that what we read back from the event log is the same as
459 // what we wrote down. 444 // what we wrote down.
460 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents()); 445 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents());
461 446
462 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); 447 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
463 448
464 RtcEventLogTestHelper::VerifyRtpEvent(parsed_log, 1, kIncomingPacket, 449 RtcEventLogTestHelper::VerifyRtpEvent(
465 MediaType::VIDEO, rtp_packet.data(), 450 parsed_log, 1, kIncomingPacket, MediaType::VIDEO, rtp_packet.data(),
466 header_size, rtp_packet.size()); 451 rtp_packet.headers_size(), rtp_packet.size());
467 452
468 RtcEventLogTestHelper::VerifyRtcpEvent(parsed_log, 2, kOutgoingPacket, 453 RtcEventLogTestHelper::VerifyRtcpEvent(parsed_log, 2, kOutgoingPacket,
469 MediaType::VIDEO, rtcp_packet.data(), 454 MediaType::VIDEO, rtcp_packet.data(),
470 rtcp_packet.size()); 455 rtcp_packet.size());
471 456
472 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); 457 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3);
473 458
474 // Clean up temporary file - can be pretty slow. 459 // Clean up temporary file - can be pretty slow.
475 remove(temp_filename.c_str()); 460 remove(temp_filename.c_str());
476 } 461 }
477 } // namespace webrtc 462 } // namespace webrtc
478 463
479 #endif // ENABLE_RTC_EVENT_LOG 464 #endif // ENABLE_RTC_EVENT_LOG
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698