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

Unified Diff: tools/telemetry/telemetry/web_perf/timeline_based_measurement_unittest.py

Issue 367523002: Handle multiple duplicate timeline interaction records. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update unittests Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
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):

Powered by Google App Engine
This is Rietveld 408576698