aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/internal/results/legacy_html_output_formatter.py
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/telemetry/internal/results/legacy_html_output_formatter.py')
-rw-r--r--catapult/telemetry/telemetry/internal/results/legacy_html_output_formatter.py174
1 files changed, 174 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/internal/results/legacy_html_output_formatter.py b/catapult/telemetry/telemetry/internal/results/legacy_html_output_formatter.py
new file mode 100644
index 00000000..a3782c01
--- /dev/null
+++ b/catapult/telemetry/telemetry/internal/results/legacy_html_output_formatter.py
@@ -0,0 +1,174 @@
+# Copyright 2016 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 datetime
+import json
+import logging
+import os
+import re
+
+from telemetry.core import util
+from telemetry import decorators
+from telemetry.internal.results import chart_json_output_formatter
+from telemetry.internal.results import output_formatter
+from telemetry import value as value_module
+from telemetry.value import list_of_scalar_values
+
+
+_TEMPLATE_HTML_PATH = os.path.join(
+ util.GetTelemetryDir(), 'support', 'html_output', 'results-template.html')
+_JS_PLUGINS = [os.path.join('flot', 'jquery.flot.min.js'),
+ os.path.join('WebKit', 'PerformanceTests', 'resources',
+ 'jquery.tablesorter.min.js'),
+ os.path.join('WebKit', 'PerformanceTests', 'resources',
+ 'statistics.js')]
+_UNIT_JSON = os.path.join(
+ util.GetTelemetryDir(), 'telemetry', 'value', 'unit-info.json')
+
+
+def _DatetimeInEs5CompatibleFormat(dt):
+ return dt.strftime('%Y-%m-%dT%H:%M:%S.%f')
+
+
+def _ShortDatetimeInEs5CompatibleFormat(dt):
+ return dt.strftime('%Y-%m-%d %H:%M:%S')
+
+
+class LegacyHtmlOutputFormatter(output_formatter.OutputFormatter):
+ def __init__(self, output_stream, metadata, reset_results, browser_type,
+ results_label=None):
+ super(LegacyHtmlOutputFormatter, self).__init__(output_stream)
+ self._metadata = metadata
+ self._reset_results = reset_results
+ self._build_time = self._GetBuildTime()
+ self._combined_results = []
+ if results_label:
+ self._results_label = results_label
+ else:
+ self._results_label = '%s (%s)' % (
+ metadata.name, _ShortDatetimeInEs5CompatibleFormat(self._build_time))
+ self._result = {
+ 'buildTime': _DatetimeInEs5CompatibleFormat(self._build_time),
+ 'label': self._results_label,
+ 'platform': browser_type,
+ 'tests': {}
+ }
+
+ def _GetBuildTime(self):
+ return datetime.datetime.utcnow()
+
+ def _GetHtmlTemplate(self):
+ with open(_TEMPLATE_HTML_PATH) as f:
+ return f.read()
+
+ def _GetPlugins(self):
+ plugins = ''
+ for p in _JS_PLUGINS:
+ with open(os.path.join(util.GetTelemetryThirdPartyDir(), p)) as f:
+ plugins += f.read()
+ return plugins
+
+ def _GetUnitJson(self):
+ with open(_UNIT_JSON) as f:
+ return f.read()
+
+ def _ReadExistingResults(self, output_stream):
+ results_html = output_stream.read()
+ if self._reset_results or not results_html:
+ return []
+ m = re.search(
+ '^<script id="results-json" type="application/json">(.*?)</script>$',
+ results_html, re.MULTILINE | re.DOTALL)
+ if not m:
+ logging.warn('Failed to extract previous results from HTML output')
+ return []
+ return json.loads(m.group(1))[:512]
+
+ def _SaveResults(self, results):
+ self._output_stream.seek(0)
+ self._output_stream.write(unicode(results, 'utf-8'))
+ self._output_stream.truncate()
+
+ def _PrintPerfResult(self, measurement, trace, values, units,
+ result_type='default', std=None):
+ metric_name = measurement
+ if trace != measurement:
+ metric_name += '.' + trace
+ self._result['tests'].setdefault(self._test_name, {})
+ self._result['tests'][self._test_name].setdefault('metrics', {})
+ metric_data = {
+ 'current': values,
+ 'units': units,
+ 'important': result_type == 'default'
+ }
+ if std is not None:
+ metric_data['std'] = std
+ self._result['tests'][self._test_name]['metrics'][metric_name] = metric_data
+
+ def _TranslateChartJson(self, chart_json_dict):
+ dummy_dict = dict()
+
+ for chart_name, traces in chart_json_dict['charts'].iteritems():
+ for trace_name, value_dict in traces.iteritems():
+ # TODO(eakuefner): refactor summarization so we don't have to jump
+ # through hoops like this.
+ if 'page_id' in value_dict:
+ del value_dict['page_id']
+ result_type = 'nondefault'
+ else:
+ result_type = 'default'
+
+ # Note: we explicitly ignore TraceValues because Buildbot did.
+ if value_dict['type'] == 'trace':
+ continue
+ value = value_module.Value.FromDict(value_dict, dummy_dict)
+
+ perf_value = value.GetBuildbotValue()
+
+ if '@@' in chart_name:
+ chart_name_to_print = '%s-%s' % tuple(chart_name.split('@@'))
+ else:
+ chart_name_to_print = str(chart_name)
+
+ if trace_name == 'summary':
+ trace_name = chart_name_to_print
+
+ std = None
+ if isinstance(value, list_of_scalar_values.ListOfScalarValues):
+ std = value.std
+
+ self._PrintPerfResult(chart_name_to_print, trace_name, perf_value,
+ value.units, result_type, std)
+
+ @property
+ def _test_name(self):
+ return self._metadata.name
+
+ def GetResults(self):
+ return self._result
+
+ def GetCombinedResults(self):
+ return self._combined_results
+
+ @decorators.Deprecated(
+ 2017, 1, 7, 'Use HtmlOutputFormatter and file any issues on GitHub at '
+ 'https://github.com/catapult-project/catapult/issues/new?labels=Results2&title=[Results2]')
+ def Format(self, page_test_results):
+ chart_json_dict = chart_json_output_formatter.ResultsAsChartDict(
+ self._metadata, page_test_results.all_page_specific_values,
+ page_test_results.all_summary_values)
+
+ self._TranslateChartJson(chart_json_dict)
+ self._PrintPerfResult('telemetry_page_measurement_results', 'num_failed',
+ [len(page_test_results.failures)], 'count',
+ 'unimportant')
+
+ self._combined_results = self._ReadExistingResults(self._output_stream)
+ self._combined_results.append(self._result)
+
+ html = self._GetHtmlTemplate()
+ html = html.replace('%json_results%', json.dumps(self.GetCombinedResults()))
+ html = html.replace('%json_units%', self._GetUnitJson())
+ html = html.replace('%plugins%', self._GetPlugins())
+ self._SaveResults(html)