From 237715f9ce9d43bf32f7367e911684ffe417ec3f Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 1 Mar 2021 14:31:18 -0500 Subject: [PATCH] test(@angular-devkit/build-angular): improve reliability of app-shell server-worker test The test now waits until the express server is listening and uses a try/finally block to ensure the server is shutdown. The test server also only now binds to localhost and lets the OS choose a port. This provides better support for running multiple tests in parallel. --- .../src/app-shell/app-shell_spec.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/app-shell/app-shell_spec.ts b/packages/angular_devkit/build_angular/src/app-shell/app-shell_spec.ts index 9ac2d75d96..0028a0c253 100644 --- a/packages/angular_devkit/build_angular/src/app-shell/app-shell_spec.ts +++ b/packages/angular_devkit/build_angular/src/app-shell/app-shell_spec.ts @@ -9,6 +9,8 @@ import { Architect } from '@angular-devkit/architect'; import { getSystemPath, join, normalize, virtualFs } from '@angular-devkit/core'; import * as express from 'express'; // tslint:disable-line:no-implicit-dependencies +import * as http from 'http'; +import { AddressInfo } from 'net'; import { createArchitect, host } from '../test-utils'; describe('AppShell Builder', () => { @@ -251,19 +253,25 @@ describe('AppShell Builder', () => { // Serve the app using a simple static server. const app = express(); app.use('/', express.static(getSystemPath(join(host.root(), 'dist')) + '/')); - const server = app.listen(4200); + const server = await new Promise((resolve) => { + const innerServer = app.listen(0, 'localhost', () => resolve(innerServer)); + }); + try { + const serverPort = (server.address() as AddressInfo).port; + // Load app in protractor, then check service worker status. + const protractorRun = await architect.scheduleTarget( + { project: 'app-e2e', target: 'e2e' }, + { baseUrl: `http://localhost:${serverPort}/`, devServerTarget: '' }, + ); - // Load app in protractor, then check service worker status. - const protractorRun = await architect.scheduleTarget( - { project: 'app-e2e', target: 'e2e' }, - { devServerTarget: undefined } as {}, - ); - const protractorOutput = await protractorRun.result; - await protractorRun.stop(); - expect(protractorOutput.success).toBe(true); + const protractorOutput = await protractorRun.result; + await protractorRun.stop(); - // Close the express server. - server.close(); + expect(protractorOutput.success).toBe(true); + } finally { + // Close the express server. + await new Promise((resolve) => server.close(() => resolve())); + } }); it('critical CSS is inlined', async () => {