# Copyright 2015 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 unittest from collections import namedtuple from telemetry.internal.results import page_test_results from telemetry.page import page from telemetry.web_perf.metrics import jitter_timeline from telemetry.web_perf import timeline_interaction_record FakeEvent = namedtuple('Event', 'name, start, end, thread_duration, args') Interaction = timeline_interaction_record.TimelineInteractionRecord TEST_INTERACTION_LABEL = 'Action_TestInteraction' JITTER_EVENT_NAME = 'jitter' def GetJitterMetrics(events, interactions): results = page_test_results.PageTestResults() test_page = page.Page('file://blank.html') results.WillRunPage(test_page) jitter_timeline.JitterTimelineMetric()._AddJitterResultsInternal( events, interactions, results) return_dict = dict((value.name, value.values) for value in results.current_page_run.values) results.DidRunPage(test_page) return return_dict def FakeJitterEvent(start, end, value, thread_duration=None): if not thread_duration: thread_duration = end - start return FakeEvent(jitter_timeline.JITTER_EVENT_NAME, start, end, thread_duration, {'value':value}) def TestInteraction(start, end): return Interaction(TEST_INTERACTION_LABEL, start, end) class JitterTimelineMetricUnitTest(unittest.TestCase): def testJitterMetric(self): events = [FakeJitterEvent(0, 1, 10), FakeJitterEvent(5, 10, 5), FakeJitterEvent(15, 34, 45)] interactions = [TestInteraction(4, 14)] # The first and the last event do not start during the interaction, so # they are ignored. The second event starts during the interaction, and its # value is 5. self.assertEqual({'jitter-amount': [5]}, GetJitterMetrics(events, interactions))