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

Side by Side Diff: media/cast/logging/logging_unittest.cc

Issue 130423007: Cast:Updating logging stats (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <gtest/gtest.h> 5 #include <gtest/gtest.h>
6 6
7 #include "base/rand_util.h" 7 #include "base/rand_util.h"
8 #include "base/test/simple_test_tick_clock.h" 8 #include "base/test/simple_test_tick_clock.h"
9 #include "base/time/tick_clock.h" 9 #include "base/time/tick_clock.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 24 matching lines...) Expand all
35 task_runner_ = new test::FakeTaskRunner(&testing_clock_); 35 task_runner_ = new test::FakeTaskRunner(&testing_clock_);
36 logging_.reset(new LoggingImpl(task_runner_, config_)); 36 logging_.reset(new LoggingImpl(task_runner_, config_));
37 } 37 }
38 38
39 virtual ~TestLogging() {} 39 virtual ~TestLogging() {}
40 40
41 CastLoggingConfig config_; 41 CastLoggingConfig config_;
42 scoped_refptr<test::FakeTaskRunner> task_runner_; 42 scoped_refptr<test::FakeTaskRunner> task_runner_;
43 scoped_ptr<LoggingImpl> logging_; 43 scoped_ptr<LoggingImpl> logging_;
44 base::SimpleTestTickClock testing_clock_; 44 base::SimpleTestTickClock testing_clock_;
45
46 DISALLOW_COPY_AND_ASSIGN(TestLogging);
45 }; 47 };
46 48
47 TEST_F(TestLogging, BasicFrameLogging) { 49 TEST_F(TestLogging, BasicFrameLogging) {
48 base::TimeTicks start_time = testing_clock_.NowTicks(); 50 base::TimeTicks start_time = testing_clock_.NowTicks();
49 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; 51 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
50 uint32 rtp_timestamp = 0; 52 uint32 rtp_timestamp = 0;
51 uint32 frame_id = 0; 53 uint32 frame_id = 0;
54 base::TimeTicks now;
52 do { 55 do {
53 logging_->InsertFrameEvent(testing_clock_.NowTicks(), 56 now = testing_clock_.NowTicks();
54 kAudioFrameCaptured, rtp_timestamp, frame_id); 57 logging_->InsertFrameEvent(now, kAudioFrameCaptured, rtp_timestamp,
58 frame_id);
55 testing_clock_.Advance( 59 testing_clock_.Advance(
56 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); 60 base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
57 rtp_timestamp += kFrameIntervalMs * 90; 61 rtp_timestamp += kFrameIntervalMs * 90;
58 ++frame_id; 62 ++frame_id;
59 time_interval = testing_clock_.NowTicks() - start_time; 63 time_interval = now - start_time;
60 } while (time_interval.InSeconds() < kIntervalTime1S); 64 } while (time_interval.InSeconds() < kIntervalTime1S);
65 base::TimeTicks end_time = now;
61 // Get logging data. 66 // Get logging data.
62 FrameRawMap frame_map = logging_->GetFrameRawData(); 67 FrameRawMap frame_map = logging_->GetFrameRawData();
63 // Size of map should be equal to the number of frames logged. 68 // Size of map should be equal to the number of frames logged.
64 EXPECT_EQ(frame_id, frame_map.size()); 69 EXPECT_EQ(frame_id, frame_map.size());
65 // Verify stats. 70 // Verify stats.
66 const FrameStatsMap* frame_stats = 71 const FrameStatsMap* frame_stats = logging_->GetFrameStatsData();
67 logging_->GetFrameStatsData(testing_clock_.NowTicks());
68 // Size of stats equals the number of events. 72 // Size of stats equals the number of events.
69 EXPECT_EQ(1u, frame_stats->size()); 73 EXPECT_EQ(1u, frame_stats->size());
70 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); 74 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured);
71 EXPECT_TRUE(it != frame_stats->end()); 75 EXPECT_TRUE(it != frame_stats->end());
72 EXPECT_NEAR(30.3, it->second->framerate_fps, 0.1); 76 EXPECT_EQ(0, it->second->max_delay.InMilliseconds());
73 EXPECT_EQ(0, it->second->bitrate_kbps); 77 EXPECT_EQ(0, it->second->min_delay.InMilliseconds());
74 EXPECT_EQ(0, it->second->max_delay_ms); 78 EXPECT_EQ(start_time, it->second->first_event_time);
75 EXPECT_EQ(0, it->second->min_delay_ms); 79 EXPECT_EQ(end_time, it->second->last_event_time);
76 EXPECT_EQ(0, it->second->avg_delay_ms); 80 EXPECT_EQ(0, it->second->size_sum);
81 // Number of events is equal to the number of frames.
82 EXPECT_EQ(static_cast<int>(frame_id), it->second->event_counter);
77 } 83 }
78 84
79 TEST_F(TestLogging, FrameLoggingWithSize) { 85 TEST_F(TestLogging, FrameLoggingWithSize) {
80 // Average packet size. 86 // Average packet size.
81 const int kBaseFrameSizeBytes = 25000; 87 const int kBaseFrameSizeBytes = 25000;
82 const int kRandomSizeInterval = 100; 88 const int kRandomSizeInterval = 100;
83 base::TimeTicks start_time = testing_clock_.NowTicks(); 89 base::TimeTicks start_time = testing_clock_.NowTicks();
84 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; 90 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
85 uint32 rtp_timestamp = 0; 91 uint32 rtp_timestamp = 0;
86 uint32 frame_id = 0; 92 uint32 frame_id = 0;
93 int size_sum = 0;
87 do { 94 do {
88 int size = kBaseFrameSizeBytes + 95 int size = kBaseFrameSizeBytes +
89 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval); 96 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval);
97 size_sum += size;
90 logging_->InsertFrameEventWithSize(testing_clock_.NowTicks(), 98 logging_->InsertFrameEventWithSize(testing_clock_.NowTicks(),
91 kAudioFrameCaptured, rtp_timestamp, frame_id, size); 99 kAudioFrameCaptured, rtp_timestamp, frame_id, size);
92 testing_clock_.Advance( 100 testing_clock_.Advance(
93 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); 101 base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
94 rtp_timestamp += kFrameIntervalMs * 90; 102 rtp_timestamp += kFrameIntervalMs * 90;
95 ++frame_id; 103 ++frame_id;
96 time_interval = testing_clock_.NowTicks() - start_time; 104 time_interval = testing_clock_.NowTicks() - start_time;
97 } while (time_interval.InSeconds() < kIntervalTime1S); 105 } while (time_interval.InSeconds() < kIntervalTime1S);
98 // Get logging data. 106 // Get logging data.
99 FrameRawMap frame_map = logging_->GetFrameRawData(); 107 FrameRawMap frame_map = logging_->GetFrameRawData();
100 // Size of map should be equal to the number of frames logged. 108 // Size of map should be equal to the number of frames logged.
101 EXPECT_EQ(frame_id, frame_map.size()); 109 EXPECT_EQ(frame_id, frame_map.size());
102 // Verify stats. 110 // Verify stats.
103 const FrameStatsMap* frame_stats = 111 const FrameStatsMap* frame_stats = logging_->GetFrameStatsData();
104 logging_->GetFrameStatsData(testing_clock_.NowTicks());
105 // Size of stats equals the number of events. 112 // Size of stats equals the number of events.
106 EXPECT_EQ(1u, frame_stats->size()); 113 EXPECT_EQ(1u, frame_stats->size());
107 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); 114 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured);
108 EXPECT_TRUE(it != frame_stats->end()); 115 EXPECT_TRUE(it != frame_stats->end());
109 EXPECT_NEAR(30.3, it->second->framerate_fps, 0.1); 116 EXPECT_EQ(0, it->second->max_delay.InMilliseconds());
110 EXPECT_NEAR(8 * kBaseFrameSizeBytes / (kFrameIntervalMs * 1000), 117 EXPECT_EQ(0, it->second->min_delay.InMilliseconds());
111 it->second->bitrate_kbps, kRandomSizeInterval); 118 EXPECT_EQ(0, it->second->sum_delay.InMilliseconds());
112 EXPECT_EQ(0, it->second->max_delay_ms); 119 EXPECT_EQ(size_sum, it->second->size_sum);
113 EXPECT_EQ(0, it->second->min_delay_ms);
114 EXPECT_EQ(0, it->second->avg_delay_ms);
115 } 120 }
116 121
117 TEST_F(TestLogging, FrameLoggingWithDelay) { 122 TEST_F(TestLogging, FrameLoggingWithDelay) {
118 // Average packet size. 123 // Average packet size.
119 const int kPlayoutDelayMs = 50; 124 const int kPlayoutDelayMs = 50;
120 const int kRandomSizeInterval = 20; 125 const int kRandomSizeInterval = 20;
121 base::TimeTicks start_time = testing_clock_.NowTicks(); 126 base::TimeTicks start_time = testing_clock_.NowTicks();
122 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; 127 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
123 uint32 rtp_timestamp = 0; 128 uint32 rtp_timestamp = 0;
124 uint32 frame_id = 0; 129 uint32 frame_id = 0;
125 do { 130 do {
126 int delay = kPlayoutDelayMs + 131 int delay = kPlayoutDelayMs +
127 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval); 132 base::RandInt(-kRandomSizeInterval, kRandomSizeInterval);
128 logging_->InsertFrameEventWithDelay(testing_clock_.NowTicks(), 133 logging_->InsertFrameEventWithDelay(testing_clock_.NowTicks(),
129 kAudioFrameCaptured, rtp_timestamp, frame_id, 134 kAudioFrameCaptured, rtp_timestamp, frame_id,
130 base::TimeDelta::FromMilliseconds(delay)); 135 base::TimeDelta::FromMilliseconds(delay));
131 testing_clock_.Advance( 136 testing_clock_.Advance(
132 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); 137 base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
133 rtp_timestamp += kFrameIntervalMs * 90; 138 rtp_timestamp += kFrameIntervalMs * 90;
134 ++frame_id; 139 ++frame_id;
135 time_interval = testing_clock_.NowTicks() - start_time; 140 time_interval = testing_clock_.NowTicks() - start_time;
136 } while (time_interval.InSeconds() < kIntervalTime1S); 141 } while (time_interval.InSeconds() < kIntervalTime1S);
137 // Get logging data. 142 // Get logging data.
138 FrameRawMap frame_map = logging_->GetFrameRawData(); 143 FrameRawMap frame_map = logging_->GetFrameRawData();
139 // Size of map should be equal to the number of frames logged. 144 // Size of map should be equal to the number of frames logged.
140 EXPECT_EQ(frame_id, frame_map.size()); 145 EXPECT_EQ(frame_id, frame_map.size());
141 // Verify stats. 146 // Verify stats.
142 const FrameStatsMap* frame_stats = 147 const FrameStatsMap* frame_stats = logging_->GetFrameStatsData();
143 logging_->GetFrameStatsData(testing_clock_.NowTicks());
144 // Size of stats equals the number of events. 148 // Size of stats equals the number of events.
145 EXPECT_EQ(1u, frame_stats->size()); 149 EXPECT_EQ(1u, frame_stats->size());
146 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured); 150 FrameStatsMap::const_iterator it = frame_stats->find(kAudioFrameCaptured);
147 EXPECT_TRUE(it != frame_stats->end()); 151 EXPECT_TRUE(it != frame_stats->end());
148 EXPECT_NEAR(30.3, it->second->framerate_fps, 0.1); 152 EXPECT_GE(kPlayoutDelayMs + kRandomSizeInterval,
149 EXPECT_EQ(0, it->second->bitrate_kbps); 153 it->second->max_delay.InMilliseconds());
150 EXPECT_GE(kPlayoutDelayMs + kRandomSizeInterval, it->second->max_delay_ms); 154 EXPECT_LE(kPlayoutDelayMs - kRandomSizeInterval,
151 EXPECT_LE(kPlayoutDelayMs - kRandomSizeInterval, it->second->min_delay_ms); 155 it->second->min_delay.InMilliseconds());
152 EXPECT_NEAR(kPlayoutDelayMs, it->second->avg_delay_ms,
153 0.2 * kRandomSizeInterval);
154 } 156 }
155 157
156 TEST_F(TestLogging, MultipleEventFrameLogging) { 158 TEST_F(TestLogging, MultipleEventFrameLogging) {
157 base::TimeTicks start_time = testing_clock_.NowTicks(); 159 base::TimeTicks start_time = testing_clock_.NowTicks();
158 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; 160 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
159 uint32 rtp_timestamp = 0; 161 uint32 rtp_timestamp = 0;
160 uint32 frame_id = 0; 162 uint32 frame_id = 0;
161 do { 163 do {
162 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured, 164 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured,
163 rtp_timestamp, frame_id); 165 rtp_timestamp, frame_id);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); 205 base::TimeDelta::FromMilliseconds(kFrameIntervalMs));
204 rtp_timestamp += kFrameIntervalMs * 90; 206 rtp_timestamp += kFrameIntervalMs * 90;
205 ++frame_id; 207 ++frame_id;
206 time_interval = testing_clock_.NowTicks() - start_time; 208 time_interval = testing_clock_.NowTicks() - start_time;
207 } while (time_interval.InSeconds() < kIntervalTime1S); 209 } while (time_interval.InSeconds() < kIntervalTime1S);
208 // Get logging data. 210 // Get logging data.
209 PacketRawMap raw_map = logging_->GetPacketRawData(); 211 PacketRawMap raw_map = logging_->GetPacketRawData();
210 // Size of map should be equal to the number of frames logged. 212 // Size of map should be equal to the number of frames logged.
211 EXPECT_EQ(frame_id, raw_map.size()); 213 EXPECT_EQ(frame_id, raw_map.size());
212 // Verify stats. 214 // Verify stats.
213 const PacketStatsMap* stats_map = 215 const PacketStatsMap* stats_map = logging_->GetPacketStatsData();
214 logging_->GetPacketStatsData(testing_clock_.NowTicks());
215 // Size of stats equals the number of events. 216 // Size of stats equals the number of events.
216 EXPECT_EQ(1u, stats_map->size()); 217 EXPECT_EQ(1u, stats_map->size());
217 PacketStatsMap::const_iterator it = stats_map->find(kPacketSentToPacer); 218 PacketStatsMap::const_iterator it = stats_map->find(kPacketSentToPacer);
218 EXPECT_TRUE(it != stats_map->end()); 219 EXPECT_TRUE(it != stats_map->end());
219 // We only store the bitrate as a packet statistic.
220 EXPECT_NEAR(8 * kNumPacketsPerFrame * kBaseSize / (kFrameIntervalMs * 1000),
221 it->second, kSizeInterval);
222 } 220 }
223 221
224 TEST_F(TestLogging, GenericLogging) { 222 TEST_F(TestLogging, GenericLogging) {
225 // Insert multiple generic types. 223 // Insert multiple generic types.
226 const size_t kNumRuns = 1000; 224 const size_t kNumRuns = 1000;
227 const int kBaseValue = 20; 225 const int kBaseValue = 20;
226 int sum_value_rtt = 0;
227 int sum_value_pl = 0;
228 int sum_value_jitter = 0;
229 int min_value, max_value;
228 for (size_t i = 0; i < kNumRuns; ++i) { 230 for (size_t i = 0; i < kNumRuns; ++i) {
229 int value = kBaseValue + base::RandInt(-5, 5); 231 int value = kBaseValue + base::RandInt(-5, 5);
232 sum_value_rtt += value;
230 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kRttMs, value); 233 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kRttMs, value);
231 if (i % 2) { 234 if (i % 2) {
232 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kPacketLoss, 235 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kPacketLoss,
233 value); 236 value);
237 sum_value_pl += value;
234 } 238 }
235 if (!(i % 4)) { 239 if (!(i % 4)) {
236 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kJitterMs, value); 240 logging_->InsertGenericEvent(testing_clock_.NowTicks(), kJitterMs, value);
241 sum_value_jitter += value;
242 }
243 if (i == 0) {
244 min_value = value;
245 max_value = value;
246 } else if (min_value > value) {
247 min_value = value;
248 } else if (max_value < value) {
249 max_value = value;
237 } 250 }
238 } 251 }
239 GenericRawMap raw_map = logging_->GetGenericRawData(); 252 GenericRawMap raw_map = logging_->GetGenericRawData();
240 const GenericStatsMap* stats_map = logging_->GetGenericStatsData(); 253 const GenericStatsMap* stats_map = logging_->GetGenericStatsData();
241 // Size of generic map = number of different events. 254 // Size of generic map = number of different events.
242 EXPECT_EQ(3u, raw_map.size()); 255 EXPECT_EQ(3u, raw_map.size());
243 EXPECT_EQ(3u, stats_map->size()); 256 EXPECT_EQ(3u, stats_map->size());
244 // Raw events - size of internal map = number of calls. 257 // Raw events - size of internal map = number of calls.
245 GenericRawMap::iterator rit = raw_map.find(kRttMs); 258 GenericRawMap::iterator rit = raw_map.find(kRttMs);
246 EXPECT_EQ(kNumRuns, rit->second.value.size()); 259 EXPECT_EQ(kNumRuns, rit->second.value.size());
247 EXPECT_EQ(kNumRuns, rit->second.timestamp.size()); 260 EXPECT_EQ(kNumRuns, rit->second.timestamp.size());
248 rit = raw_map.find(kPacketLoss); 261 rit = raw_map.find(kPacketLoss);
249 EXPECT_EQ(kNumRuns / 2, rit->second.value.size()); 262 EXPECT_EQ(kNumRuns / 2, rit->second.value.size());
250 EXPECT_EQ(kNumRuns / 2, rit->second.timestamp.size()); 263 EXPECT_EQ(kNumRuns / 2, rit->second.timestamp.size());
251 rit = raw_map.find(kJitterMs); 264 rit = raw_map.find(kJitterMs);
252 EXPECT_EQ(kNumRuns / 4, rit->second.value.size()); 265 EXPECT_EQ(kNumRuns / 4, rit->second.value.size());
253 EXPECT_EQ(kNumRuns / 4, rit->second.timestamp.size()); 266 EXPECT_EQ(kNumRuns / 4, rit->second.timestamp.size());
254 // Stats - one value per event. 267 // Stats - one value per all events.
255 GenericStatsMap::const_iterator sit = stats_map->find(kRttMs); 268 GenericStatsMap::const_iterator sit = stats_map->find(kRttMs);
256 EXPECT_NEAR(kBaseValue, sit->second, 2.5); 269 EXPECT_EQ(sum_value_rtt, sit->second->sum);
270 EXPECT_GE(min_value, sit->second->min);
271 EXPECT_LE(max_value, sit->second->max);
257 sit = stats_map->find(kPacketLoss); 272 sit = stats_map->find(kPacketLoss);
258 EXPECT_NEAR(kBaseValue, sit->second, 2.5); 273 EXPECT_EQ(sum_value_pl, sit->second->sum);
274 EXPECT_GE(min_value, sit->second->min);
275 EXPECT_LE(max_value, sit->second->max);
259 sit = stats_map->find(kJitterMs); 276 sit = stats_map->find(kJitterMs);
260 EXPECT_NEAR(kBaseValue, sit->second, 2.5); 277 EXPECT_EQ(sum_value_jitter, sit->second->sum);
278 EXPECT_GE(min_value, sit->second->min);
279 EXPECT_LE(max_value, sit->second->max);
261 } 280 }
262 281
263 TEST_F(TestLogging, RtcpMultipleEventFrameLogging) { 282 TEST_F(TestLogging, RtcpMultipleEventFrameLogging) {
264 base::TimeTicks start_time = testing_clock_.NowTicks(); 283 base::TimeTicks start_time = testing_clock_.NowTicks();
265 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; 284 base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time;
266 uint32 rtp_timestamp = 0; 285 uint32 rtp_timestamp = 0;
267 uint32 frame_id = 0; 286 uint32 frame_id = 0;
268 do { 287 do {
269 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured, 288 logging_->InsertFrameEvent(testing_clock_.NowTicks(), kAudioFrameCaptured,
270 rtp_timestamp, frame_id); 289 rtp_timestamp, frame_id);
(...skipping 22 matching lines...) Expand all
293 312
294 AudioRtcpRawMap audio_rtcp = logging_->GetAudioRtcpRawData(); 313 AudioRtcpRawMap audio_rtcp = logging_->GetAudioRtcpRawData();
295 EXPECT_EQ(0u, audio_rtcp.size()); 314 EXPECT_EQ(0u, audio_rtcp.size());
296 315
297 VideoRtcpRawMap video_rtcp = logging_->GetVideoRtcpRawData(); 316 VideoRtcpRawMap video_rtcp = logging_->GetVideoRtcpRawData();
298 EXPECT_EQ((frame_id + 1) / 2, video_rtcp.size()); 317 EXPECT_EQ((frame_id + 1) / 2, video_rtcp.size());
299 } 318 }
300 319
301 } // namespace cast 320 } // namespace cast
302 } // namespace media 321 } // namespace media
OLDNEW
« media/cast/logging/logging_stats.cc ('K') | « media/cast/logging/logging_stats.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698