Skip to content

Commit 5a0c60a

Browse files
authored
Include nearest test name in uncaught errors, catch suite errors (microsoft#18694)
1 parent 17f10c0 commit 5a0c60a

File tree

3 files changed

+45
-13
lines changed

3 files changed

+45
-13
lines changed

src/harness/parallel/host.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ namespace Harness.Parallel.Host {
120120
child.on("message", (data: ParallelClientMessage) => {
121121
switch (data.type) {
122122
case "error": {
123-
console.error(`Test worker encounted unexpected error and was forced to close:
123+
console.error(`Test worker encounted unexpected error${data.payload.name ? ` during the execution of test ${data.payload.name}` : ""} and was forced to close:
124124
Message: ${data.payload.error}
125125
Stack: ${data.payload.stack}`);
126126
return process.exit(2);

src/harness/parallel/shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Harness.Parallel {
66
export type ParallelCloseMessage = { type: "close" } | never;
77
export type ParallelHostMessage = ParallelTestMessage | ParallelCloseMessage | ParallelBatchMessage;
88

9-
export type ParallelErrorMessage = { type: "error", payload: { error: string, stack: string } } | never;
9+
export type ParallelErrorMessage = { type: "error", payload: { error: string, stack: string, name?: string } } | never;
1010
export type ErrorInfo = ParallelErrorMessage["payload"] & { name: string };
1111
export type ParallelResultMessage = { type: "result", payload: { passing: number, errors: ErrorInfo[], duration: number, runner: TestRunnerKind, file: string } } | never;
1212
export type ParallelBatchProgressMessage = { type: "progress", payload: ParallelResultMessage["payload"] } | never;

src/harness/parallel/worker.ts

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,41 @@ namespace Harness.Parallel.Worker {
5353
const savedTestList = testList;
5454

5555
testList = [];
56-
callback.call(fakeContext);
57-
beforeFunc && beforeFunc();
58-
beforeFunc = undefined;
56+
try {
57+
callback.call(fakeContext);
58+
}
59+
catch (e) {
60+
errors.push({ error: `Error executing suite: ${e.message}`, stack: e.stack, name: namestack.join(" ") });
61+
return cleanup();
62+
}
63+
try {
64+
beforeFunc && beforeFunc();
65+
}
66+
catch (e) {
67+
errors.push({ error: `Error executing before function: ${e.message}`, stack: e.stack, name: namestack.join(" ") });
68+
return cleanup();
69+
}
70+
finally {
71+
beforeFunc = undefined;
72+
}
5973
testList.forEach(({ name, callback, kind }) => executeCallback(name, callback, kind));
60-
testList.length = 0;
61-
testList = savedTestList;
6274

63-
afterFunc && afterFunc();
64-
afterFunc = undefined;
65-
beforeEachFunc = savedBeforeEach;
66-
namestack.pop();
75+
try {
76+
afterFunc && afterFunc();
77+
}
78+
catch (e) {
79+
errors.push({ error: `Error executing after function: ${e.message}`, stack: e.stack, name: namestack.join(" ") });
80+
}
81+
finally {
82+
afterFunc = undefined;
83+
cleanup();
84+
}
85+
function cleanup() {
86+
testList.length = 0;
87+
testList = savedTestList;
88+
beforeEachFunc = savedBeforeEach;
89+
namestack.pop();
90+
}
6791
}
6892

6993
function executeCallback(name: string, callback: Function, kind: "suite" | "test") {
@@ -82,13 +106,15 @@ namespace Harness.Parallel.Worker {
82106
retries() { return this; },
83107
slow() { return this; },
84108
};
85-
name = [...namestack, name].join(" ");
109+
namestack.push(name);
110+
name = namestack.join(" ");
86111
if (beforeEachFunc) {
87112
try {
88113
beforeEachFunc();
89114
}
90115
catch (error) {
91116
errors.push({ error: error.message, stack: error.stack, name });
117+
namestack.pop();
92118
return;
93119
}
94120
}
@@ -101,6 +127,9 @@ namespace Harness.Parallel.Worker {
101127
errors.push({ error: error.message, stack: error.stack, name });
102128
return;
103129
}
130+
finally {
131+
namestack.pop();
132+
}
104133
passing++;
105134
}
106135
else {
@@ -124,6 +153,9 @@ namespace Harness.Parallel.Worker {
124153
errors.push({ error: error.message, stack: error.stack, name });
125154
return;
126155
}
156+
finally {
157+
namestack.pop();
158+
}
127159
if (!completed) {
128160
errors.push({ error: "Test completes asynchronously, which is unsupported by the parallel harness", stack: "", name });
129161
}
@@ -172,7 +204,7 @@ namespace Harness.Parallel.Worker {
172204
}
173205
});
174206
process.on("uncaughtException", error => {
175-
const message: ParallelErrorMessage = { type: "error", payload: { error: error.message, stack: error.stack } };
207+
const message: ParallelErrorMessage = { type: "error", payload: { error: error.message, stack: error.stack, name: namestack.join(" ") } };
176208
try {
177209
process.send(message);
178210
}

0 commit comments

Comments
 (0)