// Flags: --experimental-bench --no-warnings 'use strict'; require('../common'); const assert = require('assert'); const { spawnSync } = require('child_process'); function runScript(script) { return spawnSync(process.execPath, [ '--no-warnings', '--experimental-bench', '-e', script, ]); } // A failing benchmark consumed through the module-level run() sets the exit // code. { const child = runScript(` const { bench, run } = require('node:bench'); bench('failure', () => { throw new Error('boom'); }); (async () => { for await (const record of run()); })(); `); assert.strictEqual(child.status, 1, child.stderr.toString()); } // A successful run through the module-level run() keeps the default exit code. { const child = runScript(` const { bench, run } = require('node:bench'); bench('success', { samples: 1 }, (b) => { b.record({ duration_ns: 1n, operations: 1 }); }); (async () => { for await (const record of run()); })(); `); assert.strictEqual(child.status, 0, child.stderr.toString()); } // An exit code set by the user is preserved when the explicit run fails. { const child = runScript(` const { bench, run } = require('node:bench'); process.exitCode = 3; bench('failure', () => { throw new Error('boom'); }); (async () => { for await (const record of run()); })(); `); assert.strictEqual(child.status, 3, child.stderr.toString()); } // An exit code set by the user is preserved when an automatic run fails. { const child = runScript(` process.exitCode = 3; require('node:bench').bench('failure', () => { throw new Error(); }); `); assert.strictEqual(child.status, 3, child.stderr.toString()); } // Runners created with createRunner() leave the exit code to the caller. { const child = runScript(` const runner = require('node:bench').createRunner(); runner.bench('failure', () => { throw new Error('boom'); }); (async () => { for await (const record of runner.run()); })(); `); assert.strictEqual(child.status, 0, child.stderr.toString()); }