1'use strict'; 2const common = require('../common'); 3 4// This test checks that Worker has correct exit codes on parent side 5// in multiple situations. 6 7const assert = require('assert'); 8const worker = require('worker_threads'); 9const { Worker, parentPort } = worker; 10 11const testCases = require('../fixtures/process-exit-code-cases'); 12 13// Do not use isMainThread so that this test itself can be run inside a Worker. 14if (!process.env.HAS_STARTED_WORKER) { 15 process.env.HAS_STARTED_WORKER = 1; 16 parent(); 17} else { 18 if (!parentPort) { 19 console.error('Parent port must not be null'); 20 process.exit(100); 21 return; 22 } 23 parentPort.once('message', (msg) => testCases[msg].func()); 24} 25 26function parent() { 27 const test = (arg, name = 'worker', exit, error = null) => { 28 const w = new Worker(__filename); 29 w.on('exit', common.mustCall((code) => { 30 assert.strictEqual( 31 code, exit, 32 `wrong exit for ${arg}-${name}\nexpected:${exit} but got:${code}`); 33 console.log(`ok - ${arg} exited with ${exit}`); 34 })); 35 if (error) { 36 w.on('error', common.mustCall((err) => { 37 console.log(err); 38 assert(error.test(err), 39 `wrong error for ${arg}\nexpected:${error} but got:${err}`); 40 })); 41 } 42 w.postMessage(arg); 43 }; 44 45 testCases.forEach((tc, i) => test(i, tc.func.name, tc.result, tc.error)); 46} 47