blob: 5a4c151253d0a12b78f4aa675f0adb60344af211 [file] [log] [blame]
# 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