-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
process-listener.js
116 lines (88 loc) · 2.66 KB
/
process-listener.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const {Logger} = require('../utils');
module.exports = class {
constructor(proc = process) {
this.__exitCode = 0;
this.testRunner = null;
this.process = proc;
this.finishCallback = null;
this.addExitListener();
this.process.once('uncaughtException', err => {
this.uncaught(err);
});
this.process.on('unhandledRejection', this.unhandled.bind(this));
}
addExitListener() {
// when used programmatically, nightwatch will keep adding exit listeners for each test suite
const listeners = this.process.listeners('exit');
const isAlreadyAdded = listeners.find(item => {
return item.name.includes('exitHandlerNightwatch');
});
if (!isAlreadyAdded) {
this.exitHandler = function exitHandlerNightwatch() {
return this.onExit();
}.bind(this);
this.process.on('exit', this.exitHandler);
}
}
setTestRunner(testRunner) {
this.testRunner = testRunner;
return this;
}
setExitCode(code) {
this.__exitCode = code;
return this;
}
get exitCode() {
return this.__exitCode;
}
onExit(code) {
if (code > 0) {
this.setExitCode(code);
}
this.exit();
}
unhandled(err) {
this.uncaught(err, {type: 'unhandledRejection'});
}
getCurrentPromise(err) {
if (this.testRunner) {
const {currentSuite} = this.testRunner;
if (currentSuite && (currentSuite.uncaughtError instanceof Error)) {
Logger.error('An additional uncaught error occurred while trying to handle the previous one – ' + err.stack);
return;
}
this.testRunner.registerUncaughtErr(err);
if (currentSuite) {
currentSuite.emptyQueue();
currentSuite.setUncaughtError(err);
}
if (this.testRunner.publishReport) {
this.testRunner.publishReport = false;
this.testRunner.reportResults().then(() => {}).catch(err => console.error(err));
}
}
}
uncaught(err, {type = 'uncaughtException'} = {}) {
Logger.warn(`${type}: ${err.message}\n${err.stack}`);
if (['TimeoutError', 'NoSuchElementError'].includes(err.name) && this.testRunner.type !== 'cucumber') {
this.closeProcess(err);
if (this.testRunner && this.testRunner.publishReport) {
this.testRunner.publishReport = false;
this.testRunner.reportResults().catch(() => {}).then(function() {});
}
return;
}
this.getCurrentPromise(err);
return this.closeProcess(err);
}
closeProcess(err) {
if (this.finishCallback) {
this.finishCallback(err);
}
this.setExitCode(1).exit();
}
exit() {
this.process.exit && this.process.exit(this.exitCode);
return this;
}
};