| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| const { Worker, isMainThread, parentPort } = require('worker_threads'); |
| |
| // Verify that cwd changes from the main thread are handled correctly in |
| // workers. |
| |
| // Do not use isMainThread directly, otherwise the test would time out in case |
| // it's started inside of another worker thread. |
| if (!process.env.HAS_STARTED_WORKER) { |
| process.env.HAS_STARTED_WORKER = '1'; |
| if (!isMainThread) { |
| common.skip('This test can only run as main thread'); |
| } |
| // Normalize the current working dir to also work with the root folder. |
| process.chdir(__dirname); |
| |
| assert(!process.cwd.toString().includes('Atomics.load')); |
| |
| // 1. Start the first worker. |
| const w = new Worker(__filename); |
| w.once('message', common.mustCall((message) => { |
| // 5. Change the cwd and send that to the spawned worker. |
| assert.strictEqual(message, process.cwd()); |
| process.chdir('..'); |
| w.postMessage(process.cwd()); |
| })); |
| } else if (!process.env.SECOND_WORKER) { |
| process.env.SECOND_WORKER = '1'; |
| |
| // 2. Save the current cwd and verify that `process.cwd` includes the |
| // Atomics.load call and spawn a new worker. |
| const cwd = process.cwd(); |
| assert(process.cwd.toString().includes('Atomics.load')); |
| |
| const w = new Worker(__filename); |
| w.once('message', common.mustCall((message) => { |
| // 4. Verify at the current cwd is identical to the received and the |
| // original one. |
| assert.strictEqual(process.cwd(), message); |
| assert.strictEqual(message, cwd); |
| parentPort.postMessage(cwd); |
| })); |
| |
| parentPort.once('message', common.mustCall((message) => { |
| // 6. Verify that the current cwd is identical to the received one but not |
| // with the original one. |
| assert.strictEqual(process.cwd(), message); |
| assert.notStrictEqual(message, cwd); |
| w.postMessage(message); |
| })); |
| } else { |
| // 3. Save the current cwd, post back to the "main" thread and verify that |
| // `process.cwd` includes the Atomics.load call. |
| const cwd = process.cwd(); |
| // Send the current cwd to the parent. |
| parentPort.postMessage(cwd); |
| assert(process.cwd.toString().includes('Atomics.load')); |
| |
| parentPort.once('message', common.mustCall((message) => { |
| // 7. Verify that the current cwd is identical to the received one but |
| // not with the original one. |
| assert.strictEqual(process.cwd(), message); |
| assert.notStrictEqual(message, cwd); |
| })); |
| } |