| 'use strict'; |
| |
| const { mustCall, mustNotCall, skip, isWindows, isIBMi } = require('../common'); |
| const { fail, ok } = require('assert'); |
| const { createServer } = require('net'); |
| const { isMainThread } = require('worker_threads'); |
| |
| if (!isMainThread) { |
| skip('process.execve is not available in Workers'); |
| } else if (isWindows || isIBMi) { |
| skip('process.execve is not available in Windows or IBM i'); |
| } |
| |
| if (process.argv[2] === 'replaced') { |
| const port = parseInt(process.env.PORT, 10); |
| ok(Number.isInteger(port)); |
| |
| const server = createServer(); |
| server.on('error', mustNotCall()); |
| server.listen(port, mustCall(() => { |
| server.close(); |
| })); |
| } else { |
| // Create a new socket server |
| const server = createServer(); |
| |
| server.on('close', mustNotCall()); |
| server.listen(0, mustCall(() => { |
| const port = server.address().port; |
| |
| // Try to create a second server on the same port. It should fail. |
| const server2 = createServer(); |
| |
| server2.on('error', mustCall(() => { |
| process.execve( |
| process.execPath, |
| [process.execPath, __filename, 'replaced'], |
| { ...process.env, PORT: port.toString() } |
| ); |
| |
| // If process.execve succeed, this should never be executed. |
| fail('process.execve failed'); |
| })); |
| |
| server2.listen(port, mustCall(() => { |
| fail('server2.listen unexpectedly succeeded'); |
| })); |
| })); |
| } |