Skip to content

Commit 8146fc2

Browse files
alan-agius4mmalerba
authored andcommitted
test: fix vscode language service e2e tests (angular#64197)
Fix the e2e test suite for the vscode language service extension and run it in CI. PR Close angular#64197
1 parent 5e61e8d commit 8146fc2

File tree

15 files changed

+177
-183
lines changed

15 files changed

+177
-183
lines changed

pnpm-lock.yaml

Lines changed: 80 additions & 116 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vscode-ng-language-service/integration/BUILD.bazel

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,22 @@
11
load("@aspect_rules_ts//ts:defs.bzl", "ts_config", "ts_project")
22

3-
ts_config(
4-
name = "tsconfig",
5-
src = "tsconfig.json",
6-
visibility = ["//vscode-ng-language-service/integration:__subpackages__"],
7-
deps = [
8-
"//vscode-ng-language-service:tsconfig",
9-
"//vscode-ng-language-service/server:tsconfig",
10-
],
11-
)
12-
133
ts_config(
144
name = "tsconfig-test",
155
src = "tsconfig-test.json",
166
visibility = ["//vscode-ng-language-service/integration:__subpackages__"],
177
deps = [
18-
":tsconfig",
198
"//vscode-ng-language-service:tsconfig",
20-
"//vscode-ng-language-service/server:tsconfig",
219
],
2210
)
2311

2412
ts_project(
2513
name = "integration",
26-
srcs = glob([
27-
"*.ts",
28-
]),
14+
srcs = [
15+
"test_constants.ts",
16+
],
2917
declaration = True,
3018
source_map = True,
31-
tsconfig = ":tsconfig",
19+
tsconfig = "//vscode-ng-language-service:tsconfig",
3220
visibility = ["//vscode-ng-language-service/integration:__subpackages__"],
3321
deps = [
3422
"//vscode-ng-language-service:node_modules/@types/node",

vscode-ng-language-service/integration/e2e/BUILD.bazel

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@ load("@aspect_rules_ts//ts:defs.bzl", "ts_project")
33

44
ts_project(
55
name = "e2e",
6+
testonly = True,
67
srcs = glob(["*.ts"]),
78
declaration = True,
89
source_map = True,
9-
tsconfig = "//vscode-ng-language-service/integration:tsconfig",
10+
tsconfig = "//vscode-ng-language-service:tsconfig",
1011
visibility = [
1112
"//vscode-ng-language-service/integration:__subpackages__",
1213
],
1314
deps = [
1415
"//vscode-ng-language-service:node_modules/@types/jasmine",
16+
"//vscode-ng-language-service:node_modules/@types/jasmine-reporters",
1517
"//vscode-ng-language-service:node_modules/@types/node",
1618
"//vscode-ng-language-service:node_modules/@types/vscode",
17-
"//vscode-ng-language-service:node_modules/vscode-test",
19+
"//vscode-ng-language-service:node_modules/@vscode/test-electron",
1820
"//vscode-ng-language-service/integration",
1921
],
2022
)
@@ -23,21 +25,26 @@ js_test(
2325
name = "test",
2426
data = [
2527
":e2e",
28+
"//vscode-ng-language-service:node_modules/jasmine",
29+
"//vscode-ng-language-service:node_modules/jasmine-reporters",
30+
"//vscode-ng-language-service:node_modules/typescript",
31+
"//vscode-ng-language-service:node_modules/xvfb",
2632
"//vscode-ng-language-service:npm",
27-
"//vscode-ng-language-service/integration",
2833
"//vscode-ng-language-service/integration/project",
29-
# Depend on //:node_modules/jasmine as a temporary work-around for jasmine escaping its
30-
# runfiles likely due to esm import issue in rules_js https://github.com/aspect-build/rules_js/issues/362
31-
"//vscode-ng-language-service:node_modules/jasmine",
34+
"//vscode-ng-language-service/integration/project:node_modules/@angular/common",
35+
"//vscode-ng-language-service/integration/project:node_modules/@angular/core",
3236
],
3337
entry_point = ":index.js",
38+
env = {
39+
"DBUS_SESSION_BUS_ADDRESS": "",
40+
},
3441
# This test downloads vscode & installs it which is not allowed in the sandbox
3542
# due to file system protection. It is tagged local so it runs outside of
3643
# the sandbox. It would need some redesign to allow for sandbox execution.
37-
# Tagged manual so that `bazel test //...` doesn't run it automatically.
3844
tags = [
3945
"e2e",
40-
"local",
41-
"manual",
46+
"no-remote-exec",
47+
"no-sandbox",
48+
"requires-network",
4249
],
4350
)

vscode-ng-language-service/integration/e2e/completion_spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {activate, COMPLETION_COMMAND, FOO_TEMPLATE_URI} from './helper';
55
describe('Angular LS completions', () => {
66
beforeAll(async () => {
77
await activate(FOO_TEMPLATE_URI);
8-
});
8+
}, 20_000);
99

1010
it(`does not duplicate HTML completions in external templates`, async () => {
1111
const position = new vscode.Position(0, 0);

vscode-ng-language-service/integration/e2e/definition_spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const APP_COMPONENT_URI = vscode.Uri.file(APP_COMPONENT);
1010
describe('Angular LS', () => {
1111
beforeAll(async () => {
1212
await activate(APP_COMPONENT_URI);
13-
}, 25000 /* 25 seconds */);
13+
}, 20_000);
1414

1515
it(`returns definition for variable in template`, async () => {
1616
// vscode Position is zero-based
@@ -29,8 +29,8 @@ describe('Angular LS', () => {
2929
expect(def.targetUri.fsPath).toBe(APP_COMPONENT); // in the same document
3030
const {start, end} = def.targetRange;
3131
// Should start and end on line 6
32-
expect(start.line).toBe(7);
33-
expect(end.line).toBe(7);
32+
expect(start.line).toBe(8);
33+
expect(end.line).toBe(8);
3434
expect(start.character).toBe(2);
3535
expect(end.character).toBe(start.character + `name`.length);
3636
});
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {setTimeout} from 'node:timers/promises';
12
import * as vscode from 'vscode';
23

34
import {APP_COMPONENT, FOO_TEMPLATE} from '../test_constants';
@@ -8,20 +9,16 @@ export const DEFINITION_COMMAND = 'vscode.executeDefinitionProvider';
89
export const APP_COMPONENT_URI = vscode.Uri.file(APP_COMPONENT);
910
export const FOO_TEMPLATE_URI = vscode.Uri.file(FOO_TEMPLATE);
1011

11-
function sleep(ms: number) {
12-
return new Promise((resolve) => setTimeout(resolve, ms));
13-
}
14-
15-
export async function activate(uri: vscode.Uri) {
16-
// set default timeout to 30 seconds
17-
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30_000;
12+
export async function activate(uri: vscode.Uri): Promise<void> {
1813
await vscode.window.showTextDocument(uri);
1914
await waitForDefinitionsToBeAvailable(20);
2015
}
2116

22-
async function waitForDefinitionsToBeAvailable(maxSeconds: number) {
17+
async function waitForDefinitionsToBeAvailable(maxTries: number) {
18+
await vscode.workspace.openTextDocument(APP_COMPONENT_URI);
19+
2320
let tries = 0;
24-
while (tries < maxSeconds) {
21+
while (tries < maxTries) {
2522
const position = new vscode.Position(4, 25);
2623
// For a complete list of standard commands, see
2724
// https://code.visualstudio.com/api/references/commands
@@ -30,10 +27,12 @@ async function waitForDefinitionsToBeAvailable(maxSeconds: number) {
3027
APP_COMPONENT_URI,
3128
position,
3229
);
33-
if (definitions && definitions.length > 0) {
30+
31+
if (definitions?.length > 0) {
3432
return;
3533
}
34+
3635
tries++;
37-
await sleep(1000);
36+
await setTimeout(500);
3837
}
3938
}

vscode-ng-language-service/integration/e2e/hover_spec.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import * as vscode from 'vscode';
22

33
import {activate, FOO_TEMPLATE_URI, HOVER_COMMAND} from './helper';
44

5-
// This hover tests appear to be the only flaky ones in the suite. Disable until they can
6-
// consistently pass.
7-
xdescribe('Angular LS quick info', () => {
5+
describe('Angular LS quick info', () => {
86
beforeAll(async () => {
97
await activate(FOO_TEMPLATE_URI);
10-
});
8+
}, 20_000);
119

1210
it(`returns quick info from built in extension for class in template`, async () => {
1311
const position = new vscode.Position(1, 8);

vscode-ng-language-service/integration/e2e/index.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,51 @@
1-
import {join} from 'path';
2-
import {runTests} from 'vscode-test';
1+
import {join} from 'node:path';
2+
import {tmpdir} from 'node:os';
3+
import {runTests} from '@vscode/test-electron';
34

45
import {PACKAGE_ROOT, PROJECT_PATH} from '../test_constants';
6+
import {mkdtemp} from 'node:fs/promises';
7+
8+
// @ts-expect-error no types.
9+
import Xvfb from 'xvfb';
510

611
async function main() {
7-
const EXT_DEVELOPMENT_PATH = join(PACKAGE_ROOT, 'npm');
12+
const EXT_DEVELOPMENT_PATH = join(PACKAGE_ROOT, 'npm/vscode-ng-language-service/vsix_sandbox');
813
const EXT_TESTS_PATH = join(PACKAGE_ROOT, 'integration', 'e2e', 'jasmine');
14+
const xvfb = new Xvfb();
15+
16+
// We cannot use `TEST_TMPDIR` as it's longer than 170 characters
17+
const vsCodeDataDir = await mkdtemp(join(tmpdir(), 'vscode-e2e-'));
918

1019
try {
11-
await runTests({
20+
xvfb.start();
21+
const exitCode = await runTests({
1222
// Keep version in sync with vscode engine version in package.json
1323
version: '1.74.3',
1424
extensionDevelopmentPath: EXT_DEVELOPMENT_PATH,
1525
extensionTestsPath: EXT_TESTS_PATH,
26+
// Avoid redownloading vscode if the test if flaky.
27+
cachePath: join(tmpdir(), 'vscode-cache'),
1628
launchArgs: [
1729
PROJECT_PATH,
1830
// This disables all extensions except the one being tested
1931
'--disable-extensions',
32+
'--disable-gpu',
33+
'--no-sandbox',
34+
'--disable-dev-shm-usage',
35+
'--disable-software-rasterizer',
36+
`--extensions-dir=${vsCodeDataDir}/extensions`,
37+
`--user-data-dir=${vsCodeDataDir}/user-data`,
2038
],
2139
});
40+
41+
if (exitCode !== 0) {
42+
process.exitCode = exitCode;
43+
}
2244
} catch (err) {
2345
console.error('Failed to run tests', err);
24-
process.exit(1);
46+
process.exitCode = 1;
47+
} finally {
48+
xvfb.stop();
2549
}
2650
}
2751

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import Jasmine from 'jasmine';
2+
import {TerminalReporter} from 'jasmine-reporters';
3+
4+
export async function run(
5+
_testsRoot: string,
6+
cb: (error: any, exitCode?: number) => void,
7+
): Promise<void> {
8+
const jasmine = new Jasmine({projectBaseDir: __dirname});
9+
jasmine.loadConfig({
10+
spec_files: ['*_spec.js'],
11+
});
12+
13+
jasmine.addReporter(new TerminalReporter());
14+
jasmine.exitOnCompletion = false;
15+
const result = await jasmine.execute();
16+
17+
if (result.overallStatus === 'passed') {
18+
console.log('All specs have passed');
19+
cb(null, 0);
20+
} else {
21+
console.log('At least one spec has failed');
22+
cb(result.incompleteReason, 1);
23+
}
24+
}

vscode-ng-language-service/integration/lsp/BUILD.bazel

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@ jasmine_test(
1212
"//vscode-ng-language-service/integration/project:node_modules/@angular/common",
1313
"//vscode-ng-language-service/integration/project:node_modules/@angular/core",
1414
"//vscode-ng-language-service/server:index",
15-
"//vscode-ng-language-service/server:node_modules",
15+
"//vscode-ng-language-service/server:node_modules/@angular/language-service",
16+
"//vscode-ng-language-service/server:node_modules/typescript",
1617
],
1718
flaky = True,
1819
shard_count = 2,
19-
tags = [
20-
"e2e",
21-
],
2220
)
2321

2422
ts_project(

0 commit comments

Comments
 (0)