From 0d14a7bd531c76e653ab4fc4e0a81cb25db05ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 16 Mar 2020 16:50:58 +0100 Subject: [PATCH] try to fix unit test runner on Windows (#4395) This PR attempts to fix intermittent errors occurring on Windows for "cli/tests/unit_test_runner.ts." Runner has been reworked to create only single TCP listener instead of one listener per worker. Additionally worker doesn't close TCP socket - it waits for parent process to close the socket and only then exits. --- cli/js/tests/test_util.ts | 4 --- cli/js/tests/unit_test_runner.ts | 62 ++++++++++++++------------------ 2 files changed, 26 insertions(+), 40 deletions(-) diff --git a/cli/js/tests/test_util.ts b/cli/js/tests/test_util.ts index 78147f28c3..9b16697447 100644 --- a/cli/js/tests/test_util.ts +++ b/cli/js/tests/test_util.ts @@ -272,10 +272,6 @@ export class SocketReporter implements Deno.TestReporter { async end(msg: Deno.TestEventEnd): Promise { await this.write(msg); } - - close(): void { - this.conn.close(); - } } unitTest(function permissionsMatches(): void { diff --git a/cli/js/tests/unit_test_runner.ts b/cli/js/tests/unit_test_runner.ts index f03f5ce697..0857772c79 100755 --- a/cli/js/tests/unit_test_runner.ts +++ b/cli/js/tests/unit_test_runner.ts @@ -71,8 +71,6 @@ async function workerRunnerMain( reporter: socketReporter, only: filter }); - // Notify parent process we're done - socketReporter.close(); } function spawnWorkerRunner( @@ -116,6 +114,8 @@ function spawnWorkerRunner( } async function runTestsForPermissionSet( + listener: Deno.Listener, + addrStr: string, verbose: boolean, reporter: Deno.ConsoleTestReporter, perms: Permissions, @@ -123,50 +123,35 @@ async function runTestsForPermissionSet( ): Promise { const permsFmt = fmtPerms(perms); console.log(`Running tests for: ${permsFmt}`); - const addr = { hostname: "127.0.0.1", port: 4510 }; - const addrStr = `${addr.hostname}:${addr.port}`; - const workerListener = Deno.listen(addr); - const workerProcess = spawnWorkerRunner(verbose, addrStr, perms, filter); - // Wait for worker subprocess to go online - const conn = await workerListener.accept(); + const conn = await listener.accept(); - let err; - let hasThrown = false; let expectedPassedTests; let endEvent; - try { - for await (const line of readLines(conn)) { - const msg = JSON.parse(line); + for await (const line of readLines(conn)) { + const msg = JSON.parse(line); - if (msg.kind === Deno.TestEvent.Start) { - expectedPassedTests = msg.tests; - await reporter.start(msg); - continue; - } else if (msg.kind === Deno.TestEvent.TestStart) { - await reporter.testStart(msg); - continue; - } else if (msg.kind === Deno.TestEvent.TestEnd) { - await reporter.testEnd(msg); - continue; - } else { - endEvent = msg; - await reporter.end(msg); - break; - } + if (msg.kind === Deno.TestEvent.Start) { + expectedPassedTests = msg.tests; + await reporter.start(msg); + continue; + } else if (msg.kind === Deno.TestEvent.TestStart) { + await reporter.testStart(msg); + continue; + } else if (msg.kind === Deno.TestEvent.TestEnd) { + await reporter.testEnd(msg); + continue; + } else { + endEvent = msg; + await reporter.end(msg); + break; } - } catch (e) { - hasThrown = true; - err = e; - } finally { - workerListener.close(); } - if (hasThrown) { - throw err; - } + // Close socket to worker, it should shutdown gracefully. + conn.close(); if (typeof expectedPassedTests === "undefined") { throw new Error("Worker runner didn't report start"); @@ -213,9 +198,14 @@ async function masterRunnerMain( const testResults = new Set(); const consoleReporter = new Deno.ConsoleTestReporter(); + const addr = { hostname: "127.0.0.1", port: 4510 }; + const addrStr = `${addr.hostname}:${addr.port}`; + const listener = Deno.listen(addr); for (const perms of permissionCombinations.values()) { const result = await runTestsForPermissionSet( + listener, + addrStr, verbose, consoleReporter, perms,