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

Side by Side Diff: webrtc/logging/rtc_event_log/rtc_event_log_unittest.cc

Issue 2997973002: Split LogRtpHeader and LogRtcpPacket into separate versions for incoming and outgoing packets.
Patch Set: Rebase Created 3 years, 3 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
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 #include <map> 11 #include <map>
12 #include <memory> 12 #include <memory>
13 #include <string> 13 #include <string>
14 #include <utility> 14 #include <utility>
15 #include <vector> 15 #include <vector>
16 16
17 #include "webrtc/call/call.h" 17 #include "webrtc/call/call.h"
18 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" 18 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
19 #include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h" 19 #include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
20 #include "webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.h" 20 #include "webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.h"
21 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor.h" 21 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor.h"
22 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h" 22 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h" 23 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
26 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" 26 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
27 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
27 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" 28 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
28 #include "webrtc/rtc_base/buffer.h" 29 #include "webrtc/rtc_base/buffer.h"
29 #include "webrtc/rtc_base/checks.h" 30 #include "webrtc/rtc_base/checks.h"
30 #include "webrtc/rtc_base/fakeclock.h" 31 #include "webrtc/rtc_base/fakeclock.h"
31 #include "webrtc/rtc_base/random.h" 32 #include "webrtc/rtc_base/random.h"
32 #include "webrtc/test/gtest.h" 33 #include "webrtc/test/gtest.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/logging/rtc_event_log/rtc_event_log.pb.h" 38 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
38 #else 39 #else
39 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h" 40 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
40 #endif 41 #endif
41 42
42 namespace webrtc { 43 namespace webrtc {
43 44
44 namespace { 45 namespace {
45 46
47 const uint8_t kTransmissionTimeOffsetExtensionId = 1;
48 const uint8_t kAbsoluteSendTimeExtensionId = 14;
49 const uint8_t kTransportSequenceNumberExtensionId = 13;
50 const uint8_t kAudioLevelExtensionId = 9;
51 const uint8_t kVideoRotationExtensionId = 5;
52
53 const uint8_t kExtensionIds[] = {
54 kTransmissionTimeOffsetExtensionId, kAbsoluteSendTimeExtensionId,
55 kTransportSequenceNumberExtensionId, kAudioLevelExtensionId,
56 kVideoRotationExtensionId};
46 const RTPExtensionType kExtensionTypes[] = { 57 const RTPExtensionType kExtensionTypes[] = {
47 RTPExtensionType::kRtpExtensionTransmissionTimeOffset, 58 RTPExtensionType::kRtpExtensionTransmissionTimeOffset,
59 RTPExtensionType::kRtpExtensionAbsoluteSendTime,
60 RTPExtensionType::kRtpExtensionTransportSequenceNumber,
48 RTPExtensionType::kRtpExtensionAudioLevel, 61 RTPExtensionType::kRtpExtensionAudioLevel,
49 RTPExtensionType::kRtpExtensionAbsoluteSendTime, 62 RTPExtensionType::kRtpExtensionVideoRotation};
50 RTPExtensionType::kRtpExtensionVideoRotation,
51 RTPExtensionType::kRtpExtensionTransportSequenceNumber};
52 const char* kExtensionNames[] = { 63 const char* kExtensionNames[] = {
53 RtpExtension::kTimestampOffsetUri, RtpExtension::kAudioLevelUri, 64 RtpExtension::kTimestampOffsetUri, RtpExtension::kAbsSendTimeUri,
54 RtpExtension::kAbsSendTimeUri, RtpExtension::kVideoRotationUri, 65 RtpExtension::kTransportSequenceNumberUri, RtpExtension::kAudioLevelUri,
55 RtpExtension::kTransportSequenceNumberUri}; 66 RtpExtension::kVideoRotationUri};
67
56 const size_t kNumExtensions = 5; 68 const size_t kNumExtensions = 5;
57 69
58 void PrintActualEvents(const ParsedRtcEventLog& parsed_log) { 70 struct BweLossEvent {
59 std::map<int, size_t> actual_event_counts; 71 int32_t bitrate_bps;
60 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { 72 uint8_t fraction_loss;
61 actual_event_counts[parsed_log.GetEventType(i)]++; 73 int32_t total_packets;
62 } 74 };
63 printf("Actual events: ");
64 for (auto kv : actual_event_counts) {
65 printf("%d_count = %zu, ", kv.first, kv.second);
66 }
67 printf("\n");
68 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) {
69 printf("%4d ", parsed_log.GetEventType(i));
70 }
71 printf("\n");
72 }
73 75
74 void PrintExpectedEvents(size_t rtp_count,
75 size_t rtcp_count,
76 size_t playout_count,
77 size_t bwe_loss_count) {
78 printf(
79 "Expected events: rtp_count = %zu, rtcp_count = %zu,"
80 "playout_count = %zu, bwe_loss_count = %zu\n",
81 rtp_count, rtcp_count, playout_count, bwe_loss_count);
82 size_t rtcp_index = 1, playout_index = 1, bwe_loss_index = 1;
83 printf("strt cfg cfg ");
84 for (size_t i = 1; i <= rtp_count; i++) {
85 printf(" rtp ");
86 if (i * rtcp_count >= rtcp_index * rtp_count) {
87 printf("rtcp ");
88 rtcp_index++;
89 }
90 if (i * playout_count >= playout_index * rtp_count) {
91 printf("play ");
92 playout_index++;
93 }
94 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) {
95 printf("loss ");
96 bwe_loss_index++;
97 }
98 }
99 printf("end \n");
100 }
101 } // namespace 76 } // namespace
102 77
103 /* 78 RtpPacketToSend GenerateOutgoingRtpPacket(
104 * Bit number i of extension_bitvector is set to indicate the 79 const RtpHeaderExtensionMap* extensions,
105 * presence of extension number i from kExtensionTypes / kExtensionNames. 80 uint32_t csrcs_count,
106 * The least significant bit extension_bitvector has number 0. 81 size_t packet_size,
107 */ 82 Random* prng) {
108 RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions,
109 uint32_t csrcs_count,
110 size_t packet_size,
111 Random* prng) {
112 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); 83 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions);
113 84
114 std::vector<uint32_t> csrcs; 85 std::vector<uint32_t> csrcs;
115 for (unsigned i = 0; i < csrcs_count; i++) { 86 for (unsigned i = 0; i < csrcs_count; i++) {
116 csrcs.push_back(prng->Rand<uint32_t>()); 87 csrcs.push_back(prng->Rand<uint32_t>());
117 } 88 }
118 89
119 RtpPacketToSend rtp_packet(extensions, packet_size); 90 RtpPacketToSend rtp_packet(extensions, packet_size);
120 rtp_packet.SetPayloadType(prng->Rand(127)); 91 rtp_packet.SetPayloadType(prng->Rand(127));
121 rtp_packet.SetMarker(prng->Rand<bool>()); 92 rtp_packet.SetMarker(prng->Rand<bool>());
122 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); 93 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>());
123 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); 94 rtp_packet.SetSsrc(prng->Rand<uint32_t>());
124 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); 95 rtp_packet.SetTimestamp(prng->Rand<uint32_t>());
125 rtp_packet.SetCsrcs(csrcs); 96 rtp_packet.SetCsrcs(csrcs);
126 97
127 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); 98 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff));
128 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); 99 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127));
129 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff)); 100 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff));
130 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); 101 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2));
131 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); 102 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>());
132 103
133 size_t payload_size = packet_size - rtp_packet.headers_size(); 104 size_t payload_size = packet_size - rtp_packet.headers_size();
134 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); 105 uint8_t* payload = rtp_packet.AllocatePayload(payload_size);
135 for (size_t i = 0; i < payload_size; i++) { 106 for (size_t i = 0; i < payload_size; i++) {
136 payload[i] = prng->Rand<uint8_t>(); 107 payload[i] = prng->Rand<uint8_t>();
137 } 108 }
138 return rtp_packet; 109 return rtp_packet;
139 } 110 }
140 111
112 RtpPacketReceived GenerateIncomingRtpPacket(
113 const RtpHeaderExtensionMap* extensions,
114 uint32_t csrcs_count,
115 size_t packet_size,
116 Random* prng) {
117 RtpPacketToSend packet_out =
118 GenerateOutgoingRtpPacket(extensions, csrcs_count, packet_size, prng);
119 RtpPacketReceived packet_in(extensions);
120 packet_in.Parse(packet_out.data(), packet_out.size());
121 return packet_in;
122 }
123
141 rtc::Buffer GenerateRtcpPacket(Random* prng) { 124 rtc::Buffer GenerateRtcpPacket(Random* prng) {
142 rtcp::ReportBlock report_block; 125 rtcp::ReportBlock report_block;
143 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC. 126 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC.
144 report_block.SetFractionLost(prng->Rand(50)); 127 report_block.SetFractionLost(prng->Rand(50));
145 128
146 rtcp::SenderReport sender_report; 129 rtcp::SenderReport sender_report;
147 sender_report.SetSenderSsrc(prng->Rand<uint32_t>()); 130 sender_report.SetSenderSsrc(prng->Rand<uint32_t>());
148 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>())); 131 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>()));
149 sender_report.SetPacketCount(prng->Rand<uint32_t>()); 132 sender_report.SetPacketCount(prng->Rand<uint32_t>());
150 sender_report.AddReportBlock(report_block); 133 sender_report.AddReportBlock(report_block);
151 134
152 return sender_report.Build(); 135 return sender_report.Build();
153 } 136 }
154 137
155 void GenerateVideoReceiveConfig(uint32_t extensions_bitvector, 138 void GenerateVideoReceiveConfig(const RtpHeaderExtensionMap& extensions,
156 rtclog::StreamConfig* config, 139 rtclog::StreamConfig* config,
157 Random* prng) { 140 Random* prng) {
158 // Add SSRCs for the stream. 141 // Add SSRCs for the stream.
159 config->remote_ssrc = prng->Rand<uint32_t>(); 142 config->remote_ssrc = prng->Rand<uint32_t>();
160 config->local_ssrc = prng->Rand<uint32_t>(); 143 config->local_ssrc = prng->Rand<uint32_t>();
161 // Add extensions and settings for RTCP. 144 // Add extensions and settings for RTCP.
162 config->rtcp_mode = 145 config->rtcp_mode =
163 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; 146 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize;
164 config->remb = prng->Rand<bool>(); 147 config->remb = prng->Rand<bool>();
165 config->rtx_ssrc = prng->Rand<uint32_t>(); 148 config->rtx_ssrc = prng->Rand<uint32_t>();
166 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", 149 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264",
167 prng->Rand(1, 127), prng->Rand(1, 127)); 150 prng->Rand(1, 127), prng->Rand(1, 127));
168 // Add header extensions. 151 // Add header extensions.
169 for (unsigned i = 0; i < kNumExtensions; i++) { 152 for (unsigned i = 0; i < kNumExtensions; i++) {
170 if (extensions_bitvector & (1u << i)) { 153 uint8_t id = extensions.GetId(kExtensionTypes[i]);
171 config->rtp_extensions.emplace_back(kExtensionNames[i], 154 if (id != RtpHeaderExtensionMap::kInvalidId) {
172 prng->Rand<int>()); 155 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
173 } 156 }
174 } 157 }
175 } 158 }
176 159
177 void GenerateVideoSendConfig(uint32_t extensions_bitvector, 160 void GenerateVideoSendConfig(const RtpHeaderExtensionMap& extensions,
178 rtclog::StreamConfig* config, 161 rtclog::StreamConfig* config,
179 Random* prng) { 162 Random* prng) {
180 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", 163 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264",
181 prng->Rand(1, 127), prng->Rand(1, 127)); 164 prng->Rand(1, 127), prng->Rand(1, 127));
182 config->local_ssrc = prng->Rand<uint32_t>(); 165 config->local_ssrc = prng->Rand<uint32_t>();
183 config->rtx_ssrc = prng->Rand<uint32_t>(); 166 config->rtx_ssrc = prng->Rand<uint32_t>();
184 // Add header extensions. 167 // Add header extensions.
185 for (unsigned i = 0; i < kNumExtensions; i++) { 168 for (unsigned i = 0; i < kNumExtensions; i++) {
186 if (extensions_bitvector & (1u << i)) { 169 uint8_t id = extensions.GetId(kExtensionTypes[i]);
187 config->rtp_extensions.push_back( 170 if (id != RtpHeaderExtensionMap::kInvalidId) {
188 RtpExtension(kExtensionNames[i], prng->Rand<int>())); 171 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
189 } 172 }
190 } 173 }
191 } 174 }
192 175
193 void GenerateAudioReceiveConfig(uint32_t extensions_bitvector, 176 void GenerateAudioReceiveConfig(const RtpHeaderExtensionMap& extensions,
194 rtclog::StreamConfig* config, 177 rtclog::StreamConfig* config,
195 Random* prng) { 178 Random* prng) {
196 // Add SSRCs for the stream. 179 // Add SSRCs for the stream.
197 config->remote_ssrc = prng->Rand<uint32_t>(); 180 config->remote_ssrc = prng->Rand<uint32_t>();
198 config->local_ssrc = prng->Rand<uint32_t>(); 181 config->local_ssrc = prng->Rand<uint32_t>();
199 // Add header extensions. 182 // Add header extensions.
200 for (unsigned i = 0; i < kNumExtensions; i++) { 183 for (unsigned i = 0; i < kNumExtensions; i++) {
201 if (extensions_bitvector & (1u << i)) { 184 uint8_t id = extensions.GetId(kExtensionTypes[i]);
202 config->rtp_extensions.push_back( 185 if (id != RtpHeaderExtensionMap::kInvalidId) {
203 RtpExtension(kExtensionNames[i], prng->Rand<int>())); 186 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
204 } 187 }
205 } 188 }
206 } 189 }
207 190
208 void GenerateAudioSendConfig(uint32_t extensions_bitvector, 191 void GenerateAudioSendConfig(const RtpHeaderExtensionMap& extensions,
209 rtclog::StreamConfig* config, 192 rtclog::StreamConfig* config,
210 Random* prng) { 193 Random* prng) {
211 // Add SSRC to the stream. 194 // Add SSRC to the stream.
212 config->local_ssrc = prng->Rand<uint32_t>(); 195 config->local_ssrc = prng->Rand<uint32_t>();
213 // Add header extensions. 196 // Add header extensions.
214 for (unsigned i = 0; i < kNumExtensions; i++) { 197 for (unsigned i = 0; i < kNumExtensions; i++) {
215 if (extensions_bitvector & (1u << i)) { 198 uint8_t id = extensions.GetId(kExtensionTypes[i]);
216 config->rtp_extensions.push_back( 199 if (id != RtpHeaderExtensionMap::kInvalidId) {
217 RtpExtension(kExtensionNames[i], prng->Rand<int>())); 200 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
218 } 201 }
219 } 202 }
220 } 203 }
221 204
222 void GenerateAudioNetworkAdaptation(uint32_t extensions_bitvector, 205 BweLossEvent GenerateBweLossEvent(Random* prng) {
206 BweLossEvent loss_event;
207 loss_event.bitrate_bps = prng->Rand(6000, 10000000);
208 loss_event.fraction_loss = prng->Rand<uint8_t>();
209 loss_event.total_packets = prng->Rand(1, 1000);
210 return loss_event;
211 }
212
213 void GenerateAudioNetworkAdaptation(const RtpHeaderExtensionMap& extensions,
223 AudioEncoderRuntimeConfig* config, 214 AudioEncoderRuntimeConfig* config,
224 Random* prng) { 215 Random* prng) {
225 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000)); 216 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000));
226 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>()); 217 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>());
227 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>()); 218 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>());
228 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120)); 219 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120));
229 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2)); 220 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2));
230 config->uplink_packet_loss_fraction = 221 config->uplink_packet_loss_fraction =
231 rtc::Optional<float>(prng->Rand<float>()); 222 rtc::Optional<float>(prng->Rand<float>());
232 } 223 }
233 224
234 // Test for the RtcEventLog class. Dumps some RTP packets and other events 225 // Test for the RtcEventLog class. Dumps some RTP packets and other events
235 // to disk, then reads them back to see if they match. 226 // to disk, then reads them back to see if they match.
236 void LogSessionAndReadBack(size_t rtp_count, 227 void LogSessionAndReadBack(size_t incoming_rtp_count,
eladalon 2017/09/05 11:57:01 IMHO, it would be good to break this function down
terelius 2017/09/07 12:53:55 Done. Created a class SessionDescription that keep
237 size_t rtcp_count, 228 size_t outgoing_rtp_count,
229 size_t incoming_rtcp_count,
230 size_t outgoing_rtcp_count,
238 size_t playout_count, 231 size_t playout_count,
239 size_t bwe_loss_count, 232 size_t bwe_loss_count,
240 uint32_t extensions_bitvector, 233 size_t bwe_delay_count,
234 const RtpHeaderExtensionMap& extensions,
241 uint32_t csrcs_count, 235 uint32_t csrcs_count,
242 unsigned int random_seed) { 236 unsigned int random_seed) {
243 ASSERT_LE(rtcp_count, rtp_count); 237 std::vector<RtpPacketReceived> incoming_rtp_packets;
244 ASSERT_LE(playout_count, rtp_count); 238 std::vector<RtpPacketToSend> outgoing_rtp_packets;
245 ASSERT_LE(bwe_loss_count, rtp_count); 239 std::vector<rtc::Buffer> incoming_rtcp_packets;
246 std::vector<RtpPacketToSend> rtp_packets; 240 std::vector<rtc::Buffer> outgoing_rtcp_packets;
247 std::vector<rtc::Buffer> rtcp_packets;
248 std::vector<uint32_t> playout_ssrcs; 241 std::vector<uint32_t> playout_ssrcs;
249 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; 242 std::vector<BweLossEvent> bwe_loss_updates;
243 std::vector<std::pair<int32_t, BandwidthUsage> > bwe_delay_updates;
250 244
251 rtclog::StreamConfig receiver_config; 245 rtclog::StreamConfig receiver_config;
252 rtclog::StreamConfig sender_config; 246 rtclog::StreamConfig sender_config;
253 247
254 Random prng(random_seed); 248 {
255 249 Random prng(random_seed);
256 // Initialize rtp header extensions to be used in generated rtp packets. 250 // Create incoming and outgoing RTP packets containing random data.
257 RtpHeaderExtensionMap extensions; 251 for (size_t i = 0; i < incoming_rtp_count; i++) {
258 for (unsigned i = 0; i < kNumExtensions; i++) { 252 size_t packet_size = prng.Rand(1000, 1100);
259 if (extensions_bitvector & (1u << i)) { 253 incoming_rtp_packets.push_back(GenerateIncomingRtpPacket(
260 extensions.Register(kExtensionTypes[i], i + 1); 254 &extensions, csrcs_count, packet_size, &prng));
261 } 255 }
256 for (size_t i = 0; i < outgoing_rtp_count; i++) {
257 size_t packet_size = prng.Rand(1000, 1100);
258 outgoing_rtp_packets.push_back(GenerateOutgoingRtpPacket(
259 &extensions, csrcs_count, packet_size, &prng));
260 }
261 // Create incoming and outgoing RTCP packets containing random data.
262 for (size_t i = 0; i < incoming_rtcp_count; i++) {
263 incoming_rtcp_packets.push_back(GenerateRtcpPacket(&prng));
264 }
265 for (size_t i = 0; i < outgoing_rtcp_count; i++) {
266 outgoing_rtcp_packets.push_back(GenerateRtcpPacket(&prng));
267 }
268 // Create random SSRCs to use when logging AudioPlayout events.
269 for (size_t i = 0; i < playout_count; i++) {
270 playout_ssrcs.push_back(prng.Rand<uint32_t>());
271 }
272 // Create random bitrate updates for LossBasedBwe.
273 for (size_t i = 0; i < bwe_loss_count; i++) {
274 bwe_loss_updates.push_back(GenerateBweLossEvent(&prng));
275 }
276 // Create random bitrate updates for DelayBasedBwe.
277 for (size_t i = 0; i < bwe_delay_count; i++) {
278 bwe_delay_updates.push_back(std::make_pair(
279 prng.Rand(6000, 10000000), prng.Rand<bool>()
280 ? BandwidthUsage::kBwOverusing
281 : BandwidthUsage::kBwUnderusing));
282 }
283 // Create configurations for the video streams.
284 GenerateVideoReceiveConfig(extensions, &receiver_config, &prng);
285 GenerateVideoSendConfig(extensions, &sender_config, &prng);
262 } 286 }
263 // Create rtp_count RTP packets containing random data.
264 for (size_t i = 0; i < rtp_count; i++) {
265 size_t packet_size = prng.Rand(1000, 1100);
266 rtp_packets.push_back(
267 GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng));
268 }
269 // Create rtcp_count RTCP packets containing random data.
270 for (size_t i = 0; i < rtcp_count; i++) {
271 rtcp_packets.push_back(GenerateRtcpPacket(&prng));
272 }
273 // Create playout_count random SSRCs to use when logging AudioPlayout events.
274 for (size_t i = 0; i < playout_count; i++) {
275 playout_ssrcs.push_back(prng.Rand<uint32_t>());
276 }
277 // Create bwe_loss_count random bitrate updates for LossBasedBwe.
278 for (size_t i = 0; i < bwe_loss_count; i++) {
279 bwe_loss_updates.push_back(
280 std::make_pair(prng.Rand<int32_t>(), prng.Rand<uint8_t>()));
281 }
282 // Create configurations for the video streams.
283 GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config, &prng);
284 GenerateVideoSendConfig(extensions_bitvector, &sender_config, &prng);
285 const int config_count = 2;
286 287
287 // Find the name of the current test, in order to use it as a temporary 288 // Find the name of the current test, in order to use it as a temporary
288 // filename. 289 // filename.
289 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 290 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
290 const std::string temp_filename = 291 const std::string temp_filename =
291 test::OutputPath() + test_info->test_case_name() + test_info->name(); 292 test::OutputPath() + test_info->test_case_name() + test_info->name();
292 293
293 // When log_dumper goes out of scope, it causes the log file to be flushed 294 // When log_dumper goes out of scope, it causes the log file to be flushed
294 // to disk. 295 // to disk.
295 { 296 {
297 Random prng(random_seed);
296 rtc::ScopedFakeClock fake_clock; 298 rtc::ScopedFakeClock fake_clock;
297 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); 299 fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
298 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); 300 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
299 log_dumper->LogVideoReceiveStreamConfig(receiver_config); 301 log_dumper->LogVideoReceiveStreamConfig(receiver_config);
300 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 302 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
301 log_dumper->LogVideoSendStreamConfig(sender_config); 303 log_dumper->LogVideoSendStreamConfig(sender_config);
304 size_t events_remaining = incoming_rtp_count + outgoing_rtp_count +
305 incoming_rtcp_count + outgoing_rtcp_count +
306 playout_count + bwe_loss_count + bwe_delay_count;
307 size_t remaining_incoming_rtp = incoming_rtp_count;
308 size_t remaining_outgoing_rtp = outgoing_rtp_count;
309 size_t remaining_incoming_rtcp = incoming_rtcp_count;
310 size_t remaining_outgoing_rtcp = outgoing_rtcp_count;
311 size_t remaining_playouts = playout_count;
312 size_t remaining_bwe_loss = bwe_loss_count;
313 size_t remaining_bwe_delay = bwe_delay_count;
314 for (; events_remaining; events_remaining--) {
315 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
316 if (events_remaining == (incoming_rtp_count + outgoing_rtp_count) / 2) {
317 log_dumper->StartLogging(temp_filename, 10000000);
318 }
319 size_t event_type = prng.Rand(0u, events_remaining - 1);
320 if (event_type < remaining_incoming_rtp) {
321 log_dumper->LogIncomingRtpHeader(
322 incoming_rtp_packets[remaining_incoming_rtp - 1]);
323 remaining_incoming_rtp--;
324 continue;
325 }
326 event_type -= remaining_incoming_rtp;
327 if (event_type < remaining_outgoing_rtp) {
328 log_dumper->LogOutgoingRtpHeader(
329 outgoing_rtp_packets[remaining_outgoing_rtp - 1],
330 PacedPacketInfo::kNotAProbe);
331 remaining_outgoing_rtp--;
332 continue;
333 }
334 event_type -= remaining_outgoing_rtp;
335 if (event_type < remaining_incoming_rtcp) {
336 log_dumper->LogIncomingRtcpPacket(rtc::ArrayView<const uint8_t>(
danilchap 2017/09/05 08:47:16 suggestion: log_dumper->LogIncomingRtcpPacket(inco
terelius 2017/09/07 12:53:55 Done.
337 incoming_rtcp_packets[remaining_incoming_rtcp - 1].data(),
338 incoming_rtcp_packets[remaining_incoming_rtcp - 1].size()));
339 remaining_incoming_rtcp--;
340 continue;
341 }
342 event_type -= remaining_incoming_rtcp;
343 if (event_type < remaining_outgoing_rtcp) {
344 log_dumper->LogOutgoingRtcpPacket(rtc::ArrayView<const uint8_t>(
345 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].data(),
346 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].size()));
347 remaining_outgoing_rtcp--;
348 continue;
349 }
350 event_type -= remaining_outgoing_rtcp;
351 if (event_type < remaining_playouts) {
352 log_dumper->LogAudioPlayout(playout_ssrcs[remaining_playouts - 1]);
353 remaining_playouts--;
354 continue;
355 }
356 event_type -= remaining_playouts;
357 if (event_type < remaining_bwe_loss) {
358 log_dumper->LogLossBasedBweUpdate(
359 bwe_loss_updates[remaining_bwe_loss - 1].bitrate_bps,
360 bwe_loss_updates[remaining_bwe_loss - 1].fraction_loss,
361 bwe_loss_updates[remaining_bwe_loss - 1].total_packets);
362 remaining_bwe_loss--;
363 continue;
364 }
365 event_type -= remaining_bwe_loss;
366 if (event_type < remaining_bwe_delay) {
367 log_dumper->LogDelayBasedBweUpdate(
368 bwe_delay_updates[remaining_bwe_delay - 1].first,
369 bwe_delay_updates[remaining_bwe_delay - 1].second);
370 remaining_bwe_delay--;
371 continue;
372 }
373 event_type -= remaining_bwe_delay;
374 RTC_NOTREACHED();
375 }
376 log_dumper->StopLogging();
377 }
378
379 // Read the file and verify that what we read back from the event log is the
380 // same as what we wrote down.
381 {
382 // Read the generated file from disk.
383 ParsedRtcEventLog parsed_log;
384 ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
385 const int config_count = 2;
386 const size_t event_count = config_count + incoming_rtp_count +
387 outgoing_rtp_count + incoming_rtcp_count +
388 outgoing_rtcp_count + playout_count +
389 bwe_loss_count + bwe_delay_count + 2;
390 EXPECT_GE(1000u, event_count); // The events must fit in the message queue.
391 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents());
392
393 Random prng(random_seed);
394 rtc::ScopedFakeClock fake_clock;
395 fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
396 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
397 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1,
398 receiver_config);
302 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 399 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
303 size_t rtcp_index = 1; 400 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2,
304 size_t playout_index = 1; 401 sender_config);
305 size_t bwe_loss_index = 1; 402 size_t events_remaining = incoming_rtp_count + outgoing_rtp_count +
306 for (size_t i = 1; i <= rtp_count; i++) { 403 incoming_rtcp_count + outgoing_rtcp_count +
307 log_dumper->LogRtpHeader( 404 playout_count + bwe_loss_count + bwe_delay_count;
308 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, 405 size_t remaining_incoming_rtp = incoming_rtp_count;
309 rtp_packets[i - 1].data(), rtp_packets[i - 1].size()); 406 size_t remaining_outgoing_rtp = outgoing_rtp_count;
407 size_t remaining_incoming_rtcp = incoming_rtcp_count;
408 size_t remaining_outgoing_rtcp = outgoing_rtcp_count;
409 size_t remaining_playouts = playout_count;
410 size_t remaining_bwe_loss = bwe_loss_count;
411 size_t remaining_bwe_delay = bwe_delay_count;
412 for (; events_remaining; events_remaining--) {
310 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 413 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
311 if (i * rtcp_count >= rtcp_index * rtp_count) { 414 size_t event_type = prng.Rand(0u, events_remaining - 1);
312 log_dumper->LogRtcpPacket( 415 if (event_type < remaining_incoming_rtp) {
313 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, 416 RtcEventLogTestHelper::VerifyRtpEvent(
314 rtcp_packets[rtcp_index - 1].data(), 417 parsed_log, event_count - events_remaining - 1, kIncomingPacket,
315 rtcp_packets[rtcp_index - 1].size()); 418 incoming_rtp_packets[remaining_incoming_rtp - 1]);
316 rtcp_index++; 419 remaining_incoming_rtp--;
317 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 420 continue;
318 } 421 }
319 if (i * playout_count >= playout_index * rtp_count) { 422 event_type -= remaining_incoming_rtp;
320 log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]); 423 if (event_type < remaining_outgoing_rtp) {
321 playout_index++; 424 RtcEventLogTestHelper::VerifyRtpEvent(
322 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 425 parsed_log, event_count - events_remaining - 1, kOutgoingPacket,
323 } 426 outgoing_rtp_packets[remaining_outgoing_rtp - 1]);
324 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { 427 remaining_outgoing_rtp--;
325 log_dumper->LogLossBasedBweUpdate( 428 continue;
326 bwe_loss_updates[bwe_loss_index - 1].first, 429 }
327 bwe_loss_updates[bwe_loss_index - 1].second, i); 430 event_type -= remaining_outgoing_rtp;
328 bwe_loss_index++; 431 if (event_type < remaining_incoming_rtcp) {
329 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 432 RtcEventLogTestHelper::VerifyRtcpEvent(
330 } 433 parsed_log, event_count - events_remaining - 1, kIncomingPacket,
331 if (i == rtp_count / 2) { 434 incoming_rtcp_packets[remaining_incoming_rtcp - 1].data(),
332 log_dumper->StartLogging(temp_filename, 10000000); 435 incoming_rtcp_packets[remaining_incoming_rtcp - 1].size());
333 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 436 remaining_incoming_rtcp--;
334 } 437 continue;
335 } 438 }
336 log_dumper->StopLogging(); 439 event_type -= remaining_incoming_rtcp;
337 } 440 if (event_type < remaining_outgoing_rtcp) {
338 441 RtcEventLogTestHelper::VerifyRtcpEvent(
339 // Read the generated file from disk. 442 parsed_log, event_count - events_remaining - 1, kOutgoingPacket,
340 ParsedRtcEventLog parsed_log; 443 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].data(),
341 444 outgoing_rtcp_packets[remaining_outgoing_rtcp - 1].size());
342 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); 445 remaining_outgoing_rtcp--;
343 446 continue;
344 // Verify that what we read back from the event log is the same as 447 }
345 // what we wrote down. For RTCP we log the full packets, but for 448 event_type -= remaining_outgoing_rtcp;
346 // RTP we should only log the header. 449 if (event_type < remaining_playouts) {
347 const size_t event_count = config_count + playout_count + bwe_loss_count + 450 RtcEventLogTestHelper::VerifyPlayoutEvent(
348 rtcp_count + rtp_count + 2; 451 parsed_log, event_count - events_remaining - 1,
349 EXPECT_GE(1000u, event_count); // The events must fit in the message queue. 452 playout_ssrcs[remaining_playouts - 1]);
350 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents()); 453 remaining_playouts--;
351 if (event_count != parsed_log.GetNumberOfEvents()) { 454 continue;
352 // Print the expected and actual event types for easier debugging. 455 }
353 PrintActualEvents(parsed_log); 456 event_type -= remaining_playouts;
354 PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count); 457 if (event_type < remaining_bwe_loss) {
355 } 458 RtcEventLogTestHelper::VerifyBweLossEvent(
356 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); 459 parsed_log, event_count - events_remaining - 1,
357 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1, 460 bwe_loss_updates[remaining_bwe_loss - 1].bitrate_bps,
358 receiver_config); 461 bwe_loss_updates[remaining_bwe_loss - 1].fraction_loss,
359 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2, 462 bwe_loss_updates[remaining_bwe_loss - 1].total_packets);
360 sender_config); 463 remaining_bwe_loss--;
361 size_t event_index = config_count + 1; 464 continue;
362 size_t rtcp_index = 1; 465 }
363 size_t playout_index = 1; 466 event_type -= remaining_bwe_loss;
364 size_t bwe_loss_index = 1; 467 if (event_type < remaining_bwe_delay) {
365 for (size_t i = 1; i <= rtp_count; i++) { 468 RtcEventLogTestHelper::VerifyBweDelayEvent(
366 RtcEventLogTestHelper::VerifyRtpEvent( 469 parsed_log, event_count - events_remaining - 1,
367 parsed_log, event_index, 470 bwe_delay_updates[remaining_bwe_delay - 1].first,
368 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, 471 bwe_delay_updates[remaining_bwe_delay - 1].second);
369 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(), 472 remaining_bwe_delay--;
370 rtp_packets[i - 1].size()); 473 continue;
371 event_index++; 474 }
372 if (i * rtcp_count >= rtcp_index * rtp_count) { 475 event_type -= remaining_bwe_delay;
373 RtcEventLogTestHelper::VerifyRtcpEvent( 476 RTC_NOTREACHED();
374 parsed_log, event_index, 477 }
375 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket, 478 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, event_count - 1);
376 rtcp_packets[rtcp_index - 1].data(), 479
377 rtcp_packets[rtcp_index - 1].size()); 480 // Clean up temporary file - can be pretty slow.
378 event_index++; 481 remove(temp_filename.c_str());
379 rtcp_index++; 482 }
380 }
381 if (i * playout_count >= playout_index * rtp_count) {
382 RtcEventLogTestHelper::VerifyPlayoutEvent(
383 parsed_log, event_index, playout_ssrcs[playout_index - 1]);
384 event_index++;
385 playout_index++;
386 }
387 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) {
388 RtcEventLogTestHelper::VerifyBweLossEvent(
389 parsed_log, event_index, bwe_loss_updates[bwe_loss_index - 1].first,
390 bwe_loss_updates[bwe_loss_index - 1].second, i);
391 event_index++;
392 bwe_loss_index++;
393 }
394 }
395
396 // Clean up temporary file - can be pretty slow.
397 remove(temp_filename.c_str());
398 } 483 }
399 484
400 TEST(RtcEventLogTest, LogSessionAndReadBack) { 485 TEST(RtcEventLogTest, LogSessionAndReadBack) {
401 // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events 486 RtpHeaderExtensionMap extensions;
402 // with no header extensions or CSRCS. 487 LogSessionAndReadBack(3, // Number of incoming RTP packets.
eladalon 2017/09/05 11:57:01 One hack you could employ would be to define enums
terelius 2017/09/07 12:53:55 Seems like overkill imo.
403 LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321); 488 2, // Number of outgoing RTP packets.
404 489 1, // Number of incoming RTCP packets.
405 // Enable AbsSendTime and TransportSequenceNumbers. 490 1, // Number of outgoing RTCP packets.
406 uint32_t extensions = 0; 491 0, // Number of playout events.
492 0, // Number of BWE loss events.
493 0, // Number of BWE delay events.
494 extensions, // No extensions.
495 0, // Number of contributing sources.
496 321); // Random seed.
497 }
498
499 TEST(RtcEventLogTest, LogSessionAndReadBackWith2Extensions) {
500 RtpHeaderExtensionMap extensions;
501 extensions.Register(kRtpExtensionAbsoluteSendTime,
502 kAbsoluteSendTimeExtensionId);
503 extensions.Register(kRtpExtensionTransportSequenceNumber,
504 kTransportSequenceNumberExtensionId);
505 LogSessionAndReadBack(4, 4, 1, 1, 0, 0, 0, extensions, 0, 3141592653u);
506 }
507
508 TEST(RtcEventLogTest, LogSessionAndReadBackWithAllExtensions) {
509 RtpHeaderExtensionMap extensions;
407 for (uint32_t i = 0; i < kNumExtensions; i++) { 510 for (uint32_t i = 0; i < kNumExtensions; i++) {
408 if (kExtensionTypes[i] == RTPExtensionType::kRtpExtensionAbsoluteSendTime || 511 extensions.Register(kExtensionTypes[i], kExtensionIds[i]);
409 kExtensionTypes[i] == 512 }
410 RTPExtensionType::kRtpExtensionTransportSequenceNumber) { 513 LogSessionAndReadBack(5, 4, 1, 1, 3, 2, 2, extensions, 2, 2718281828u);
411 extensions |= 1u << i; 514 }
412 } 515
413 } 516 TEST(RtcEventLogTest, LogSessionAndReadBackAllCombinations) {
414 LogSessionAndReadBack(8, 2, 0, 0, extensions, 0, 3141592653u);
415
416 extensions = (1u << kNumExtensions) - 1; // Enable all header extensions.
417 LogSessionAndReadBack(9, 2, 3, 2, extensions, 2, 2718281828u);
418
419 // Try all combinations of header extensions and up to 2 CSRCS. 517 // Try all combinations of header extensions and up to 2 CSRCS.
420 for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) { 518 for (uint32_t extension_selection = 0;
519 extension_selection < (1u << kNumExtensions); extension_selection++) {
520 RtpHeaderExtensionMap extensions;
521 for (uint32_t i = 0; i < kNumExtensions; i++) {
522 if (extension_selection & (1u << i)) {
523 extensions.Register(kExtensionTypes[i], kExtensionIds[i]);
524 }
525 }
421 for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) { 526 for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) {
422 LogSessionAndReadBack(5 + extensions, // Number of RTP packets. 527 LogSessionAndReadBack(
423 2 + csrcs_count, // Number of RTCP packets. 528 2 + extension_selection, // Number of incoming RTP packets.
424 3 + csrcs_count, // Number of playout events. 529 2 + extension_selection, // Number of outgoing RTP packets.
425 1 + csrcs_count, // Number of BWE loss events. 530 1 + csrcs_count, // Number of incoming RTCP packets.
426 extensions, // Bit vector choosing extensions. 531 1 + csrcs_count, // Number of outgoing RTCP packets.
427 csrcs_count, // Number of contributing sources. 532 3 + csrcs_count, // Number of playout events.
428 extensions * 3 + csrcs_count + 1); // Random seed. 533 1 + csrcs_count, // Number of BWE loss events.
429 } 534 2 + csrcs_count, // Number of BWE delay events.
430 } 535 extensions, // Bit vector choosing extensions.
431 } 536 csrcs_count, // Number of contributing sources.
537 extension_selection * 3 + csrcs_count + 1); // Random seed.
538 }
539 }
540 }
432 541
433 TEST(RtcEventLogTest, LogEventAndReadBack) { 542 TEST(RtcEventLogTest, LogEventAndReadBack) {
434 Random prng(987654321); 543 Random prng(987654321);
435 544
436 // Create one RTP and one RTCP packet containing random data. 545 // Create one RTP and one RTCP packet containing random data.
437 size_t packet_size = prng.Rand(1000, 1100); 546 size_t packet_size = prng.Rand(1000, 1100);
438 RtpPacketToSend rtp_packet = 547 RtpPacketReceived rtp_packet =
439 GenerateRtpPacket(nullptr, 0, packet_size, &prng); 548 GenerateIncomingRtpPacket(nullptr, 0, packet_size, &prng);
440 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); 549 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng);
441 550
442 // Find the name of the current test, in order to use it as a temporary 551 // Find the name of the current test, in order to use it as a temporary
443 // filename. 552 // filename.
444 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 553 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
445 const std::string temp_filename = 554 const std::string temp_filename =
446 test::OutputPath() + test_info->test_case_name() + test_info->name(); 555 test::OutputPath() + test_info->test_case_name() + test_info->name();
447 556
448 // Add RTP, start logging, add RTCP and then stop logging 557 // Add RTP, start logging, add RTCP and then stop logging
449 rtc::ScopedFakeClock fake_clock; 558 rtc::ScopedFakeClock fake_clock;
450 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); 559 fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
451 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); 560 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
452 561
453 log_dumper->LogRtpHeader(kIncomingPacket, rtp_packet.data(), 562 log_dumper->LogIncomingRtpHeader(rtp_packet);
454 rtp_packet.size());
455 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 563 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
456 564
457 log_dumper->StartLogging(temp_filename, 10000000); 565 log_dumper->StartLogging(temp_filename, 10000000);
458 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 566 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
459 567
460 log_dumper->LogRtcpPacket(kOutgoingPacket, rtcp_packet.data(), 568 log_dumper->LogOutgoingRtcpPacket(
461 rtcp_packet.size()); 569 rtc::ArrayView<const uint8_t>(rtcp_packet.data(), rtcp_packet.size()));
danilchap 2017/09/05 08:47:16 rtc::Buffer is implicitly convertable to rtc::Arra
terelius 2017/09/07 12:53:55 Done.
462 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 570 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
463 571
464 log_dumper->StopLogging(); 572 log_dumper->StopLogging();
465 573
466 // Read the generated file from disk. 574 // Read the generated file from disk.
467 ParsedRtcEventLog parsed_log; 575 ParsedRtcEventLog parsed_log;
468 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); 576 ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
469 577
470 // Verify that what we read back from the event log is the same as 578 // Verify that what we read back from the event log is the same as
471 // what we wrote down. 579 // what we wrote down.
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4); 821 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4);
714 822
715 // Clean up temporary file - can be pretty slow. 823 // Clean up temporary file - can be pretty slow.
716 remove(temp_filename.c_str()); 824 remove(temp_filename.c_str());
717 } 825 }
718 826
719 class ConfigReadWriteTest { 827 class ConfigReadWriteTest {
720 public: 828 public:
721 ConfigReadWriteTest() : prng(987654321) {} 829 ConfigReadWriteTest() : prng(987654321) {}
722 virtual ~ConfigReadWriteTest() {} 830 virtual ~ConfigReadWriteTest() {}
723 virtual void GenerateConfig(uint32_t extensions_bitvector) = 0; 831 virtual void GenerateConfig(const RtpHeaderExtensionMap& extensions) = 0;
724 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, 832 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log,
725 size_t index) = 0; 833 size_t index) = 0;
726 virtual void LogConfig(RtcEventLog* event_log) = 0; 834 virtual void LogConfig(RtcEventLog* event_log) = 0;
727 835
728 void DoTest() { 836 void DoTest() {
729 // Find the name of the current test, in order to use it as a temporary 837 // Find the name of the current test, in order to use it as a temporary
730 // filename. 838 // filename.
731 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 839 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
732 const std::string temp_filename = 840 const std::string temp_filename =
733 test::OutputPath() + test_info->test_case_name() + test_info->name(); 841 test::OutputPath() + test_info->test_case_name() + test_info->name();
734 842
735 // Use all extensions. 843 // Use all extensions.
736 uint32_t extensions_bitvector = (1u << kNumExtensions) - 1; 844 RtpHeaderExtensionMap extensions;
737 GenerateConfig(extensions_bitvector); 845 for (uint32_t i = 0; i < kNumExtensions; i++) {
846 extensions.Register(kExtensionTypes[i], kExtensionIds[i]);
847 }
848 GenerateConfig(extensions);
738 849
739 // Log a single config event and stop logging. 850 // Log a single config event and stop logging.
740 rtc::ScopedFakeClock fake_clock; 851 rtc::ScopedFakeClock fake_clock;
741 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); 852 fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
742 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); 853 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
743 854
744 log_dumper->StartLogging(temp_filename, 10000000); 855 log_dumper->StartLogging(temp_filename, 10000000);
745 LogConfig(log_dumper.get()); 856 LogConfig(log_dumper.get());
746 log_dumper->StopLogging(); 857 log_dumper->StopLogging();
747 858
(...skipping 12 matching lines...) Expand all
760 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); 871 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2);
761 872
762 // Clean up temporary file - can be pretty slow. 873 // Clean up temporary file - can be pretty slow.
763 remove(temp_filename.c_str()); 874 remove(temp_filename.c_str());
764 } 875 }
765 Random prng; 876 Random prng;
766 }; 877 };
767 878
768 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { 879 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest {
769 public: 880 public:
770 void GenerateConfig(uint32_t extensions_bitvector) override { 881 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
771 GenerateAudioReceiveConfig(extensions_bitvector, &config, &prng); 882 GenerateAudioReceiveConfig(extensions, &config, &prng);
772 } 883 }
773 void LogConfig(RtcEventLog* event_log) override { 884 void LogConfig(RtcEventLog* event_log) override {
774 event_log->LogAudioReceiveStreamConfig(config); 885 event_log->LogAudioReceiveStreamConfig(config);
775 } 886 }
776 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 887 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
777 size_t index) override { 888 size_t index) override {
778 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, 889 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index,
779 config); 890 config);
780 } 891 }
781 rtclog::StreamConfig config; 892 rtclog::StreamConfig config;
782 }; 893 };
783 894
784 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { 895 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest {
785 public: 896 public:
786 AudioSendConfigReadWriteTest() {} 897 AudioSendConfigReadWriteTest() {}
787 void GenerateConfig(uint32_t extensions_bitvector) override { 898 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
788 GenerateAudioSendConfig(extensions_bitvector, &config, &prng); 899 GenerateAudioSendConfig(extensions, &config, &prng);
789 } 900 }
790 void LogConfig(RtcEventLog* event_log) override { 901 void LogConfig(RtcEventLog* event_log) override {
791 event_log->LogAudioSendStreamConfig(config); 902 event_log->LogAudioSendStreamConfig(config);
792 } 903 }
793 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 904 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
794 size_t index) override { 905 size_t index) override {
795 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, 906 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index,
796 config); 907 config);
797 } 908 }
798 rtclog::StreamConfig config; 909 rtclog::StreamConfig config;
799 }; 910 };
800 911
801 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { 912 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest {
802 public: 913 public:
803 VideoReceiveConfigReadWriteTest() {} 914 VideoReceiveConfigReadWriteTest() {}
804 void GenerateConfig(uint32_t extensions_bitvector) override { 915 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
805 GenerateVideoReceiveConfig(extensions_bitvector, &config, &prng); 916 GenerateVideoReceiveConfig(extensions, &config, &prng);
806 } 917 }
807 void LogConfig(RtcEventLog* event_log) override { 918 void LogConfig(RtcEventLog* event_log) override {
808 event_log->LogVideoReceiveStreamConfig(config); 919 event_log->LogVideoReceiveStreamConfig(config);
809 } 920 }
810 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 921 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
811 size_t index) override { 922 size_t index) override {
812 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, 923 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index,
813 config); 924 config);
814 } 925 }
815 rtclog::StreamConfig config; 926 rtclog::StreamConfig config;
816 }; 927 };
817 928
818 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { 929 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest {
819 public: 930 public:
820 VideoSendConfigReadWriteTest() {} 931 VideoSendConfigReadWriteTest() {}
821 void GenerateConfig(uint32_t extensions_bitvector) override { 932 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
822 GenerateVideoSendConfig(extensions_bitvector, &config, &prng); 933 GenerateVideoSendConfig(extensions, &config, &prng);
823 } 934 }
824 void LogConfig(RtcEventLog* event_log) override { 935 void LogConfig(RtcEventLog* event_log) override {
825 event_log->LogVideoSendStreamConfig(config); 936 event_log->LogVideoSendStreamConfig(config);
826 } 937 }
827 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 938 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
828 size_t index) override { 939 size_t index) override {
829 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, 940 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index,
830 config); 941 config);
831 } 942 }
832 rtclog::StreamConfig config; 943 rtclog::StreamConfig config;
833 }; 944 };
834 945
835 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest { 946 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest {
836 public: 947 public:
837 void GenerateConfig(uint32_t extensions_bitvector) override { 948 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
838 GenerateAudioNetworkAdaptation(extensions_bitvector, &config, &prng); 949 GenerateAudioNetworkAdaptation(extensions, &config, &prng);
839 } 950 }
840 void LogConfig(RtcEventLog* event_log) override { 951 void LogConfig(RtcEventLog* event_log) override {
841 event_log->LogAudioNetworkAdaptation(config); 952 event_log->LogAudioNetworkAdaptation(config);
842 } 953 }
843 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 954 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
844 size_t index) override { 955 size_t index) override {
845 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index, 956 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index,
846 config); 957 config);
847 } 958 }
848 AudioEncoderRuntimeConfig config; 959 AudioEncoderRuntimeConfig config;
(...skipping 18 matching lines...) Expand all
867 VideoSendConfigReadWriteTest test; 978 VideoSendConfigReadWriteTest test;
868 test.DoTest(); 979 test.DoTest();
869 } 980 }
870 981
871 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) { 982 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) {
872 AudioNetworkAdaptationReadWriteTest test; 983 AudioNetworkAdaptationReadWriteTest test;
873 test.DoTest(); 984 test.DoTest();
874 } 985 }
875 986
876 } // namespace webrtc 987 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698