| # 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 | |
| class ExceptionOutProc(base.OutProc): | |
| """Output processor for tests with expected exception.""" | |
| def __init__(self, expected_outcomes, expected_exception=None): | |
| super(ExceptionOutProc, self).__init__(expected_outcomes) | |
| self._expected_exception = expected_exception | |
| def _is_failure_output(self, output): | |
| if output.exit_code != 0: | |
| return True | |
| if self._expected_exception != self._parse_exception(output.stdout): | |
| return True | |
| return 'FAILED!' in output.stdout | |
| 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 | |
| def _is_failure_output(self, output): | |
| return ( | |
| output.exit_code != 0 or | |
| 'FAILED!' in output.stdout | |
| ) | |
| class NoExceptionOutProc(base.OutProc): | |
| """Output processor optimized for tests without expected exception.""" | |
| NoExceptionOutProc._is_failure_output = _is_failure_output | |
| class PassNoExceptionOutProc(base.PassOutProc): | |
| """ | |
| Output processor optimized for tests expected to PASS without expected | |
| exception. | |
| """ | |
| PassNoExceptionOutProc._is_failure_output = _is_failure_output | |
| PASS_NO_EXCEPTION = PassNoExceptionOutProc() |