Skip to content

Commit 6db7038

Browse files
Alan Agiusalexeagle
authored andcommitted
feat(@angular-devkit/build-angular): add support for port 0 when using protractor
Fixes #13129
1 parent 881966b commit 6db7038

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

packages/angular_devkit/build_angular/src/protractor/index.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import {
1313
BuilderContext,
1414
BuilderDescription,
1515
} from '@angular-devkit/architect';
16+
import { DevServerResult } from '@angular-devkit/build-webpack';
1617
import { Path, getSystemPath, normalize, resolve, tags } from '@angular-devkit/core';
1718
import { Observable, from, of } from 'rxjs';
18-
import { concatMap, take, tap } from 'rxjs/operators';
19+
import { concatMap, map, take, tap } from 'rxjs/operators';
1920
import * as url from 'url';
2021
import { requireProjectModule } from '../angular-cli-files/utilities/require-project-module';
2122
import { DevServerBuilderOptions } from '../dev-server';
@@ -70,9 +71,15 @@ export class ProtractorBuilder implements Builder<ProtractorBuilderOptions> {
7071

7172
return architect.getBuilderDescription(builderConfig).pipe(
7273
tap(description => devServerDescription = description),
73-
concatMap(devServerDescription => architect.validateBuilderOptions(
74-
builderConfig, devServerDescription)),
75-
concatMap(() => {
74+
concatMap(devServerDescription =>
75+
architect.validateBuilderOptions(builderConfig, devServerDescription)),
76+
map(() => this.context.architect.getBuilder(devServerDescription, this.context)),
77+
concatMap(builder => builder.run(builderConfig)),
78+
tap(buildEvent => {
79+
if (!buildEvent.success) {
80+
return;
81+
}
82+
7683
// Compute baseUrl from devServerOptions.
7784
if (options.devServerTarget && builderConfig.options.publicHost) {
7885
let publicHost = builderConfig.options.publicHost;
@@ -84,19 +91,18 @@ export class ProtractorBuilder implements Builder<ProtractorBuilderOptions> {
8491
const clientUrl = url.parse(publicHost);
8592
baseUrl = url.format(clientUrl);
8693
} else if (options.devServerTarget) {
94+
const result: DevServerResult | undefined = buildEvent.result;
95+
8796
baseUrl = url.format({
8897
protocol: builderConfig.options.ssl ? 'https' : 'http',
8998
hostname: options.host,
90-
port: builderConfig.options.port.toString(),
99+
port: result && result.port.toString(),
91100
});
92101
}
93102

94103
// Save the computed baseUrl back so that Protractor can use it.
95104
options.baseUrl = baseUrl;
96-
97-
return of(this.context.architect.getBuilder(devServerDescription, this.context));
98105
}),
99-
concatMap(builder => builder.run(builderConfig)),
100106
);
101107
}
102108

packages/angular_devkit/build_angular/test/protractor/works_spec_large.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ describe('Protractor Builder', () => {
6060
).toPromise().then(done, done.fail);
6161
}, 60000);
6262

63+
it('works with port 0', (done) => {
64+
runTargetSpec(host, protractorTargetSpec, { port: 0 }).pipe(
65+
retry(3),
66+
).toPromise().then(done, done.fail);
67+
}, 30000);
68+
6369
// TODO: test `element-explorer` when the protractor builder emits build events with text.
6470
// .then(() => execAndWaitForOutputToMatch('ng', ['e2e', '--element-explorer'],
6571
// /Element Explorer/))

0 commit comments

Comments
 (0)