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.
4
5import datetime
6import json
7import logging
8import os
9import tempfile
10
11from py_utils import cloud_storage
12
13from telemetry.internal.results import chart_json_output_formatter
14from telemetry.internal.results import output_formatter
15
16from tracing import results_renderer
17from tracing.value import convert_chart_json
18
19
20class 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
27
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
35
36    file_descriptor, chart_json_path = tempfile.mkstemp()
37    os.close(file_descriptor)
38    json.dump(chart_json, file(chart_json_path, 'w'))
39
40    vinn_result = convert_chart_json.ConvertChartJson(chart_json_path)
41
42    os.remove(chart_json_path)
43
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)
49
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)
54
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)
67