# Copyright 2019 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 os import re import shlex import sys from pathlib import Path from testrunner.local import testsuite from testrunner.local import utils from testrunner.objects import testcase from testrunner.outproc import message PY_FLAGS_PATTERN = re.compile(r"#\s+Flags:(.*)") class PYTestCase(testcase.TestCase): def get_shell(self): return Path(sys.executable).stem def get_command(self): return super(PYTestCase, self).get_command() def _get_cmd_params(self): return ( self._get_files_params() + ['--', self.test_config.shell_dir / 'd8'] + self._get_source_flags() ) def _get_shell_flags(self): return [] class TestCase(PYTestCase): def __init__(self, *args, **kwargs): super(TestCase, self).__init__(*args, **kwargs) source = self.get_source() self._source_files = self._parse_source_files(source) self._source_flags = self._parse_source_flags(source) def _parse_source_files(self, source): files = [] files.append(self._get_source_path()) return files def _parse_source_flags(self, source=None): source = source or self.get_source() flags = [] for match in re.findall(PY_FLAGS_PATTERN, source): flags += shlex.split(match.strip()) return flags def _expected_fail(self): path = self.path while path: head, tail = os.path.split(path) if tail == 'fail': return True path = head return False def _get_files_params(self): return self._source_files def _get_source_flags(self): return self._source_flags def _get_source_path(self): js_file = self.suite.root / self.path_js if js_file.exists(): return js_file return self.suite.root / self.path_and_suffix('.py') def skip_predictable(self): return super(TestCase, self).skip_predictable() or self._expected_fail() class PYTestLoader(testsuite.GenericTestLoader): @property def excluded_files(self): return {'gdb_rsp.py', 'testcfg.py', '__init__.py', 'test_basic.py', 'test_float.py', 'test_memory.py', 'test_trap.py'} @property def extensions(self): return ['.py'] class TestSuite(testsuite.TestSuite): def _test_loader_class(self): return PYTestLoader def _test_class(self): return TestCase