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

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

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