qape
Version:
Monkey testing library
98 lines (83 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
/** @module master */
/**
* Initializes all QApe workers and handles their communication.
* @memberof master
* @param {cluster} cluster
* @param {Object} config
*/
var _default = (cluster, config) => {
let exitCode = 0;
let liveWorkers = 0;
let reporter;
let scriptwriter;
initReporter();
initScriptwriter();
for (let i = 0; i < config.parallelInstances; i++) {
liveWorkers++;
initTester();
}
function initReporter() {
reporter = cluster.fork({
worker_type: 'reporter'
}).on('exit', (code, signal) => {
console.error(`Reporter died! [code:${code}, signal: ${signal}]`);
initReporter();
});
}
function initScriptwriter() {
scriptwriter = cluster.fork({
worker_type: 'scriptwriter'
}).on('message', msg => {
if (msg.reciever === 'tester') {
cluster.workers[msg.workerId].send(msg.eventData);
}
}).on('exit', (code, signal) => {
console.error(`Scriptwriter died! [code: ${code}, signal: ${signal}]`);
initScriptwriter();
});
}
function initTester() {
let worker = cluster.fork();
let timeoutHandler = () => worker.kill('SIGKILL');
let timeout = setTimeout(timeoutHandler, config.testerTimeout);
worker.on('message', msg => {
clearTimeout(timeout);
timeout = setTimeout(timeoutHandler, config.testerTimeout);
let fullMsg = Object.assign({}, msg, {
workerId: worker.id
});
if (msg.reciever === 'reporter') {
reporter.send(fullMsg);
}
if (msg.reciever === 'scriptwriter') {
scriptwriter.send(fullMsg);
}
}).on('exit', (code, signal) => {
clearTimeout(timeout);
console.log(`Tester ${worker.id} exited. [code: ${code}, signal: ${signal}]`); // eslint-disable-line no-console
if (code > exitCode) {
exitCode = code;
}
if (signal === 'SIGKILL') {
initTester();
} else {
liveWorkers--;
if (liveWorkers <= 0) {
reporter.send({
eventName: 'process:exit',
eventData: {
exitCode
}
});
process.exit(exitCode);
}
}
});
}
};
exports.default = _default;