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

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

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