Revision: 23313
Author: [email protected]
Date: Fri Aug 22 13:00:10 2014 UTC
Log: test/test262: update testcfg.py for new test262
testcfg.py:
- update revision and MD5
- remove non-mandatory harness files
- use test parser distributed with test262
- new attribute `suite.harnesspath`
- new method GetIncludesForTest
- GetSourceForTest: cache source on testcase
- IsNegativeTest: use parseTestRecord
- use 7-char sha hash [1]
- DRY setting up paths to test262 suite, harness, etc
- clean up helper fns
harness-adapter.js:
- add $DONE function to adapter [2]
1: github tar file has 7-char sha embedded in dir name
script cannot find directory to rename if they don't match exactly
2: test262 uses a `$DONE` function for async tests with
semantics like those of mocha's `done`.
Briefly: done(arg) => if (arg) { /* failure */ }
Implemented a version of this for v8, using v8-specific
api (`print`, `quit`)
BUG=v8:3513
LOG=N
[email protected]
Review URL: https://codereview.chromium.org/478163002
https://code.google.com/p/v8/source/detail?r=23313
Added:
/branches/bleeding_edge/test/test262-es6
/branches/bleeding_edge/test/test262-es6/README
/branches/bleeding_edge/test/test262-es6/harness-adapt.js
/branches/bleeding_edge/test/test262-es6/test262-es6.status
/branches/bleeding_edge/test/test262-es6/testcfg.py
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/test262-es6/README Fri Aug 22 13:00:10
2014 UTC
@@ -0,0 +1,18 @@
+This directory contains code for binding the test262 test suite
+into the v8 test harness. To use the tests check out the test262
+tests from
+
+ https://github.com/tc39/test262
+
+at hash 595a36b (2014/08/10 revision) as 'data' in this directory. Using
later
+version may be possible but the tests are only known to pass (and indeed
run)
+with that revision.
+
+ git clone https://github.com/tc39/test262 data
+ cd data
+ git checkout 595a36b
+
+If you do update to a newer revision you may have to change the test
+harness adapter code since it uses internal functionality from the
+harness that comes bundled with the tests. You will most likely also
+have to update the test expectation file.
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/test262-es6/harness-adapt.js Fri Aug 22
13:00:10 2014 UTC
@@ -0,0 +1,91 @@
+// Copyright 2011 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+function fnGlobalObject() { return (function() { return this; })(); }
+
+var ES5Harness = (function() {
+ var currentTest = {};
+ var $this = this;
+
+ function Test262Error(id, path, description, codeString,
+ preconditionString, result, error) {
+ this.id = id;
+ this.path = path;
+ this.description = description;
+ this.result = result;
+ this.error = error;
+ this.code = codeString;
+ this.pre = preconditionString;
+ }
+
+ Test262Error.prototype.toString = function() {
+ return this.result + " " + this.error;
+ }
+
+ function registerTest(test) {
+ if (!(test.precondition && !test.precondition())) {
+ var error;
+ try {
+ var res = test.test.call($this);
+ } catch(e) {
+ res = 'fail';
+ error = e;
+ }
+ var retVal = /^s/i.test(test.id)
+ ? (res === true || typeof res == 'undefined' ? 'pass' : 'fail')
+ : (res === true ? 'pass' : 'fail');
+
+ if (retVal != 'pass') {
+ var precondition = (test.precondition !== undefined)
+ ? test.precondition.toString()
+ : '';
+
+ throw new Test262Error(
+ test.id,
+ test.path,
+ test.description,
+ test.test.toString(),
+ precondition,
+ retVal,
+ error);
+ }
+ }
+ }
+
+ return {
+ registerTest: registerTest
+ }
+})();
+
+function $DONE(arg){
+ if (arg) {
+ print('FAILED! Error: ' + arg);
+ quit(1);
+ }
+
+ quit(0);
+};
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/test262-es6/test262-es6.status Fri Aug 22
13:00:10 2014 UTC
@@ -0,0 +1,186 @@
+# Copyright 2011 the V8 project authors. All rights reserved.
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+[
+[ALWAYS, {
+ ############################### BUGS ###################################
+
+ '15.5.4.9_CE': [['no_i18n', SKIP]],
+
+ # TODO(turbofan): Timeouts on TurboFan need investigation.
+ '10.1.1_13': [PASS, NO_VARIANTS],
+
+ # BUG(v8:3455)
+ '11.2.3_b': [FAIL],
+ '12.2.3_b': [FAIL],
+
+ ###################### NEEDS INVESTIGATION (2014) #######################
+
+ # Cause unknown.
+ 'bug_596_1': [FAIL],
+
+ # New ES6 Array functions.
+ 'S22.1.2.1_T1': [FAIL],
+ 'S22.1.2.1_T2': [FAIL],
+ 'S22.1.2.3_T1': [FAIL],
+ 'S22.1.2.3_T2': [FAIL],
+ 'S22.1.3.6_T1': [FAIL],
+
+ # New ES6 function String.prototype.contains, unimplemented in v8.
+ 'String.prototype.contains_FailBadLocation': [FAIL],
+ 'String.prototype.contains_FailLocation': [FAIL],
+ 'String.prototype.contains_FailMissingLetter': [FAIL],
+ 'String.prototype.contains_Success': [FAIL],
+ 'String.prototype.contains_SuccessNoLocation': [FAIL],
+ 'String.prototype.contains_lengthProp': [FAIL],
+
+ # New ES6 function String.prototype.endsWith, unimplemented in v8.
+ 'String.prototype.endsWith_Fail': [FAIL],
+ 'String.prototype.endsWith_Fail_2': [FAIL],
+ 'String.prototype.endsWith_Success': [FAIL],
+ 'String.prototype.endsWith_Success_2': [FAIL],
+ 'String.prototype.endsWith_Success_3': [FAIL],
+ 'String.prototype.endsWith_Success_4': [FAIL],
+
+ # New ES6 function Array.prototype.find, unimplemented in v8.
+ 'Array.prototype.find_callable-predicate': [FAIL],
+ 'Array.prototype.find_empty-array-undefined': [FAIL],
+ 'Array.prototype.find_length-property': [FAIL],
+ 'Array.prototype.find_modify-after-start': [FAIL],
+ 'Array.prototype.find_non-returning-predicate': [FAIL],
+ 'Array.prototype.find_predicate-arguments': [FAIL],
+ 'Array.prototype.find_push-after-start': [FAIL],
+ 'Array.prototype.find_remove-after-start': [FAIL],
+ 'Array.prototype.find_return-found-value': [FAIL],
+ 'Array.prototype.find_skip-empty': [FAIL],
+ 'Array.prototype.find_this-defined': [FAIL],
+ 'Array.prototype.find_this-is-object': [FAIL],
+ 'Array.prototype.find_this-undefined': [FAIL],
+
+ # This negative test fails for the wrong reason.
+ #'Array.prototype.find_noncallable-predicate': [FAIL],
+
+ # Possibly same cause as S8.5_A2.1, below: floating-point tests.
+ 'S15.8.2.16_A7': [PASS, FAIL_OK],
+ 'S15.8.2.18_A7': [PASS, FAIL_OK],
+ 'S15.8.2.7_A7': [PASS, FAIL_OK],
+
+ # This is an incompatibility between ES5 and V8 on enumerating
+ # shadowed elements in a for..in loop.
+ # https://code.google.com/p/v8/issues/detail?id=705
+ '12.6.4-2': [PASS, FAIL_OK],
+
+ ######################## NEEDS INVESTIGATION ###########################
+
+ # These test failures are specific to the intl402 suite and need
investigation
+ # to be either marked as bugs with issues filed for them or as deliberate
+ # incompatibilities if the test cases turn out to be broken or ambiguous.
+ '6.2.3': [FAIL],
+ '9.2.1_2': [FAIL],
+ '9.2.6_2': [FAIL],
+ '10.1.1_a': [FAIL],
+ '10.1.1_19_c': [PASS, FAIL, NO_VARIANTS],
+ '10.1.2.1_4': [FAIL],
+ '10.2.3_b': [PASS, FAIL],
+ '10.3_a': [FAIL],
+ '11.1.1_17': [PASS, FAIL],
+ '11.1.1_19': [PASS, FAIL],
+ '11.1.1_20_c': [FAIL],
+ '11.1.1_a': [FAIL],
+ '11.1.2.1_4': [FAIL],
+ '11.3.2_FN_2': [PASS, FAIL],
+ '11.3.2_TRF': [PASS, FAIL],
+ '11.3_a': [FAIL],
+ '12.1.1_a': [FAIL],
+ '12.1.2.1_4': [FAIL],
+ '12.3.2_FDT_7_a_iv': [FAIL],
+ '12.3.3': [FAIL],
+ '12.3_a': [FAIL],
+ '15.5.4.9_3': [PASS, FAIL],
+
+ ##################### DELIBERATE INCOMPATIBILITIES #####################
+
+ 'S15.8.2.8_A6': [PASS, FAIL_OK], # Math.exp (less precise with
--fast-math)
+
+ # Linux for ia32 (and therefore simulators) default to extended 80 bit
+ # floating point formats, so these tests checking 64-bit FP precision
fail.
+ # The other platforms/arch's pass these tests.
+ # We follow the other major JS engines by keeping this default.
+ 'S8.5_A2.1': [PASS, FAIL_OK],
+ 'S8.5_A2.2': [PASS, FAIL_OK],
+
+ # ES6 allows duplicate properties
+ '11.1.5-4-4-a-1-s': [FAIL],
+ '11.1.5_4-4-b-1': [FAIL],
+ '11.1.5_4-4-b-2': [FAIL],
+ '11.1.5_4-4-c-1': [FAIL],
+ '11.1.5_4-4-c-2': [FAIL],
+ '11.1.5_4-4-d-1': [FAIL],
+ '11.1.5_4-4-d-2': [FAIL],
+ '11.1.5_4-4-d-3': [FAIL],
+ '11.1.5_4-4-d-4': [FAIL],
+
+ ############################ INVALID TESTS #############################
+
+ # The reference value calculated by Test262 is incorrect if you run these
+ # tests in PST/PDT between first Sunday in March and first Sunday in
April.
+ # The DST switch was moved in 2007 whereas Test262 bases the reference
value
+ # on 2000. Test262 Bug: https://bugs.ecmascript.org/show_bug.cgi?id=293
+ 'S15.9.3.1_A5_T1': [PASS, FAIL_OK],
+ 'S15.9.3.1_A5_T2': [PASS, FAIL_OK],
+ 'S15.9.3.1_A5_T3': [PASS, FAIL_OK],
+ 'S15.9.3.1_A5_T4': [PASS, FAIL_OK],
+ 'S15.9.3.1_A5_T5': [PASS, FAIL_OK],
+ 'S15.9.3.1_A5_T6': [PASS, FAIL_OK],
+
+ ############################ SKIPPED TESTS #############################
+
+ # These tests take a looong time to run in debug mode.
+ 'S15.1.3.1_A2.5_T1': [PASS, ['mode == debug', SKIP]],
+ 'S15.1.3.2_A2.5_T1': [PASS, ['mode == debug', SKIP]],
+}], # ALWAYS
+
+['system == macos', {
+ '11.3.2_TRP': [FAIL],
+ '9.2.5_11_g_ii_2': [FAIL],
+}], # system == macos
+
+['arch == arm or arch == mipsel or arch == mips or arch == arm64 or arch
== mips64el', {
+
+ # TODO(mstarzinger): Causes stack overflow on simulators due to eager
+ # compilation of parenthesized function literals. Needs investigation.
+ 'S13.2.1_A1_T1': [SKIP],
+
+ # BUG(3251225): Tests that timeout with --nocrankshaft.
+ 'S15.1.3.1_A2.4_T1': [SKIP],
+ 'S15.1.3.1_A2.5_T1': [SKIP],
+ 'S15.1.3.2_A2.4_T1': [SKIP],
+ 'S15.1.3.2_A2.5_T1': [SKIP],
+ 'S15.1.3.3_A2.3_T1': [SKIP],
+ 'S15.1.3.4_A2.3_T1': [SKIP],
+}], # 'arch == arm or arch == mipsel or arch == mips or arch == arm64'
+]
=======================================
--- /dev/null
+++ /branches/bleeding_edge/test/test262-es6/testcfg.py Fri Aug 22 13:00:10
2014 UTC
@@ -0,0 +1,164 @@
+# Copyright 2012 the V8 project authors. All rights reserved.
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials provided
+# with the distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+import hashlib
+import os
+import shutil
+import sys
+import tarfile
+import imp
+
+from testrunner.local import testsuite
+from testrunner.local import utils
+from testrunner.objects import testcase
+
+TEST_262_ARCHIVE_REVISION = "595a36b" # This is the 2014-Aug-10 revision.
+TEST_262_ARCHIVE_MD5 = "89dfc8458f474cdb7e8e178f3215dd06"
+TEST_262_URL = "https://github.com/tc39/test262/tarball/%s"
+TEST_262_HARNESS_FILES = ["sta.js"]
+
+TEST_262_SUITE_PATH = ["data", "test", "suite"]
+TEST_262_HARNESS_PATH = ["data", "test", "harness"]
+TEST_262_TOOLS_PATH = ["data", "tools", "packaging"]
+
+class Test262TestSuite(testsuite.TestSuite):
+
+ def __init__(self, name, root):
+ super(Test262TestSuite, 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.ParseTestRecord = None
+
+ def CommonTestName(self, testcase):
+ return testcase.path.split(os.path.sep)[-1]
+
+ def ListTests(self, context):
+ tests = []
+ for dirname, dirs, files in os.walk(self.testroot):
+ for dotted in [x for x in dirs if x.startswith(".")]:
+ dirs.remove(dotted)
+ if context.noi18n and "intl402" in dirs:
+ dirs.remove("intl402")
+ dirs.sort()
+ files.sort()
+ for filename in files:
+ if filename.endswith(".js"):
+ testname = os.path.join(dirname[len(self.testroot) + 1:],
+ filename[:-3])
+ case = testcase.TestCase(self, testname)
+ tests.append(case)
+ return tests
+
+ def GetFlagsForTestCase(self, testcase, context):
+ return (testcase.flags + context.mode_flags + self.harness +
+ self.GetIncludesForTest(testcase) +
+ [os.path.join(self.testroot, testcase.path + ".js")])
+
+ 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 "
+ "--download-data 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 GetIncludesForTest(self, testcase):
+ test_record = self.GetTestRecord(testcase)
+ if "includes" in test_record:
+ includes = [os.path.join(self.harnesspath, f)
+ for f in test_record["includes"]]
+ else:
+ includes = []
+ return includes
+
+ def GetSourceForTest(self, testcase):
+ filename = os.path.join(self.testroot, testcase.path + ".js")
+ with open(filename) as f:
+ return f.read()
+
+ def IsNegativeTest(self, testcase):
+ test_record = self.GetTestRecord(testcase)
+ return "negative" in test_record
+
+ def IsFailureOutput(self, output, testpath):
+ if output.exit_code != 0:
+ return True
+ return "FAILED!" in output.stdout
+
+ def DownloadData(self):
+ revision = TEST_262_ARCHIVE_REVISION
+ archive_url = TEST_262_URL % revision
+ archive_name = os.path.join(self.root, "tc39-test262-%s.tar.gz" %
revision)
+ directory_name = os.path.join(self.root, "data")
+ directory_old_name = os.path.join(self.root, "data.old")
+ if not os.path.exists(archive_name):
+ print "Downloading test data from %s ..." % archive_url
+ utils.URLRetrieve(archive_url, archive_name)
+ if os.path.exists(directory_name):
+ if os.path.exists(directory_old_name):
+ shutil.rmtree(directory_old_name)
+ os.rename(directory_name, directory_old_name)
+ if not os.path.exists(directory_name):
+ print "Extracting test262-%s.tar.gz ..." % revision
+ md5 = hashlib.md5()
+ with open(archive_name, "rb") as f:
+ for chunk in iter(lambda: f.read(8192), ""):
+ md5.update(chunk)
+ if md5.hexdigest() != TEST_262_ARCHIVE_MD5:
+ os.remove(archive_name)
+ raise Exception("Hash mismatch of test data file")
+ archive = tarfile.open(archive_name, "r:gz")
+ if sys.platform in ("win32", "cygwin"):
+ # Magic incantation to allow longer path names on Windows.
+ archive.extractall(u"\\\\?\\%s" % self.root)
+ else:
+ archive.extractall(self.root)
+ os.rename(os.path.join(self.root, "tc39-test262-%s" % revision),
+ directory_name)
+
+
+def GetSuite(name, root):
+ return Test262TestSuite(name, root)
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.