Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / page / html_page_measurement_results.py
1 # Copyright 2013 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
5 import datetime
6 import json
7 import logging
8 import os
9 import re
10 import sys
11
12 from telemetry.core import util
13 from telemetry.page import buildbot_page_measurement_results
14 from telemetry.page import cloud_storage
15
16 util.AddDirToPythonPath(util.GetChromiumSrcDir(), 'build', 'util')
17 import lastchange  # pylint: disable=F0401
18
19
20 _TEMPLATE_HTML_PATH = os.path.join(
21     util.GetTelemetryDir(), 'support', 'html_output', 'results-template.html')
22 _PLUGINS = [('third_party', 'flot', 'jquery.flot.min.js'),
23             ('third_party', 'WebKit', 'PerformanceTests', 'resources',
24              'jquery.tablesorter.min.js'),
25             ('third_party', 'WebKit', 'PerformanceTests', 'resources',
26              'statistics.js')]
27 _UNIT_JSON = ('tools', 'perf', 'unit-info.json')
28
29
30 class HtmlPageMeasurementResults(
31     buildbot_page_measurement_results.BuildbotPageMeasurementResults):
32   def __init__(self, output_stream, test_name, reset_results, upload_results,
33       browser_type, results_label=None, trace_tag=''):
34     super(HtmlPageMeasurementResults, self).__init__(sys.stdout, trace_tag)
35     self._test_name = test_name
36     self._reset_results = reset_results
37     self._upload_results = upload_results
38     self._html_output_stream = output_stream
39     self._existing_results = self._ReadExistingResults(output_stream)
40     self._result = {
41         'buildTime': self._GetBuildTime(),
42         'revision': self._GetRevision(),
43         'label': results_label,
44         'platform': browser_type,
45         'tests': {}
46         }
47
48   def _GetBuildTime(self):
49     def _DatetimeInEs5CompatibleFormat(dt):
50       return dt.strftime('%Y-%m-%dT%H:%M:%S.%f')
51     return _DatetimeInEs5CompatibleFormat(datetime.datetime.utcnow())
52
53   def _GetRevision(self):
54     return lastchange.FetchVersionInfo(None).revision
55
56   def _GetHtmlTemplate(self):
57     with open(_TEMPLATE_HTML_PATH) as f:
58       return f.read()
59
60   def _GetPlugins(self):
61     plugins = ''
62     for p in _PLUGINS:
63       with open(os.path.join(util.GetChromiumSrcDir(), *p)) as f:
64         plugins += f.read()
65     return plugins
66
67   def _GetUnitJson(self):
68     with open(os.path.join(util.GetChromiumSrcDir(), *_UNIT_JSON)) as f:
69       return f.read()
70
71   def _ReadExistingResults(self, output_stream):
72     results_html = output_stream.read()
73     if self._reset_results or not results_html:
74       return []
75     m = re.search(
76         '^<script id="results-json" type="application/json">(.*?)</script>$',
77         results_html, re.MULTILINE | re.DOTALL)
78     if not m:
79       logging.warn('Failed to extract previous results from HTML output')
80       return []
81     return json.loads(m.group(1))[:512]
82
83   def _SaveResults(self, results):
84     self._html_output_stream.seek(0)
85     self._html_output_stream.write(results)
86     self._html_output_stream.truncate()
87
88   def _PrintPerfResult(self, measurement, trace, values, units,
89                        result_type='default'):
90     super(HtmlPageMeasurementResults, self)._PrintPerfResult(
91         measurement, trace, values, units, result_type)
92
93     metric_name = measurement
94     if trace != measurement:
95       metric_name += '.' + trace
96     self._result['tests'].setdefault(self._test_name, {})
97     self._result['tests'][self._test_name].setdefault('metrics', {})
98     self._result['tests'][self._test_name]['metrics'][metric_name] = {
99         'current': values,
100         'units': units,
101         'important': result_type == 'default'
102         }
103
104   def GetResults(self):
105     return self._result
106
107   def GetCombinedResults(self):
108     all_results = list(self._existing_results)
109     all_results.append(self.GetResults())
110     return all_results
111
112   def PrintSummary(self):
113     super(HtmlPageMeasurementResults, self).PrintSummary()
114     html = self._GetHtmlTemplate()
115     html = html.replace('%json_results%', json.dumps(self.GetCombinedResults()))
116     html = html.replace('%json_units%', self._GetUnitJson())
117     html = html.replace('%plugins%', self._GetPlugins())
118     self._SaveResults(html)
119
120     if self._upload_results:
121       file_path = os.path.abspath(self._html_output_stream.name)
122       file_name = 'html-results/results-%s' % datetime.datetime.now().strftime(
123           '%Y-%m-%d_%H-%M-%S')
124       cloud_storage.Insert(cloud_storage.PUBLIC_BUCKET, file_name, file_path)
125       print
126       print ('View online at '
127           'http://storage.googleapis.com/chromium-telemetry/%s' % file_name)
128     print
129     print 'View result at file://%s' % os.path.abspath(
130         self._html_output_stream.name)