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

Side by Side Diff: 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: Split VerifyRtpEvent into one incoming and one outgoing version. Created 3 years, 2 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 <ostream>
13 #include <string> 14 #include <string>
14 #include <utility> 15 #include <utility>
15 #include <vector> 16 #include <vector>
16 17
17 #include "call/call.h" 18 #include "call/call.h"
18 #include "logging/rtc_event_log/rtc_event_log.h" 19 #include "logging/rtc_event_log/rtc_event_log.h"
19 #include "logging/rtc_event_log/rtc_event_log_parser.h" 20 #include "logging/rtc_event_log/rtc_event_log_parser.h"
20 #include "logging/rtc_event_log/rtc_event_log_unittest_helper.h" 21 #include "logging/rtc_event_log/rtc_event_log_unittest_helper.h"
21 #include "logging/rtc_event_log/rtc_stream_config.h" 22 #include "logging/rtc_event_log/rtc_stream_config.h"
22 #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adapt or.h" 23 #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adapt or.h"
23 #include "modules/remote_bitrate_estimator/include/bwe_defines.h" 24 #include "modules/remote_bitrate_estimator/include/bwe_defines.h"
24 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" 25 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
25 #include "modules/rtp_rtcp/source/rtcp_packet.h" 26 #include "modules/rtp_rtcp/source/rtcp_packet.h"
26 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" 27 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
27 #include "modules/rtp_rtcp/source/rtp_header_extensions.h" 28 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
29 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
28 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" 30 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
29 #include "rtc_base/buffer.h" 31 #include "rtc_base/buffer.h"
30 #include "rtc_base/checks.h" 32 #include "rtc_base/checks.h"
31 #include "rtc_base/fakeclock.h" 33 #include "rtc_base/fakeclock.h"
34 #include "rtc_base/ptr_util.h"
32 #include "rtc_base/random.h" 35 #include "rtc_base/random.h"
36 #include "system_wrappers/include/sleep.h" // TODO(terelius): Remove this.
33 #include "test/gtest.h" 37 #include "test/gtest.h"
34 #include "test/testsupport/fileutils.h" 38 #include "test/testsupport/fileutils.h"
35 39
36 // Files generated at build-time by the protobuf compiler. 40 // Files generated at build-time by the protobuf compiler.
37 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD 41 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD
38 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h" 42 #include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
39 #else 43 #else
40 #include "logging/rtc_event_log/rtc_event_log.pb.h" 44 #include "logging/rtc_event_log/rtc_event_log.pb.h"
41 #endif 45 #endif
42 46
43 namespace webrtc { 47 namespace webrtc {
44 48
45 namespace { 49 namespace {
46 50
51 const uint8_t kTransmissionTimeOffsetExtensionId = 1;
52 const uint8_t kAbsoluteSendTimeExtensionId = 14;
53 const uint8_t kTransportSequenceNumberExtensionId = 13;
54 const uint8_t kAudioLevelExtensionId = 9;
55 const uint8_t kVideoRotationExtensionId = 5;
56
57 const uint8_t kExtensionIds[] = {
58 kTransmissionTimeOffsetExtensionId, kAbsoluteSendTimeExtensionId,
59 kTransportSequenceNumberExtensionId, kAudioLevelExtensionId,
60 kVideoRotationExtensionId};
47 const RTPExtensionType kExtensionTypes[] = { 61 const RTPExtensionType kExtensionTypes[] = {
48 RTPExtensionType::kRtpExtensionTransmissionTimeOffset, 62 RTPExtensionType::kRtpExtensionTransmissionTimeOffset,
63 RTPExtensionType::kRtpExtensionAbsoluteSendTime,
64 RTPExtensionType::kRtpExtensionTransportSequenceNumber,
49 RTPExtensionType::kRtpExtensionAudioLevel, 65 RTPExtensionType::kRtpExtensionAudioLevel,
50 RTPExtensionType::kRtpExtensionAbsoluteSendTime, 66 RTPExtensionType::kRtpExtensionVideoRotation};
51 RTPExtensionType::kRtpExtensionVideoRotation,
52 RTPExtensionType::kRtpExtensionTransportSequenceNumber};
53 const char* kExtensionNames[] = { 67 const char* kExtensionNames[] = {
54 RtpExtension::kTimestampOffsetUri, RtpExtension::kAudioLevelUri, 68 RtpExtension::kTimestampOffsetUri, RtpExtension::kAbsSendTimeUri,
55 RtpExtension::kAbsSendTimeUri, RtpExtension::kVideoRotationUri, 69 RtpExtension::kTransportSequenceNumberUri, RtpExtension::kAudioLevelUri,
56 RtpExtension::kTransportSequenceNumberUri}; 70 RtpExtension::kVideoRotationUri};
71
57 const size_t kNumExtensions = 5; 72 const size_t kNumExtensions = 5;
58 73
59 void PrintActualEvents(const ParsedRtcEventLog& parsed_log) { 74 struct BweLossEvent {
60 std::map<int, size_t> actual_event_counts; 75 int32_t bitrate_bps;
61 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) { 76 uint8_t fraction_loss;
62 actual_event_counts[parsed_log.GetEventType(i)]++; 77 int32_t total_packets;
63 } 78 };
64 printf("Actual events: ");
65 for (auto kv : actual_event_counts) {
66 printf("%d_count = %zu, ", kv.first, kv.second);
67 }
68 printf("\n");
69 for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) {
70 printf("%4d ", parsed_log.GetEventType(i));
71 }
72 printf("\n");
73 }
74 79
75 void PrintExpectedEvents(size_t rtp_count, 80 // TODO(terelius): Merge with event type in parser once updated?
76 size_t rtcp_count, 81 enum class EventType {
77 size_t playout_count, 82 kIncomingRtp,
78 size_t bwe_loss_count) { 83 kOutgoingRtp,
79 printf( 84 kIncomingRtcp,
80 "Expected events: rtp_count = %zu, rtcp_count = %zu," 85 kOutgoingRtcp,
81 "playout_count = %zu, bwe_loss_count = %zu\n", 86 kAudioPlayout,
82 rtp_count, rtcp_count, playout_count, bwe_loss_count); 87 kBweLossUpdate,
83 size_t rtcp_index = 1, playout_index = 1, bwe_loss_index = 1; 88 kBweDelayUpdate,
84 printf("strt cfg cfg "); 89 kVideoRecvConfig,
85 for (size_t i = 1; i <= rtp_count; i++) { 90 kVideoSendConfig,
86 printf(" rtp "); 91 kAudioRecvConfig,
87 if (i * rtcp_count >= rtcp_index * rtp_count) { 92 kAudioSendConfig,
88 printf("rtcp "); 93 kAudioNetworkAdaptation,
89 rtcp_index++; 94 kBweProbeClusterCreated,
90 } 95 kBweProbeResult,
91 if (i * playout_count >= playout_index * rtp_count) { 96 };
92 printf("play "); 97
93 playout_index++; 98 const std::map<EventType, std::string> event_type_to_string(
94 } 99 {{EventType::kIncomingRtp, "RTP(in)"},
95 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { 100 {EventType::kOutgoingRtp, "RTP(out)"},
96 printf("loss "); 101 {EventType::kIncomingRtcp, "RTCP(in)"},
97 bwe_loss_index++; 102 {EventType::kOutgoingRtcp, "RTCP(out)"},
98 } 103 {EventType::kAudioPlayout, "PLAYOUT"},
99 } 104 {EventType::kBweLossUpdate, "BWE_LOSS"},
100 printf("end \n"); 105 {EventType::kBweDelayUpdate, "BWE_DELAY"},
101 } 106 {EventType::kVideoRecvConfig, "VIDEO_RECV_CONFIG"},
107 {EventType::kVideoSendConfig, "VIDEO_SEND_CONFIG"},
108 {EventType::kAudioRecvConfig, "AUDIO_RECV_CONFIG"},
109 {EventType::kAudioSendConfig, "AUDIO_SEND_CONFIG"},
110 {EventType::kAudioNetworkAdaptation, "AUDIO_NETWORK_ADAPTATION"},
111 {EventType::kBweProbeClusterCreated, "BWE_PROBE_CREATED"},
112 {EventType::kBweProbeResult, "BWE_PROBE_RESULT"}});
113
114 const std::map<ParsedRtcEventLog::EventType, std::string>
115 parsed_event_type_to_string(
116 {{ParsedRtcEventLog::EventType::UNKNOWN_EVENT, "UNKNOWN_EVENT"},
117 {ParsedRtcEventLog::EventType::LOG_START, "LOG_START"},
118 {ParsedRtcEventLog::EventType::LOG_END, "LOG_END"},
119 {ParsedRtcEventLog::EventType::RTP_EVENT, "RTP"},
120 {ParsedRtcEventLog::EventType::RTCP_EVENT, "RTCP"},
121 {ParsedRtcEventLog::EventType::AUDIO_PLAYOUT_EVENT, "AUDIO_PLAYOUT"},
122 {ParsedRtcEventLog::EventType::LOSS_BASED_BWE_UPDATE,
123 "LOSS_BASED_BWE_UPDATE"},
124 {ParsedRtcEventLog::EventType::DELAY_BASED_BWE_UPDATE,
125 "DELAY_BASED_BWE_UPDATE"},
126 {ParsedRtcEventLog::EventType::VIDEO_RECEIVER_CONFIG_EVENT,
127 "VIDEO_RECV_CONFIG"},
128 {ParsedRtcEventLog::EventType::VIDEO_SENDER_CONFIG_EVENT,
129 "VIDEO_SEND_CONFIG"},
130 {ParsedRtcEventLog::EventType::AUDIO_RECEIVER_CONFIG_EVENT,
131 "AUDIO_RECV_CONFIG"},
132 {ParsedRtcEventLog::EventType::AUDIO_SENDER_CONFIG_EVENT,
133 "AUDIO_SEND_CONFIG"},
134 {ParsedRtcEventLog::EventType::AUDIO_NETWORK_ADAPTATION_EVENT,
135 "AUDIO_NETWORK_ADAPTATION"},
136 {ParsedRtcEventLog::EventType::BWE_PROBE_CLUSTER_CREATED_EVENT,
137 "BWE_PROBE_CREATED"},
138 {ParsedRtcEventLog::EventType::BWE_PROBE_RESULT_EVENT,
139 "BWE_PROBE_RESULT"}});
102 } // namespace 140 } // namespace
103 141
104 /* 142 void PrintActualEvents(const ParsedRtcEventLog& parsed_log,
105 * Bit number i of extension_bitvector is set to indicate the 143 std::ostream& stream);
106 * presence of extension number i from kExtensionTypes / kExtensionNames. 144
107 * The least significant bit extension_bitvector has number 0. 145 RtpPacketToSend GenerateOutgoingRtpPacket(
108 */ 146 const RtpHeaderExtensionMap* extensions,
109 RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions, 147 uint32_t csrcs_count,
110 uint32_t csrcs_count, 148 size_t packet_size,
111 size_t packet_size, 149 Random* prng) {
112 Random* prng) {
113 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions); 150 RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions);
114 151
115 std::vector<uint32_t> csrcs; 152 std::vector<uint32_t> csrcs;
116 for (unsigned i = 0; i < csrcs_count; i++) { 153 for (unsigned i = 0; i < csrcs_count; i++) {
117 csrcs.push_back(prng->Rand<uint32_t>()); 154 csrcs.push_back(prng->Rand<uint32_t>());
118 } 155 }
119 156
120 RtpPacketToSend rtp_packet(extensions, packet_size); 157 RtpPacketToSend rtp_packet(extensions, packet_size);
121 rtp_packet.SetPayloadType(prng->Rand(127)); 158 rtp_packet.SetPayloadType(prng->Rand(127));
122 rtp_packet.SetMarker(prng->Rand<bool>()); 159 rtp_packet.SetMarker(prng->Rand<bool>());
123 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>()); 160 rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>());
124 rtp_packet.SetSsrc(prng->Rand<uint32_t>()); 161 rtp_packet.SetSsrc(prng->Rand<uint32_t>());
125 rtp_packet.SetTimestamp(prng->Rand<uint32_t>()); 162 rtp_packet.SetTimestamp(prng->Rand<uint32_t>());
126 rtp_packet.SetCsrcs(csrcs); 163 rtp_packet.SetCsrcs(csrcs);
127 164
128 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff)); 165 rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff));
129 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127)); 166 rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127));
130 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff)); 167 rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff));
131 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2)); 168 rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2));
132 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>()); 169 rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>());
133 170
134 size_t payload_size = packet_size - rtp_packet.headers_size(); 171 size_t payload_size = packet_size - rtp_packet.headers_size();
135 uint8_t* payload = rtp_packet.AllocatePayload(payload_size); 172 uint8_t* payload = rtp_packet.AllocatePayload(payload_size);
136 for (size_t i = 0; i < payload_size; i++) { 173 for (size_t i = 0; i < payload_size; i++) {
137 payload[i] = prng->Rand<uint8_t>(); 174 payload[i] = prng->Rand<uint8_t>();
138 } 175 }
139 return rtp_packet; 176 return rtp_packet;
140 } 177 }
141 178
179 RtpPacketReceived GenerateIncomingRtpPacket(
180 const RtpHeaderExtensionMap* extensions,
181 uint32_t csrcs_count,
182 size_t packet_size,
183 Random* prng) {
184 RtpPacketToSend packet_out =
185 GenerateOutgoingRtpPacket(extensions, csrcs_count, packet_size, prng);
186 RtpPacketReceived packet_in(extensions);
187 packet_in.Parse(packet_out.data(), packet_out.size());
188 return packet_in;
189 }
190
142 rtc::Buffer GenerateRtcpPacket(Random* prng) { 191 rtc::Buffer GenerateRtcpPacket(Random* prng) {
143 rtcp::ReportBlock report_block; 192 rtcp::ReportBlock report_block;
144 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC. 193 report_block.SetMediaSsrc(prng->Rand<uint32_t>()); // Remote SSRC.
145 report_block.SetFractionLost(prng->Rand(50)); 194 report_block.SetFractionLost(prng->Rand(50));
146 195
147 rtcp::SenderReport sender_report; 196 rtcp::SenderReport sender_report;
148 sender_report.SetSenderSsrc(prng->Rand<uint32_t>()); 197 sender_report.SetSenderSsrc(prng->Rand<uint32_t>());
149 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>())); 198 sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>()));
150 sender_report.SetPacketCount(prng->Rand<uint32_t>()); 199 sender_report.SetPacketCount(prng->Rand<uint32_t>());
151 sender_report.AddReportBlock(report_block); 200 sender_report.AddReportBlock(report_block);
152 201
153 return sender_report.Build(); 202 return sender_report.Build();
154 } 203 }
155 204
156 void GenerateVideoReceiveConfig(uint32_t extensions_bitvector, 205 void GenerateVideoReceiveConfig(const RtpHeaderExtensionMap& extensions,
157 rtclog::StreamConfig* config, 206 rtclog::StreamConfig* config,
158 Random* prng) { 207 Random* prng) {
159 // Add SSRCs for the stream. 208 // Add SSRCs for the stream.
160 config->remote_ssrc = prng->Rand<uint32_t>(); 209 config->remote_ssrc = prng->Rand<uint32_t>();
161 config->local_ssrc = prng->Rand<uint32_t>(); 210 config->local_ssrc = prng->Rand<uint32_t>();
162 // Add extensions and settings for RTCP. 211 // Add extensions and settings for RTCP.
163 config->rtcp_mode = 212 config->rtcp_mode =
164 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize; 213 prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize;
165 config->remb = prng->Rand<bool>(); 214 config->remb = prng->Rand<bool>();
166 config->rtx_ssrc = prng->Rand<uint32_t>(); 215 config->rtx_ssrc = prng->Rand<uint32_t>();
167 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", 216 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264",
168 prng->Rand(1, 127), prng->Rand(1, 127)); 217 prng->Rand(1, 127), prng->Rand(1, 127));
169 // Add header extensions. 218 // Add header extensions.
170 for (unsigned i = 0; i < kNumExtensions; i++) { 219 for (unsigned i = 0; i < kNumExtensions; i++) {
171 if (extensions_bitvector & (1u << i)) { 220 uint8_t id = extensions.GetId(kExtensionTypes[i]);
172 config->rtp_extensions.emplace_back(kExtensionNames[i], 221 if (id != RtpHeaderExtensionMap::kInvalidId) {
173 prng->Rand<int>()); 222 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
174 } 223 }
175 } 224 }
176 } 225 }
177 226
178 void GenerateVideoSendConfig(uint32_t extensions_bitvector, 227 void GenerateVideoSendConfig(const RtpHeaderExtensionMap& extensions,
179 rtclog::StreamConfig* config, 228 rtclog::StreamConfig* config,
180 Random* prng) { 229 Random* prng) {
181 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264", 230 config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264",
182 prng->Rand(1, 127), prng->Rand(1, 127)); 231 prng->Rand(1, 127), prng->Rand(1, 127));
183 config->local_ssrc = prng->Rand<uint32_t>(); 232 config->local_ssrc = prng->Rand<uint32_t>();
184 config->rtx_ssrc = prng->Rand<uint32_t>(); 233 config->rtx_ssrc = prng->Rand<uint32_t>();
185 // Add header extensions. 234 // Add header extensions.
186 for (unsigned i = 0; i < kNumExtensions; i++) { 235 for (unsigned i = 0; i < kNumExtensions; i++) {
187 if (extensions_bitvector & (1u << i)) { 236 uint8_t id = extensions.GetId(kExtensionTypes[i]);
188 config->rtp_extensions.push_back( 237 if (id != RtpHeaderExtensionMap::kInvalidId) {
189 RtpExtension(kExtensionNames[i], prng->Rand<int>())); 238 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
190 } 239 }
191 } 240 }
192 } 241 }
193 242
194 void GenerateAudioReceiveConfig(uint32_t extensions_bitvector, 243 void GenerateAudioReceiveConfig(const RtpHeaderExtensionMap& extensions,
195 rtclog::StreamConfig* config, 244 rtclog::StreamConfig* config,
196 Random* prng) { 245 Random* prng) {
197 // Add SSRCs for the stream. 246 // Add SSRCs for the stream.
198 config->remote_ssrc = prng->Rand<uint32_t>(); 247 config->remote_ssrc = prng->Rand<uint32_t>();
199 config->local_ssrc = prng->Rand<uint32_t>(); 248 config->local_ssrc = prng->Rand<uint32_t>();
200 // Add header extensions. 249 // Add header extensions.
201 for (unsigned i = 0; i < kNumExtensions; i++) { 250 for (unsigned i = 0; i < kNumExtensions; i++) {
202 if (extensions_bitvector & (1u << i)) { 251 uint8_t id = extensions.GetId(kExtensionTypes[i]);
203 config->rtp_extensions.push_back( 252 if (id != RtpHeaderExtensionMap::kInvalidId) {
204 RtpExtension(kExtensionNames[i], prng->Rand<int>())); 253 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
205 } 254 }
206 } 255 }
207 } 256 }
208 257
209 void GenerateAudioSendConfig(uint32_t extensions_bitvector, 258 void GenerateAudioSendConfig(const RtpHeaderExtensionMap& extensions,
210 rtclog::StreamConfig* config, 259 rtclog::StreamConfig* config,
211 Random* prng) { 260 Random* prng) {
212 // Add SSRC to the stream. 261 // Add SSRC to the stream.
213 config->local_ssrc = prng->Rand<uint32_t>(); 262 config->local_ssrc = prng->Rand<uint32_t>();
214 // Add header extensions. 263 // Add header extensions.
215 for (unsigned i = 0; i < kNumExtensions; i++) { 264 for (unsigned i = 0; i < kNumExtensions; i++) {
216 if (extensions_bitvector & (1u << i)) { 265 uint8_t id = extensions.GetId(kExtensionTypes[i]);
217 config->rtp_extensions.push_back( 266 if (id != RtpHeaderExtensionMap::kInvalidId) {
218 RtpExtension(kExtensionNames[i], prng->Rand<int>())); 267 config->rtp_extensions.emplace_back(kExtensionNames[i], id);
219 } 268 }
220 } 269 }
221 } 270 }
222 271
223 void GenerateAudioNetworkAdaptation(uint32_t extensions_bitvector, 272 // BweLossEvent GenerateBweLossEvent(Random* prng) {
273 // BweLossEvent loss_event;
274 // loss_event.bitrate_bps = prng->Rand(6000, 10000000);
275 // loss_event.fraction_loss = prng->Rand<uint8_t>();
276 // loss_event.total_packets = prng->Rand(1, 1000);
277 // return loss_event;
278 // }
279
280 void GenerateAudioNetworkAdaptation(const RtpHeaderExtensionMap& extensions,
224 AudioEncoderRuntimeConfig* config, 281 AudioEncoderRuntimeConfig* config,
225 Random* prng) { 282 Random* prng) {
226 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000)); 283 config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000));
227 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>()); 284 config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>());
228 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>()); 285 config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>());
229 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120)); 286 config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120));
230 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2)); 287 config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2));
231 config->uplink_packet_loss_fraction = 288 config->uplink_packet_loss_fraction =
232 rtc::Optional<float>(prng->Rand<float>()); 289 rtc::Optional<float>(prng->Rand<float>());
233 } 290 }
234 291
235 // Test for the RtcEventLog class. Dumps some RTP packets and other events 292 class SessionDescription {
236 // to disk, then reads them back to see if they match. 293 public:
237 void LogSessionAndReadBack(size_t rtp_count, 294 explicit SessionDescription(unsigned int random_seed) : prng(random_seed) {}
238 size_t rtcp_count, 295 void GenerateSessionDescription(size_t incoming_rtp_count,
239 size_t playout_count, 296 size_t outgoing_rtp_count,
240 size_t bwe_loss_count, 297 size_t incoming_rtcp_count,
241 uint32_t extensions_bitvector, 298 size_t outgoing_rtcp_count,
242 uint32_t csrcs_count, 299 size_t playout_count,
243 unsigned int random_seed) { 300 size_t bwe_loss_count,
244 ASSERT_LE(rtcp_count, rtp_count); 301 size_t bwe_delay_count,
245 ASSERT_LE(playout_count, rtp_count); 302 const RtpHeaderExtensionMap& extensions,
246 ASSERT_LE(bwe_loss_count, rtp_count); 303 uint32_t csrcs_count);
247 std::vector<RtpPacketToSend> rtp_packets; 304 void WriteSession();
248 std::vector<rtc::Buffer> rtcp_packets; 305 void ReadAndVerifySession();
249 std::vector<uint32_t> playout_ssrcs; 306 void PrintExpectedEvents(std::ostream& stream);
250 std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates; 307
251 308 private:
252 rtclog::StreamConfig receiver_config; 309 // std::vector<RtpPacketReceived> incoming_rtp_packets;
253 rtclog::StreamConfig sender_config; 310 // std::vector<RtpPacketToSend> outgoing_rtp_packets;
254 311 // std::vector<rtc::Buffer> incoming_rtcp_packets;
255 Random prng(random_seed); 312 // std::vector<rtc::Buffer> outgoing_rtcp_packets;
256 313 // std::vector<uint32_t> playout_ssrcs;
257 // Initialize rtp header extensions to be used in generated rtp packets. 314 // std::vector<BweLossEvent> bwe_loss_updates;
315 std::vector<std::pair<int32_t, BandwidthUsage> > bwe_delay_updates;
316 // std::vector<rtclog::StreamConfig> receiver_configs;
317 // std::vector<rtclog::StreamConfig> sender_configs;
318 // std::vector<EventType> event_types;
319 Random prng;
320 };
321
322 void SessionDescription::GenerateSessionDescription(
323 size_t incoming_rtp_count,
324 size_t outgoing_rtp_count,
325 size_t incoming_rtcp_count,
326 size_t outgoing_rtcp_count,
327 size_t playout_count,
328 size_t bwe_loss_count,
329 size_t bwe_delay_count,
330 const RtpHeaderExtensionMap& extensions,
331 uint32_t csrcs_count) {
332 // // Create configuration for the video receive stream.
333 // receiver_configs.push_back(rtclog::StreamConfig());
334 // GenerateVideoReceiveConfig(extensions, &receiver_configs.back(), &prng);
335 // event_types.push_back(EventType::kVideoRecvConfig);
336
337 // // Create configuration for the video send stream.
338 // sender_configs.push_back(rtclog::StreamConfig());
339 // GenerateVideoSendConfig(extensions, &sender_configs.back(), &prng);
340 // event_types.push_back(EventType::kVideoSendConfig);
341 // const size_t config_count = 2;
342
343 // // Create incoming and outgoing RTP packets containing random data.
344 // for (size_t i = 0; i < incoming_rtp_count; i++) {
345 // size_t packet_size = prng.Rand(1000, 1100);
346 // incoming_rtp_packets.push_back(GenerateIncomingRtpPacket(
347 // &extensions, csrcs_count, packet_size, &prng));
348 // event_types.push_back(EventType::kIncomingRtp);
349 // }
350 // for (size_t i = 0; i < outgoing_rtp_count; i++) {
351 // size_t packet_size = prng.Rand(1000, 1100);
352 // outgoing_rtp_packets.push_back(GenerateOutgoingRtpPacket(
353 // &extensions, csrcs_count, packet_size, &prng));
354 // event_types.push_back(EventType::kOutgoingRtp);
355 // }
356 // // Create incoming and outgoing RTCP packets containing random data.
357 // for (size_t i = 0; i < incoming_rtcp_count; i++) {
358 // incoming_rtcp_packets.push_back(GenerateRtcpPacket(&prng));
359 // event_types.push_back(EventType::kIncomingRtcp);
360 // }
361 // for (size_t i = 0; i < outgoing_rtcp_count; i++) {
362 // outgoing_rtcp_packets.push_back(GenerateRtcpPacket(&prng));
363 // event_types.push_back(EventType::kOutgoingRtcp);
364 // }
365 // // Create random SSRCs to use when logging AudioPlayout events.
366 // for (size_t i = 0; i < playout_count; i++) {
367 // playout_ssrcs.push_back(prng.Rand<uint32_t>());
368 // event_types.push_back(EventType::kAudioPlayout);
369 // }
370 // // Create random bitrate updates for LossBasedBwe.
371 // for (size_t i = 0; i < bwe_loss_count; i++) {
372 // bwe_loss_updates.push_back(GenerateBweLossEvent(&prng));
373 // event_types.push_back(EventType::kBweLossUpdate);
374 // }
375 // // Create random bitrate updates for DelayBasedBwe.
376 // for (size_t i = 0; i < bwe_delay_count; i++) {
377 // bwe_delay_updates.push_back(std::make_pair(
378 // prng.Rand(6000, 10000000), prng.Rand<bool>()
379 // ? BandwidthUsage::kBwOverusing
380 // : BandwidthUsage::kBwUnderusing));
381 // event_types.push_back(EventType::kBweDelayUpdate);
382 // }
383
384 // // Order the events randomly. The configurations are stored in a separate
385 // // buffer, so they might be written before any othe events. Hence, we can't
386 // // mix the config events with other events.
387 // for (size_t i = config_count; i < event_types.size(); i++) {
388 // size_t other = prng.Rand(static_cast<uint32_t>(i),
389 // static_cast<uint32_t>(event_types.size() - 1));
390 // RTC_CHECK(i <= other && other < event_types.size());
391 // std::swap(event_types[i], event_types[other]);
392 // }
393 }
394
395 void SessionDescription::WriteSession() {
396 // // Find the name of the current test, in order to use it as a temporary
397 // // filename.
398 // auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
399 // const std::string temp_filename =
400 // test::OutputPath() + test_info->test_case_name() + test_info->name();
401
402 // rtc::ScopedFakeClock fake_clock;
403 // fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
404
405 // // When log_dumper goes out of scope, it causes the log file to be flushed
406 // // to disk.
407 // std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
408
409 // size_t incoming_rtp_written = 0;
410 // size_t outgoing_rtp_written = 0;
411 // size_t incoming_rtcp_written = 0;
412 // size_t outgoing_rtcp_written = 0;
413 // size_t playouts_written = 0;
414 // size_t bwe_loss_written = 0;
415 // size_t bwe_delay_written = 0;
416 // size_t recv_configs_written = 0;
417 // size_t send_configs_written = 0;
418
419 // for (size_t i = 0; i < event_types.size(); i++) {
420 // fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
421 // if (i == event_types.size() / 2)
422 // log_dumper->StartLogging(temp_filename, 10000000);
423 // switch (event_types[i]) {
424 // case EventType::kIncomingRtp:
425 // RTC_CHECK(incoming_rtp_written < incoming_rtp_packets.size());
426 // log_dumper->LogIncomingRtpHeader(
427 // incoming_rtp_packets[incoming_rtp_written++]);
428 // break;
429 // case EventType::kOutgoingRtp:
430 // RTC_CHECK(outgoing_rtp_written < outgoing_rtp_packets.size());
431 // log_dumper->LogOutgoingRtpHeader(
432 // outgoing_rtp_packets[outgoing_rtp_written++],
433 // PacedPacketInfo::kNotAProbe);
434 // break;
435 // case EventType::kIncomingRtcp:
436 // RTC_CHECK(incoming_rtcp_written < incoming_rtcp_packets.size());
437 // log_dumper->LogIncomingRtcpPacket(
438 // incoming_rtcp_packets[incoming_rtcp_written++]);
439 // break;
440 // case EventType::kOutgoingRtcp:
441 // RTC_CHECK(outgoing_rtcp_written < outgoing_rtcp_packets.size());
442 // log_dumper->LogOutgoingRtcpPacket(
443 // outgoing_rtcp_packets[outgoing_rtcp_written++]);
444 // break;
445 // case EventType::kAudioPlayout:
446 // RTC_CHECK(playouts_written < playout_ssrcs.size());
447 // log_dumper->LogAudioPlayout(playout_ssrcs[playouts_written++]);
448 // break;
449 // case EventType::kBweLossUpdate:
450 // RTC_CHECK(bwe_loss_written < bwe_loss_updates.size());
451 // log_dumper->LogLossBasedBweUpdate(
452 // bwe_loss_updates[bwe_loss_written].bitrate_bps,
453 // bwe_loss_updates[bwe_loss_written].fraction_loss,
454 // bwe_loss_updates[bwe_loss_written].total_packets);
455 // bwe_loss_written++;
456 // break;
457 // case EventType::kBweDelayUpdate:
458 // RTC_CHECK(bwe_delay_written < bwe_delay_updates.size());
459 // log_dumper->LogDelayBasedBweUpdate(
460 // bwe_delay_updates[bwe_delay_written].first,
461 // bwe_delay_updates[bwe_delay_written].second);
462 // bwe_delay_written++;
463 // break;
464 // case EventType::kVideoRecvConfig:
465 // RTC_CHECK(recv_configs_written < receiver_configs.size());
466 // log_dumper->LogVideoReceiveStreamConfig(
467 // receiver_configs[recv_configs_written++]);
468 // break;
469 // case EventType::kVideoSendConfig:
470 // RTC_CHECK(send_configs_written < sender_configs.size());
471 // log_dumper->LogVideoSendStreamConfig(
472 // sender_configs[send_configs_written++]);
473 // break;
474 // case EventType::kAudioRecvConfig:
475 // // Not implemented
476 // RTC_NOTREACHED();
477 // break;
478 // case EventType::kAudioSendConfig:
479 // // Not implemented
480 // RTC_NOTREACHED();
481 // break;
482 // case EventType::kAudioNetworkAdaptation:
483 // // Not implemented
484 // RTC_NOTREACHED();
485 // break;
486 // case EventType::kBweProbeClusterCreated:
487 // // Not implemented
488 // RTC_NOTREACHED();
489 // break;
490 // case EventType::kBweProbeResult:
491 // // Not implemented
492 // RTC_NOTREACHED();
493 // break;
494 // }
495 // }
496
497 // log_dumper->StopLogging();
498 }
499
500 // Read the file and verify that what we read back from the event log is the
501 // same as what we wrote down.
502 void SessionDescription::ReadAndVerifySession() {
503 // // Find the name of the current test, in order to use it as a temporary
504 // // filename.
505 // auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
506 // const std::string temp_filename =
507 // test::OutputPath() + test_info->test_case_name() + test_info->name();
508
509 // // Read the generated file from disk.
510 // ParsedRtcEventLog parsed_log;
511 // ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
512 // EXPECT_GE(1000u, event_types.size() +
513 // 2); // The events must fit in the message queue.
514 // EXPECT_EQ(event_types.size() + 2, parsed_log.GetNumberOfEvents());
515
516 // size_t incoming_rtp_read = 0;
517 // size_t outgoing_rtp_read = 0;
518 // size_t incoming_rtcp_read = 0;
519 // size_t outgoing_rtcp_read = 0;
520 // size_t playouts_read = 0;
521 // size_t bwe_loss_read = 0;
522 // size_t bwe_delay_read = 0;
523 // size_t recv_configs_read = 0;
524 // size_t send_configs_read = 0;
525
526 // RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
527
528 // for (size_t i = 0; i < event_types.size(); i++) {
529 // switch (event_types[i]) {
530 // case EventType::kIncomingRtp:
531 // RTC_CHECK(incoming_rtp_read < incoming_rtp_packets.size());
532 // RtcEventLogTestHelper::VerifyRtpEvent(
533 // parsed_log, i + 1, kIncomingPacket,
534 // incoming_rtp_packets[incoming_rtp_read++]);
535 // break;
536 // case EventType::kOutgoingRtp:
537 // RTC_CHECK(outgoing_rtp_read < outgoing_rtp_packets.size());
538 // RtcEventLogTestHelper::VerifyRtpEvent(
539 // parsed_log, i + 1, kOutgoingPacket,
540 // outgoing_rtp_packets[outgoing_rtp_read++]);
541 // break;
542 // case EventType::kIncomingRtcp:
543 // RTC_CHECK(incoming_rtcp_read < incoming_rtcp_packets.size());
544 // RtcEventLogTestHelper::VerifyRtcpEvent(
545 // parsed_log, i + 1, kIncomingPacket,
546 // incoming_rtcp_packets[incoming_rtcp_read].data(),
547 // incoming_rtcp_packets[incoming_rtcp_read].size());
548 // incoming_rtcp_read++;
549 // break;
550 // case EventType::kOutgoingRtcp:
551 // RTC_CHECK(outgoing_rtcp_read < outgoing_rtcp_packets.size());
552 // RtcEventLogTestHelper::VerifyRtcpEvent(
553 // parsed_log, i + 1, kOutgoingPacket,
554 // outgoing_rtcp_packets[outgoing_rtcp_read].data(),
555 // outgoing_rtcp_packets[outgoing_rtcp_read].size());
556 // outgoing_rtcp_read++;
557 // break;
558 // case EventType::kAudioPlayout:
559 // RTC_CHECK(playouts_read < playout_ssrcs.size());
560 // RtcEventLogTestHelper::VerifyPlayoutEvent(
561 // parsed_log, i + 1, playout_ssrcs[playouts_read++]);
562 // break;
563 // case EventType::kBweLossUpdate:
564 // RTC_CHECK(bwe_loss_read < bwe_loss_updates.size());
565 // RtcEventLogTestHelper::VerifyBweLossEvent(
566 // parsed_log, i + 1, bwe_loss_updates[bwe_loss_read].bitrate_bps,
567 // bwe_loss_updates[bwe_loss_read].fraction_loss,
568 // bwe_loss_updates[bwe_loss_read].total_packets);
569 // bwe_loss_read++;
570 // break;
571 // case EventType::kBweDelayUpdate:
572 // RTC_CHECK(bwe_delay_read < bwe_delay_updates.size());
573 // RtcEventLogTestHelper::VerifyBweDelayEvent(
574 // parsed_log, i + 1, bwe_delay_updates[bwe_delay_read].first,
575 // bwe_delay_updates[bwe_delay_read].second);
576 // bwe_delay_read++;
577 // break;
578 // case EventType::kVideoRecvConfig:
579 // RTC_CHECK(recv_configs_read < receiver_configs.size());
580 // RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(
581 // parsed_log, i + 1, receiver_configs[recv_configs_read++]);
582 // break;
583 // case EventType::kVideoSendConfig:
584 // RTC_CHECK(send_configs_read < sender_configs.size());
585 // RtcEventLogTestHelper::VerifyVideoSendStreamConfig(
586 // parsed_log, i + 1, sender_configs[send_configs_read++]);
587 // break;
588 // case EventType::kAudioRecvConfig:
589 // // Not implemented
590 // RTC_NOTREACHED();
591 // break;
592 // case EventType::kAudioSendConfig:
593 // // Not implemented
594 // RTC_NOTREACHED();
595 // break;
596 // case EventType::kAudioNetworkAdaptation:
597 // // Not implemented
598 // RTC_NOTREACHED();
599 // break;
600 // case EventType::kBweProbeClusterCreated:
601 // // Not implemented
602 // RTC_NOTREACHED();
603 // break;
604 // case EventType::kBweProbeResult:
605 // // Not implemented
606 // RTC_NOTREACHED();
607 // break;
608 // }
609 // }
610
611 // RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log,
612 // parsed_log.GetNumberOfEvents() -
613 // 1);
614
615 // // Clean up temporary file - can be pretty slow.
616 // remove(temp_filename.c_str());
617 }
618
619 void SessionDescription::PrintExpectedEvents(std::ostream& stream) {
620 // for (size_t i = 0; i < event_types.size(); i++) {
621 // auto it = event_type_to_string.find(event_types[i]);
622 // RTC_CHECK(it != event_type_to_string.end());
623 // stream << it->second << " ";
624 // }
625 // stream << std::endl;
626 }
627
628 void PrintActualEvents(const ParsedRtcEventLog& parsed_log,
629 std::ostream& stream) {
630 // for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) {
631 // auto it = parsed_event_type_to_string.find(parsed_log.GetEventType(i));
632 // RTC_CHECK(it != parsed_event_type_to_string.end());
633 // stream << it->second << " ";
634 // }
635 // stream << std::endl;
636 }
637
638 TEST(RtcEventLogTest, LogSessionAndReadBack) {
258 RtpHeaderExtensionMap extensions; 639 RtpHeaderExtensionMap extensions;
259 for (unsigned i = 0; i < kNumExtensions; i++) { 640 SessionDescription session(321 /*Random seed*/);
260 if (extensions_bitvector & (1u << i)) { 641 // session.GenerateSessionDescription(3, // Number of incoming RTP packets.
261 extensions.Register(kExtensionTypes[i], i + 1); 642 // 2, // Number of outgoing RTP packets.
262 } 643 // 1, // Number of incoming RTCP packets.
263 } 644 // 1, // Number of outgoing RTCP packets.
264 // Create rtp_count RTP packets containing random data. 645 // 0, // Number of playout events.
265 for (size_t i = 0; i < rtp_count; i++) { 646 // 0, // Number of BWE loss events.
266 size_t packet_size = prng.Rand(1000, 1100); 647 // 0, // Number of BWE delay events.
267 rtp_packets.push_back( 648 // extensions, // No extensions.
268 GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng)); 649 // 0); // Number of contributing sources.
269 } 650 // session.WriteSession();
270 // Create rtcp_count RTCP packets containing random data. 651 // session.ReadAndVerifySession();
271 for (size_t i = 0; i < rtcp_count; i++) { 652
272 rtcp_packets.push_back(GenerateRtcpPacket(&prng)); 653 printf("Test finished - sleeping\n");
273 } 654 fflush(stdout);
274 // Create playout_count random SSRCs to use when logging AudioPlayout events. 655 SleepMs(1000);
275 for (size_t i = 0; i < playout_count; i++) { 656 printf("Waking up and leaving test\n");
276 playout_ssrcs.push_back(prng.Rand<uint32_t>()); 657 fflush(stdout);
277 } 658 }
278 // Create bwe_loss_count random bitrate updates for LossBasedBwe. 659
279 for (size_t i = 0; i < bwe_loss_count; i++) { 660 // TEST(RtcEventLogTest, LogSessionAndReadBackWith2Extensions) {
280 bwe_loss_updates.push_back( 661 // RtpHeaderExtensionMap extensions;
281 std::make_pair(prng.Rand<int32_t>(), prng.Rand<uint8_t>())); 662 // extensions.Register(kRtpExtensionAbsoluteSendTime,
282 } 663 // kAbsoluteSendTimeExtensionId);
283 // Create configurations for the video streams. 664 // extensions.Register(kRtpExtensionTransportSequenceNumber,
284 GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config, &prng); 665 // kTransportSequenceNumberExtensionId);
285 GenerateVideoSendConfig(extensions_bitvector, &sender_config, &prng); 666 // SessionDescription session(3141592653u /*Random seed*/);
286 const int config_count = 2; 667 // session.GenerateSessionDescription(4, 4, 1, 1, 0, 0, 0, extensions, 0);
287 668 // session.WriteSession();
288 // Find the name of the current test, in order to use it as a temporary 669 // session.ReadAndVerifySession();
289 // filename. 670 // }
290 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 671
291 const std::string temp_filename = 672 // TEST(RtcEventLogTest, LogSessionAndReadBackWithAllExtensions) {
292 test::OutputPath() + test_info->test_case_name() + test_info->name(); 673 // RtpHeaderExtensionMap extensions;
293 674 // for (uint32_t i = 0; i < kNumExtensions; i++) {
294 // When log_dumper goes out of scope, it causes the log file to be flushed 675 // extensions.Register(kExtensionTypes[i], kExtensionIds[i]);
295 // to disk. 676 // }
296 { 677 // SessionDescription session(2718281828u /*Random seed*/);
297 rtc::ScopedFakeClock fake_clock; 678 // session.GenerateSessionDescription(5, 4, 1, 1, 3, 2, 2, extensions, 2);
298 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); 679 // session.WriteSession();
299 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); 680 // session.ReadAndVerifySession();
300 log_dumper->LogVideoReceiveStreamConfig(receiver_config); 681 // }
301 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 682
302 log_dumper->LogVideoSendStreamConfig(sender_config); 683 // TEST(RtcEventLogTest, LogSessionAndReadBackAllCombinations) {
303 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 684 // // Try all combinations of header extensions and up to 2 CSRCS.
304 size_t rtcp_index = 1; 685 // for (uint32_t extension_selection = 0;
305 size_t playout_index = 1; 686 // extension_selection < (1u << kNumExtensions); extension_selection++) {
306 size_t bwe_loss_index = 1; 687 // RtpHeaderExtensionMap extensions;
307 for (size_t i = 1; i <= rtp_count; i++) { 688 // for (uint32_t i = 0; i < kNumExtensions; i++) {
308 log_dumper->LogRtpHeader( 689 // if (extension_selection & (1u << i)) {
309 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, 690 // extensions.Register(kExtensionTypes[i], kExtensionIds[i]);
310 rtp_packets[i - 1].data(), rtp_packets[i - 1].size()); 691 // }
311 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 692 // }
312 if (i * rtcp_count >= rtcp_index * rtp_count) { 693 // for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) {
313 log_dumper->LogRtcpPacket( 694 // SessionDescription session(extension_selection * 3 + csrcs_count +
314 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, 695 // 1 /*Random seed*/);
315 rtcp_packets[rtcp_index - 1].data(), 696 // session.GenerateSessionDescription(
316 rtcp_packets[rtcp_index - 1].size()); 697 // 2 + extension_selection, // Number of incoming RTP packets.
317 rtcp_index++; 698 // 2 + extension_selection, // Number of outgoing RTP packets.
318 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 699 // 1 + csrcs_count, // Number of incoming RTCP packets.
319 } 700 // 1 + csrcs_count, // Number of outgoing RTCP packets.
320 if (i * playout_count >= playout_index * rtp_count) { 701 // 3 + csrcs_count, // Number of playout events.
321 log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]); 702 // 1 + csrcs_count, // Number of BWE loss events.
322 playout_index++; 703 // 2 + csrcs_count, // Number of BWE delay events.
323 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 704 // extensions, // Bit vector choosing extensions.
324 } 705 // csrcs_count); // Number of contributing sources.
325 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { 706 // session.WriteSession();
326 log_dumper->LogLossBasedBweUpdate( 707 // session.ReadAndVerifySession();
327 bwe_loss_updates[bwe_loss_index - 1].first, 708 // }
328 bwe_loss_updates[bwe_loss_index - 1].second, i); 709 // }
329 bwe_loss_index++; 710 // }
330 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
331 }
332 if (i == rtp_count / 2) {
333 log_dumper->StartLogging(temp_filename, 10000000);
334 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
335 }
336 }
337 log_dumper->StopLogging();
338 }
339
340 // Read the generated file from disk.
341 ParsedRtcEventLog parsed_log;
342
343 ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
344
345 // Verify that what we read back from the event log is the same as
346 // what we wrote down. For RTCP we log the full packets, but for
347 // RTP we should only log the header.
348 const size_t event_count = config_count + playout_count + bwe_loss_count +
349 rtcp_count + rtp_count + 2;
350 EXPECT_GE(1000u, event_count); // The events must fit in the message queue.
351 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents());
352 if (event_count != parsed_log.GetNumberOfEvents()) {
353 // Print the expected and actual event types for easier debugging.
354 PrintActualEvents(parsed_log);
355 PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count);
356 }
357 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
358 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1,
359 receiver_config);
360 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2,
361 sender_config);
362 size_t event_index = config_count + 1;
363 size_t rtcp_index = 1;
364 size_t playout_index = 1;
365 size_t bwe_loss_index = 1;
366 for (size_t i = 1; i <= rtp_count; i++) {
367 RtcEventLogTestHelper::VerifyRtpEvent(
368 parsed_log, event_index,
369 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket,
370 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(),
371 rtp_packets[i - 1].size());
372 event_index++;
373 if (i * rtcp_count >= rtcp_index * rtp_count) {
374 RtcEventLogTestHelper::VerifyRtcpEvent(
375 parsed_log, event_index,
376 rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket,
377 rtcp_packets[rtcp_index - 1].data(),
378 rtcp_packets[rtcp_index - 1].size());
379 event_index++;
380 rtcp_index++;
381 }
382 if (i * playout_count >= playout_index * rtp_count) {
383 RtcEventLogTestHelper::VerifyPlayoutEvent(
384 parsed_log, event_index, playout_ssrcs[playout_index - 1]);
385 event_index++;
386 playout_index++;
387 }
388 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) {
389 RtcEventLogTestHelper::VerifyBweLossEvent(
390 parsed_log, event_index, bwe_loss_updates[bwe_loss_index - 1].first,
391 bwe_loss_updates[bwe_loss_index - 1].second, i);
392 event_index++;
393 bwe_loss_index++;
394 }
395 }
396
397 // Clean up temporary file - can be pretty slow.
398 remove(temp_filename.c_str());
399 }
400
401 TEST(RtcEventLogTest, LogSessionAndReadBack) {
402 // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events
403 // with no header extensions or CSRCS.
404 LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321);
405
406 // Enable AbsSendTime and TransportSequenceNumbers.
407 uint32_t extensions = 0;
408 for (uint32_t i = 0; i < kNumExtensions; i++) {
409 if (kExtensionTypes[i] == RTPExtensionType::kRtpExtensionAbsoluteSendTime ||
410 kExtensionTypes[i] ==
411 RTPExtensionType::kRtpExtensionTransportSequenceNumber) {
412 extensions |= 1u << i;
413 }
414 }
415 LogSessionAndReadBack(8, 2, 0, 0, extensions, 0, 3141592653u);
416
417 extensions = (1u << kNumExtensions) - 1; // Enable all header extensions.
418 LogSessionAndReadBack(9, 2, 3, 2, extensions, 2, 2718281828u);
419
420 // Try all combinations of header extensions and up to 2 CSRCS.
421 for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) {
422 for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) {
423 LogSessionAndReadBack(5 + extensions, // Number of RTP packets.
424 2 + csrcs_count, // Number of RTCP packets.
425 3 + csrcs_count, // Number of playout events.
426 1 + csrcs_count, // Number of BWE loss events.
427 extensions, // Bit vector choosing extensions.
428 csrcs_count, // Number of contributing sources.
429 extensions * 3 + csrcs_count + 1); // Random seed.
430 }
431 }
432 }
433 711
434 TEST(RtcEventLogTest, LogEventAndReadBack) { 712 TEST(RtcEventLogTest, LogEventAndReadBack) {
435 Random prng(987654321); 713 Random prng(987654321);
436 714
437 // Create one RTP and one RTCP packet containing random data. 715 // Create one RTP and one RTCP packet containing random data.
438 size_t packet_size = prng.Rand(1000, 1100); 716 size_t packet_size = prng.Rand(1000, 1100);
439 RtpPacketToSend rtp_packet = 717 RtpPacketReceived rtp_packet =
440 GenerateRtpPacket(nullptr, 0, packet_size, &prng); 718 GenerateIncomingRtpPacket(nullptr, 0, packet_size, &prng);
441 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); 719 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng);
442 720
443 // Find the name of the current test, in order to use it as a temporary 721 // Find the name of the current test, in order to use it as a temporary
444 // filename. 722 // filename.
445 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 723 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
446 const std::string temp_filename = 724 const std::string temp_filename =
447 test::OutputPath() + test_info->test_case_name() + test_info->name(); 725 test::OutputPath() + test_info->test_case_name() + test_info->name();
448 726
449 // Add RTP, start logging, add RTCP and then stop logging 727 // Add RTP, start logging, add RTCP and then stop logging
450 rtc::ScopedFakeClock fake_clock; 728 rtc::ScopedFakeClock fake_clock;
451 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); 729 fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
452 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); 730 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
453 731
454 log_dumper->LogRtpHeader(kIncomingPacket, rtp_packet.data(), 732 log_dumper->LogIncomingRtpHeader(rtp_packet);
455 rtp_packet.size());
456 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 733 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
457 734
458 log_dumper->StartLogging(temp_filename, 10000000); 735 log_dumper->StartLogging(temp_filename, 10000000);
459 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 736 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
460 737
461 log_dumper->LogRtcpPacket(kOutgoingPacket, rtcp_packet.data(), 738 log_dumper->LogOutgoingRtcpPacket(rtcp_packet);
462 rtcp_packet.size());
463 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000)); 739 fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
464 740
465 log_dumper->StopLogging(); 741 log_dumper->StopLogging();
466 742
467 // Read the generated file from disk. 743 // Read the generated file from disk.
468 ParsedRtcEventLog parsed_log; 744 ParsedRtcEventLog parsed_log;
469 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); 745 ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
470 746
471 // Verify that what we read back from the event log is the same as 747 // Verify that what we read back from the event log is the same as
472 // what we wrote down. 748 // what we wrote down.
473 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents()); 749 EXPECT_EQ(4u, parsed_log.GetNumberOfEvents());
474 750
475 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); 751 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
476 752
477 RtcEventLogTestHelper::VerifyRtpEvent( 753 RtcEventLogTestHelper::VerifyIncomingRtpEvent(parsed_log, 1, rtp_packet);
478 parsed_log, 1, kIncomingPacket, rtp_packet.data(),
479 rtp_packet.headers_size(), rtp_packet.size());
480 754
481 RtcEventLogTestHelper::VerifyRtcpEvent( 755 RtcEventLogTestHelper::VerifyRtcpEvent(
482 parsed_log, 2, kOutgoingPacket, rtcp_packet.data(), rtcp_packet.size()); 756 parsed_log, 2, kOutgoingPacket, rtcp_packet.data(), rtcp_packet.size());
483 757
484 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); 758 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3);
485 759
486 // Clean up temporary file - can be pretty slow. 760 // Clean up temporary file - can be pretty slow.
487 remove(temp_filename.c_str()); 761 remove(temp_filename.c_str());
488 } 762 }
489 763
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4); 988 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4);
715 989
716 // Clean up temporary file - can be pretty slow. 990 // Clean up temporary file - can be pretty slow.
717 remove(temp_filename.c_str()); 991 remove(temp_filename.c_str());
718 } 992 }
719 993
720 class ConfigReadWriteTest { 994 class ConfigReadWriteTest {
721 public: 995 public:
722 ConfigReadWriteTest() : prng(987654321) {} 996 ConfigReadWriteTest() : prng(987654321) {}
723 virtual ~ConfigReadWriteTest() {} 997 virtual ~ConfigReadWriteTest() {}
724 virtual void GenerateConfig(uint32_t extensions_bitvector) = 0; 998 virtual void GenerateConfig(const RtpHeaderExtensionMap& extensions) = 0;
725 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, 999 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log,
726 size_t index) = 0; 1000 size_t index) = 0;
727 virtual void LogConfig(RtcEventLog* event_log) = 0; 1001 virtual void LogConfig(RtcEventLog* event_log) = 0;
728 1002
729 void DoTest() { 1003 void DoTest() {
730 // Find the name of the current test, in order to use it as a temporary 1004 // Find the name of the current test, in order to use it as a temporary
731 // filename. 1005 // filename.
732 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); 1006 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
733 const std::string temp_filename = 1007 const std::string temp_filename =
734 test::OutputPath() + test_info->test_case_name() + test_info->name(); 1008 test::OutputPath() + test_info->test_case_name() + test_info->name();
735 1009
736 // Use all extensions. 1010 // Use all extensions.
737 uint32_t extensions_bitvector = (1u << kNumExtensions) - 1; 1011 RtpHeaderExtensionMap extensions;
738 GenerateConfig(extensions_bitvector); 1012 for (uint32_t i = 0; i < kNumExtensions; i++) {
1013 extensions.Register(kExtensionTypes[i], kExtensionIds[i]);
1014 }
1015 GenerateConfig(extensions);
739 1016
740 // Log a single config event and stop logging. 1017 // Log a single config event and stop logging.
741 rtc::ScopedFakeClock fake_clock; 1018 rtc::ScopedFakeClock fake_clock;
742 fake_clock.SetTimeMicros(prng.Rand<uint32_t>()); 1019 fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
743 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); 1020 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
744 1021
745 log_dumper->StartLogging(temp_filename, 10000000); 1022 log_dumper->StartLogging(temp_filename, 10000000);
746 LogConfig(log_dumper.get()); 1023 LogConfig(log_dumper.get());
747 log_dumper->StopLogging(); 1024 log_dumper->StopLogging();
748 1025
(...skipping 12 matching lines...) Expand all
761 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); 1038 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2);
762 1039
763 // Clean up temporary file - can be pretty slow. 1040 // Clean up temporary file - can be pretty slow.
764 remove(temp_filename.c_str()); 1041 remove(temp_filename.c_str());
765 } 1042 }
766 Random prng; 1043 Random prng;
767 }; 1044 };
768 1045
769 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { 1046 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest {
770 public: 1047 public:
771 void GenerateConfig(uint32_t extensions_bitvector) override { 1048 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
772 GenerateAudioReceiveConfig(extensions_bitvector, &config, &prng); 1049 GenerateAudioReceiveConfig(extensions, &config, &prng);
773 } 1050 }
774 void LogConfig(RtcEventLog* event_log) override { 1051 void LogConfig(RtcEventLog* event_log) override {
775 event_log->LogAudioReceiveStreamConfig(config); 1052 event_log->LogAudioReceiveStreamConfig(config);
776 } 1053 }
777 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 1054 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
778 size_t index) override { 1055 size_t index) override {
779 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, 1056 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index,
780 config); 1057 config);
781 } 1058 }
782 rtclog::StreamConfig config; 1059 rtclog::StreamConfig config;
783 }; 1060 };
784 1061
785 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { 1062 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest {
786 public: 1063 public:
787 AudioSendConfigReadWriteTest() {} 1064 AudioSendConfigReadWriteTest() {}
788 void GenerateConfig(uint32_t extensions_bitvector) override { 1065 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
789 GenerateAudioSendConfig(extensions_bitvector, &config, &prng); 1066 GenerateAudioSendConfig(extensions, &config, &prng);
790 } 1067 }
791 void LogConfig(RtcEventLog* event_log) override { 1068 void LogConfig(RtcEventLog* event_log) override {
792 event_log->LogAudioSendStreamConfig(config); 1069 event_log->LogAudioSendStreamConfig(config);
793 } 1070 }
794 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 1071 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
795 size_t index) override { 1072 size_t index) override {
796 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, 1073 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index,
797 config); 1074 config);
798 } 1075 }
799 rtclog::StreamConfig config; 1076 rtclog::StreamConfig config;
800 }; 1077 };
801 1078
802 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { 1079 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest {
803 public: 1080 public:
804 VideoReceiveConfigReadWriteTest() {} 1081 VideoReceiveConfigReadWriteTest() {}
805 void GenerateConfig(uint32_t extensions_bitvector) override { 1082 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
806 GenerateVideoReceiveConfig(extensions_bitvector, &config, &prng); 1083 GenerateVideoReceiveConfig(extensions, &config, &prng);
807 } 1084 }
808 void LogConfig(RtcEventLog* event_log) override { 1085 void LogConfig(RtcEventLog* event_log) override {
809 event_log->LogVideoReceiveStreamConfig(config); 1086 event_log->LogVideoReceiveStreamConfig(config);
810 } 1087 }
811 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 1088 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
812 size_t index) override { 1089 size_t index) override {
813 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, 1090 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index,
814 config); 1091 config);
815 } 1092 }
816 rtclog::StreamConfig config; 1093 rtclog::StreamConfig config;
817 }; 1094 };
818 1095
819 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { 1096 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest {
820 public: 1097 public:
821 VideoSendConfigReadWriteTest() {} 1098 VideoSendConfigReadWriteTest() {}
822 void GenerateConfig(uint32_t extensions_bitvector) override { 1099 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
823 GenerateVideoSendConfig(extensions_bitvector, &config, &prng); 1100 GenerateVideoSendConfig(extensions, &config, &prng);
824 } 1101 }
825 void LogConfig(RtcEventLog* event_log) override { 1102 void LogConfig(RtcEventLog* event_log) override {
826 event_log->LogVideoSendStreamConfig(config); 1103 event_log->LogVideoSendStreamConfig(config);
827 } 1104 }
828 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 1105 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
829 size_t index) override { 1106 size_t index) override {
830 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, 1107 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index,
831 config); 1108 config);
832 } 1109 }
833 rtclog::StreamConfig config; 1110 rtclog::StreamConfig config;
834 }; 1111 };
835 1112
836 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest { 1113 class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest {
837 public: 1114 public:
838 void GenerateConfig(uint32_t extensions_bitvector) override { 1115 void GenerateConfig(const RtpHeaderExtensionMap& extensions) override {
839 GenerateAudioNetworkAdaptation(extensions_bitvector, &config, &prng); 1116 GenerateAudioNetworkAdaptation(extensions, &config, &prng);
840 } 1117 }
841 void LogConfig(RtcEventLog* event_log) override { 1118 void LogConfig(RtcEventLog* event_log) override {
842 event_log->LogAudioNetworkAdaptation(config); 1119 event_log->LogAudioNetworkAdaptation(config);
843 } 1120 }
844 void VerifyConfig(const ParsedRtcEventLog& parsed_log, 1121 void VerifyConfig(const ParsedRtcEventLog& parsed_log,
845 size_t index) override { 1122 size_t index) override {
846 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index, 1123 RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index,
847 config); 1124 config);
848 } 1125 }
849 AudioEncoderRuntimeConfig config; 1126 AudioEncoderRuntimeConfig config;
(...skipping 18 matching lines...) Expand all
868 VideoSendConfigReadWriteTest test; 1145 VideoSendConfigReadWriteTest test;
869 test.DoTest(); 1146 test.DoTest();
870 } 1147 }
871 1148
872 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) { 1149 TEST(RtcEventLogTest, LogAudioNetworkAdaptation) {
873 AudioNetworkAdaptationReadWriteTest test; 1150 AudioNetworkAdaptationReadWriteTest test;
874 test.DoTest(); 1151 test.DoTest();
875 } 1152 }
876 1153
877 } // namespace webrtc 1154 } // namespace webrtc
OLDNEW
« no previous file with comments | « logging/rtc_event_log/rtc_event_log.cc ('k') | logging/rtc_event_log/rtc_event_log_unittest_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698