1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)from telemetry import perf_tests_helper
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from telemetry import value as value_module
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.results import output_formatter
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.value import summary as summary_module
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class BuildbotOutputFormatter(output_formatter.OutputFormatter):
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def __init__(self, output_stream, trace_tag=''):
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    super(BuildbotOutputFormatter, self).__init__(output_stream)
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self._trace_tag = trace_tag
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  def _PrintPerfResult(self, measurement, trace, v, units,
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       result_type='default'):
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output = perf_tests_helper.PrintPerfResult(
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        measurement, trace, v, units, result_type, print_to_stdout=False)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.output_stream.write(output + '\n')
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self.output_stream.flush()
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def Format(self, page_test_results):
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """Print summary data in a format expected by buildbot for perf dashboards.
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    If any failed pages exist, only output individual page results, and do
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    not output any average data.
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    had_failures = len(page_test_results.failures) > 0
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # Print out the list of unique pages.
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    perf_tests_helper.PrintPages(
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        [page.display_name for page in page_test_results.pages_that_succeeded])
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    summary = summary_module.Summary(page_test_results.all_page_specific_values)
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for value in summary.interleaved_computed_per_page_values_and_summaries:
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if value.page:
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        self._PrintComputedPerPageValue(value)
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      else:
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self._PrintComputedSummaryValue(value, had_failures)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._PrintOverallResults(page_test_results)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def _PrintComputedPerPageValue(self, value):
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # We dont print per-page-values when there is a trace tag.
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if self._trace_tag:
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # Actually print the result.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    buildbot_value = value.GetBuildbotValue()
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    buildbot_data_type = value.GetBuildbotDataType(
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        output_context=value_module.PER_PAGE_RESULT_OUTPUT_CONTEXT)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if buildbot_value is None or buildbot_data_type is None:
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    buildbot_measurement_name, buildbot_trace_name = (
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        value.GetChartAndTraceNameForPerPageResult())
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self._PrintPerfResult(buildbot_measurement_name,
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          buildbot_trace_name,
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          buildbot_value, value.units, buildbot_data_type)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def _PrintComputedSummaryValue(self, value, had_failures):
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # If there were any page errors, we typically will print nothing.
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    #
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    # Note: this branch is structured less-densely to improve legibility.
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if had_failures:
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    buildbot_value = value.GetBuildbotValue()
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    buildbot_data_type = value.GetBuildbotDataType(
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        output_context=value_module.COMPUTED_PER_PAGE_SUMMARY_OUTPUT_CONTEXT)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if buildbot_value is None or buildbot_data_type is None:
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    buildbot_measurement_name, buildbot_trace_name = (
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        value.GetChartAndTraceNameForComputedSummaryResult(
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            self._trace_tag))
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    self._PrintPerfResult(buildbot_measurement_name,
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          buildbot_trace_name,
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          buildbot_value, value.units, buildbot_data_type)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  def _PrintOverallResults(self, page_test_results):
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # If there were no failed pages, output the overall results (results not
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # associated with a page).
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    had_failures = len(page_test_results.failures) > 0
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if not had_failures:
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for value in page_test_results.all_summary_values:
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        buildbot_value = value.GetBuildbotValue()
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        buildbot_data_type = value.GetBuildbotDataType(
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            output_context=value_module.SUMMARY_RESULT_OUTPUT_CONTEXT)
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        buildbot_measurement_name, buildbot_trace_name = (
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            value.GetChartAndTraceNameForComputedSummaryResult(
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                self._trace_tag))
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        self._PrintPerfResult(
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buildbot_measurement_name,
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buildbot_trace_name,
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buildbot_value,
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            value.units,
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            buildbot_data_type)
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    # Print the number of failed and errored pages.
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self._PrintPerfResult('telemetry_page_measurement_results', 'num_failed',
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          [len(page_test_results.failures)], 'count',
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          'unimportant')
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # TODO(chrishenry): Remove this in a separate patch to reduce the risk
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # of rolling back due to buildbot breakage.
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # Also fix src/tools/bisect-perf-regression_test.py when this is
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # removed.
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self._PrintPerfResult('telemetry_page_measurement_results', 'num_errored',
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          [0], 'count', 'unimportant')
110