Fix subtle concurrency bug

This commit is contained in:
Radon Rosborough 2020-07-30 16:01:23 -06:00
parent 97e2099226
commit 821be937ce
1 changed files with 13 additions and 12 deletions

View File

@ -137,7 +137,7 @@ class Test {
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
this.handleUpdate = () => { this.handleUpdate = () => {
if (this.timedOut) { if (this.timedOut) {
reject(`timeout while waiting for ${desc}`); reject(new Error(`timeout while waiting for ${desc}`));
} else { } else {
while (this.handledMessages < this.messages.length) { while (this.handledMessages < this.messages.length) {
const msg = this.messages[this.handledMessages]; const msg = this.messages[this.handledMessages];
@ -635,13 +635,15 @@ async function main() {
let passed = new Set(); let passed = new Set();
let failed = new Map(); let failed = new Map();
for (const { lang, type } of tests) { for (const { lang, type } of tests) {
let test: Test; queue.add(async () => {
queue const test = new Test(lang, type);
.add(() => { let err = null;
test = new Test(lang, type); try {
return test.run(); await test.run();
}) } catch (error) {
.then(async () => { err = error;
}
if (!err) {
passed.add({ lang, type }); passed.add({ lang, type });
console.error(`PASSED: ${lang}/${type}`); console.error(`PASSED: ${lang}/${type}`);
await writeLog( await writeLog(
@ -649,8 +651,7 @@ async function main() {
type, type,
`PASSED: ${lang}/${type}\n` + test.getLog({ pretty: true }) + "\n" `PASSED: ${lang}/${type}\n` + test.getLog({ pretty: true }) + "\n"
); );
}) } else {
.catch(async (err) => {
failed.set({ lang, type }, err); failed.set({ lang, type }, err);
console.error(`FAILED: ${lang}/${type}`); console.error(`FAILED: ${lang}/${type}`);
console.error(test.getLog()); console.error(test.getLog());
@ -663,8 +664,8 @@ async function main() {
"\n" + "\n" +
(err.stack ? err.stack + "\n" : err ? `${err}` : "") (err.stack ? err.stack + "\n" : err ? `${err}` : "")
); );
}) }
.catch(console.error); });
} }
await queue.onIdle(); await queue.onIdle();
console.error(); console.error();