Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add option to use posix exit code upon fatal signal #4989

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8999b7b
Option to use posix exit code upon fatal signal
73rhodes May 23, 2023
3b99517
Update test/integration/options/posixExitCodes.spec.js
73rhodes Mar 15, 2024
2150c30
Address PR review comments mocha org
73rhodes Mar 18, 2024
0fb6ca3
Merge pull request #2 from zendesk/dderidder/X-mochajs-pr-review
73rhodes Mar 18, 2024
62528c5
Address PR review comments mocha org
73rhodes Mar 18, 2024
8a4f2bd
Merge pull request #3 from zendesk/dderidder/X-mochajs-pr-review
73rhodes Mar 18, 2024
817d890
Merge branch 'master' into master
73rhodes Mar 18, 2024
ad30057
Update docs/index.md
73rhodes Mar 25, 2024
592f071
Fix exit code when no signal caught
73rhodes Apr 11, 2024
34f2822
Coverage for posix exit code with normally failing tests
73rhodes Apr 11, 2024
3438da6
Merge pull request #4 from zendesk/dderidder/X-mochajs-pr-review-part2
73rhodes Apr 11, 2024
b6e6d30
Update docs/index.md
73rhodes Apr 15, 2024
d2991a1
Address PR comments; use os.constants
73rhodes Apr 15, 2024
7cf79d8
Merge pull request #5 from zendesk/dderidder/X-mochajs-pr-review-part3
73rhodes Apr 15, 2024
609f94f
Remove test that asserts the problematic behavior
73rhodes Apr 23, 2024
b71eaf3
Merge pull request #6 from zendesk/dderidder/X-mochajs-pr-review-part4
73rhodes Apr 23, 2024
26bebac
Merge branch 'mochajs:master' into master
73rhodes Apr 24, 2024
0aa939f
Omit win32 from signals test suite
73rhodes Apr 26, 2024
59e471d
Merge pull request #7 from zendesk/dderidder/X-win32-fixup
73rhodes Apr 26, 2024
6d237fc
Update docs/index.md
73rhodes May 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 10 additions & 3 deletions bin/mocha.js
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* @private
*/

const os = require('os');
const {loadOptions} = require('../lib/cli/options');
const {
unparseNodeFlags,
Expand Down Expand Up @@ -109,9 +110,15 @@ if (mochaArgs['node-option'] || Object.keys(nodeArgs).length || hasInspect) {
proc.on('exit', (code, signal) => {
process.on('exit', () => {
if (signal) {
process.kill(process.pid, signal);
const numericSignal =
typeof signal === 'string' ? os.constants.signals[signal] : signal;
if (mochaArgs['posix-exit-codes'] === true) {
process.exit(128 + numericSignal);
} else {
process.kill(process.pid, signal);
}
} else {
process.exit(code);
process.exit((mochaArgs['posix-exit-codes'] === true) ? 0 : code);
}
});
});
Expand All @@ -126,7 +133,7 @@ if (mochaArgs['node-option'] || Object.keys(nodeArgs).length || hasInspect) {
// be needed.
if (!args.parallel || args.jobs < 2) {
// win32 does not support SIGTERM, so use next best thing.
if (require('os').platform() === 'win32') {
if (os.platform() === 'win32') {
proc.kill('SIGKILL');
} else {
// using SIGKILL won't cleanly close the output streams, which can result
Expand Down
4 changes: 4 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -936,6 +936,10 @@ Define a global variable name. For example, suppose your app deliberately expose

By using this option in conjunction with `--check-leaks`, you can specify a whitelist of known global variables that you _expect_ to leak into global scope.

### `--posix-exit-codes`
73rhodes marked this conversation as resolved.
Show resolved Hide resolved

Exits with standard POSIX exit codes instead of the number of failed tests.
73rhodes marked this conversation as resolved.
Show resolved Hide resolved

### `--retries <n>`

Retries failed tests `n` times.
Expand Down
1 change: 1 addition & 0 deletions lib/cli/run-option-metadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ const TYPES = (exports.types = {
'list-reporters',
'no-colors',
'parallel',
'posix-exit-codes',
'recursive',
'sort',
'watch'
Expand Down
4 changes: 4 additions & 0 deletions lib/cli/run.js
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,10 @@ exports.builder = yargs =>
description: 'Run tests in parallel',
group: GROUPS.RULES
},
'posix-exit-codes': {
description: 'Use posix exit codes for fatal signals',
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
group: GROUPS.RULES
},
recursive: {
description: 'Look for tests in subdirectories',
group: GROUPS.FILES
Expand Down
7 changes: 7 additions & 0 deletions test/integration/fixtures/signals-sigabrt.fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict';

describe('signal suite', function () {
it('test SIGABRT', function () {
process.kill(process.pid, 'SIGABRT');
});
});
7 changes: 7 additions & 0 deletions test/integration/fixtures/signals-sigterm.fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict';

describe('signal suite', function () {
it('test SIGTERM', function () {
process.kill(process.pid, 'SIGTERM');
});
});
69 changes: 69 additions & 0 deletions test/integration/options/posixExitCodes.spec.js
JoshuaKGoldberg marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
'use strict';

var helpers = require('../helpers');
var runMocha = helpers.runMocha;

describe('--posix-exit-codes', function () {
describe('when enabled, and with node options', function () {
var args = ['--no-warnings', '--posix-exit-codes'];
73rhodes marked this conversation as resolved.
Show resolved Hide resolved

it('should exit with code 134 on SIGABRT', function (done) {
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
var fixture = 'signals-sigabrt.fixture.js';
runMocha(fixture, args, function postmortem(err, res) {
if (err) {
return done(err);
}
expect(res.code, 'to be', 134);
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
done();
});
});

it('should exit with code 143 on SIGTERM', function (done) {
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
var fixture = 'signals-sigterm.fixture.js';
runMocha(fixture, args, function postmortem(err, res) {
if (err) {
return done(err);
}
expect(res.code, 'to be', 143);
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
done();
});
});

it('should exit with code 0 even if there are test failures', function (done) {
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
var fixture = 'failing.fixture.js';
runMocha(fixture, args, function postmortem(err, res) {
if (err) {
return done(err);
}
expect(res.code, 'to be', 0);
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
done();
});
});
});

73rhodes marked this conversation as resolved.
Show resolved Hide resolved
describe('when not enabled, and with node options', function () {
it('should exit with code null on SIGABRT', function (done) {
var fixture = 'signals-sigabrt.fixture.js';
var args = ['--no-warnings'];
runMocha(fixture, args, function postmortem(err, res) {
if (err) {
return done(err);
}
expect(res.code, 'to be', null);
done();
});
});

it('should exit with the number of failed tests', function (done) {
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
var fixture = 'failing.fixture.js'; // one failing test
var args = ['--no-warnings'];
runMocha(fixture, args, function postmortem(err, res) {
if (err) {
return done(err);
}
expect(res.code, 'to be', 1);
73rhodes marked this conversation as resolved.
Show resolved Hide resolved
done();
});
});
});
});