1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2015 The Chromium Authors. All rights reserved.
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file.
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik
5cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport unittest
6cef7893435aa41160dd1255c43cb8498279738ccChris Craik
7cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom collections import namedtuple
8cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.results import page_test_results
9cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.page import page
10cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.web_perf.metrics import jitter_timeline
11cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.web_perf import timeline_interaction_record
12cef7893435aa41160dd1255c43cb8498279738ccChris Craik
13cef7893435aa41160dd1255c43cb8498279738ccChris Craik
14cef7893435aa41160dd1255c43cb8498279738ccChris CraikFakeEvent = namedtuple('Event', 'name, start, end, thread_duration, args')
15cef7893435aa41160dd1255c43cb8498279738ccChris CraikInteraction = timeline_interaction_record.TimelineInteractionRecord
16cef7893435aa41160dd1255c43cb8498279738ccChris CraikTEST_INTERACTION_LABEL = 'Action_TestInteraction'
17cef7893435aa41160dd1255c43cb8498279738ccChris CraikJITTER_EVENT_NAME = 'jitter'
18cef7893435aa41160dd1255c43cb8498279738ccChris Craik
19cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef GetJitterMetrics(events, interactions):
20cef7893435aa41160dd1255c43cb8498279738ccChris Craik  results = page_test_results.PageTestResults()
21cef7893435aa41160dd1255c43cb8498279738ccChris Craik  test_page = page.Page('file://blank.html')
22cef7893435aa41160dd1255c43cb8498279738ccChris Craik  results.WillRunPage(test_page)
23cef7893435aa41160dd1255c43cb8498279738ccChris Craik  jitter_timeline.JitterTimelineMetric()._AddJitterResultsInternal(
24cef7893435aa41160dd1255c43cb8498279738ccChris Craik      events, interactions, results)
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik  return_dict = dict((value.name, value.values) for value in
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik                     results.current_page_run.values)
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik  results.DidRunPage(test_page)
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik  return return_dict
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik
30cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef FakeJitterEvent(start, end, value, thread_duration=None):
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik  if not thread_duration:
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik    thread_duration = end - start
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik  return FakeEvent(jitter_timeline.JITTER_EVENT_NAME,
34cef7893435aa41160dd1255c43cb8498279738ccChris Craik          start, end, thread_duration, {'value':value})
35cef7893435aa41160dd1255c43cb8498279738ccChris Craik
36cef7893435aa41160dd1255c43cb8498279738ccChris Craikdef TestInteraction(start, end):
37cef7893435aa41160dd1255c43cb8498279738ccChris Craik  return Interaction(TEST_INTERACTION_LABEL, start, end)
38cef7893435aa41160dd1255c43cb8498279738ccChris Craik
39cef7893435aa41160dd1255c43cb8498279738ccChris Craik
40cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass JitterTimelineMetricUnitTest(unittest.TestCase):
41cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testJitterMetric(self):
42cef7893435aa41160dd1255c43cb8498279738ccChris Craik    events = [FakeJitterEvent(0, 1, 10),
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik              FakeJitterEvent(5, 10, 5),
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik              FakeJitterEvent(15, 34, 45)]
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik    interactions = [TestInteraction(4, 14)]
46cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # The first and the last event do not start during the interaction, so
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # they are ignored. The second event starts during the interaction, and its
48cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # value is 5.
49cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEqual({'jitter-amount': [5]},
50cef7893435aa41160dd1255c43cb8498279738ccChris Craik        GetJitterMetrics(events, interactions))
51