|  | # Copyright 2018 the V8 project authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  |  | 
|  | class ResultBase(object): | 
|  | @property | 
|  | def is_skipped(self): | 
|  | return False | 
|  |  | 
|  | @property | 
|  | def is_grouped(self): | 
|  | return False | 
|  |  | 
|  | @property | 
|  | def is_rerun(self): | 
|  | return False | 
|  |  | 
|  |  | 
|  | class Result(ResultBase): | 
|  | """Result created by the output processor.""" | 
|  |  | 
|  | def __init__(self, has_unexpected_output, output, cmd=None): | 
|  | self.has_unexpected_output = has_unexpected_output | 
|  | self.output = output | 
|  | self.cmd = cmd | 
|  |  | 
|  |  | 
|  | class GroupedResult(ResultBase): | 
|  | """Result consisting of multiple results. It can be used by processors that | 
|  | create multiple subtests for each test and want to pass all results back. | 
|  | """ | 
|  |  | 
|  | @staticmethod | 
|  | def create(results): | 
|  | """Create grouped result from the list of results. It filters out skipped | 
|  | results. If all results are skipped results it returns skipped result. | 
|  |  | 
|  | Args: | 
|  | results: list of pairs (test, result) | 
|  | """ | 
|  | results = [(t, r) for (t, r) in results if not r.is_skipped] | 
|  | if not results: | 
|  | return SKIPPED | 
|  | return GroupedResult(results) | 
|  |  | 
|  | def __init__(self, results): | 
|  | self.results = results | 
|  |  | 
|  | @property | 
|  | def is_grouped(self): | 
|  | return True | 
|  |  | 
|  |  | 
|  | class SkippedResult(ResultBase): | 
|  | """Result without any meaningful value. Used primarily to inform the test | 
|  | processor that it's test wasn't executed. | 
|  | """ | 
|  |  | 
|  | @property | 
|  | def is_skipped(self): | 
|  | return True | 
|  |  | 
|  |  | 
|  | SKIPPED = SkippedResult() | 
|  |  | 
|  |  | 
|  | class RerunResult(Result): | 
|  | """Result generated from several reruns of the same test. It's a subclass of | 
|  | Result since the result of rerun is result of the last run. In addition to | 
|  | normal result it contains results of all reruns. | 
|  | """ | 
|  | @staticmethod | 
|  | def create(results): | 
|  | """Create RerunResult based on list of results. List cannot be empty. If it | 
|  | has only one element it's returned as a result. | 
|  | """ | 
|  | assert results | 
|  |  | 
|  | if len(results) == 1: | 
|  | return results[0] | 
|  | return RerunResult(results) | 
|  |  | 
|  | def __init__(self, results): | 
|  | """Has unexpected output and the output itself of the RerunResult equals to | 
|  | the last result in the passed list. | 
|  | """ | 
|  | assert results | 
|  |  | 
|  | last = results[-1] | 
|  | super(RerunResult, self).__init__(last.has_unexpected_output, last.output, | 
|  | last.cmd) | 
|  | self.results = results | 
|  |  | 
|  | @property | 
|  | def is_rerun(self): | 
|  | return True |