From 873fe14fc81664d1824c463adb4ffb282a12e382 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Fri, 19 Aug 2022 21:38:55 -0700 Subject: [PATCH] Tests: improved fs test262 tests robustness with different environment. --- test/fs/methods.t.js | 12 +++--- test/fs/promises_01.t.js | 12 +++++- test/fs/promises_02.t.js | 75 +++++++++++++++++++-------------- test/fs/promises_03.t.js | 37 ++++++++-------- test/fs/promises_04.t.js | 58 ++++++++++++------------- test/fs/promises_05.t.js | 37 ++++++++-------- test/fs/promises_06.t.js | 69 +++++++++++++++--------------- test/fs/promises_07.t.js | 35 +++++++-------- test/fs/promises_08.t.js | 23 +++++----- test/fs/promises_09.t.js | 19 +++++---- test/harness/compatFs.js | 32 +++++++++++++- test/harness/compatPrint.js | 2 +- test/harness/compatWebcrypto.js | 2 +- 13 files changed, 231 insertions(+), 182 deletions(-) diff --git a/test/fs/methods.t.js b/test/fs/methods.t.js index bf57f1f6..54a8fb60 100644 --- a/test/fs/methods.t.js +++ b/test/fs/methods.t.js @@ -535,7 +535,7 @@ let stat_tests = () => [ let stat_tsuite = { name: "fs stat", - skip: () => (!has_fs() || !has_buffer()), + skip: () => (!has_fs() || !has_fs_symbolic_link() || !has_buffer()), T: stat_test, prepare_args: p, opts: { type: "callback", method: "stat" }, @@ -544,7 +544,7 @@ let stat_tsuite = { let statSync_tsuite = { name: "fs statSync", - skip: () => (!has_fs() || !has_buffer()), + skip: () => (!has_fs() || !has_fs_symbolic_link() || !has_buffer()), T: stat_test, prepare_args: p, opts: { type: "sync", method: "stat" }, @@ -553,7 +553,7 @@ let statSync_tsuite = { let statP_tsuite = { name: "fsp stat", - skip: () => (!has_fs() || !has_buffer()), + skip: () => (!has_fs() || !has_fs_symbolic_link() || !has_buffer()), T: stat_test, prepare_args: p, opts: { type: "promise", method: "stat" }, @@ -562,7 +562,7 @@ let statP_tsuite = { let lstat_tsuite = { name: "fs lstat", - skip: () => (!has_fs() || !has_buffer()), + skip: () => (!has_fs() || !has_fs_symbolic_link() || !has_buffer()), T: stat_test, prepare_args: p, opts: { type: "callback", method: "lstat" }, @@ -571,7 +571,7 @@ let lstat_tsuite = { let lstatSync_tsuite = { name: "fs lstatSync", - skip: () => (!has_fs() || !has_buffer()), + skip: () => (!has_fs() || !has_fs_symbolic_link() || !has_buffer()), T: stat_test, prepare_args: p, opts: { type: "sync", method: "lstat" }, @@ -580,7 +580,7 @@ let lstatSync_tsuite = { let lstatP_tsuite = { name: "fsp lstat", - skip: () => (!has_fs() || !has_buffer()), + skip: () => (!has_fs() || !has_fs_symbolic_link() || !has_buffer()), T: stat_test, prepare_args: p, opts: { type: "promise", method: "lstat" }, diff --git a/test/fs/promises_01.t.js b/test/fs/promises_01.t.js index bcea784e..69f0ce38 100644 --- a/test/fs/promises_01.t.js +++ b/test/fs/promises_01.t.js @@ -7,7 +7,7 @@ var fname = `${test_dir}/fs_promises_01`; let stages = []; -Promise.resolve() +let test = () => Promise.resolve() .then(() => { return fsp.writeFile(fname, fname); }) @@ -39,4 +39,12 @@ Promise.resolve() .then(() => { assert.compareArray(stages, ["init", "short circut", "chain", "errors ok"]); }) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs()) { + p = p + .then(test) + .then(() => assert.compareArray(stages, ["init", "short circut", "chain", "errors ok"])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_02.t.js b/test/fs/promises_02.t.js index cbe79991..604ac8ca 100644 --- a/test/fs/promises_02.t.js +++ b/test/fs/promises_02.t.js @@ -5,8 +5,9 @@ flags: [async] var fname = `${test_dir}/fs_promises_02`; -var testSync = new Promise((resolve, reject) => { - var failed = false; +let stages = []; + +var testSync = () => new Promise((resolve, reject) => { try { fs.writeFileSync(fname, fname); @@ -15,47 +16,52 @@ var testSync = new Promise((resolve, reject) => { try { fs.accessSync(fname + '___'); - failed = true; - } catch(e) { - failed = (e.syscall != 'access') || e.code != 'ENOENT'; + reject(new Error('fs.accessSync error 1')); + } catch (e) { + if (e.syscall != 'access' || e.code != 'ENOENT') { + reject(new Error('fs.accessSync error 2')); + } } - resolve(Boolean(failed)); + + stages.push('testSync'); + + resolve(); + } catch (e) { reject(e); } }); -var testCallback = new Promise((resolve, reject) => { - var failed = false; - +var testCallback = () => new Promise((resolve, reject) => { fs.writeFileSync(fname, fname); fs.access(fname, (err) => { - failed = (err !== undefined); + if (err) { + reject(new Error('fs.access error 1')); + } + fs.access(fname, fs.constants.R_OK | fs.constants.W_OK, (err) => { - failed |= (err !== undefined); + if (err) { + reject(err); + } + fs.access(fname + '___', (err) => { - failed |= ((err === undefined) || (err.syscall != 'access') - || err.code != 'ENOENT'); - resolve(Boolean(failed)); + if (!err + || err.syscall != 'access' + || err.code != 'ENOENT') + { + reject(new Error('fs.access error 2')); + } + + stages.push('testCallback'); + + resolve(); }); }); }); }); -let stages = []; - -Promise.resolve() -.then(() => testSync) -.then(failed => { - stages.push('testSync'); - assert.sameValue(failed, false, 'testSync'); -}) -.then(() => testCallback) -.then(failed => { - stages.push('testCallback'); - assert.sameValue(failed, false, 'testCallback'); -}) +let testFsp = () => Promise.resolve() .then(() => { fs.writeFileSync(fname, fname); @@ -72,7 +78,14 @@ Promise.resolve() assert.sameValue(e.path, fname + '___', 'testPromise'); assert.sameValue(e.code, 'ENOENT', 'testPromise'); }) -.then(() => { - assert.compareArray(stages, ["testSync", "testCallback", "testPromise"]); -}) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs()) { + p = p + .then(testSync) + .then(testCallback) + .then(testFsp) + .then(() => assert.compareArray(stages, ["testSync", "testCallback", "testPromise"])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_03.t.js b/test/fs/promises_03.t.js index 41cc7f67..491d9903 100644 --- a/test/fs/promises_03.t.js +++ b/test/fs/promises_03.t.js @@ -5,6 +5,8 @@ flags: [async] var fname = `${test_dir}/fs_promises_03`; +let stages = []; + var testSync = () => new Promise((resolve, reject) => { try { try { @@ -32,13 +34,14 @@ var testSync = () => new Promise((resolve, reject) => { void e; } + stages.push("unlinkSync"); + resolve(); } catch (e) { reject(e); } }); - var testCallback = () => new Promise((resolve, reject) => { fs.unlink(fname, () => { fs.unlink(fname, (err) => { @@ -64,31 +67,21 @@ var testCallback = () => new Promise((resolve, reject) => { } catch (e) { void e; } + + stages.push("unlink"); + resolve(); }); }); }); }); -let stages = []; - -Promise.resolve() -.then(testSync) -.then(() => { - stages.push("unlinkSync"); -}) - -.then(testCallback) -.then(() => { - stages.push("unlink"); -}) - +let testFsp = () => Promise.resolve() .then(() => fsp.unlink(fname) .catch(() => {})) .then(() => fsp.unlink(fname)) .then(() => { throw new Error('fsp.unlink error 1'); }) .catch((e) => { if (e.syscall != 'unlink') { throw e; } }) - .then(() => { fs.writeFileSync(fname, fname); return fsp.unlink(fname); @@ -96,9 +89,17 @@ Promise.resolve() .then(() => fsp.access(fname)) .then(() => { throw new Error('fsp.unlink error 2'); }) .catch((e) => { if (e.syscall != 'access') { throw e; } }) - .then(() => { stages.push("fsp.unlink"); }) -.then(() => assert.compareArray(stages, ['unlinkSync', 'unlink', 'fsp.unlink'])) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs()) { + p = p + .then(testSync) + .then(testCallback) + .then(testFsp) + .then(() => assert.compareArray(stages, ['unlinkSync', 'unlink', 'fsp.unlink'])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_04.t.js b/test/fs/promises_04.t.js index ce358a45..763e0954 100644 --- a/test/fs/promises_04.t.js +++ b/test/fs/promises_04.t.js @@ -7,25 +7,21 @@ var fname = `${test_dir}/fs_promises_04`; var fname_utf8 = `${test_dir}/fs_promises_αβγ_04`; var lname = `${test_dir}/fs_promises_lnk_04`; +let stages = []; + var testSync = () => new Promise((resolve, reject) => { try { - try { - fs.unlinkSync(fname); - } catch (e) { - void e; - } - try { - fs.unlinkSync(lname); - } catch (e) { - void e; - } + try { fs.unlinkSync(fname); } catch (e) {} + try { fs.unlinkSync(lname); } catch (e) {} try { fs.realpathSync(fname); + throw new Error('fs.realpathSync error 1'); + } catch (e) { - if (e.syscall != 'realpath' || e.code != 'ENOENT') { - throw e; + if (e.code != 'ENOENT') { + throw new Error('fs.realpathSync error 2'); } } @@ -46,7 +42,7 @@ var testSync = () => new Promise((resolve, reject) => { var rname_utf8 = fs.realpathSync(fname_utf8); if (rname_utf8.slice(-6,-3) != 'αβγ') { - throw new Error('fs.realpathSync error 2'); + throw new Error('fs.realpathSync error 3'); } fs.unlinkSync(lname); @@ -54,6 +50,8 @@ var testSync = () => new Promise((resolve, reject) => { fs.unlinkSync(fname); fs.unlinkSync(fname_utf8); + stages.push("symlinkSync"); + resolve(); } catch (e) { @@ -80,7 +78,8 @@ var testCallback = () => new Promise((resolve, reject) => { reject(new Error('fs.realpath error 1')); return; } - if (err.syscall != 'realpath' || err.code != 'ENOENT') { + + if (err.code != 'ENOENT') { reject(err); return; } @@ -130,6 +129,8 @@ var testCallback = () => new Promise((resolve, reject) => { return; } + stages.push("symlink"); + resolve(); }); }); @@ -141,19 +142,7 @@ var testCallback = () => new Promise((resolve, reject) => { } }); -let stages = []; - -Promise.resolve() -.then(testSync) -.then(() => { - stages.push("symlinkSync"); -}) - -.then(testCallback) -.then(() => { - stages.push("symlink"); -}) - +let testFsp = () => Promise.resolve() .then(() => fsp.unlink(fname) .catch(() => {})) .then(() => fsp.unlink(lname) @@ -186,10 +175,17 @@ Promise.resolve() fs.unlinkSync(lname); fs.accessSync(fname); fs.unlinkSync(fname); -}) -.then(() => { stages.push("fsp.symlink"); }) -.then(() => assert.compareArray(stages, ['symlinkSync', 'symlink', 'fsp.symlink'])) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs() && has_fs_symbolic_link()) { + p = p + .then(testSync) + .then(testCallback) + .then(testFsp) + .then(() => assert.compareArray(stages, ['symlinkSync', 'symlink', 'fsp.symlink'])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_05.t.js b/test/fs/promises_05.t.js index bfc36059..5d08fd03 100644 --- a/test/fs/promises_05.t.js +++ b/test/fs/promises_05.t.js @@ -7,6 +7,8 @@ var dname = `${test_dir}/fs_promises_05`; var dname_utf8 = `${test_dir}/fs_promises_αβγ_05`; var fname = (d) => d + '/fs_promises_05_file'; +let stages = []; + var testSync = () => new Promise((resolve, reject) => { try { try { fs.unlinkSync(fname(dname)); } catch (e) {} @@ -47,6 +49,8 @@ var testSync = () => new Promise((resolve, reject) => { try { fs.writeFileSync(fname(dname_utf8), fname(dname_utf8)); + throw new Error('fs.mkdirSync error 1'); + } catch (e) { if (e.syscall != 'open' || e.code != 'EACCES') { throw e; @@ -64,6 +68,8 @@ var testSync = () => new Promise((resolve, reject) => { fs.rmdirSync(dname_utf8); + stages.push("mkdirSync"); + resolve(); } catch (e) { @@ -94,6 +100,8 @@ var testCallback = () => new Promise((resolve, reject) => { reject(err); } + stages.push("mkdir"); + resolve(); }); }); @@ -104,21 +112,7 @@ var testCallback = () => new Promise((resolve, reject) => { } }); - -let stages = []; - -Promise.resolve() -.then(testSync) -.then(() => { - stages.push("mkdirSync"); -}) - - -.then(testCallback) -.then(() => { - stages.push("mkdir"); -}) - +let testFsp = () => Promise.resolve() .then(() => { try { fs.unlinkSync(fname(dname)); } catch (e) {} try { fs.unlinkSync(fname(dname_utf8)); } catch (e) {} @@ -136,5 +130,14 @@ Promise.resolve() .then(() => { stages.push("fsp.mkdir"); }) -.then(() => assert.compareArray(stages, ['mkdirSync', 'mkdir', 'fsp.mkdir'])) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs()) { + p = p + .then(testSync) + .then(testCallback) + .then(testFsp) + .then(() => assert.compareArray(stages, ['mkdirSync', 'mkdir', 'fsp.mkdir'])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_06.t.js b/test/fs/promises_06.t.js index ed896f98..91fdba01 100644 --- a/test/fs/promises_06.t.js +++ b/test/fs/promises_06.t.js @@ -7,7 +7,9 @@ var dname = `${test_dir}/`; var fname = (d) => d + '/fs_promises_06_file'; var fname_utf8 = (d) => d + '/fs_promises_αβγ_06'; -var testSync = new Promise((resolve, reject) => { +let stages = []; + +var testSync = () => new Promise((resolve, reject) => { try { try { fs.unlinkSync(fname(dname)); } catch (e) {} try { fs.unlinkSync(fname_utf8(dname)); } catch (e) {} @@ -25,10 +27,12 @@ var testSync = new Promise((resolve, reject) => { if (e.syscall != 'rename' || (e.code != 'ENOTDIR' && e.code != 'EISDIR')) { - throw e; + reject(new Error('fs.unlinkSync error 1')); } } + stages.push("renameSync"); + resolve(); } catch (e) { @@ -36,7 +40,7 @@ var testSync = new Promise((resolve, reject) => { } }); -var testCallback = new Promise((resolve, reject) => { +var testCallback = () => new Promise((resolve, reject) => { try { try { fs.unlinkSync(fname(dname)); } catch (e) {} try { fs.unlinkSync(fname_utf8(dname)); } catch (e) {} @@ -45,46 +49,30 @@ var testCallback = new Promise((resolve, reject) => { fs.rename(fname(dname), fname_utf8(dname), err => { if (err) { - throw err; + reject(new Error('fs.unlink error 1')); } - }); - fs.accessSync(fname_utf8(dname)); + fs.accessSync(fname_utf8(dname)); - fs.rename(fname_utf8(dname), dname, err => { - if (err.syscall != 'rename' - || (err.code != 'ENOTDIR' && err.code != 'EISDIR')) - { - throw err; - } - }); + fs.rename(fname_utf8(dname), dname, err => { + if (err.syscall != 'rename' + || (err.code != 'ENOTDIR' && err.code != 'EISDIR')) + { + reject(new Error('fs.unlink error 2')); + } + }); - resolve(); + stages.push("rename"); + + resolve(); + }); } catch (e) { reject(e); } }); -let stages = []; - -Promise.resolve() -.then(() => testSync) -.then(() => { - stages.push("renameSync"); -}) -.catch((e) => { - console.log('test fs.renameSync failed', JSON.stringify(e)); -}) - -.then(testCallback) -.then(() => { - stages.push("rename"); -}) -.catch((e) => { - console.log('test fs.rename failed', JSON.stringify(e)); -}) - +let testFsp = () => Promise.resolve() .then(() => { try { fs.unlinkSync(fname(dname)); } catch (e) {} try { fs.unlinkSync(fname_utf8(dname)); } catch (e) {} @@ -98,11 +86,20 @@ Promise.resolve() if (e.syscall != 'rename' || (e.code != 'ENOTDIR' && e.code != 'EISDIR')) { - throw e; + throw new Error('fsp.rename error 1'); } }) .then(() => { stages.push("fsp.rename"); }) -.then(() => assert.compareArray(stages, ["renameSync", "rename", "fsp.rename"])) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs()) { + p = p + .then(testSync) + .then(testCallback) + .then(testFsp) + .then(() => assert.compareArray(stages, ["renameSync", "rename", "fsp.rename"])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_07.t.js b/test/fs/promises_07.t.js index c0d0dd99..0b525fdc 100644 --- a/test/fs/promises_07.t.js +++ b/test/fs/promises_07.t.js @@ -15,7 +15,7 @@ var match = (entry) => { var idx = dir_test.indexOf(entry.name); try { - switch(idx) { + switch (idx) { case 0: return entry.isDirectory(); case 1: @@ -34,6 +34,7 @@ var match = (entry) => { } }; +let stages = []; var testSync = () => new Promise((resolve, reject) => { try { @@ -109,6 +110,8 @@ var testSync = () => new Promise((resolve, reject) => { throw new Error('fs.readdirSync - error 8'); } + stages.push("readdirSync"); + resolve(); } catch (e) { @@ -167,6 +170,8 @@ var testCallback = () => new Promise((resolve, reject) => { reject(new Error('fs.readdir - error 5')); } + stages.push("readdir"); + resolve(); }); }); @@ -177,20 +182,7 @@ var testCallback = () => new Promise((resolve, reject) => { } }); - -let stages = []; - -Promise.resolve() -.then(testSync) -.then(() => { - stages.push("readdirSync"); -}) - -.then(testCallback) -.then(() => { - stages.push("readdir"); -}) - +let testFsp = () => Promise.resolve() .then(() => { try { fs.rmdirSync(cname(dname)); } catch (e) {} try { fs.unlinkSync(lname(dname)); } catch (e) {} @@ -235,5 +227,14 @@ Promise.resolve() .then(() => { stages.push("fsp.readdir"); }) -.then(() => assert.compareArray(stages, ["readdirSync", "readdir", "fsp.readdir"])) -.then($DONE, $DONE); + +let p = Promise.resolve() +if (has_fs() && has_fs_symbolic_link()) { + p = p + .then(testSync) + .then(testCallback) + .then(testFsp) + .then(() => assert.compareArray(stages, ['readdirSync', 'readdir', 'fsp.readdir'])) +} + +p.then($DONE, $DONE); diff --git a/test/fs/promises_08.t.js b/test/fs/promises_08.t.js index 7aba5b22..cffa7c20 100644 --- a/test/fs/promises_08.t.js +++ b/test/fs/promises_08.t.js @@ -24,6 +24,8 @@ var wipePath = (root, path, nofail) => { }); }; +let stages = []; + var testSync = () => new Promise((resolve, reject) => { try { wipePath(dname, path + '/' + path, true); @@ -66,21 +68,20 @@ var testSync = () => new Promise((resolve, reject) => { wipePath(dname, path); fs.rmdirSync(dname); + + stages.push("mkdirSync") + resolve(); } catch (e) { reject(e); } }); -let stages = []; +let p = Promise.resolve() +if (has_fs()) { + p = p + .then(testSync) + .then(() => assert.compareArray(stages, ["mkdirSync"])) +} -Promise.resolve() -.then(testSync) -.then(() => { - stages.push("mkdirSync"); -}) -.catch((e) => { - $DONOTEVALUATE(); -}) -.then(() => assert.compareArray(stages, ["mkdirSync"])) -.then($DONE, $DONE); +p.then($DONE, $DONE); diff --git a/test/fs/promises_09.t.js b/test/fs/promises_09.t.js index 6ae86477..91789eed 100644 --- a/test/fs/promises_09.t.js +++ b/test/fs/promises_09.t.js @@ -23,6 +23,7 @@ var setContent = (root, path) => { var isNode = () => process.argv[0].includes('node'); +let stages = []; var testSync = () => new Promise((resolve, reject) => { try { @@ -90,6 +91,8 @@ var testSync = () => new Promise((resolve, reject) => { } } + stages.push("rmdirSync"); + resolve(); } catch (e) { @@ -97,13 +100,11 @@ var testSync = () => new Promise((resolve, reject) => { } }); +let p = Promise.resolve() +if (has_fs() && has_fs_symbolic_link()) { + p = p + .then(testSync) + .then(() => assert.compareArray(stages, ['rmdirSync'])) +} -let stages = []; - -Promise.resolve() -.then(testSync) -.then(() => { - stages.push("rmdirSync"); -}) -.then(() => assert.compareArray(stages, ["rmdirSync"])) -.then($DONE, $DONE); +p.then($DONE, $DONE); diff --git a/test/harness/compatFs.js b/test/harness/compatFs.js index 9bb8c491..dd96a592 100644 --- a/test/harness/compatFs.js +++ b/test/harness/compatFs.js @@ -6,9 +6,37 @@ if (typeof require == 'function') { fsp = fs.promises; } -function has_fs() { - return fs; +if (typeof process == 'undefined') { + globalThis.process = {}; } let test_dir = process.env && process.env['NJS_TEST_DIR'] || 'build'; test_dir = `${test_dir}/test`; + +function has_fs() { + return fs; +} + +function has_fs_symbolic_link() { + if (!fs) { + return false; + } + + let fname = test_dir + '/a'; + let lname = test_dir + '/b'; + + try { fs.unlinkSync(fname); fs.unlinkSync(lname); } catch (e) {} + + fs.writeFileSync(fname, fname); + + fname = fs.realpathSync(fname); + + try { + fs.symlinkSync(fname, lname); + } catch (e) { + return false; + } + + return true; +} + diff --git a/test/harness/compatPrint.js b/test/harness/compatPrint.js index db33030e..67a62d86 100644 --- a/test/harness/compatPrint.js +++ b/test/harness/compatPrint.js @@ -1,3 +1,3 @@ if (typeof print !== 'function') { - print = console.log; + globalThis.print = console.log; } diff --git a/test/harness/compatWebcrypto.js b/test/harness/compatWebcrypto.js index be757e17..aca3ada5 100644 --- a/test/harness/compatWebcrypto.js +++ b/test/harness/compatWebcrypto.js @@ -1,5 +1,5 @@ if (typeof crypto == 'undefined' && typeof require == 'function') { - crypto = require('crypto').webcrypto; + globalThis.crypto = require('crypto').webcrypto; } function has_webcrypto() { -- 2.47.3