blob: e3173fe61fc23a41f4d947ac9253f584b3082787 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2014 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 collections
import json
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir))
from telemetry.internal.results import buildbot_output_formatter
from telemetry.internal.results import page_test_results
from telemetry.page import page as page_module
from telemetry.timeline import model
from telemetry.timeline import tracing_timeline_data
from telemetry.web_perf.metrics import smoothness
from telemetry.web_perf import timeline_interaction_record as tir_module
sys.path.append(os.path.join(
os.path.dirname(__file__), os.pardir, os.pardir, 'perf'))
# pylint: disable=F0401
from measurements import smooth_gesture_util
from measurements import smoothness_controller
def _ExtractInteractionsRecordFromThread(thread, timeline_model):
run_smooth_actions_record = None
records = []
for event in thread.async_slices:
if not tir_module.IsTimelineInteractionRecord(event.name):
continue
assert event.start_thread
assert event.start_thread is event.end_thread
r = smooth_gesture_util.GetAdjustedInteractionIfContainGesture(
timeline_model,
tir_module.TimelineInteractionRecord.FromAsyncEvent(event))
if r.label == smoothness_controller.RUN_SMOOTH_ACTIONS:
assert run_smooth_actions_record is None, (
'There can\'t be more than 1 %s record' %
smoothness_controller.RUN_SMOOTH_ACTIONS)
run_smooth_actions_record = r
else:
records.append(r)
if not records:
# Only include run_smooth_actions_record (label =
# smoothness_controller.RUN_SMOOTH_ACTIONS) if there is no other records
records = [run_smooth_actions_record]
return records
def Main(args):
if len(args) is not 1:
print 'Invalid arguments. Usage: measure_trace.py <trace file>'
return 1
with open(args[0]) as trace_file:
trace_data = tracing_timeline_data.TracingTimelineData(
json.load(trace_file))
timeline_model = model.TimelineModel(trace_data)
smoothness_metric = smoothness.SmoothnessMetric()
formatters = [
buildbot_output_formatter.BuildbotOutputFormatter(sys.stdout)
]
results = page_test_results.PageTestResults(output_formatters=formatters)
for thread in timeline_model.GetAllThreads():
interaction_records = _ExtractInteractionsRecordFromThread(
thread, timeline_model)
if not any(interaction_records):
continue
records_label_to_records_map = collections.defaultdict(list)
for r in interaction_records:
records_label_to_records_map[r.label].append(r)
for label, records in records_label_to_records_map.iteritems():
if records[0].is_smooth:
page = page_module.Page('interaction-record://%s' % label)
results.WillRunPage(page)
smoothness_metric.AddResults(
timeline_model, thread, records, results)
results.DidRunPage(page)
results.PrintSummary()
return 0
if __name__ == '__main__':
sys.exit(Main(sys.argv[1:]))