current commit
261007.20 · lib: set exit code on failed node:bench run()
// Flags: --experimental-bench --no-warnings
'use strict';

const common = require('../common');
const { completeSample } = require('../common/bench');
const assert = require('assert');
const { setImmediate } = require('timers/promises');
const {
  after,
  afterEach,
  before,
  beforeEach,
  bench,
  run,
  suite,
} = require('node:bench');

suite('before failure', () => {
  before(() => { throw new Error('before failure'); });
  after(common.mustCall());
  bench('blocked by before', { samples: 1 }, common.mustNotCall());
});

suite('beforeEach failure', () => {
  beforeEach(() => { throw new Error('beforeEach failure'); });
  afterEach(common.mustCall());
  bench('blocked by beforeEach', { samples: 1 }, common.mustNotCall());
});

suite('after failure', () => {
  after(() => { throw new Error('after failure'); });
  bench('completes before after', { samples: 1 }, completeSample);
});

suite('build failure', async () => {
  await setImmediate();
  throw new Error('build failure');
});

bench('continues after suite failures', { samples: 1 }, completeSample);

const completions = [];
const diagnostics = [];
let summary;
const stream = run();
stream.on('bench:complete', (result) => completions.push(result));
stream.on('bench:diagnostic', (diagnostic) => {
  diagnostics.push(diagnostic);
});
stream.on('bench:summary', (value) => { summary = value; });
stream.on('end', common.mustCall(() => {
  assert.deepStrictEqual(summary.counts, {
    __proto__: null,
    completed: 2,
    failed: 2,
    skipped: 0,
    total: 4,
  });
  assert.strictEqual(summary.success, false);
  // The failed run sets the exit code; reset it so the test itself passes.
  assert.strictEqual(process.exitCode, 1);
  process.exitCode = 0;

  const byName = new Map(completions.map((result) => [result.name, result]));
  assert.strictEqual(byName.get('blocked by before').error.message,
                     'before failure');
  assert.strictEqual(byName.get('blocked by beforeEach').error.message,
                     'beforeEach failure');
  assert.strictEqual(byName.get('completes before after').error, undefined);
  assert.strictEqual(
    byName.get('continues after suite failures').error, undefined);

  assert.deepStrictEqual(
    diagnostics.map(({ message }) => message).sort(),
    ['after failure', 'before failure', 'build failure'],
  );
  for (const diagnostic of diagnostics) {
    assert.strictEqual(typeof diagnostic.file, 'string');
    assert.strictEqual(typeof diagnostic.line, 'number');
    assert.strictEqual(typeof diagnostic.column, 'number');
  }
}));
stream.resume();