1// Copyright Joyent, Inc. and other Node contributors. 2// 3// Permission is hereby granted, free of charge, to any person obtaining a 4// copy of this software and associated documentation files (the 5// "Software"), to deal in the Software without restriction, including 6// without limitation the rights to use, copy, modify, merge, publish, 7// distribute, sublicense, and/or sell copies of the Software, and to permit 8// persons to whom the Software is furnished to do so, subject to the 9// following conditions: 10// 11// The above copyright notice and this permission notice shall be included 12// in all copies or substantial portions of the Software. 13// 14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20// USE OR OTHER DEALINGS IN THE SOFTWARE. 21 22'use strict'; 23require('../common'); 24const assert = require('assert'); 25const cluster = require('cluster'); 26const debug = require('util').debuglog('test'); 27 28assert(cluster.isMaster); 29 30// The cluster.settings object is cloned even though the current implementation 31// makes that unnecessary. This is to make the test less fragile if the 32// implementation ever changes such that cluster.settings is mutated instead of 33// replaced. 34const cheapClone = (obj) => JSON.parse(JSON.stringify(obj)); 35 36const configs = []; 37 38// Capture changes 39cluster.on('setup', () => { 40 debug(`"setup" emitted ${JSON.stringify(cluster.settings)}`); 41 configs.push(cheapClone(cluster.settings)); 42}); 43 44const execs = [ 45 'node-next', 46 'node-next-2', 47 'node-next-3', 48]; 49 50process.on('exit', () => { 51 // Tests that "setup" is emitted for every call to setupMaster 52 assert.strictEqual(configs.length, execs.length); 53 54 assert.strictEqual(configs[0].exec, execs[0]); 55 assert.strictEqual(configs[1].exec, execs[1]); 56 assert.strictEqual(configs[2].exec, execs[2]); 57}); 58 59// Make changes to cluster settings 60execs.forEach((v, i) => { 61 setTimeout(() => { 62 cluster.setupMaster({ exec: v }); 63 }, i * 100); 64}); 65 66// Cluster emits 'setup' asynchronously, so we must stay alive long 67// enough for that to happen 68setTimeout(() => { 69 debug('cluster setup complete'); 70}, (execs.length + 1) * 100); 71