summaryrefslogtreecommitdiff
path: root/deps/v8/test/test262/testcfg.py
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/test262/testcfg.py')
-rw-r--r--deps/v8/test/test262/testcfg.py277
1 files changed, 131 insertions, 146 deletions
diff --git a/deps/v8/test/test262/testcfg.py b/deps/v8/test/test262/testcfg.py
index 358d0db459..2f23fb67fb 100644
--- a/deps/v8/test/test262/testcfg.py
+++ b/deps/v8/test/test262/testcfg.py
@@ -33,21 +33,25 @@ import re
import sys
import tarfile
-
from testrunner.local import statusfile
from testrunner.local import testsuite
from testrunner.local import utils
from testrunner.objects import testcase
+from testrunner.outproc import base as outproc
+from testrunner.outproc import test262
+
# TODO(littledan): move the flag mapping into the status file
FEATURE_FLAGS = {
- 'async-iteration': '--harmony-async-iteration',
+ 'BigInt': '--harmony-bigint',
'regexp-named-groups': '--harmony-regexp-named-captures',
'regexp-unicode-property-escapes': '--harmony-regexp-property',
'Promise.prototype.finally': '--harmony-promise-finally',
+ 'class-fields-public': '--harmony-class-fields',
+ 'optional-catch-binding': '--harmony-optional-catch-binding',
}
-SKIPPED_FEATURES = set(['BigInt', 'class-fields', 'optional-catch-binding'])
+SKIPPED_FEATURES = set(['class-fields-private'])
DATA = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data")
ARCHIVE = DATA + ".tar"
@@ -71,64 +75,88 @@ ALL_VARIANT_FLAGS_STRICT = dict(
for v, flag_sets in testsuite.ALL_VARIANT_FLAGS.iteritems()
)
-FAST_VARIANT_FLAGS_STRICT = dict(
- (v, [flags + ["--use-strict"] for flags in flag_sets])
- for v, flag_sets in testsuite.FAST_VARIANT_FLAGS.iteritems()
-)
-
ALL_VARIANT_FLAGS_BOTH = dict(
(v, [flags for flags in testsuite.ALL_VARIANT_FLAGS[v] +
ALL_VARIANT_FLAGS_STRICT[v]])
for v in testsuite.ALL_VARIANT_FLAGS
)
-FAST_VARIANT_FLAGS_BOTH = dict(
- (v, [flags for flags in testsuite.FAST_VARIANT_FLAGS[v] +
- FAST_VARIANT_FLAGS_STRICT[v]])
- for v in testsuite.FAST_VARIANT_FLAGS
-)
-
ALL_VARIANTS = {
'nostrict': testsuite.ALL_VARIANT_FLAGS,
'strict': ALL_VARIANT_FLAGS_STRICT,
'both': ALL_VARIANT_FLAGS_BOTH,
}
-FAST_VARIANTS = {
- 'nostrict': testsuite.FAST_VARIANT_FLAGS,
- 'strict': FAST_VARIANT_FLAGS_STRICT,
- 'both': FAST_VARIANT_FLAGS_BOTH,
-}
-
-class Test262VariantGenerator(testsuite.VariantGenerator):
- def GetFlagSets(self, testcase, variant):
- outcomes = testcase.suite.GetStatusFileOutcomes(testcase)
- if outcomes and statusfile.OnlyFastVariants(outcomes):
- variant_flags = FAST_VARIANTS
- else:
- variant_flags = ALL_VARIANTS
-
- test_record = self.suite.GetTestRecord(testcase)
+class LegacyVariantsGenerator(testsuite.LegacyVariantsGenerator):
+ def GetFlagSets(self, test, variant):
+ test_record = test.test_record
if "noStrict" in test_record:
- return variant_flags["nostrict"][variant]
+ return ALL_VARIANTS["nostrict"][variant]
if "onlyStrict" in test_record:
- return variant_flags["strict"][variant]
- return variant_flags["both"][variant]
-
-
-class Test262TestSuite(testsuite.TestSuite):
+ return ALL_VARIANTS["strict"][variant]
+ return ALL_VARIANTS["both"][variant]
+
+
+class VariantsGenerator(testsuite.VariantsGenerator):
+ def gen(self, test):
+ flags_set = self._get_flags_set(test)
+ test_record = test.test_record
+ for n, variant in enumerate(self._get_variants(test)):
+ flags = flags_set[variant][0]
+ if 'noStrict' in test_record:
+ yield (variant, flags, str(n))
+ elif 'onlyStrict' in test_record:
+ yield (variant, flags + ['--use-strict'], 'strict-%d' % n)
+ else:
+ yield (variant, flags, str(n))
+ yield (variant, flags + ['--use-strict'], 'strict-%d' % n)
+
+
+class TestSuite(testsuite.TestSuite):
# Match the (...) in '/path/to/v8/test/test262/subdir/test/(...).js'
# In practice, subdir is data or local-tests
def __init__(self, name, root):
- super(Test262TestSuite, self).__init__(name, root)
+ super(TestSuite, self).__init__(name, root)
self.testroot = os.path.join(self.root, *TEST_262_SUITE_PATH)
self.harnesspath = os.path.join(self.root, *TEST_262_HARNESS_PATH)
self.harness = [os.path.join(self.harnesspath, f)
for f in TEST_262_HARNESS_FILES]
self.harness += [os.path.join(self.root, "harness-adapt.js")]
self.localtestroot = os.path.join(self.root, *TEST_262_LOCAL_TESTS_PATH)
- self.ParseTestRecord = None
+
+ self._extract_sources()
+ self.parse_test_record = self._load_parse_test_record()
+
+ def _extract_sources(self):
+ # The archive is created only on swarming. Local checkouts have the
+ # data folder.
+ if (os.path.exists(ARCHIVE) and
+ # Check for a JS file from the archive if we need to unpack. Some other
+ # files from the archive unfortunately exist due to a bug in the
+ # isolate_processor.
+ # TODO(machenbach): Migrate this to GN to avoid using the faulty
+ # isolate_processor: http://crbug.com/669910
+ not os.path.exists(os.path.join(DATA, 'test', 'harness', 'error.js'))):
+ print "Extracting archive..."
+ tar = tarfile.open(ARCHIVE)
+ tar.extractall(path=os.path.dirname(ARCHIVE))
+ tar.close()
+
+ def _load_parse_test_record(self):
+ root = os.path.join(self.root, *TEST_262_TOOLS_PATH)
+ f = None
+ try:
+ (f, pathname, description) = imp.find_module("parseTestRecord", [root])
+ module = imp.load_module("parseTestRecord", f, pathname, description)
+ return module.parseTestRecord
+ except:
+ print ('Cannot load parseTestRecord; '
+ 'you may need to gclient sync for test262')
+ raise
+ finally:
+ if f:
+ f.close()
def ListTests(self, context):
testnames = set()
@@ -148,122 +176,79 @@ class Test262TestSuite(testsuite.TestSuite):
fullpath = os.path.join(dirname, filename)
relpath = re.match(TEST_262_RELPATH_REGEXP, fullpath).group(1)
testnames.add(relpath.replace(os.path.sep, "/"))
- cases = [testcase.TestCase(self, testname) for testname in testnames]
+ cases = map(self._create_test, testnames)
return [case for case in cases if len(
SKIPPED_FEATURES.intersection(
- self.GetTestRecord(case).get("features", []))) == 0]
-
- def GetParametersForTestCase(self, testcase, context):
- files = (
- list(self.harness) +
- ([os.path.join(self.root, "harness-agent.js")]
- if testcase.path.startswith('built-ins/Atomics') else []) +
- self.GetIncludesForTest(testcase) +
- (["--module"] if "module" in self.GetTestRecord(testcase) else []) +
- [self.GetPathForTest(testcase)]
+ case.test_record.get("features", []))) == 0]
+
+ def _test_class(self):
+ return TestCase
+
+ def _LegacyVariantsGeneratorFactory(self):
+ return LegacyVariantsGenerator
+
+ def _variants_gen_class(self):
+ return VariantsGenerator
+
+
+class TestCase(testcase.TestCase):
+ def __init__(self, *args, **kwargs):
+ super(TestCase, self).__init__(*args, **kwargs)
+
+ source = self.get_source()
+ self.test_record = self.suite.parse_test_record(source, self.path)
+ self._expected_exception = (
+ self.test_record
+ .get('negative', {})
+ .get('type', None)
)
- flags = (
- testcase.flags + context.mode_flags +
- (["--throws"] if "negative" in self.GetTestRecord(testcase)
- else []) +
+
+ def _get_files_params(self, ctx):
+ return (
+ list(self.suite.harness) +
+ ([os.path.join(self.suite.root, "harness-agent.js")]
+ if self.path.startswith('built-ins/Atomics') else []) +
+ self._get_includes() +
+ (["--module"] if "module" in self.test_record else []) +
+ [self._get_source_path()]
+ )
+
+ def _get_suite_flags(self, ctx):
+ return (
+ (["--throws"] if "negative" in self.test_record else []) +
(["--allow-natives-syntax"]
- if "detachArrayBuffer.js" in
- self.GetTestRecord(testcase).get("includes", [])
+ if "detachArrayBuffer.js" in self.test_record.get("includes", [])
else []) +
- ([flag for (feature, flag) in FEATURE_FLAGS.items()
- if feature in self.GetTestRecord(testcase).get("features", [])])
+ [flag for (feature, flag) in FEATURE_FLAGS.items()
+ if feature in self.test_record.get("features", [])]
)
- return files, flags, {}
-
- def _VariantGeneratorFactory(self):
- return Test262VariantGenerator
-
- def LoadParseTestRecord(self):
- if not self.ParseTestRecord:
- root = os.path.join(self.root, *TEST_262_TOOLS_PATH)
- f = None
- try:
- (f, pathname, description) = imp.find_module("parseTestRecord", [root])
- module = imp.load_module("parseTestRecord", f, pathname, description)
- self.ParseTestRecord = module.parseTestRecord
- except:
- raise ImportError("Cannot load parseTestRecord; you may need to "
- "gclient sync for test262")
- finally:
- if f:
- f.close()
- return self.ParseTestRecord
-
- def GetTestRecord(self, testcase):
- if not hasattr(testcase, "test_record"):
- ParseTestRecord = self.LoadParseTestRecord()
- testcase.test_record = ParseTestRecord(self.GetSourceForTest(testcase),
- testcase.path)
- return testcase.test_record
-
- def BasePath(self, filename):
- return self.root if filename in TEST_262_NATIVE_FILES else self.harnesspath
-
- def GetIncludesForTest(self, testcase):
- test_record = self.GetTestRecord(testcase)
- return [os.path.join(self.BasePath(filename), filename)
- for filename in test_record.get("includes", [])]
-
- def GetPathForTest(self, testcase):
- filename = os.path.join(self.localtestroot, testcase.path + ".js")
- if not os.path.exists(filename):
- filename = os.path.join(self.testroot, testcase.path + ".js")
- return filename
-
- def GetSourceForTest(self, testcase):
- with open(self.GetPathForTest(testcase)) as f:
- return f.read()
-
- def _ParseException(self, str, testcase):
- # somefile:somelinenumber: someerror[: sometext]
- # somefile might include an optional drive letter on windows e.g. "e:".
- match = re.search(
- '^(?:\w:)?[^:]*:[0-9]+: ([^: ]+?)($|: )', str, re.MULTILINE)
- if match:
- return match.group(1).strip()
+
+ def _get_includes(self):
+ return [os.path.join(self._base_path(filename), filename)
+ for filename in self.test_record.get("includes", [])]
+
+ def _base_path(self, filename):
+ if filename in TEST_262_NATIVE_FILES:
+ return self.suite.root
else:
- print "Error parsing exception for %s" % testcase.GetLabel()
- return None
-
- def IsFailureOutput(self, testcase):
- output = testcase.output
- test_record = self.GetTestRecord(testcase)
- if output.exit_code != 0:
- return True
- if ("negative" in test_record and
- "type" in test_record["negative"] and
- self._ParseException(output.stdout, testcase) !=
- test_record["negative"]["type"]):
- return True
- return "FAILED!" in output.stdout
-
- def GetExpectedOutcomes(self, testcase):
- outcomes = self.GetStatusFileOutcomes(testcase)
- if (statusfile.FAIL_SLOPPY in outcomes and
- '--use-strict' not in testcase.flags):
- return [statusfile.FAIL]
- return super(Test262TestSuite, self).GetExpectedOutcomes(testcase)
-
- def PrepareSources(self):
- # The archive is created only on swarming. Local checkouts have the
- # data folder.
- if (os.path.exists(ARCHIVE) and
- # Check for a JS file from the archive if we need to unpack. Some other
- # files from the archive unfortunately exist due to a bug in the
- # isolate_processor.
- # TODO(machenbach): Migrate this to GN to avoid using the faulty
- # isolate_processor: http://crbug.com/669910
- not os.path.exists(os.path.join(DATA, 'test', 'harness', 'error.js'))):
- print "Extracting archive..."
- tar = tarfile.open(ARCHIVE)
- tar.extractall(path=os.path.dirname(ARCHIVE))
- tar.close()
+ return self.suite.harnesspath
+
+ def _get_source_path(self):
+ filename = self.path + self._get_suffix()
+ path = os.path.join(self.suite.localtestroot, filename)
+ if os.path.exists(path):
+ return path
+ return os.path.join(self.suite.testroot, filename)
+
+ @property
+ def output_proc(self):
+ if self._expected_exception is not None:
+ return test262.ExceptionOutProc(self.expected_outcomes,
+ self._expected_exception)
+ if self.expected_outcomes == outproc.OUTCOMES_PASS:
+ return test262.PASS_NO_EXCEPTION
+ return test262.NoExceptionOutProc(self.expected_outcomes)
def GetSuite(name, root):
- return Test262TestSuite(name, root)
+ return TestSuite(name, root)