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 = [ timeline_bounds.Bounds.CreateFromEvent(marker) for marker in timeline_markers ] 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 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 = [ timeline_bounds.Bounds.CreateFromEvent(marker) for marker in timeline_markers ] stats = RenderingStats(renderer, None, None, timeline_ranges) self.assertEquals(0, len(stats.frame_timestamps[1]))
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. timer.Advance(2, 4) renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') for _ in xrange(0, 10): AddInputLatencyStats(timer, browser_main, renderer_main, ref_latency) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) # 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. timer.Advance(2, 4) renderer_main.BeginSlice('webkit.console', 'ActionB', timer.Get(), '') for _ in xrange(0, 10): AddInputLatencyStats(timer, browser_main, renderer_main, ref_latency) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) # Create 10 input latency stats events for Action A. timer.Advance(2, 4) renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') for _ in xrange(0, 10): AddInputLatencyStats(timer, browser_main, renderer_main, ref_latency) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) browser.FinalizeImport() renderer.FinalizeImport() input_events = [] timeline_markers = timeline.FindTimelineMarkers( ['ActionA', 'ActionB', 'ActionA']) timeline_ranges = [timeline_bounds.Bounds.CreateFromEvent(marker) for marker in timeline_markers] for timeline_range in timeline_ranges: if timeline_range.is_empty: continue input_events.extend(GetInputLatencyEvents(browser, timeline_range)) self.assertEquals(input_events, ref_latency.input_event) input_event_latency_result = ComputeInputEventLatencies(input_events) self.assertEquals(input_event_latency_result, ref_latency.input_event_latency) stats = RenderingStats(renderer, browser, timeline_ranges) self.assertEquals(FlattenList(stats.input_event_latency), [ latency for name, latency in ref_latency.input_event_latency if name != SCROLL_UPDATE_EVENT_NAME]) self.assertEquals(FlattenList(stats.scroll_update_latency), [ latency for name, latency in ref_latency.input_event_latency if name == SCROLL_UPDATE_EVENT_NAME]) self.assertEquals(FlattenList(stats.gesture_scroll_update_latency), [ latency for name, latency in ref_latency.input_event_latency if name == GESTURE_SCROLL_UPDATE_EVENT_NAME])
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_main = browser.GetOrCreateThread(tid = 11) 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. timer.Advance(2, 4) renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') renderer_ref_stats.AppendNewRange() browser_ref_stats.AppendNewRange() for i in xrange(0, 10): first = (i == 0) AddMainThreadRenderingStats( timer, renderer_main, first, renderer_ref_stats) AddImplThreadRenderingStats( timer, renderer_compositor, first, renderer_ref_stats) AddMainThreadRenderingStats( timer, browser_main, first, browser_ref_stats) AddImplThreadRenderingStats( timer, browser_compositor, first, browser_ref_stats) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) # Create 5 main and impl rendering stats events not within any action. for i in xrange(0, 5): first = (i == 0) AddMainThreadRenderingStats(timer, renderer_main, first, None) AddImplThreadRenderingStats(timer, renderer_compositor, first, None) AddMainThreadRenderingStats(timer, browser_main, first, None) AddImplThreadRenderingStats(timer, browser_compositor, first, None) # Create 10 main and impl rendering stats events for Action B. timer.Advance(2, 4) renderer_main.BeginSlice('webkit.console', 'ActionB', timer.Get(), '') renderer_ref_stats.AppendNewRange() browser_ref_stats.AppendNewRange() for i in xrange(0, 10): first = (i == 0) AddMainThreadRenderingStats( timer, renderer_main, first, renderer_ref_stats) AddImplThreadRenderingStats( timer, renderer_compositor, first, renderer_ref_stats) AddMainThreadRenderingStats( timer, browser_main, first, browser_ref_stats) AddImplThreadRenderingStats( timer, browser_compositor, first, browser_ref_stats) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) # Create 10 main and impl rendering stats events for Action A. timer.Advance(2, 4) renderer_main.BeginSlice('webkit.console', 'ActionA', timer.Get(), '') renderer_ref_stats.AppendNewRange() browser_ref_stats.AppendNewRange() for i in xrange(0, 10): first = (i == 0) AddMainThreadRenderingStats( timer, renderer_main, first, renderer_ref_stats) AddImplThreadRenderingStats( timer, renderer_compositor, first, renderer_ref_stats) AddMainThreadRenderingStats( timer, browser_main, first, browser_ref_stats) AddImplThreadRenderingStats( timer, browser_compositor, first, browser_ref_stats) timer.Advance(2, 4) renderer_main.EndSlice(timer.Get()) browser.FinalizeImport() renderer.FinalizeImport() timeline_markers = timeline.FindTimelineMarkers( ['ActionA', 'ActionB', 'ActionA']) timeline_ranges = [ timeline_bounds.Bounds.CreateFromEvent(marker) for marker in timeline_markers ] stats = RenderingStats(renderer, browser, 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.rasterize_times, renderer_ref_stats.rasterize_times) self.assertEquals(stats.rasterized_pixel_counts, renderer_ref_stats.rasterized_pixel_counts) self.assertEquals(stats.approximated_pixel_percentages, renderer_ref_stats.approximated_pixel_percentages) self.assertEquals(stats.paint_times, renderer_ref_stats.paint_times) self.assertEquals(stats.painted_pixel_counts, renderer_ref_stats.painted_pixel_counts) self.assertEquals(stats.record_times, renderer_ref_stats.record_times) self.assertEquals(stats.recorded_pixel_counts, renderer_ref_stats.recorded_pixel_counts)