Chromium Code Reviews| Index: tracing/tracing/metrics/media_metric_test.html |
| diff --git a/tracing/tracing/metrics/media_metric_test.html b/tracing/tracing/metrics/media_metric_test.html |
| index 64ea02b4b2ea74c171096660d8a55d7b914f8704..c4d96982102e880306ea9cdf15529637368f4a85 100644 |
| --- a/tracing/tracing/metrics/media_metric_test.html |
| +++ b/tracing/tracing/metrics/media_metric_test.html |
| @@ -18,6 +18,7 @@ tr.b.unittest.testSuite(function() { |
| return tr.c.TestUtils.newModelWithEvents([events]); |
| } |
| + // No media data |
|
CalebRouleau
2017/09/22 17:44:21
This is not necessary since it is redundant with t
johnchen
2017/09/23 04:43:02
Done.
|
| test('mediaMetric_noData', function() { |
| const histograms = new tr.v.HistogramSet(); |
| const events = [ |
| @@ -28,6 +29,7 @@ tr.b.unittest.testSuite(function() { |
| assert.lengthOf(histograms, 0); |
| }); |
| + // Video time-to-play |
|
CalebRouleau
2017/09/22 17:44:21
This comment isn't needed.
|
| test('mediaMetric_videoTimeToPlay', function() { |
| const histograms = new tr.v.HistogramSet(); |
| const events = [ |
| @@ -52,6 +54,7 @@ tr.b.unittest.testSuite(function() { |
| assert.closeTo(ttpStatistics.max, 0.036, 1e-5); |
| }); |
| + // Audio time-to-play |
|
CalebRouleau
2017/09/22 17:44:21
Comment not needed
|
| test('mediaMetric_audioTimeToPlay', function() { |
| const histograms = new tr.v.HistogramSet(); |
| const events = [ |
| @@ -73,5 +76,304 @@ tr.b.unittest.testSuite(function() { |
| assert.closeTo(ttpStatistics.mean, 3.087, 1e-5); |
| assert.closeTo(ttpStatistics.max, 3.087, 1e-5); |
| }); |
| + |
| + // Buffering time with video |
|
CalebRouleau
2017/09/22 17:44:21
Comment not needed.
|
| + test('mediaMetric_bufferingTimeVideo', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1100, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 1500, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 1600, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10}, |
| + pid: 52, ts: 10066666, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'Compositor'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('buffering_time')); |
| + const btValue = histograms.getHistogramNamed('buffering_time'); |
| + const btStatistics = btValue.running; |
| + assert.strictEqual(btStatistics.count, 1); |
| + assert.closeTo(btStatistics.mean, 65.166, 1e-5); |
| + assert.closeTo(btStatistics.max, 65.166, 1e-5); |
| + }); |
| + |
| + // Buffering time with audio |
|
CalebRouleau
2017/09/22 17:44:21
Comment not needed.
|
| + test('mediaMetric_bufferingTimeAudio', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'AudioOutputDevice'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1234, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'AudioRendererImpl::Render', args: {}, |
| + pid: 52, ts: 4321, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 5}, |
| + pid: 52, ts: 5066666, cat: 'media', tid: 1, ph: 'X'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('buffering_time')); |
| + const btValue = histograms.getHistogramNamed('buffering_time'); |
| + const btStatistics = btValue.running; |
| + assert.strictEqual(btStatistics.count, 1); |
| + assert.closeTo(btStatistics.mean, 62.345, 1e-5); |
| + assert.closeTo(btStatistics.max, 62.345, 1e-5); |
| + }); |
| + |
| + // With seek, no buffering time should be reported |
|
CalebRouleau
2017/09/22 17:44:21
This comment contradicts the name of the test case
johnchen
2017/09/23 04:43:02
The test case name I chose was too confusing. I us
|
| + test('mediaMetric_bufferingTimeNegative', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1100, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 1500, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 1600, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10}, |
| + pid: 52, ts: 10066666, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 1.2}, |
| + pid: 52, ts: 525, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 1.2}, |
| + pid: 52, ts: 719, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'Compositor'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isUndefined(histograms.getHistogramNamed('buffering_time')); |
| + }); |
| + |
| + // Dropped frame count with video |
|
CalebRouleau
2017/09/22 17:44:21
Comment not needed.
|
| + test('mediaMetric_droppedFrameCount', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1100, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 1500, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 3}, |
| + pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 6}, |
| + pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 1}, |
| + pid: 52, ts: 345678, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'Compositor'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('dropped_frame_count')); |
| + const dfcValue = histograms.getHistogramNamed('dropped_frame_count'); |
| + const dfcStatistics = dfcValue.running; |
| + assert.strictEqual(dfcStatistics.count, 1); |
| + assert.strictEqual(dfcStatistics.mean, 10); |
| + assert.strictEqual(dfcStatistics.max, 10); |
| + }); |
| + |
| + // Seek time |
|
CalebRouleau
2017/09/22 17:44:21
Comment not needed.
|
| + test('mediaMetric_seekTime', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 100, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 200, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 1.2}, |
| + pid: 52, ts: 524, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 1.2}, |
| + pid: 52, ts: 719, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 3.7}, |
| + pid: 52, ts: 14159, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 3.7}, |
| + pid: 52, ts: 71828, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'Compositor'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('seek_time_1.2')); |
| + const st1Value = histograms.getHistogramNamed('seek_time_1.2'); |
| + const st1Statistics = st1Value.running; |
| + assert.strictEqual(st1Statistics.count, 1); |
| + assert.closeTo(st1Statistics.mean, 0.195, 1e-5); |
| + assert.closeTo(st1Statistics.max, 0.195, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('seek_time_3.7')); |
| + const st2Value = histograms.getHistogramNamed('seek_time_3.7'); |
| + const st2Statistics = st2Value.running; |
| + assert.strictEqual(st2Statistics.count, 1); |
| + assert.closeTo(st2Statistics.mean, 57.669, 1e-5); |
| + assert.closeTo(st2Statistics.max, 57.669, 1e-5); |
| + }); |
| + |
| + // Scenario: Play mixed audio/video from start to finish |
|
CalebRouleau
2017/09/22 17:44:21
This comment is better because it does add some cl
johnchen
2017/09/23 04:43:02
I would prefer to keep this one, but OK either way
|
| + test('mediaMetric_playVideoScenario', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1516, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3257, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'AudioRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3266, cat: 'media', tid: 57, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3287, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 4}, |
| + pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 2}, |
| + pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10}, |
| + pid: 52, ts: 10012345, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'Compositor'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'AudioOutputDevice'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 57, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('time_to_video_play')); |
| + const ttpvValue = histograms.getHistogramNamed('time_to_video_play'); |
| + const ttpvStatistics = ttpvValue.running; |
| + assert.strictEqual(ttpvStatistics.count, 1); |
| + assert.closeTo(ttpvStatistics.mean, 1.741, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('time_to_audio_play')); |
| + const ttpaValue = histograms.getHistogramNamed('time_to_audio_play'); |
| + const ttpaStatistics = ttpaValue.running; |
| + assert.strictEqual(ttpaStatistics.count, 1); |
| + assert.closeTo(ttpaStatistics.mean, 1.75, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('buffering_time')); |
| + const btValue = histograms.getHistogramNamed('buffering_time'); |
| + const btStatistics = btValue.running; |
| + assert.strictEqual(btStatistics.count, 1); |
| + assert.closeTo(btStatistics.mean, 9.088, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('dropped_frame_count')); |
| + const dfcValue = histograms.getHistogramNamed('dropped_frame_count'); |
| + const dfcStatistics = dfcValue.running; |
| + assert.strictEqual(dfcStatistics.count, 1); |
| + assert.strictEqual(dfcStatistics.mean, 6); |
| + }); |
| + |
| + // Scenario: Play audio from start to finish |
| + test('mediaMetric_playAudioScenario', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1516, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'AudioRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3266, cat: 'media', tid: 57, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10}, |
| + pid: 52, ts: 10012345, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'AudioOutputDevice'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 57, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isUndefined(histograms.getHistogramNamed('time_to_video_play')); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('time_to_audio_play')); |
| + const ttpaValue = histograms.getHistogramNamed('time_to_audio_play'); |
| + const ttpaStatistics = ttpaValue.running; |
| + assert.strictEqual(ttpaStatistics.count, 1); |
| + assert.closeTo(ttpaStatistics.mean, 1.75, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('buffering_time')); |
| + const btValue = histograms.getHistogramNamed('buffering_time'); |
| + const btStatistics = btValue.running; |
| + assert.strictEqual(btStatistics.count, 1); |
| + assert.closeTo(btStatistics.mean, 9.079, 1e-5); |
| + |
| + assert.isUndefined(histograms.getHistogramNamed('dropped_frame_count')); |
| + }); |
| + |
| + // Scenario: Play audio/video with two seeks |
| + test('mediaMetric_seekScenario', function() { |
| + const histograms = new tr.v.HistogramSet(); |
| + const events = [ |
| + {name: 'WebMediaPlayerImpl::DoLoad', args: {}, |
| + pid: 52, ts: 1516, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3257, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'AudioRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3266, cat: 'media', tid: 57, ph: 'X'}, |
| + {name: 'VideoRendererImpl::Render', args: {}, |
| + pid: 52, ts: 3287, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 0.5}, |
| + pid: 52, ts: 5123, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 0.5}, |
| + pid: 52, ts: 5234, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 4}, |
| + pid: 52, ts: 123456, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::DoSeek', args: {target: 9}, |
| + pid: 52, ts: 222222, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnPipelineSeeked', args: {target: 9}, |
| + pid: 52, ts: 222444, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'VideoFramesDropped', args: {count: 2}, |
| + pid: 52, ts: 234567, cat: 'media', tid: 53, ph: 'X'}, |
| + {name: 'WebMediaPlayerImpl::OnEnded', args: {duration: 10}, |
| + pid: 52, ts: 1234567, cat: 'media', tid: 1, ph: 'X'}, |
| + {name: 'thread_name', args: {name: 'CrRendererMain'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 1, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'Compositor'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 53, ph: 'M'}, |
| + {name: 'thread_name', args: {name: 'AudioOutputDevice'}, |
| + pid: 52, ts: 0, cat: '__metadata', tid: 57, ph: 'M'}, |
| + ]; |
| + tr.metrics.mediaMetric(histograms, makeModel(events)); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('time_to_video_play')); |
| + const ttpvValue = histograms.getHistogramNamed('time_to_video_play'); |
| + const ttpvStatistics = ttpvValue.running; |
| + assert.strictEqual(ttpvStatistics.count, 1); |
| + assert.closeTo(ttpvStatistics.mean, 1.741, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('time_to_audio_play')); |
| + const ttpaValue = histograms.getHistogramNamed('time_to_audio_play'); |
| + const ttpaStatistics = ttpaValue.running; |
| + assert.strictEqual(ttpaStatistics.count, 1); |
| + assert.closeTo(ttpaStatistics.mean, 1.75, 1e-5); |
| + |
| + assert.isUndefined(histograms.getHistogramNamed('buffering_time')); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('dropped_frame_count')); |
| + const dfcValue = histograms.getHistogramNamed('dropped_frame_count'); |
| + const dfcStatistics = dfcValue.running; |
| + assert.strictEqual(dfcStatistics.count, 1); |
| + assert.strictEqual(dfcStatistics.mean, 6); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('seek_time_0.5')); |
| + const st1Value = histograms.getHistogramNamed('seek_time_0.5'); |
| + const st1Statistics = st1Value.running; |
| + assert.strictEqual(st1Statistics.count, 1); |
| + assert.closeTo(st1Statistics.mean, 0.111, 1e-5); |
| + |
| + assert.isDefined(histograms.getHistogramNamed('seek_time_9')); |
| + const st2Value = histograms.getHistogramNamed('seek_time_9'); |
| + const st2Statistics = st2Value.running; |
| + assert.strictEqual(st2Statistics.count, 1); |
| + assert.closeTo(st2Statistics.mean, 0.222, 1e-5); |
| + }); |
| }); |
| </script> |