• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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