From 0a9cfeb01f33196d677f3a323736b0cc4e569c0f Mon Sep 17 00:00:00 2001 From: Aldwin Vlasblom Date: Sun, 8 Sep 2019 13:04:50 +0200 Subject: [PATCH 1/2] Refactor out the directory crawler from the test runner --- cli.mjs | 4 +++- crawler.mjs | 10 ++++++++++ example.mjs | 11 ++++++++++- package.json | 1 + runner.mjs | 39 +++++++++++++++------------------------ test/run.mjs | 4 +++- 6 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 crawler.mjs diff --git a/cli.mjs b/cli.mjs index 8b2a56b..60deceb 100644 --- a/cli.mjs +++ b/cli.mjs @@ -2,8 +2,10 @@ import run from './runner.mjs' import concise from './report-concise.mjs' import verbose from './report-verbose.mjs' +import crawl from './crawler.mjs' -run('./test/', process.env.CI ? verbose : concise) +crawl('./test/') + .then(files => run(files, process.env.CI ? verbose : concise)) .then(({ passed, failed }) => failed ? process.exit(1) : process.exit(0)) .catch(err => { process.stderr.write(err.toString()) diff --git a/crawler.mjs b/crawler.mjs new file mode 100644 index 0000000..574370b --- /dev/null +++ b/crawler.mjs @@ -0,0 +1,10 @@ +import fs from 'fs' +import util from 'util' +import path from 'path' + +const readdir = util.promisify(fs.readdir) + +export default function crawl (dir) { + return readdir(dir) + .then(files => files.map(file => path.resolve(dir, file))) +} diff --git a/example.mjs b/example.mjs index 6c61258..fd031be 100644 --- a/example.mjs +++ b/example.mjs @@ -1,5 +1,14 @@ import run from './runner.mjs' +import crawl from './crawler.mjs' import concise from './report-concise.mjs' import verbose from './report-verbose.mjs' -run('./test/fixtures/', concise).then(() => run('./test/fixtures/', verbose)) +const fixtures = crawl('./test/fixtures/') + +fixtures + .then(fixtures => { + return run(fixtures, concise) + }) + .then(fixtures => { + return run(fixtures, verbose) + }) diff --git a/package.json b/package.json index 3fbdaea..55ea443 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "files": [ "batch-promise.mjs", "cli.mjs", + "crawler.mjs", "oletus.mjs", "report-concise.mjs", "report-verbose.mjs", diff --git a/runner.mjs b/runner.mjs index 7961e1d..59a55e2 100644 --- a/runner.mjs +++ b/runner.mjs @@ -1,36 +1,27 @@ -import fs from 'fs' import childProcess from 'child_process' import perfHooks from 'perf_hooks' import os from 'os' import batchPromise from './batch-promise.mjs' -export default function run (testDirectory, report = () => {}) { +export default function run (files, report = () => {}) { const timestamp = perfHooks.performance.now() + let passed = 0 + let failed = 0 - return new Promise((resolve, reject) => { - fs.readdir(testDirectory, (err, files) => { - if (err) reject(err) + return batchPromise(files, os.cpus().length, file => { + return new Promise(resolve => { + const forked = childProcess.fork(file) - let passed = 0 - let failed = 0 - - batchPromise(files, os.cpus().length, file => { - return new Promise(resolve => { - const forked = childProcess.fork(`${testDirectory}${file}`) - - forked.on('message', ({ didPass, title, location, message }) => { - didPass ? passed++ : failed++ - report({ didPass, title, location, message, timestamp, file, passed, failed, isComplete: false }) - }) - - forked.on('close', () => resolve()) - }) + forked.on('message', ({ didPass, title, location, message }) => { + didPass ? passed++ : failed++ + report({ didPass, title, location, message, timestamp, file, passed, failed, isComplete: false }) }) - .then(() => { - report({ timestamp, passed, failed, isComplete: true }) - resolve({ passed, failed }) - }) - .catch(err => reject(err)) + + forked.on('close', () => resolve()) }) }) + .then(() => { + report({ timestamp, passed, failed, isComplete: true }) + return { passed, failed } + }) } diff --git a/test/run.mjs b/test/run.mjs index 784fafc..81a6e97 100644 --- a/test/run.mjs +++ b/test/run.mjs @@ -1,4 +1,5 @@ import run from '../runner.mjs' +import crawl from '../crawler.mjs' import assert from 'assert' function fail (e) { @@ -6,7 +7,8 @@ function fail (e) { process.exit(1) } -run('./test/fixtures/') +crawl('./test/fixtures/') + .then(run) .then(({ passed, failed }) => { assert.strict.equal(passed, 6) assert.strict.equal(failed, 4) From 2dff9367e4289e7f8a6e798522e4d6f402777ccb Mon Sep 17 00:00:00 2001 From: Aldwin Vlasblom Date: Sun, 8 Sep 2019 13:05:18 +0200 Subject: [PATCH 2/2] Add a feature to allow users to pass files on the CLI --- cli.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cli.mjs b/cli.mjs index 60deceb..a2ac250 100644 --- a/cli.mjs +++ b/cli.mjs @@ -4,7 +4,11 @@ import concise from './report-concise.mjs' import verbose from './report-verbose.mjs' import crawl from './crawler.mjs' -crawl('./test/') +const eventualFiles = process.argv.length > 2 + ? Promise.resolve(process.argv.slice(2)) + : crawl('./test/') + +eventualFiles .then(files => run(files, process.env.CI ? verbose : concise)) .then(({ passed, failed }) => failed ? process.exit(1) : process.exit(0)) .catch(err => {