| Index: tools/telemetry/telemetry/web_perf/timeline_based_measurement_unittest.py
|
| diff --git a/tools/telemetry/telemetry/web_perf/timeline_based_measurement_unittest.py b/tools/telemetry/telemetry/web_perf/timeline_based_measurement_unittest.py
|
| index 3e3c9d7c2ebdba216aa8af4b0ad2ee093cb1a2be..e6dc2796083977ad0f70224ba4492b5b32a40446 100644
|
| --- a/tools/telemetry/telemetry/web_perf/timeline_based_measurement_unittest.py
|
| +++ b/tools/telemetry/telemetry/web_perf/timeline_based_measurement_unittest.py
|
| @@ -7,96 +7,145 @@ import unittest
|
|
|
| from telemetry import benchmark
|
| from telemetry.core import wpr_modes
|
| -from telemetry.timeline import model as model_module
|
| -from telemetry.timeline import async_slice
|
| +from telemetry.page import page as page_module
|
| from telemetry.page import page_measurement_unittest_base
|
| from telemetry.page import page_set
|
| from telemetry.page import page as page_module
|
| from telemetry.results import page_measurement_results
|
| +from telemetry.timeline import async_slice
|
| +from telemetry.timeline import model as model_module
|
| from telemetry.unittest import options_for_unittests
|
| from telemetry.web_perf import timeline_based_measurement as tbm_module
|
| +from telemetry.web_perf import timeline_interaction_record as tir_module
|
| from telemetry.web_perf.metrics import timeline_based_metric
|
|
|
|
|
| -class TimelineBasedMetricsTests(unittest.TestCase):
|
| +class FakeSmoothMetric(timeline_based_metric.TimelineBasedMetric):
|
|
|
| - def setUp(self):
|
| - model = model_module.TimelineModel()
|
| - renderer_thread = model.GetOrCreateProcess(1).GetOrCreateThread(2)
|
| - renderer_thread.name = 'CrRendererMain'
|
| -
|
| - # [ X ]
|
| - # [ Y ]
|
| - renderer_thread.BeginSlice('cat1', 'x.y', 10, 0)
|
| - renderer_thread.EndSlice(20, 20)
|
| -
|
| - renderer_thread.async_slices.append(async_slice.AsyncSlice(
|
| - 'cat', 'Interaction.LogicalName1/is_smooth',
|
| - timestamp=0, duration=20,
|
| - start_thread=renderer_thread, end_thread=renderer_thread,
|
| - thread_start=5, thread_duration=15))
|
| - renderer_thread.async_slices.append(async_slice.AsyncSlice(
|
| - 'cat', 'Interaction.LogicalName2/is_responsive',
|
| - timestamp=25, duration=5,
|
| - start_thread=renderer_thread, end_thread=renderer_thread,
|
| - thread_start=25, thread_duration=5))
|
| - model.FinalizeImport()
|
| -
|
| - self.model = model
|
| - self.renderer_thread = renderer_thread
|
| + def AddResults(self, model, renderer_thread,
|
| + interaction_records, results):
|
| + results.Add('FakeSmoothMetric', 'ms', 1)
|
| + results.Add('SmoothMetricRecords', 'count', len(interaction_records))
|
|
|
| - def testFindTimelineInteractionRecords(self):
|
| - metric = tbm_module._TimelineBasedMetrics( # pylint: disable=W0212
|
| - self.model, self.renderer_thread, lambda _: [])
|
| - interactions = metric.FindTimelineInteractionRecords()
|
| - self.assertEquals(2, len(interactions))
|
| - self.assertTrue(interactions[0].is_smooth)
|
| - self.assertEquals(0, interactions[0].start)
|
| - self.assertEquals(20, interactions[0].end)
|
|
|
| - self.assertTrue(interactions[1].is_responsive)
|
| - self.assertEquals(25, interactions[1].start)
|
| - self.assertEquals(30, interactions[1].end)
|
| +class FakeLoadingMetric(timeline_based_metric.TimelineBasedMetric):
|
|
|
| - def testAddResults(self):
|
| - results = page_measurement_results.PageMeasurementResults()
|
| + def AddResults(self, model, renderer_thread,
|
| + interaction_records, results):
|
| + results.Add('FakeLoadingMetric', 'ms', 2)
|
| + results.Add('LoadingMetricRecords', 'count', len(interaction_records))
|
| +
|
| +
|
| +def GetMetricFromMetricType(metric_type):
|
| + if metric_type == tir_module.IS_SMOOTH:
|
| + return FakeSmoothMetric()
|
| + if metric_type == tir_module.IS_RESPONSIVE:
|
| + return FakeLoadingMetric()
|
| + raise Exception('Unrecognized metric type: %s' % metric_type)
|
|
|
| - class FakeSmoothMetric(timeline_based_metric.TimelineBasedMetric):
|
|
|
| - def AddResults(self, model, renderer_thread,
|
| - interaction_records, results):
|
| - results.Add('FakeSmoothMetric', 'ms', 1)
|
| +class TimelineBasedMetricTestData(object):
|
|
|
| - class FakeLoadingMetric(timeline_based_metric.TimelineBasedMetric):
|
| + def __init__(self):
|
| + self._model = model_module.TimelineModel()
|
| + renderer_process = self._model.GetOrCreateProcess(1)
|
| + self._renderer_thread = renderer_process.GetOrCreateThread(2)
|
| + self._renderer_thread.name = 'CrRendererMain'
|
| + self._results = page_measurement_results.PageMeasurementResults()
|
| + self._metric = None
|
|
|
| - def AddResults(self, model, renderer_thread,
|
| - interaction_records, results):
|
| - for r in interaction_records:
|
| - assert r.logical_name == 'LogicalName2'
|
| - results.Add('FakeLoadingMetric', 'ms', 2)
|
| + @property
|
| + def results(self):
|
| + return self._results
|
|
|
| - def CreateMetricsForTimelineInteractionRecord(interaction):
|
| - res = []
|
| - if interaction.is_smooth:
|
| - res.append(FakeSmoothMetric())
|
| - if interaction.is_responsive:
|
| - res.append(FakeLoadingMetric())
|
| - return res
|
| + @property
|
| + def metric(self):
|
| + return self._metric
|
|
|
| - metric = tbm_module._TimelineBasedMetrics( # pylint: disable=W0212
|
| - self.model, self.renderer_thread,
|
| - CreateMetricsForTimelineInteractionRecord)
|
| + def AddInteraction(self, marker='', ts=0, duration=5):
|
| + self._renderer_thread.async_slices.append(async_slice.AsyncSlice(
|
| + 'category', marker, timestamp=ts, duration=duration,
|
| + start_thread=self._renderer_thread, end_thread=self._renderer_thread,
|
| + thread_start=ts, thread_duration=duration))
|
| +
|
| + def FinalizeImport(self):
|
| + self._model.FinalizeImport()
|
| + self._metric = tbm_module._TimelineBasedMetrics( # pylint: disable=W0212
|
| + self._model, self._renderer_thread, GetMetricFromMetricType)
|
| ps = page_set.PageSet(file_path=os.path.dirname(__file__))
|
| ps.AddPageWithDefaultRunNavigate('http://www.bar.com/')
|
| + self._results.WillMeasurePage(ps.pages[0])
|
|
|
| - results.WillMeasurePage(ps.pages[0])
|
| - metric.AddResults(results)
|
| - results.DidMeasurePage()
|
| + def AddResults(self):
|
| + self._metric.AddResults(self._results)
|
| + self._results.DidMeasurePage()
|
|
|
| - v = results.FindAllPageSpecificValuesNamed('LogicalName1-FakeSmoothMetric')
|
| - self.assertEquals(len(v), 1)
|
| - v = results.FindAllPageSpecificValuesNamed('LogicalName2-FakeLoadingMetric')
|
| - self.assertEquals(len(v), 1)
|
| +
|
| +class TimelineBasedMetricsTests(unittest.TestCase):
|
| +
|
| + def testFindTimelineInteractionRecords(self):
|
| + d = TimelineBasedMetricTestData()
|
| + d.AddInteraction(ts=0, duration=20,
|
| + marker='Interaction.LogicalName1/is_smooth')
|
| + d.AddInteraction(ts=25, duration=5,
|
| + marker='Interaction.LogicalName2/is_responsive')
|
| + d.FinalizeImport()
|
| + interactions = d.metric.FindTimelineInteractionRecords()
|
| + self.assertEquals(2, len(interactions))
|
| + self.assertTrue(interactions[0].is_smooth)
|
| + self.assertEquals(0, interactions[0].start)
|
| + self.assertEquals(20, interactions[0].end)
|
| +
|
| + self.assertTrue(interactions[1].is_responsive)
|
| + self.assertEquals(25, interactions[1].start)
|
| + self.assertEquals(30, interactions[1].end)
|
| +
|
| + def testAddResults(self):
|
| + d = TimelineBasedMetricTestData()
|
| + d.AddInteraction(ts=0, duration=20,
|
| + marker='Interaction.LogicalName1/is_smooth')
|
| + d.AddInteraction(ts=25, duration=5,
|
| + marker='Interaction.LogicalName2/is_responsive')
|
| + d.FinalizeImport()
|
| + d.AddResults()
|
| + self.assertEquals(1, len(d.results.FindAllPageSpecificValuesNamed(
|
| + 'LogicalName1-FakeSmoothMetric')))
|
| + self.assertEquals(1, len(d.results.FindAllPageSpecificValuesNamed(
|
| + 'LogicalName2-FakeLoadingMetric')))
|
| +
|
| + def testNoInteractions(self):
|
| + d = TimelineBasedMetricTestData()
|
| + d.FinalizeImport()
|
| + self.assertRaises(tbm_module.InvalidInteractions, d.AddResults)
|
| +
|
| + def testDuplicateUnrepeatableInteractions(self):
|
| + d = TimelineBasedMetricTestData()
|
| + d.AddInteraction(ts=10, duration=5,
|
| + marker='Interaction.LogicalName/is_smooth')
|
| + d.AddInteraction(ts=20, duration=5,
|
| + marker='Interaction.LogicalName/is_smooth')
|
| + d.FinalizeImport()
|
| + self.assertRaises(tbm_module.InvalidInteractions, d.AddResults)
|
| +
|
| + def testDuplicateRepeatableInteractions(self):
|
| + d = TimelineBasedMetricTestData()
|
| + d.AddInteraction(ts=10, duration=5,
|
| + marker='Interaction.LogicalName/is_smooth,repeatable')
|
| + d.AddInteraction(ts=20, duration=5,
|
| + marker='Interaction.LogicalName/is_smooth,repeatable')
|
| + d.FinalizeImport()
|
| + d.AddResults()
|
| + self.assertEquals(1, len(d.results.pages_that_succeeded))
|
| +
|
| + def testDuplicateRepeatableInteractionsWithDifferentMetrics(self):
|
| + d = TimelineBasedMetricTestData()
|
| +
|
| + responsive_marker = 'Interaction.LogicalName/is_responsive,repeatable'
|
| + d.AddInteraction(ts=10, duration=5, marker=responsive_marker)
|
| + smooth_marker = 'Interaction.LogicalName/is_smooth,repeatable'
|
| + d.AddInteraction(ts=20, duration=5, marker=smooth_marker)
|
| + d.FinalizeImport()
|
| + self.assertRaises(tbm_module.InvalidInteractions, d.AddResults)
|
|
|
|
|
| class TestTimelinebasedMeasurementPage(page_module.Page):
|
|
|