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