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 |
deleted file mode 100644 |
index 0609bbd52af225c4166760a51b5cec1c42a8f81d..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/web_perf/metrics/rendering_stats_unittest.py |
+++ /dev/null |
@@ -1,543 +0,0 @@ |
-# Copyright 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-import random |
-import unittest |
- |
-from telemetry.timeline import async_slice |
-from telemetry.timeline import bounds |
-from telemetry.timeline import model |
-from telemetry.util import perf_tests_helper |
-from telemetry.util import statistics |
-from telemetry.web_perf.metrics import rendering_stats |
- |
- |
-class MockTimer(object): |
- """A mock timer class which can generate random durations. |
- |
- An instance of this class is used as a global timer to generate random |
- durations for stats and consistent timestamps for all mock trace events. |
- The unit of time is milliseconds. |
- """ |
- |
- def __init__(self): |
- self.milliseconds = 0 |
- |
- def Advance(self, low=0.1, high=1): |
- delta = random.uniform(low, high) |
- self.milliseconds += delta |
- return delta |
- |
- def AdvanceAndGet(self, low=0.1, high=1): |
- self.Advance(low, high) |
- return self.milliseconds |
- |
- |
-class ReferenceRenderingStats(object): |
- """ Stores expected data for comparison with actual RenderingStats """ |
- |
- def __init__(self): |
- self.frame_timestamps = [] |
- self.frame_times = [] |
- self.approximated_pixel_percentages = [] |
- self.checkerboarded_pixel_percentages = [] |
- |
- def AppendNewRange(self): |
- self.frame_timestamps.append([]) |
- self.frame_times.append([]) |
- self.approximated_pixel_percentages.append([]) |
- self.checkerboarded_pixel_percentages.append([]) |
- |
- |
-class ReferenceInputLatencyStats(object): |
- """ Stores expected data for comparison with actual input latency stats """ |
- |
- def __init__(self): |
- self.input_event_latency = [] |
- self.input_event = [] |
- |
- |
-def AddSurfaceFlingerStats(mock_timer, thread, first_frame, |
- ref_stats=None): |
- """ Adds a random surface flinger stats event. |
- |
- thread: The timeline model thread to which the event will be added. |
- first_frame: Is this the first frame within the bounds of an action? |
- ref_stats: A ReferenceRenderingStats object to record expected values. |
- """ |
- # Create randonm data and timestap for impl thread rendering stats. |
- data = {'frame_count': 1, |
- 'refresh_period': 16.6666} |
- timestamp = mock_timer.AdvanceAndGet() |
- |
- # Add a slice with the event data to the given thread. |
- thread.PushCompleteSlice( |
- 'SurfaceFlinger', 'vsync_before', |
- timestamp, duration=0.0, thread_timestamp=None, thread_duration=None, |
- args={'data': data}) |
- |
- if not ref_stats: |
- return |
- |
- # Add timestamp only if a frame was output |
- if data['frame_count'] == 1: |
- if not first_frame: |
- # Add frame_time if this is not the first frame in within the bounds of an |
- # action. |
- prev_timestamp = ref_stats.frame_timestamps[-1][-1] |
- ref_stats.frame_times[-1].append(timestamp - prev_timestamp) |
- ref_stats.frame_timestamps[-1].append(timestamp) |
- |
- |
-def AddDisplayRenderingStats(mock_timer, thread, first_frame, |
- ref_stats=None): |
- """ Adds a random display rendering stats event. |
- |
- thread: The timeline model thread to which the event will be added. |
- first_frame: Is this the first frame within the bounds of an action? |
- ref_stats: A ReferenceRenderingStats object to record expected values. |
- """ |
- # Create randonm data and timestap for main thread rendering stats. |
- data = {'frame_count': 1} |
- timestamp = mock_timer.AdvanceAndGet() |
- |
- # Add a slice with the event data to the given thread. |
- thread.PushCompleteSlice( |
- 'benchmark', 'BenchmarkInstrumentation::DisplayRenderingStats', |
- timestamp, duration=0.0, thread_timestamp=None, thread_duration=None, |
- args={'data': data}) |
- |
- if not ref_stats: |
- return |
- |
- # Add timestamp only if a frame was output |
- if not first_frame: |
- # Add frame_time if this is not the first frame in within the bounds of an |
- # action. |
- prev_timestamp = ref_stats.frame_timestamps[-1][-1] |
- ref_stats.frame_times[-1].append(timestamp - prev_timestamp) |
- ref_stats.frame_timestamps[-1].append(timestamp) |
- |
- |
-def AddImplThreadRenderingStats(mock_timer, thread, first_frame, |
- ref_stats=None): |
- """ Adds a random impl thread rendering stats event. |
- |
- thread: The timeline model thread to which the event will be added. |
- first_frame: Is this the first frame within the bounds of an action? |
- ref_stats: A ReferenceRenderingStats object to record expected values. |
- """ |
- # Create randonm data and timestap for impl thread rendering stats. |
- data = {'frame_count': 1, |
- 'visible_content_area': random.uniform(0, 100), |
- 'approximated_visible_content_area': random.uniform(0, 5), |
- 'checkerboarded_visible_content_area': random.uniform(0, 5)} |
- timestamp = mock_timer.AdvanceAndGet() |
- |
- # Add a slice with the event data to the given thread. |
- thread.PushCompleteSlice( |
- 'benchmark', 'BenchmarkInstrumentation::ImplThreadRenderingStats', |
- timestamp, duration=0.0, thread_timestamp=None, thread_duration=None, |
- args={'data': data}) |
- |
- if not ref_stats: |
- return |
- |
- # Add timestamp only if a frame was output |
- if data['frame_count'] == 1: |
- if not first_frame: |
- # Add frame_time if this is not the first frame in within the bounds of an |
- # action. |
- prev_timestamp = ref_stats.frame_timestamps[-1][-1] |
- ref_stats.frame_times[-1].append(timestamp - prev_timestamp) |
- ref_stats.frame_timestamps[-1].append(timestamp) |
- |
- ref_stats.approximated_pixel_percentages[-1].append( |
- round(statistics.DivideIfPossibleOrZero( |
- data['approximated_visible_content_area'], |
- data['visible_content_area']) * 100.0, 3)) |
- |
- ref_stats.checkerboarded_pixel_percentages[-1].append( |
- round(statistics.DivideIfPossibleOrZero( |
- data['checkerboarded_visible_content_area'], |
- data['visible_content_area']) * 100.0, 3)) |
- |
-def AddInputLatencyStats(mock_timer, start_thread, end_thread, |
- ref_latency_stats=None): |
- """ Adds a random input latency stats event. |
- |
- start_thread: The start thread on which the async slice is added. |
- end_thread: The end thread on which the async slice is ended. |
- ref_latency_stats: A ReferenceInputLatencyStats object for expected values. |
- """ |
- |
- original_comp_time = mock_timer.AdvanceAndGet(2, 4) * 1000.0 |
- ui_comp_time = mock_timer.AdvanceAndGet(2, 4) * 1000.0 |
- begin_comp_time = mock_timer.AdvanceAndGet(2, 4) * 1000.0 |
- forward_comp_time = mock_timer.AdvanceAndGet(2, 4) * 1000.0 |
- end_comp_time = mock_timer.AdvanceAndGet(10, 20) * 1000.0 |
- |
- data = {rendering_stats.ORIGINAL_COMP_NAME: {'time': original_comp_time}, |
- rendering_stats.UI_COMP_NAME: {'time': ui_comp_time}, |
- rendering_stats.BEGIN_COMP_NAME: {'time': begin_comp_time}, |
- rendering_stats.END_COMP_NAME: {'time': end_comp_time}} |
- |
- timestamp = mock_timer.AdvanceAndGet(2, 4) |
- |
- tracing_async_slice = async_slice.AsyncSlice( |
- 'benchmark', 'InputLatency', timestamp) |
- |
- async_sub_slice = async_slice.AsyncSlice( |
- 'benchmark', rendering_stats.GESTURE_SCROLL_UPDATE_EVENT_NAME, timestamp) |
- async_sub_slice.args = {'data': data} |
- async_sub_slice.parent_slice = tracing_async_slice |
- async_sub_slice.start_thread = start_thread |
- async_sub_slice.end_thread = end_thread |
- |
- tracing_async_slice.sub_slices.append(async_sub_slice) |
- tracing_async_slice.start_thread = start_thread |
- tracing_async_slice.end_thread = end_thread |
- start_thread.AddAsyncSlice(tracing_async_slice) |
- |
- # Add scroll update latency info. |
- scroll_update_data = { |
- rendering_stats.BEGIN_SCROLL_UPDATE_COMP_NAME: {'time': begin_comp_time}, |
- rendering_stats.FORWARD_SCROLL_UPDATE_COMP_NAME: |
- {'time': forward_comp_time}, |
- rendering_stats.END_COMP_NAME: {'time': end_comp_time} |
- } |
- |
- scroll_async_slice = async_slice.AsyncSlice( |
- 'benchmark', 'InputLatency', timestamp) |
- |
- scroll_async_sub_slice = async_slice.AsyncSlice( |
- 'benchmark', rendering_stats.MAIN_THREAD_SCROLL_UPDATE_EVENT_NAME, |
- timestamp) |
- scroll_async_sub_slice.args = {'data': scroll_update_data} |
- scroll_async_sub_slice.parent_slice = scroll_async_slice |
- scroll_async_sub_slice.start_thread = start_thread |
- scroll_async_sub_slice.end_thread = end_thread |
- |
- scroll_async_slice.sub_slices.append(scroll_async_sub_slice) |
- scroll_async_slice.start_thread = start_thread |
- scroll_async_slice.end_thread = end_thread |
- start_thread.AddAsyncSlice(scroll_async_slice) |
- |
- # Also add some dummy frame statistics so we can feed the resulting timeline |
- # to RenderingStats. |
- AddImplThreadRenderingStats(mock_timer, end_thread, False) |
- |
- if not ref_latency_stats: |
- return |
- |
- ref_latency_stats.input_event.append(async_sub_slice) |
- ref_latency_stats.input_event.append(scroll_async_sub_slice) |
- ref_latency_stats.input_event_latency.append(( |
- rendering_stats.GESTURE_SCROLL_UPDATE_EVENT_NAME, |
- (data[rendering_stats.END_COMP_NAME]['time'] - |
- data[rendering_stats.ORIGINAL_COMP_NAME]['time']) / 1000.0)) |
- scroll_update_time = ( |
- scroll_update_data[rendering_stats.END_COMP_NAME]['time'] - |
- scroll_update_data[rendering_stats.BEGIN_SCROLL_UPDATE_COMP_NAME]['time']) |
- ref_latency_stats.input_event_latency.append(( |
- rendering_stats.MAIN_THREAD_SCROLL_UPDATE_EVENT_NAME, |
- scroll_update_time / 1000.0)) |
- |
- |
-class RenderingStatsUnitTest(unittest.TestCase): |
- |
- def testHasRenderingStats(self): |
- timeline = model.TimelineModel() |
- timer = MockTimer() |
- |
- # A process without rendering stats |
- process_without_stats = timeline.GetOrCreateProcess(pid=1) |
- thread_without_stats = process_without_stats.GetOrCreateThread(tid=11) |
- process_without_stats.FinalizeImport() |
- self.assertFalse(rendering_stats.HasRenderingStats(thread_without_stats)) |
- |
- # A process with rendering stats, but no frames in them |
- process_without_frames = timeline.GetOrCreateProcess(pid=2) |
- thread_without_frames = process_without_frames.GetOrCreateThread(tid=21) |
- process_without_frames.FinalizeImport() |
- self.assertFalse(rendering_stats.HasRenderingStats(thread_without_frames)) |
- |
- # A process with rendering stats and frames in them |
- process_with_frames = timeline.GetOrCreateProcess(pid=3) |
- thread_with_frames = process_with_frames.GetOrCreateThread(tid=31) |
- AddImplThreadRenderingStats(timer, thread_with_frames, True, None) |
- process_with_frames.FinalizeImport() |
- self.assertTrue(rendering_stats.HasRenderingStats(thread_with_frames)) |
- |
- def testBothSurfaceFlingerAndDisplayStats(self): |
- timeline = model.TimelineModel() |
- timer = MockTimer() |
- |
- ref_stats = ReferenceRenderingStats() |
- ref_stats.AppendNewRange() |
- surface_flinger = timeline.GetOrCreateProcess(pid=4) |
- surface_flinger.name = 'SurfaceFlinger' |
- surface_flinger_thread = surface_flinger.GetOrCreateThread(tid=41) |
- renderer = timeline.GetOrCreateProcess(pid=2) |
- browser = timeline.GetOrCreateProcess(pid=3) |
- browser_main = browser.GetOrCreateThread(tid=31) |
- browser_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- |
- # Create SurfaceFlinger stats and display rendering stats. |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddSurfaceFlingerStats(timer, surface_flinger_thread, first, ref_stats) |
- timer.Advance(2, 4) |
- |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddDisplayRenderingStats(timer, browser_main, first, None) |
- timer.Advance(5, 10) |
- |
- browser_main.EndSlice(timer.AdvanceAndGet()) |
- timer.Advance(2, 4) |
- |
- browser.FinalizeImport() |
- renderer.FinalizeImport() |
- timeline_markers = timeline.FindTimelineMarkers(['ActionA']) |
- timeline_ranges = [bounds.Bounds.CreateFromEvent(marker) |
- for marker in timeline_markers] |
- stats = rendering_stats.RenderingStats( |
- renderer, browser, surface_flinger, timeline_ranges) |
- |
- # Compare rendering stats to reference - Only SurfaceFlinger stats should |
- # count |
- self.assertEquals(stats.frame_timestamps, ref_stats.frame_timestamps) |
- self.assertEquals(stats.frame_times, ref_stats.frame_times) |
- |
- def testBothDisplayAndImplStats(self): |
- timeline = model.TimelineModel() |
- timer = MockTimer() |
- |
- ref_stats = ReferenceRenderingStats() |
- ref_stats.AppendNewRange() |
- renderer = timeline.GetOrCreateProcess(pid=2) |
- browser = timeline.GetOrCreateProcess(pid=3) |
- browser_main = browser.GetOrCreateThread(tid=31) |
- browser_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- |
- # Create main, impl, and display rendering stats. |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddImplThreadRenderingStats(timer, browser_main, first, None) |
- timer.Advance(2, 4) |
- |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddDisplayRenderingStats(timer, browser_main, first, ref_stats) |
- timer.Advance(5, 10) |
- |
- browser_main.EndSlice(timer.AdvanceAndGet()) |
- timer.Advance(2, 4) |
- |
- browser.FinalizeImport() |
- renderer.FinalizeImport() |
- timeline_markers = timeline.FindTimelineMarkers(['ActionA']) |
- timeline_ranges = [bounds.Bounds.CreateFromEvent(marker) |
- for marker in timeline_markers] |
- stats = rendering_stats.RenderingStats( |
- renderer, browser, None, timeline_ranges) |
- |
- # Compare rendering stats to reference - Only display stats should count |
- self.assertEquals(stats.frame_timestamps, ref_stats.frame_timestamps) |
- self.assertEquals(stats.frame_times, ref_stats.frame_times) |
- |
- def testRangeWithoutFrames(self): |
- timer = MockTimer() |
- timeline = model.TimelineModel() |
- |
- # Create a renderer process, with a main thread and impl thread. |
- renderer = timeline.GetOrCreateProcess(pid=2) |
- renderer_main = renderer.GetOrCreateThread(tid=21) |
- renderer_compositor = renderer.GetOrCreateThread(tid=22) |
- |
- # Create 10 main and impl rendering stats events for Action A. |
- renderer_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddImplThreadRenderingStats(timer, renderer_compositor, first, None) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- timer.Advance(2, 4) |
- |
- # Create 5 main and impl rendering stats events not within any action. |
- for i in xrange(0, 5): |
- first = (i == 0) |
- AddImplThreadRenderingStats(timer, renderer_compositor, first, None) |
- |
- # Create Action B without any frames. This should trigger |
- # NotEnoughFramesError when the RenderingStats object is created. |
- renderer_main.BeginSlice('webkit.console', 'ActionB', |
- timer.AdvanceAndGet(2, 4), '') |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- |
- renderer.FinalizeImport() |
- |
- timeline_markers = timeline.FindTimelineMarkers(['ActionA', 'ActionB']) |
- timeline_ranges = [bounds.Bounds.CreateFromEvent(marker) |
- for marker in timeline_markers] |
- |
- stats = rendering_stats.RenderingStats( |
- renderer, None, None, timeline_ranges) |
- self.assertEquals(0, len(stats.frame_timestamps[1])) |
- |
- def testFromTimeline(self): |
- timeline = model.TimelineModel() |
- |
- # Create a browser process and a renderer process, and a main thread and |
- # impl thread for each. |
- browser = timeline.GetOrCreateProcess(pid=1) |
- browser_compositor = browser.GetOrCreateThread(tid=12) |
- renderer = timeline.GetOrCreateProcess(pid=2) |
- renderer_main = renderer.GetOrCreateThread(tid=21) |
- renderer_compositor = renderer.GetOrCreateThread(tid=22) |
- |
- timer = MockTimer() |
- renderer_ref_stats = ReferenceRenderingStats() |
- browser_ref_stats = ReferenceRenderingStats() |
- |
- # Create 10 main and impl rendering stats events for Action A. |
- renderer_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- renderer_ref_stats.AppendNewRange() |
- browser_ref_stats.AppendNewRange() |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddImplThreadRenderingStats( |
- timer, renderer_compositor, first, renderer_ref_stats) |
- AddImplThreadRenderingStats( |
- timer, browser_compositor, first, browser_ref_stats) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- |
- # Create 5 main and impl rendering stats events not within any action. |
- for i in xrange(0, 5): |
- first = (i == 0) |
- AddImplThreadRenderingStats(timer, renderer_compositor, first, None) |
- AddImplThreadRenderingStats(timer, browser_compositor, first, None) |
- |
- # Create 10 main and impl rendering stats events for Action B. |
- renderer_main.BeginSlice('webkit.console', 'ActionB', |
- timer.AdvanceAndGet(2, 4), '') |
- renderer_ref_stats.AppendNewRange() |
- browser_ref_stats.AppendNewRange() |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddImplThreadRenderingStats( |
- timer, renderer_compositor, first, renderer_ref_stats) |
- AddImplThreadRenderingStats( |
- timer, browser_compositor, first, browser_ref_stats) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- |
- # Create 10 main and impl rendering stats events for Action A. |
- renderer_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- renderer_ref_stats.AppendNewRange() |
- browser_ref_stats.AppendNewRange() |
- for i in xrange(0, 10): |
- first = (i == 0) |
- AddImplThreadRenderingStats( |
- timer, renderer_compositor, first, renderer_ref_stats) |
- AddImplThreadRenderingStats( |
- timer, browser_compositor, first, browser_ref_stats) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- timer.Advance(2, 4) |
- |
- browser.FinalizeImport() |
- renderer.FinalizeImport() |
- |
- timeline_markers = timeline.FindTimelineMarkers( |
- ['ActionA', 'ActionB', 'ActionA']) |
- timeline_ranges = [bounds.Bounds.CreateFromEvent(marker) |
- for marker in timeline_markers] |
- stats = rendering_stats.RenderingStats( |
- renderer, browser, None, timeline_ranges) |
- |
- # Compare rendering stats to reference. |
- self.assertEquals(stats.frame_timestamps, |
- browser_ref_stats.frame_timestamps) |
- self.assertEquals(stats.frame_times, browser_ref_stats.frame_times) |
- self.assertEquals(stats.approximated_pixel_percentages, |
- renderer_ref_stats.approximated_pixel_percentages) |
- self.assertEquals(stats.checkerboarded_pixel_percentages, |
- renderer_ref_stats.checkerboarded_pixel_percentages) |
- |
- def testInputLatencyFromTimeline(self): |
- timeline = model.TimelineModel() |
- |
- # Create a browser process and a renderer process. |
- browser = timeline.GetOrCreateProcess(pid=1) |
- browser_main = browser.GetOrCreateThread(tid=11) |
- renderer = timeline.GetOrCreateProcess(pid=2) |
- renderer_main = renderer.GetOrCreateThread(tid=21) |
- |
- timer = MockTimer() |
- ref_latency = ReferenceInputLatencyStats() |
- |
- # Create 10 input latency stats events for Action A. |
- renderer_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- for _ in xrange(0, 10): |
- AddInputLatencyStats(timer, browser_main, renderer_main, ref_latency) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- |
- # Create 5 input latency stats events not within any action. |
- timer.Advance(2, 4) |
- for _ in xrange(0, 5): |
- AddInputLatencyStats(timer, browser_main, renderer_main, None) |
- |
- # Create 10 input latency stats events for Action B. |
- renderer_main.BeginSlice('webkit.console', 'ActionB', |
- timer.AdvanceAndGet(2, 4), '') |
- for _ in xrange(0, 10): |
- AddInputLatencyStats(timer, browser_main, renderer_main, ref_latency) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- |
- # Create 10 input latency stats events for Action A. |
- renderer_main.BeginSlice('webkit.console', 'ActionA', |
- timer.AdvanceAndGet(2, 4), '') |
- for _ in xrange(0, 10): |
- AddInputLatencyStats(timer, browser_main, renderer_main, ref_latency) |
- renderer_main.EndSlice(timer.AdvanceAndGet(2, 4)) |
- |
- browser.FinalizeImport() |
- renderer.FinalizeImport() |
- |
- latency_events = [] |
- |
- timeline_markers = timeline.FindTimelineMarkers( |
- ['ActionA', 'ActionB', 'ActionA']) |
- timeline_ranges = [bounds.Bounds.CreateFromEvent(marker) |
- for marker in timeline_markers] |
- for timeline_range in timeline_ranges: |
- if timeline_range.is_empty: |
- continue |
- latency_events.extend(rendering_stats.GetLatencyEvents( |
- browser, timeline_range)) |
- |
- self.assertEquals(latency_events, ref_latency.input_event) |
- event_latency_result = rendering_stats.ComputeEventLatencies(latency_events) |
- self.assertEquals(event_latency_result, |
- ref_latency.input_event_latency) |
- |
- stats = rendering_stats.RenderingStats( |
- renderer, browser, None, timeline_ranges) |
- self.assertEquals( |
- perf_tests_helper.FlattenList(stats.input_event_latency), |
- [latency for name, latency in ref_latency.input_event_latency |
- if name != rendering_stats.MAIN_THREAD_SCROLL_UPDATE_EVENT_NAME]) |
- self.assertEquals( |
- perf_tests_helper.FlattenList(stats.main_thread_scroll_latency), |
- [latency for name, latency in ref_latency.input_event_latency |
- if name == rendering_stats.MAIN_THREAD_SCROLL_UPDATE_EVENT_NAME]) |
- self.assertEquals( |
- perf_tests_helper.FlattenList(stats.gesture_scroll_update_latency), |
- [latency for name, latency in ref_latency.input_event_latency |
- if name == rendering_stats.GESTURE_SCROLL_UPDATE_EVENT_NAME]) |