Esempio n. 1
0
    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)
Esempio n. 2
0
    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)