# 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()