This PR proposes changes to existing test262 tests to allow them to pass under Hardened JavaScript (see Secure ECMAScript proposal and Hardened JavaScript). Moddable uses Hardened JavaScript for JavaScript runtimes on resource constrained embedded devices, including those targeted by ECMA-419.
The changes fall into four groups:
1. Replace use of new Date() with new Date(1970). Scripts running inside a Compartment cannot retrieve the current time, so new Date() throws but new Date(1970) succeeds. Very few tests need the current time, but instead simply need a Date instance.
2. Use Object.defineProperty instead of setting existing built-in properties directly, such as toString and toValue. In Hardened JavaScript, prototypes of built-in objects are frozen. Consequently, setting properties of an instance that exist on the prototype throw (Hardened JavaScript is always in strict mode).
3. Eliminate use of Math.random(). Scripts running inside a Compartment cannot generate random numbers. One test identified so far uses Math.random() in a way that can easily be replaced with a counter.
4. Narrow the scope of exception tests. Consider the following
assert.throws(TypeError, () => {
var s1 = new Date();
s1.toString = Boolean.prototype.toString;
s1.toString();
});
This test passes, but only because new Date() fails by throwing a TypeError. If the invocation of the Date constructor is resolved by (1) above, then the assignment to toString fails as per (2) above. The script should be modified as below to ensure that assert.throws only tests the intended statement, s1.toString(). The modified script tests the intended functionality and passes under Hardened JavaScript
var s1 = new Date(1970);
Object.defineProperty(s1, "toString", {
value: Boolean.prototype.toString
});
assert.throws(TypeError, () => {
s1.toString();
});
This is an initial PR to begin the process of adapting test262 for use with Hardened JavaScript. Further changes are expected, with the vast majority likely to fall into the four groups described above.
Thank you to gibson042, kriskowal, and erights for their advice on this work.
This harness function is not necessary in the majority of cases in which
it is used. Remove its usage to simplify tests and decrease the amount
of domain-specific knowledge necessary to contribute to the test suite.
Persist the harness function itself for use by future tests for ES2015
modules (such a helper is necessary for tests that are interpreted as
module code).
- this change hits all files that use
dataPropertyAttributesAreCorrect or
acccessorPropertyAttributesAreCorrect
Major changes:
- remove include of runTestCase.js,
dataPropertyAttributesAreCorrect.js and
acccessorPropertyAttributesAreCorrect.js
- add include of propertyHelper.js
- remove function testCase() and call to
function runTestCase()
- instead of collecting test state into booleans,
which are eventually returned from runTestCase,
test conditions and throw errors immediately
- use negative: to check error types instead of
using `instanceof` in a catch() block
Selected commit logs follow:
manual conversion of accessorPropertyAttributesAreCorrect() test
- remove runTestCase
- remove wrapping testCase function
- unindent
- remove includes of runTestCase & accessor...
- add include of propertyHelper.js
- unpack final two args 'true, false' to explicit inline
tests of isEnumerable and isConfigurable
- unpack setter test into inline logic
- unpack getter test into inline logic
used script to replace includes: frontmatter
with propertyHelper.js ; manually added back
references to fnGlobalObject() where needed
additional helper functions
add helper functions for get and writable
duplicate runTestCase so can remove runTestCase.js from
includes of all tests in batch
use keyboard macros to simplify repetitive conversions
remove auto-save file accidentaly committed
minor changes, manually remove runTestCase from remaining files
lint etc. fixes
remove now-obsolete harness files
make strict/nonstrict variants
tests where behavior is different in strict/nonstrict
need two variants
- strict mode throws on assign to read-only element (no setter fn)
- strict mode separates named arguments from arguments[]
fix indentation
cleanup minor issues
reviewing 15.2.3.7-9 tests, found some minor issues
- indentation/spacing
- duplicate test (eg, direct test of value and dataProp...)
- remove needless try/finally
- use assert.. helpers in place of if(is..
- rename some assertions to 'e'
rename assertX to verifyX
new helper fn sameValue
test "set" as well as get
reverse order of checks
restore test of desc2
restore test of length
restore test of ownProperty
incorporate suggestions re order of ops, Object.prototype
add test of sameValue helper
restore return value in getter
restore second defineProperty call
restore check of explicit "false"
restore explicit test of TypeError
set noStrict flag on arguments changes
rename catch var to "e" b4ad0e6
remove dataPropertyAttributesAreCorrect from tests 0d83ff2
remove accessorPropertyAttributesAreCorrect from tests bb926f3
remove {data,accessor}Property... fns from harness
fix writable check on array.length
call $ERROR if expected exception not thrown
fix Epected => Expected typo
use assert._isSamevalue