Skip to content

Commit

Permalink
Fix orphaned browser processes due to uncaught exceptions in the tests
Browse files Browse the repository at this point in the history
If uncaught exceptions occur in the tests (which happened in mozilla#17962 and
can be triggered manually by throwing an error in `integration-boot.js`)
the teardown logic of the tests doesn't get to run and thus spawned
browser processes are not closed properly. Given that `test.mjs` is the
only process that has a reference to them they will become orphaned and
keep running if `test.mjs` exits without explicitly closing them.

This commit fixes the issue by always closing the browsers if uncaught
exceptions occur, and we make sure to log them for debugging purposes.
  • Loading branch information
timvandermeij committed Jul 6, 2024
1 parent db91156 commit 3d31da5
Showing 1 changed file with 23 additions and 15 deletions.
38 changes: 23 additions & 15 deletions test/test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1078,25 +1078,33 @@ async function main() {
stats = [];
}

if (options.downloadOnly) {
await ensurePDFsDownloaded();
} else if (options.unitTest) {
// Allows linked PDF files in unit-tests as well.
await ensurePDFsDownloaded();
startUnitTest("/test/unit/unit_test.html", "unit");
} else if (options.fontTest) {
startUnitTest("/test/font/font_test.html", "font");
} else if (options.integration) {
// Allows linked PDF files in integration-tests as well.
await ensurePDFsDownloaded();
startIntegrationTest();
} else {
startRefTest(options.masterMode, options.reftest);
try {
if (options.downloadOnly) {
await ensurePDFsDownloaded();
} else if (options.unitTest) {
// Allows linked PDF files in unit-tests as well.
await ensurePDFsDownloaded();
await startUnitTest("/test/unit/unit_test.html", "unit");
} else if (options.fontTest) {
await startUnitTest("/test/font/font_test.html", "font");
} else if (options.integration) {
// Allows linked PDF files in integration-tests as well.
await ensurePDFsDownloaded();
await startIntegrationTest();
} else {
await startRefTest(options.masterMode, options.reftest);
}
} catch (e) {
// Close the browsers if uncaught exceptions occur, otherwise the spawned
// processes can become orphaned and keep running after `test.mjs` exits
// because the teardown logic of the tests did not get a chance to run.
console.error(e);
await Promise.all(sessions.map(session => closeSession(session.name)));
}
}

var server;
var sessions;
var sessions = [];
var onAllSessionsClosed;
var host = "127.0.0.1";
var options = parseOptions();
Expand Down

0 comments on commit 3d31da5

Please sign in to comment.