Skip to content

Commit cd0b01a

Browse files
filipesilvaalexeagle
authored andcommitted
feat(@angular-devkit/build-angular): stop karma gracefully
Followup to karma-runner/karma#3153
1 parent 8064ff6 commit cd0b01a

File tree

5 files changed

+16
-62
lines changed

5 files changed

+16
-62
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
"istanbul": "^0.4.5",
104104
"jasmine": "^2.6.0",
105105
"jasmine-spec-reporter": "^3.2.0",
106+
"karma": "~3.1.1",
106107
"karma-jasmine-html-reporter": "^0.2.2",
107108
"license-checker": "^20.1.0",
108109
"minimatch": "^3.0.4",

packages/angular_devkit/build_angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
"jquery": "^3.3.1",
7878
"jasmine-core": "~2.8.0",
7979
"jasmine-spec-reporter": "~4.2.1",
80-
"karma": "~3.0.0",
80+
"karma": "~3.1.1",
8181
"karma-chrome-launcher": "~2.2.0",
8282
"karma-coverage-istanbul-reporter": "~2.0.0",
8383
"karma-jasmine": "~1.1.0",

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,14 @@ export class KarmaBuilder implements Builder<KarmaBuilderSchema> {
108108

109109
// Complete the observable once the Karma server returns.
110110
const karmaServer = new karma.Server(karmaOptions, () => obs.complete());
111-
karmaServer.start();
111+
const karmaStartPromise = karmaServer.start();
112112

113113
// Cleanup, signal Karma to exit.
114114
return () => {
115-
// Karma does not seem to have a way to exit the server gracefully.
116-
// See https://github.com/karma-runner/karma/issues/2867#issuecomment-369912167
117-
// TODO: make a PR for karma to add `karmaServer.close(code)`, that
118-
// calls `disconnectBrowsers(code);`
119-
// karmaServer.close();
115+
// Karma only has the `stop` method start with 3.1.1, so we must defensively check.
116+
if (karmaServer.stop && typeof karmaServer.stop === 'function') {
117+
return karmaStartPromise.then(() => karmaServer.stop());
118+
}
120119
};
121120
})),
122121
);

packages/angular_devkit/build_angular/test/karma/rebuilds_spec_large.ts

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -10,64 +10,18 @@ import { runTargetSpec } from '@angular-devkit/architect/testing';
1010
import { debounceTime, take, tap } from 'rxjs/operators';
1111
import { host, karmaTargetSpec } from '../utils';
1212

13-
14-
// Karma watch mode is currently bugged:
15-
// - errors print a huge stack trace
16-
// - karma does not have a way to close the server
17-
// gracefully (https://github.com/karma-runner/karma/issues/3149)
18-
// TODO: fix these before 6.0 final.
19-
xdescribe('Karma Builder watch mode', () => {
13+
describe('Karma Builder watch mode', () => {
2014
beforeEach(done => host.initialize().toPromise().then(done, done.fail));
2115
afterEach(done => host.restore().toPromise().then(done, done.fail));
2216

23-
it('works', (done) => {
17+
it('works', async () => {
2418
const overrides = { watch: true };
25-
runTargetSpec(host, karmaTargetSpec, overrides).pipe(
19+
const res = await runTargetSpec(host, karmaTargetSpec, overrides).pipe(
2620
debounceTime(500),
2721
tap((buildEvent) => expect(buildEvent.success).toBe(true)),
2822
take(1),
29-
).toPromise().then(done, done.fail);
30-
}, 30000);
31-
32-
it('recovers from compilation failures in watch mode', (done) => {
33-
const overrides = { watch: true };
34-
let buildNumber = 0;
35-
36-
runTargetSpec(host, karmaTargetSpec, overrides).pipe(
37-
debounceTime(500),
38-
tap((buildEvent) => {
39-
buildNumber += 1;
40-
switch (buildNumber) {
41-
case 1:
42-
// Karma run should succeed.
43-
// Add a compilation error.
44-
expect(buildEvent.success).toBe(true);
45-
host.writeMultipleFiles({
46-
'src/app/app.component.spec.ts': '<p> definitely not typescript </p>',
47-
});
48-
break;
49-
50-
case 2:
51-
// Karma run should fail due to compilation error. Fix it.
52-
expect(buildEvent.success).toBe(false);
53-
host.writeMultipleFiles({ 'src/foo.spec.ts': '' });
54-
break;
55-
56-
case 3:
57-
// Karma run should succeed again.
58-
expect(buildEvent.success).toBe(true);
59-
break;
60-
61-
default:
62-
break;
63-
}
64-
}),
65-
take(3),
66-
).toPromise().then(done, done.fail);
67-
}, 30000);
23+
).toPromise();
6824

69-
it('does not rebuild when nothing changed', (done) => {
70-
// Start the server in watch mode, wait for the first build to finish, touch
71-
// test.js without changing it, wait 5s then exit unsuscribe, verify only one event was emitted.
25+
expect(res).toEqual({ success: true });
7226
}, 30000);
7327
});

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5542,10 +5542,10 @@ karma@alexeagle/karma#fa1a84ac881485b5657cb669e9b4e5da77b79f0a:
55425542
tmp "0.0.33"
55435543
useragent "^2.1.12"
55445544

5545-
karma@~3.0.0:
5546-
version "3.0.0"
5547-
resolved "https://registry.yarnpkg.com/karma/-/karma-3.0.0.tgz#6da83461a8a28d8224575c3b5b874e271b4730c3"
5548-
integrity sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ==
5545+
karma@~3.1.1:
5546+
version "3.1.1"
5547+
resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.1.tgz#94c8edd20fb9597ccde343326da009737fb0423a"
5548+
integrity sha512-NetT3wPCQMNB36uiL9LLyhrOt8SQwrEKt0xD3+KpTCfm0VxVyUJdPL5oTq2Ic5ouemgL/Iz4wqXEbF3zea9kQQ==
55495549
dependencies:
55505550
bluebird "^3.3.0"
55515551
body-parser "^1.16.1"

0 commit comments

Comments
 (0)