Index: tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py |
diff --git a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py b/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py |
index 8abffc2930b55ff725e2a3cb075a19ba4bca4a2f..c0ba3fb3d20df0327b25331f7f767106eb76575e 100644 |
--- a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py |
+++ b/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py |
@@ -6,17 +6,28 @@ import random |
import unittest |
from telemetry.web_perf.metrics.rendering_stats import ( |
- UI_COMP_NAME, BEGIN_COMP_NAME, ORIGINAL_COMP_NAME, END_COMP_NAME) |
-from telemetry.web_perf.metrics.rendering_stats import ComputeInputEventLatency |
-from telemetry.web_perf.metrics.rendering_stats import GetInputLatencyEvents |
-from telemetry.web_perf.metrics.rendering_stats import HasRenderingStats |
-from telemetry.web_perf.metrics.rendering_stats import NotEnoughFramesError |
-from telemetry.web_perf.metrics.rendering_stats import RenderingStats |
+ UI_COMP_NAME, |
+ BEGIN_COMP_NAME, |
+ ORIGINAL_COMP_NAME, |
+ END_COMP_NAME, |
+ GESTURE_SCROLL_UPDATE, |
+ ALL_INPUT_EVENTS) |
+ |
+from telemetry.web_perf.metrics.rendering_stats import ( |
+ ComputeInputEventLatency, |
+ GetInputLatencyEvents, |
+ HasRenderingStats, |
+ NotEnoughFramesError, |
+ RenderingStats, |
+ GetInputEventStartAndLatency) |
+ |
from telemetry.util.statistics import DivideIfPossibleOrZero |
import telemetry.timeline.bounds as timeline_bounds |
from telemetry.timeline import model |
import telemetry.timeline.async_slice as tracing_async_slice |
+from collections import namedtuple |
+InputEventDetails = namedtuple('InputEventDetails','start_time latency') |
class MockTimer(object): |
"""A mock timer class which can generate random durations. |
@@ -196,6 +207,15 @@ def AddInputLatencyStats(mock_timer, start_thread, end_thread, |
(data[END_COMP_NAME]['time'] - data[ORIGINAL_COMP_NAME]['time']) / 1000.0) |
+def assertListsAreAlmostEqual(self, list1, list2): |
+ """Compare items in two lists to default (7 decimal places) precision |
+ to avoid rounding errors generating false positives. |
+ """ |
+ self.assertEquals(len(list1), len(list2)) |
+ for item1, item2 in zip(list1, list2): |
+ self.assertAlmostEqual(item1, item2) |
+ |
+ |
class RenderingStatsUnitTest(unittest.TestCase): |
def testHasRenderingStats(self): |
timeline = model.TimelineModel() |
@@ -364,6 +384,7 @@ class RenderingStatsUnitTest(unittest.TestCase): |
self.assertEquals(stats.recorded_pixel_counts, |
renderer_ref_stats.recorded_pixel_counts) |
+ |
def testInputLatencyFromTimeline(self): |
timeline = model.TimelineModel() |
@@ -419,5 +440,51 @@ class RenderingStatsUnitTest(unittest.TestCase): |
input_events.extend(GetInputLatencyEvents(browser, timeline_range)) |
self.assertEquals(input_events, ref_latency.input_event) |
- self.assertEquals(ComputeInputEventLatency(input_events), |
- ref_latency.input_event_latency) |
+ |
+ assertListsAreAlmostEqual(self, |
+ ComputeInputEventLatency(input_events), |
+ ref_latency.input_event_latency) |
+ |
+ def testGetInputEventStartAndLatency(self): |
+ data_1 = { ORIGINAL_COMP_NAME: {'time': 1000.0}, |
+ UI_COMP_NAME: {'time': 1000.0}, |
+ BEGIN_COMP_NAME: {'time': 1000.0}, |
+ END_COMP_NAME: {'time': 5000.0} } |
+ |
+ data_2 = { ORIGINAL_COMP_NAME: {'time': 2000.0}, |
+ UI_COMP_NAME: {'time': 2000.0}, |
+ BEGIN_COMP_NAME: {'time': 2000.0}, |
+ END_COMP_NAME: {'time': 8000.0} } |
+ |
+ timestamp = MockTimer().Get() |
+ |
+ async_slice_GSU = tracing_async_slice.AsyncSlice( |
+ 'benchmark', 'InputLatency', timestamp) |
+ |
+ async_slice = tracing_async_slice.AsyncSlice( |
+ 'benchmark', 'InputLatency', timestamp) |
+ |
+ async_slice_GSU.args = {'data': data_1, 'step':GESTURE_SCROLL_UPDATE} |
+ async_slice.args = {'data': data_2, 'step':'GeneralInput'} |
+ |
+ input_events = [] |
+ |
+ input_events.append(async_slice_GSU) |
+ input_events.append(async_slice) |
+ |
+ filtered_GSU_events = GetInputEventStartAndLatency(input_events, |
+ GESTURE_SCROLL_UPDATE) |
+ self.assertEquals([InputEventDetails(1.0, 4.0)], filtered_GSU_events) |
+ |
+ filtered_Non_GSU_events = GetInputEventStartAndLatency(input_events, |
+ 'GeneralInput') |
+ self.assertEquals([InputEventDetails(2.0, 6.0)], filtered_Non_GSU_events) |
+ |
+ all_events = GetInputEventStartAndLatency(input_events, ALL_INPUT_EVENTS) |
+ self.assertEquals([InputEventDetails(1.0, 4.0), |
+ InputEventDetails(2.0, 6.0)], all_events) |
+ |
+ no_events = GetInputEventStartAndLatency(input_events, "Nothing to match") |
+ self.assertEquals([], no_events) |
+ |
+ |