Update sdk/platform-tools to version 26.0.0.
[android_tools.git] / sdk / platform-tools / systrace / catapult / telemetry / telemetry / internal / results / html_output_formatter.py
blob1e12965fc06cc83531f2e04d82f665edc9db4e98
1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 import datetime
6 import json
7 import logging
8 import os
9 import tempfile
11 from py_utils import cloud_storage
13 from telemetry.internal.results import chart_json_output_formatter
14 from telemetry.internal.results import output_formatter
16 from tracing import results_renderer
17 from tracing.value import convert_chart_json
20 class HtmlOutputFormatter(output_formatter.OutputFormatter):
21 def __init__(self, output_stream, metadata, reset_results,
22 upload_bucket=None):
23 super(HtmlOutputFormatter, self).__init__(output_stream)
24 self._metadata = metadata
25 self._upload_bucket = upload_bucket
26 self._reset_results = reset_results
28 def _ConvertChartJson(self, page_test_results):
29 chart_json = chart_json_output_formatter.ResultsAsChartDict(
30 self._metadata, page_test_results.all_page_specific_values,
31 page_test_results.all_summary_values)
32 info = page_test_results.telemetry_info
33 chart_json['label'] = info.label
34 chart_json['benchmarkStartMs'] = info.benchmark_start_ms
36 file_descriptor, chart_json_path = tempfile.mkstemp()
37 os.close(file_descriptor)
38 json.dump(chart_json, file(chart_json_path, 'w'))
40 vinn_result = convert_chart_json.ConvertChartJson(chart_json_path)
42 os.remove(chart_json_path)
44 if vinn_result.returncode != 0:
45 logging.error('Error converting chart json to Histograms:\n' +
46 vinn_result.stdout)
47 return []
48 return json.loads(vinn_result.stdout)
50 def Format(self, page_test_results):
51 histograms = page_test_results.value_set
52 if not histograms:
53 histograms = self._ConvertChartJson(page_test_results)
55 results_renderer.RenderHTMLView(histograms,
56 self._output_stream, self._reset_results)
57 file_path = os.path.abspath(self._output_stream.name)
58 if self._upload_bucket:
59 remote_path = ('html-results/results-%s' %
60 datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
61 try:
62 url = cloud_storage.Insert(self._upload_bucket, remote_path, file_path)
63 print 'View HTML results online at %s' % url
64 except cloud_storage.PermissionError as e:
65 logging.error('Cannot upload profiling files to cloud storage due to '
66 ' permission error: %s' % e.message)