Index: tools/telemetry/telemetry/internal/results/page_test_results.py |
diff --git a/tools/telemetry/telemetry/internal/results/page_test_results.py b/tools/telemetry/telemetry/internal/results/page_test_results.py |
deleted file mode 100644 |
index d16812504b8567bb412e47f6463f567505773e33..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/internal/results/page_test_results.py |
+++ /dev/null |
@@ -1,269 +0,0 @@ |
-# Copyright 2014 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 collections |
-import copy |
-import datetime |
-import logging |
-import random |
-import sys |
-import traceback |
- |
-from catapult_base import cloud_storage # pylint: disable=import-error |
- |
-from telemetry.internal.results import json_output_formatter |
-from telemetry.internal.results import progress_reporter as reporter_module |
-from telemetry.internal.results import story_run |
-from telemetry import value as value_module |
-from telemetry.value import failure |
-from telemetry.value import skip |
-from telemetry.value import trace |
- |
- |
-class PageTestResults(object): |
- def __init__(self, output_formatters=None, |
- progress_reporter=None, trace_tag='', output_dir=None, |
- value_can_be_added_predicate=lambda v, is_first: True): |
- """ |
- Args: |
- output_formatters: A list of output formatters. The output |
- formatters are typically used to format the test results, such |
- as CsvPivotTableOutputFormatter, which output the test results as CSV. |
- progress_reporter: An instance of progress_reporter.ProgressReporter, |
- to be used to output test status/results progressively. |
- trace_tag: A string to append to the buildbot trace name. Currently only |
- used for buildbot. |
- output_dir: A string specified the directory where to store the test |
- artifacts, e.g: trace, videos,... |
- value_can_be_added_predicate: A function that takes two arguments: |
- a value.Value instance (except failure.FailureValue, skip.SkipValue |
- or trace.TraceValue) and a boolean (True when the value is part of |
- the first result for the story). It returns True if the value |
- can be added to the test results and False otherwise. |
- """ |
- # TODO(chrishenry): Figure out if trace_tag is still necessary. |
- |
- super(PageTestResults, self).__init__() |
- self._progress_reporter = ( |
- progress_reporter if progress_reporter is not None |
- else reporter_module.ProgressReporter()) |
- self._output_formatters = ( |
- output_formatters if output_formatters is not None else []) |
- self._trace_tag = trace_tag |
- self._output_dir = output_dir |
- self._value_can_be_added_predicate = value_can_be_added_predicate |
- |
- self._current_page_run = None |
- self._all_page_runs = [] |
- self._all_stories = set() |
- self._representative_value_for_each_value_name = {} |
- self._all_summary_values = [] |
- self._serialized_trace_file_ids_to_paths = {} |
- self._pages_to_profiling_files = collections.defaultdict(list) |
- self._pages_to_profiling_files_cloud_url = collections.defaultdict(list) |
- |
- def __copy__(self): |
- cls = self.__class__ |
- result = cls.__new__(cls) |
- for k, v in self.__dict__.items(): |
- if isinstance(v, collections.Container): |
- v = copy.copy(v) |
- setattr(result, k, v) |
- return result |
- |
- @property |
- def pages_to_profiling_files(self): |
- return self._pages_to_profiling_files |
- |
- @property |
- def serialized_trace_file_ids_to_paths(self): |
- return self._serialized_trace_file_ids_to_paths |
- |
- @property |
- def pages_to_profiling_files_cloud_url(self): |
- return self._pages_to_profiling_files_cloud_url |
- |
- @property |
- def all_page_specific_values(self): |
- values = [] |
- for run in self._all_page_runs: |
- values += run.values |
- if self._current_page_run: |
- values += self._current_page_run.values |
- return values |
- |
- @property |
- def all_summary_values(self): |
- return self._all_summary_values |
- |
- @property |
- def current_page(self): |
- assert self._current_page_run, 'Not currently running test.' |
- return self._current_page_run.story |
- |
- @property |
- def current_page_run(self): |
- assert self._current_page_run, 'Not currently running test.' |
- return self._current_page_run |
- |
- @property |
- def all_page_runs(self): |
- return self._all_page_runs |
- |
- @property |
- def pages_that_succeeded(self): |
- """Returns the set of pages that succeeded.""" |
- pages = set(run.story for run in self.all_page_runs) |
- pages.difference_update(self.pages_that_failed) |
- return pages |
- |
- @property |
- def pages_that_failed(self): |
- """Returns the set of failed pages.""" |
- failed_pages = set() |
- for run in self.all_page_runs: |
- if run.failed: |
- failed_pages.add(run.story) |
- return failed_pages |
- |
- @property |
- def failures(self): |
- values = self.all_page_specific_values |
- return [v for v in values if isinstance(v, failure.FailureValue)] |
- |
- @property |
- def skipped_values(self): |
- values = self.all_page_specific_values |
- return [v for v in values if isinstance(v, skip.SkipValue)] |
- |
- def _GetStringFromExcInfo(self, err): |
- return ''.join(traceback.format_exception(*err)) |
- |
- def CleanUp(self): |
- """Clean up any TraceValues contained within this results object.""" |
- for run in self._all_page_runs: |
- for v in run.values: |
- if isinstance(v, trace.TraceValue): |
- v.CleanUp() |
- run.values.remove(v) |
- |
- def __enter__(self): |
- return self |
- |
- def __exit__(self, _, __, ___): |
- self.CleanUp() |
- |
- def WillRunPage(self, page): |
- assert not self._current_page_run, 'Did not call DidRunPage.' |
- self._current_page_run = story_run.StoryRun(page) |
- self._progress_reporter.WillRunPage(self) |
- |
- def DidRunPage(self, page): # pylint: disable=unused-argument |
- """ |
- Args: |
- page: The current page under test. |
- """ |
- assert self._current_page_run, 'Did not call WillRunPage.' |
- self._progress_reporter.DidRunPage(self) |
- self._all_page_runs.append(self._current_page_run) |
- self._all_stories.add(self._current_page_run.story) |
- self._current_page_run = None |
- |
- def AddValue(self, value): |
- assert self._current_page_run, 'Not currently running test.' |
- self._ValidateValue(value) |
- is_first_result = ( |
- self._current_page_run.story not in self._all_stories) |
- if not (isinstance(value, skip.SkipValue) or |
- isinstance(value, failure.FailureValue) or |
- isinstance(value, trace.TraceValue) or |
- self._value_can_be_added_predicate(value, is_first_result)): |
- return |
- # TODO(eakuefner/chrishenry): Add only one skip per pagerun assert here |
- self._current_page_run.AddValue(value) |
- self._progress_reporter.DidAddValue(value) |
- |
- def AddProfilingFile(self, page, file_handle): |
- self._pages_to_profiling_files[page].append(file_handle) |
- |
- def AddSummaryValue(self, value): |
- assert value.page is None |
- self._ValidateValue(value) |
- self._all_summary_values.append(value) |
- |
- def _ValidateValue(self, value): |
- assert isinstance(value, value_module.Value) |
- if value.name not in self._representative_value_for_each_value_name: |
- self._representative_value_for_each_value_name[value.name] = value |
- representative_value = self._representative_value_for_each_value_name[ |
- value.name] |
- assert value.IsMergableWith(representative_value) |
- |
- def PrintSummary(self): |
- self._progress_reporter.DidFinishAllTests(self) |
- |
- # Only serialize the trace if output_format is json. |
- if (self._output_dir and |
- any(isinstance(o, json_output_formatter.JsonOutputFormatter) |
- for o in self._output_formatters)): |
- self._SerializeTracesToDirPath(self._output_dir) |
- for output_formatter in self._output_formatters: |
- output_formatter.Format(self) |
- |
- def FindValues(self, predicate): |
- """Finds all values matching the specified predicate. |
- |
- Args: |
- predicate: A function that takes a Value and returns a bool. |
- Returns: |
- A list of values matching |predicate|. |
- """ |
- values = [] |
- for value in self.all_page_specific_values: |
- if predicate(value): |
- values.append(value) |
- return values |
- |
- def FindPageSpecificValuesForPage(self, page, value_name): |
- return self.FindValues(lambda v: v.page == page and v.name == value_name) |
- |
- def FindAllPageSpecificValuesNamed(self, value_name): |
- return self.FindValues(lambda v: v.name == value_name) |
- |
- def FindAllPageSpecificValuesFromIRNamed(self, tir_label, value_name): |
- return self.FindValues(lambda v: v.name == value_name |
- and v.tir_label == tir_label) |
- |
- def FindAllTraceValues(self): |
- return self.FindValues(lambda v: isinstance(v, trace.TraceValue)) |
- |
- def _SerializeTracesToDirPath(self, dir_path): |
- """ Serialize all trace values to files in dir_path and return a list of |
- file handles to those files. """ |
- for value in self.FindAllTraceValues(): |
- fh = value.Serialize(dir_path) |
- self._serialized_trace_file_ids_to_paths[fh.id] = fh.GetAbsPath() |
- |
- def UploadTraceFilesToCloud(self, bucket): |
- for value in self.FindAllTraceValues(): |
- value.UploadToCloud(bucket) |
- |
- def UploadProfilingFilesToCloud(self, bucket): |
- for page, file_handle_list in self._pages_to_profiling_files.iteritems(): |
- for file_handle in file_handle_list: |
- remote_path = ('profiler-file-id_%s-%s%-d%s' % ( |
- file_handle.id, |
- datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'), |
- random.randint(1, 100000), |
- file_handle.extension)) |
- try: |
- cloud_url = cloud_storage.Insert( |
- bucket, remote_path, file_handle.GetAbsPath()) |
- sys.stderr.write( |
- 'View generated profiler files online at %s for page %s\n' % |
- (cloud_url, page.display_name)) |
- self._pages_to_profiling_files_cloud_url[page].append(cloud_url) |
- except cloud_storage.PermissionError as e: |
- logging.error('Cannot upload profiling files to cloud storage due to ' |
- ' permission error: %s' % e.message) |