From 6db7038c1bb07604348fbe804534561c0a6f7b7a Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 28 Dec 2018 09:34:18 +0100 Subject: [PATCH] feat(@angular-devkit/build-angular): add support for port 0 when using protractor Fixes #13129 --- .../build_angular/src/protractor/index.ts | 22 ++++++++++++------- .../test/protractor/works_spec_large.ts | 6 +++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/protractor/index.ts b/packages/angular_devkit/build_angular/src/protractor/index.ts index d00e92608e..a6effc5032 100644 --- a/packages/angular_devkit/build_angular/src/protractor/index.ts +++ b/packages/angular_devkit/build_angular/src/protractor/index.ts @@ -13,9 +13,10 @@ import { BuilderContext, BuilderDescription, } from '@angular-devkit/architect'; +import { DevServerResult } from '@angular-devkit/build-webpack'; import { Path, getSystemPath, normalize, resolve, tags } from '@angular-devkit/core'; import { Observable, from, of } from 'rxjs'; -import { concatMap, take, tap } from 'rxjs/operators'; +import { concatMap, map, take, tap } from 'rxjs/operators'; import * as url from 'url'; import { requireProjectModule } from '../angular-cli-files/utilities/require-project-module'; import { DevServerBuilderOptions } from '../dev-server'; @@ -70,9 +71,15 @@ export class ProtractorBuilder implements Builder { return architect.getBuilderDescription(builderConfig).pipe( tap(description => devServerDescription = description), - concatMap(devServerDescription => architect.validateBuilderOptions( - builderConfig, devServerDescription)), - concatMap(() => { + concatMap(devServerDescription => + architect.validateBuilderOptions(builderConfig, devServerDescription)), + map(() => this.context.architect.getBuilder(devServerDescription, this.context)), + concatMap(builder => builder.run(builderConfig)), + tap(buildEvent => { + if (!buildEvent.success) { + return; + } + // Compute baseUrl from devServerOptions. if (options.devServerTarget && builderConfig.options.publicHost) { let publicHost = builderConfig.options.publicHost; @@ -84,19 +91,18 @@ export class ProtractorBuilder implements Builder { const clientUrl = url.parse(publicHost); baseUrl = url.format(clientUrl); } else if (options.devServerTarget) { + const result: DevServerResult | undefined = buildEvent.result; + baseUrl = url.format({ protocol: builderConfig.options.ssl ? 'https' : 'http', hostname: options.host, - port: builderConfig.options.port.toString(), + port: result && result.port.toString(), }); } // Save the computed baseUrl back so that Protractor can use it. options.baseUrl = baseUrl; - - return of(this.context.architect.getBuilder(devServerDescription, this.context)); }), - concatMap(builder => builder.run(builderConfig)), ); } diff --git a/packages/angular_devkit/build_angular/test/protractor/works_spec_large.ts b/packages/angular_devkit/build_angular/test/protractor/works_spec_large.ts index 0970512d95..ecbb8f62ee 100644 --- a/packages/angular_devkit/build_angular/test/protractor/works_spec_large.ts +++ b/packages/angular_devkit/build_angular/test/protractor/works_spec_large.ts @@ -60,6 +60,12 @@ describe('Protractor Builder', () => { ).toPromise().then(done, done.fail); }, 60000); + it('works with port 0', (done) => { + runTargetSpec(host, protractorTargetSpec, { port: 0 }).pipe( + retry(3), + ).toPromise().then(done, done.fail); + }, 30000); + // TODO: test `element-explorer` when the protractor builder emits build events with text. // .then(() => execAndWaitForOutputToMatch('ng', ['e2e', '--element-explorer'], // /Element Explorer/))