|  | # 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. | 
|  |  | 
|  | import re | 
|  |  | 
|  | from . import base | 
|  |  | 
|  |  | 
|  | def _is_failure_output(output): | 
|  | return ( | 
|  | output.exit_code != 0 or | 
|  | 'FAILED!' in output.stdout | 
|  | ) | 
|  |  | 
|  |  | 
|  | class ExceptionOutProc(base.OutProc): | 
|  | """Output processor for tests with expected exception.""" | 
|  | def __init__( | 
|  | self, expected_outcomes, expected_exception=None, negative=False): | 
|  | super(ExceptionOutProc, self).__init__(expected_outcomes) | 
|  | self._expected_exception = expected_exception | 
|  | self._negative = negative | 
|  |  | 
|  | @property | 
|  | def negative(self): | 
|  | return self._negative | 
|  |  | 
|  | def _is_failure_output(self, output): | 
|  | if self._expected_exception != self._parse_exception(output.stdout): | 
|  | return True | 
|  | return _is_failure_output(output) | 
|  |  | 
|  | def _parse_exception(self, string): | 
|  | # somefile:somelinenumber: someerror[: sometext] | 
|  | # somefile might include an optional drive letter on windows e.g. "e:". | 
|  | match = re.search( | 
|  | '^(?:\w:)?[^:]*:[0-9]+: ([^: ]+?)($|: )', string, re.MULTILINE) | 
|  | if match: | 
|  | return match.group(1).strip() | 
|  | else: | 
|  | return None | 
|  |  | 
|  |  | 
|  | class NoExceptionOutProc(base.OutProc): | 
|  | """Output processor optimized for tests without expected exception.""" | 
|  | def __init__(self, expected_outcomes): | 
|  | super(NoExceptionOutProc, self).__init__(expected_outcomes) | 
|  |  | 
|  | def _is_failure_output(self, output): | 
|  | return _is_failure_output(output) | 
|  |  | 
|  |  | 
|  | class PassNoExceptionOutProc(base.PassOutProc): | 
|  | """ | 
|  | Output processor optimized for tests expected to PASS without expected | 
|  | exception. | 
|  | """ | 
|  | def _is_failure_output(self, output): | 
|  | return _is_failure_output(output) | 
|  |  | 
|  |  | 
|  | PASS_NO_EXCEPTION = PassNoExceptionOutProc() |