PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/test/sequential/test-inspector-port-cluster.js

https://github.com/isaacs/node
JavaScript | 353 lines | 270 code | 78 blank | 5 comment | 26 complexity | 07611851a846da5c57259093bf7669cb MD5 | raw file
  1. 'use strict';
  2. // Flags: --expose-internals
  3. const common = require('../common');
  4. common.skipIfInspectorDisabled();
  5. const assert = require('assert');
  6. const cluster = require('cluster');
  7. const debuggerPort = common.PORT;
  8. const childProcess = require('child_process');
  9. let offset = 0;
  10. // This test suite checks that inspector port in cluster is incremented
  11. // for different execArgv combinations
  12. function testRunnerMain() {
  13. let defaultPortCase = spawnPrimary({
  14. execArgv: ['--inspect'],
  15. workers: [{ expectedPort: 9230 }]
  16. });
  17. spawnPrimary({
  18. execArgv: ['--inspect=65534'],
  19. workers: [
  20. { expectedPort: 65535 },
  21. { expectedPort: 1024 },
  22. { expectedPort: 1025 },
  23. { expectedPort: 1026 }
  24. ]
  25. });
  26. let port = debuggerPort + offset++ * 5;
  27. spawnPrimary({
  28. execArgv: [`--inspect=${port}`],
  29. workers: [
  30. { expectedPort: port + 1 },
  31. { expectedPort: port + 2 },
  32. { expectedPort: port + 3 }
  33. ]
  34. });
  35. port = debuggerPort + offset++ * 5;
  36. spawnPrimary({
  37. execArgv: ['--inspect', `--inspect-port=${port}`],
  38. workers: [{ expectedPort: port + 1 }]
  39. });
  40. port = debuggerPort + offset++ * 5;
  41. spawnPrimary({
  42. execArgv: ['--inspect', `--debug-port=${port}`],
  43. workers: [{ expectedPort: port + 1 }]
  44. });
  45. port = debuggerPort + offset++ * 5;
  46. spawnPrimary({
  47. execArgv: [`--inspect=0.0.0.0:${port}`],
  48. workers: [{ expectedPort: port + 1, expectedHost: '0.0.0.0' }]
  49. });
  50. port = debuggerPort + offset++ * 5;
  51. spawnPrimary({
  52. execArgv: [`--inspect=127.0.0.1:${port}`],
  53. workers: [{ expectedPort: port + 1, expectedHost: '127.0.0.1' }]
  54. });
  55. if (common.hasIPv6) {
  56. port = debuggerPort + offset++ * 5;
  57. spawnPrimary({
  58. execArgv: [`--inspect=[::]:${port}`],
  59. workers: [{ expectedPort: port + 1, expectedHost: '::' }]
  60. });
  61. port = debuggerPort + offset++ * 5;
  62. spawnPrimary({
  63. execArgv: [`--inspect=[::1]:${port}`],
  64. workers: [{ expectedPort: port + 1, expectedHost: '::1' }]
  65. });
  66. }
  67. // These tests check that setting inspectPort in cluster.settings
  68. // would take effect and override port incrementing behavior
  69. port = debuggerPort + offset++ * 5;
  70. spawnPrimary({
  71. execArgv: [`--inspect=${port}`],
  72. clusterSettings: { inspectPort: port + 2 },
  73. workers: [{ expectedPort: port + 2 }]
  74. });
  75. port = debuggerPort + offset++ * 5;
  76. spawnPrimary({
  77. execArgv: [`--inspect=${port}`],
  78. clusterSettings: { inspectPort: 'addTwo' },
  79. workers: [
  80. { expectedPort: port + 2 },
  81. { expectedPort: port + 4 }
  82. ]
  83. });
  84. port = debuggerPort + offset++ * 5;
  85. spawnPrimary({
  86. execArgv: [`--inspect=${port}`],
  87. clusterSettings: { inspectPort: 'string' },
  88. workers: [{}]
  89. });
  90. port = debuggerPort + offset++ * 5;
  91. spawnPrimary({
  92. execArgv: [`--inspect=${port}`],
  93. clusterSettings: { inspectPort: 'null' },
  94. workers: [{}]
  95. });
  96. port = debuggerPort + offset++ * 5;
  97. spawnPrimary({
  98. execArgv: [`--inspect=${port}`],
  99. clusterSettings: { inspectPort: 'bignumber' },
  100. workers: [{}]
  101. });
  102. port = debuggerPort + offset++ * 5;
  103. spawnPrimary({
  104. execArgv: [`--inspect=${port}`],
  105. clusterSettings: { inspectPort: 'negativenumber' },
  106. workers: [{}]
  107. });
  108. port = debuggerPort + offset++ * 5;
  109. spawnPrimary({
  110. execArgv: [`--inspect=${port}`],
  111. clusterSettings: { inspectPort: 'bignumberfunc' },
  112. workers: [{}]
  113. });
  114. port = debuggerPort + offset++ * 5;
  115. spawnPrimary({
  116. execArgv: [`--inspect=${port}`],
  117. clusterSettings: { inspectPort: 'strfunc' },
  118. workers: [{}]
  119. });
  120. port = debuggerPort + offset++ * 5;
  121. spawnPrimary({
  122. execArgv: [],
  123. clusterSettings: { inspectPort: port, execArgv: ['--inspect'] },
  124. workers: [
  125. { expectedPort: port }
  126. ]
  127. });
  128. port = debuggerPort + offset++ * 5;
  129. spawnPrimary({
  130. execArgv: [`--inspect=${port}`],
  131. clusterSettings: { inspectPort: 0 },
  132. workers: [
  133. { expectedInitialPort: 0 },
  134. { expectedInitialPort: 0 },
  135. { expectedInitialPort: 0 }
  136. ]
  137. });
  138. port = debuggerPort + offset++ * 5;
  139. spawnPrimary({
  140. execArgv: [],
  141. clusterSettings: { inspectPort: 0 },
  142. workers: [
  143. { expectedInitialPort: 0 },
  144. { expectedInitialPort: 0 },
  145. { expectedInitialPort: 0 }
  146. ]
  147. });
  148. defaultPortCase.then(() => {
  149. port = debuggerPort + offset++ * 5;
  150. defaultPortCase = spawnPrimary({
  151. execArgv: ['--inspect'],
  152. clusterSettings: { inspectPort: port + 2 },
  153. workers: [
  154. { expectedInitialPort: port + 2 }
  155. ]
  156. });
  157. });
  158. }
  159. function primaryProcessMain() {
  160. const workers = JSON.parse(process.env.workers);
  161. const clusterSettings = JSON.parse(process.env.clusterSettings) || {};
  162. const badPortError = { name: 'RangeError', code: 'ERR_SOCKET_BAD_PORT' };
  163. let debugPort = process.debugPort;
  164. for (const worker of workers) {
  165. const params = {};
  166. if (worker.expectedPort) {
  167. params.expectedPort = worker.expectedPort;
  168. }
  169. if (worker.expectedInitialPort) {
  170. params.expectedInitialPort = worker.expectedInitialPort;
  171. }
  172. if (worker.expectedHost) {
  173. params.expectedHost = worker.expectedHost;
  174. }
  175. clusterSettings.execArgv = clusterSettings.execArgv ?
  176. clusterSettings.execArgv.concat(['--expose-internals']) :
  177. process.execArgv.concat(['--expose-internals']);
  178. if (clusterSettings.inspectPort === 'addTwo') {
  179. clusterSettings.inspectPort = common.mustCall(
  180. () => { return debugPort += 2; },
  181. workers.length
  182. );
  183. } else if (clusterSettings.inspectPort === 'string') {
  184. clusterSettings.inspectPort = 'string';
  185. cluster.setupPrimary(clusterSettings);
  186. assert.throws(() => {
  187. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  188. }, badPortError);
  189. return;
  190. } else if (clusterSettings.inspectPort === 'null') {
  191. clusterSettings.inspectPort = null;
  192. cluster.setupPrimary(clusterSettings);
  193. assert.throws(() => {
  194. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  195. }, badPortError);
  196. return;
  197. } else if (clusterSettings.inspectPort === 'bignumber') {
  198. clusterSettings.inspectPort = 1293812;
  199. cluster.setupPrimary(clusterSettings);
  200. assert.throws(() => {
  201. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  202. }, badPortError);
  203. return;
  204. } else if (clusterSettings.inspectPort === 'negativenumber') {
  205. clusterSettings.inspectPort = -9776;
  206. cluster.setupPrimary(clusterSettings);
  207. assert.throws(() => {
  208. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  209. }, badPortError);
  210. return;
  211. } else if (clusterSettings.inspectPort === 'bignumberfunc') {
  212. clusterSettings.inspectPort = common.mustCall(
  213. () => 123121,
  214. workers.length
  215. );
  216. cluster.setupPrimary(clusterSettings);
  217. assert.throws(() => {
  218. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  219. }, badPortError);
  220. return;
  221. } else if (clusterSettings.inspectPort === 'strfunc') {
  222. clusterSettings.inspectPort = common.mustCall(
  223. () => 'invalidPort',
  224. workers.length
  225. );
  226. cluster.setupPrimary(clusterSettings);
  227. assert.throws(() => {
  228. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  229. }, badPortError);
  230. return;
  231. }
  232. cluster.setupPrimary(clusterSettings);
  233. cluster.fork(params).on('exit', common.mustCall(checkExitCode));
  234. }
  235. }
  236. function workerProcessMain() {
  237. const { expectedPort, expectedInitialPort, expectedHost } = process.env;
  238. const debugOptions =
  239. require('internal/options').getOptionValue('--inspect-port');
  240. if ('expectedPort' in process.env) {
  241. assert.strictEqual(process.debugPort, +expectedPort);
  242. }
  243. if ('expectedInitialPort' in process.env) {
  244. assert.strictEqual(debugOptions.port, +expectedInitialPort);
  245. }
  246. if ('expectedHost' in process.env) {
  247. assert.strictEqual(debugOptions.host, expectedHost);
  248. }
  249. process.exit();
  250. }
  251. function spawnPrimary({ execArgv, workers, clusterSettings = {} }) {
  252. return new Promise((resolve) => {
  253. childProcess.fork(__filename, {
  254. env: { ...process.env,
  255. workers: JSON.stringify(workers),
  256. clusterSettings: JSON.stringify(clusterSettings),
  257. testProcess: true },
  258. execArgv: execArgv.concat(['--expose-internals'])
  259. }).on('exit', common.mustCall((code, signal) => {
  260. checkExitCode(code, signal);
  261. resolve();
  262. }));
  263. });
  264. }
  265. function checkExitCode(code, signal) {
  266. assert.strictEqual(code, 0);
  267. assert.strictEqual(signal, null);
  268. }
  269. if (!process.env.testProcess) {
  270. testRunnerMain();
  271. } else if (cluster.isPrimary) {
  272. primaryProcessMain();
  273. } else {
  274. workerProcessMain();
  275. }