# 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 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 os.path.splitext(sys.executable)[0] def get_command(self): return super(PYTestCase, self).get_command() def _get_cmd_params(self): return self._get_files_params() + ['--', os.path.join(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): base_path = os.path.join(self.suite.root, self.path) if os.path.exists(base_path + self._get_suffix()): return base_path + self._get_suffix() return base_path + '.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 def GetSuite(*args, **kwargs): return TestSuite(*args, **kwargs)