Skip to content

Commit 2647a6b

Browse files
authored
Support for multi-root .code-workspace workspaces (#1566)
* Avoid situation where a postfix is appended twice in status bar * Smarter finding of the root "test" folder * Add extra sdk arguments for code-workspace tests * Better plugin arg assertions * Fixes for code workspace debugging * Code workspace tests * Include test explorer suite * Fix tests so don't need root "test" folder * Include dependency tests * Make sure we do not miss folders * Fix dependencies test
1 parent 3335069 commit 2647a6b

29 files changed

+478
-94
lines changed

.vscode-test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,42 @@ module.exports = defineConfig({
8989
reuseMachineInstall: !isCIBuild,
9090
installExtensions,
9191
},
92+
{
93+
label: "codeWorkspaceTests",
94+
files: [
95+
"dist/test/common.js",
96+
"dist/test/integration-tests/extension.test.js",
97+
"dist/test/integration-tests/WorkspaceContext.test.js",
98+
"dist/test/integration-tests/tasks/**/*.test.js",
99+
"dist/test/integration-tests/commands/build.test.js",
100+
"dist/test/integration-tests/testexplorer/TestExplorerIntegration.test.js",
101+
"dist/test/integration-tests/commands/dependency.test.js",
102+
],
103+
version: process.env["VSCODE_VERSION"] ?? "stable",
104+
workspaceFolder: "./assets/test.code-workspace",
105+
launchArgs,
106+
extensionDevelopmentPath: vsixPath
107+
? [`${__dirname}/.vscode-test/extensions/${publisher}.${name}-${version}`]
108+
: undefined,
109+
mocha: {
110+
ui: "tdd",
111+
color: true,
112+
timeout,
113+
forbidOnly: isCIBuild,
114+
grep: isFastTestRun ? "@slow" : undefined,
115+
invert: isFastTestRun,
116+
slow: 10000,
117+
retries: 1,
118+
reporter: path.join(__dirname, ".mocha-reporter.js"),
119+
reporterOptions: {
120+
jsonReporterOptions: {
121+
output: path.join(__dirname, "test-results", "code-workspace-tests.json"),
122+
},
123+
},
124+
},
125+
reuseMachineInstall: !isCIBuild,
126+
installExtensions,
127+
},
92128
{
93129
label: "unitTests",
94130
files: ["dist/test/common.js", "dist/test/unit-tests/**/*.test.js"],

.vscode/launch.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@
2929
},
3030
"preLaunchTask": "compile-tests"
3131
},
32+
{
33+
"name": "Code Workspace Tests",
34+
"type": "extensionHost",
35+
"request": "launch",
36+
"testConfiguration": "${workspaceFolder}/.vscode-test.js",
37+
"testConfigurationLabel": "codeWorkspaceTests",
38+
"args": ["--profile=testing-debug"],
39+
"outFiles": ["${workspaceFolder}/dist/**/*.js"],
40+
"env": {
41+
"VSCODE_DEBUG": "1"
42+
},
43+
"preLaunchTask": "compile-tests"
44+
},
3245
{
3346
"name": "Unit Tests",
3447
"type": "extensionHost",

assets/test.code-workspace

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
{
2+
"folders": [
3+
{
4+
"name": "diagnostics",
5+
"path": "./test/diagnostics"
6+
},
7+
{
8+
"name": "dependencies",
9+
"path": "./test/dependencies"
10+
},
11+
{
12+
"name": "command-plugin",
13+
"path": "./test/command-plugin"
14+
},
15+
{
16+
"name": "defaultPackage",
17+
"path": "./test/defaultPackage"
18+
}
19+
],
20+
"settings": {
21+
"swift.disableAutoResolve": true,
22+
"swift.autoGenerateLaunchConfigurations": false,
23+
"swift.debugger.debugAdapter": "lldb-dap",
24+
"swift.debugger.setupCodeLLDB": "alwaysUpdateGlobal",
25+
"swift.additionalTestArguments": [
26+
"-Xswiftc",
27+
"-DTEST_ARGUMENT_SET_VIA_TEST_BUILD_ARGUMENTS_SETTING"
28+
],
29+
"lldb.verboseLogging": true,
30+
"lldb.launch.terminal": "external",
31+
"lldb-dap.detachOnError": true,
32+
"swift.sourcekit-lsp.backgroundIndexing": "off"
33+
},
34+
"tasks": {
35+
"version": "2.0.0",
36+
"tasks": [
37+
{
38+
"type": "swift",
39+
"args": [
40+
"build",
41+
"--build-tests",
42+
"--verbose",
43+
"-Xswiftc",
44+
"-DBAR"
45+
],
46+
"cwd": "${workspaceFolder:defaultPackage}",
47+
"group": {
48+
"kind": "build",
49+
"isDefault": true
50+
},
51+
"label": "swift: Build All (defaultPackage) (workspace)",
52+
"detail": "swift build --build-tests --verbose -Xswiftc -DBAR"
53+
},
54+
{
55+
"type": "swift",
56+
"args": [
57+
"build",
58+
"--show-bin-path"
59+
],
60+
"cwd": "${workspaceFolder:defaultPackage}",
61+
"group": "build",
62+
"label": "swift: Build All from code workspace",
63+
"detail": "swift build --show-bin-path"
64+
},
65+
{
66+
"type": "swift-plugin",
67+
"command": "command_plugin",
68+
"args": [
69+
"--foo"
70+
],
71+
"cwd": "${workspaceFolder:command-plugin}",
72+
"disableSandbox": true,
73+
"label": "swift: command-plugin from code workspace",
74+
"detail": "swift package command_plugin --foo"
75+
},
76+
{
77+
"type": "swift",
78+
"args": [
79+
"build",
80+
"--product",
81+
"PackageExe",
82+
"-Xswiftc",
83+
"-diagnostic-style=llvm",
84+
"-Xswiftc",
85+
"-DBAR"
86+
],
87+
"cwd": "${workspaceFolder:defaultPackage}",
88+
"group": "build",
89+
"label": "swift: Build Debug PackageExe (defaultPackage) (workspace)",
90+
"detail": "swift build --product PackageExe -Xswiftc -diagnostic-style=llvm -Xswiftc -DBAR"
91+
},
92+
{
93+
"type": "swift",
94+
"args": [
95+
"build",
96+
"-c",
97+
"release",
98+
"--product",
99+
"PackageExe",
100+
"-Xswiftc",
101+
"-diagnostic-style=llvm",
102+
"-Xswiftc",
103+
"-DBAR"
104+
],
105+
"cwd": "${workspaceFolder:defaultPackage}",
106+
"group": "build",
107+
"label": "swift: Build Release PackageExe (defaultPackage) (workspace)",
108+
"detail": "swift build -c release --product PackageExe -Xswiftc -diagnostic-style=llvm -Xswiftc -DBAR"
109+
}
110+
]
111+
},
112+
"launch": {
113+
"version": "0.2.0",
114+
"configurations": [
115+
{
116+
"type": "swift",
117+
"request": "launch",
118+
"name": "Debug PackageExe (defaultPackage) (workspace)",
119+
"program": "${workspaceFolder:defaultPackage}/.build/debug/PackageExe",
120+
"args": [],
121+
"cwd": "${workspaceFolder:defaultPackage}",
122+
"preLaunchTask": "swift: Build Debug PackageExe (defaultPackage) (workspace)",
123+
"disableASLR": false,
124+
"initCommands": [
125+
"settings set target.disable-aslr false"
126+
]
127+
},
128+
{
129+
"type": "swift",
130+
"request": "launch",
131+
"name": "Release PackageExe (defaultPackage) (workspace)",
132+
"program": "${workspaceFolder:defaultPackage}/.build/release/PackageExe",
133+
"args": [],
134+
"cwd": "${workspaceFolder:defaultPackage}",
135+
"preLaunchTask": "swift: Build Release PackageExe (defaultPackage) (workspace)",
136+
"disableASLR": false,
137+
"initCommands": [
138+
"settings set target.disable-aslr false"
139+
]
140+
}
141+
],
142+
"compounds": []
143+
}
144+
}

assets/test/.vscode/tasks.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
"args": [
77
"build",
88
"--build-tests",
9-
"--verbose"
9+
"--verbose",
10+
"-Xswiftc",
11+
"-DFOO"
1012
],
1113
"cwd": "defaultPackage",
1214
"problemMatcher": [
1315
"$swiftc"
1416
],
1517
"group": "build",
1618
"label": "swift: Build All (defaultPackage)",
17-
"detail": "swift build --build-tests --verbose"
19+
"detail": "swift build --build-tests --verbose -Xswiftc -DFOO"
1820
},
1921
{
2022
"type": "swift",
@@ -33,7 +35,9 @@
3335
{
3436
"type": "swift-plugin",
3537
"command": "command_plugin",
36-
"args": ["--foo"],
38+
"args": [
39+
"--foo"
40+
],
3741
"cwd": "command-plugin",
3842
"disableSandbox": true,
3943
"problemMatcher": [
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"configurations": [
3+
{
4+
"type": "swift",
5+
"request": "launch",
6+
"name": "Attach to Swift Executable",
7+
"program": "${workspaceFolder}/.build/aarch64-unknown-linux-gnu/debug/PackageExe",
8+
// "attachCommands": [
9+
// // "gdb-remote 1234",
10+
// // "process launch"
11+
// "platform select remote-linux",
12+
// "platform connect connect://127.0.0.1:1234"
13+
// ],
14+
// "initCommands": [
15+
// "target create .build/aarch64-unknown-linux-gnu/debug/PackageExe",
16+
// "b main.swift:7",
17+
// ]
18+
"initCommands": [
19+
"platform select remote-linux",
20+
// "platform connect connect://127.0.0.1:1234",
21+
"gdb-remote 1234",
22+
"settings set target.inherit-env false"
23+
]
24+
},
25+
{
26+
"type": "swift",
27+
"request": "launch",
28+
"name": "Debug package1",
29+
"program": "${workspaceFolder:defaultPackage}/.build/debug/package1",
30+
"args": [],
31+
"cwd": "${workspaceFolder:defaultPackage}",
32+
"preLaunchTask": "swift: Build Debug package1"
33+
},
34+
{
35+
"type": "swift",
36+
"request": "launch",
37+
"name": "Release package1",
38+
"program": "${workspaceFolder:defaultPackage}/.build/release/package1",
39+
"args": [],
40+
"cwd": "${workspaceFolder:defaultPackage}",
41+
"preLaunchTask": "swift: Build Release package1"
42+
},
43+
{
44+
"type": "swift",
45+
"request": "launch",
46+
"args": [],
47+
"cwd": "${workspaceFolder:defaultPackage}",
48+
"name": "Debug PackageExe",
49+
"program": "${workspaceFolder:defaultPackage}/.build/debug/PackageExe",
50+
"preLaunchTask": "swift: Build Debug PackageExe"
51+
},
52+
{
53+
"type": "swift",
54+
"request": "launch",
55+
"args": [],
56+
"cwd": "${workspaceFolder:defaultPackage}",
57+
"name": "Release PackageExe",
58+
"program": "${workspaceFolder:defaultPackage}/.build/release/PackageExe",
59+
"preLaunchTask": "swift: Build Release PackageExe"
60+
}
61+
]
62+
}

scripts/test_windows.ps1

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
function Update-SwiftBuildAndPackageArguments {
1616
param (
1717
[string]$jsonFilePath = "./assets/test/.vscode/settings.json",
18+
[string]$codeWorkspaceFilePath = "./assets/test.code-workspace",
1819
[string]$windowsSdkVersion = "10.0.22000.0",
1920
[string]$vcToolsVersion = "14.43.34808"
2021
)
@@ -28,9 +29,17 @@ function Update-SwiftBuildAndPackageArguments {
2829
exit 1
2930
}
3031

32+
try {
33+
$codeWorkspaceContent = Get-Content -Raw -Path $codeWorkspaceFilePath | ConvertFrom-Json
34+
} catch {
35+
Write-Host "Invalid JSON content in $codeWorkspaceFilePath"
36+
exit 1
37+
}
38+
3139
if ($jsonContent.PSObject.Properties['swift.buildArguments']) {
3240
$jsonContent.PSObject.Properties.Remove('swift.buildArguments')
3341
}
42+
3443

3544
$jsonContent | Add-Member -MemberType NoteProperty -Name "swift.buildArguments" -Value @(
3645
"-Xbuild-tools-swiftc", "-windows-sdk-root", "-Xbuild-tools-swiftc", $windowsSdkRoot,
@@ -54,10 +63,20 @@ function Update-SwiftBuildAndPackageArguments {
5463
"-Xswiftc", "-visualc-tools-version", "-Xswiftc", $vcToolsVersion
5564
)
5665

66+
67+
$codeWorkspaceContent.PSObject.Properties.Remove('settings')
68+
$codeWorkspaceContent | Add-Member -MemberType NoteProperty -Name "settings" -Value $jsonContent
69+
5770
$jsonContent | ConvertTo-Json -Depth 32 | Set-Content -Path $jsonFilePath
5871

72+
73+
$codeWorkspaceContent | ConvertTo-Json -Depth 32 | Set-Content -Path $codeWorkspaceFilePath
74+
5975
Write-Host "Contents of ${jsonFilePath}:"
6076
Get-Content -Path $jsonFilePath
77+
78+
Write-Host "Contents of ${codeWorkspaceFilePath}:"
79+
Get-Content -Path $codeWorkspaceFilePath
6180
}
6281

6382
$swiftVersionOutput = & swift --version

src/TestExplorer/TestRunner.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import { reduceTestItemChildren } from "./TestUtils";
5151
import { CompositeCancellationToken } from "../utilities/cancellation";
5252
// eslint-disable-next-line @typescript-eslint/no-require-imports
5353
import stripAnsi = require("strip-ansi");
54+
import { packageName, resolveScope } from "../utilities/tasks";
5455

5556
export enum TestLibrary {
5657
xctest = "XCTest",
@@ -773,8 +774,8 @@ export class TestRunner {
773774
`Building and Running Tests${kindLabel}`,
774775
{
775776
cwd: this.folderContext.folder,
776-
scope: this.folderContext.workspaceFolder,
777-
prefix: this.folderContext.name,
777+
scope: resolveScope(this.folderContext.workspaceFolder),
778+
packageName: packageName(this.folderContext),
778779
presentationOptions: { reveal: vscode.TaskRevealKind.Never },
779780
},
780781
this.folderContext.toolchain,

src/commands/build.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { debugLaunchConfig, getLaunchConfiguration } from "../debugger/launch";
1919
import { executeTaskWithUI } from "./utilities";
2020
import { FolderContext } from "../FolderContext";
2121
import { Target } from "../SwiftPackage";
22+
import { packageName } from "../utilities/tasks";
2223

2324
/**
2425
* Executes a {@link vscode.Task task} to run swift target.
@@ -56,7 +57,7 @@ export async function folderCleanBuild(folderContext: FolderContext) {
5657
{
5758
cwd: folderContext.folder,
5859
scope: folderContext.workspaceFolder,
59-
prefix: folderContext.name,
60+
packageName: packageName(folderContext),
6061
presentationOptions: { reveal: vscode.TaskRevealKind.Silent },
6162
group: vscode.TaskGroup.Clean,
6263
},
@@ -111,7 +112,11 @@ export async function debugBuildWithOptions(
111112
const launchConfig = getLaunchConfiguration(target.name, current);
112113
if (launchConfig) {
113114
ctx.buildStarted(target.name, launchConfig, options);
114-
const result = await debugLaunchConfig(current.workspaceFolder, launchConfig, options);
115+
const result = await debugLaunchConfig(
116+
vscode.workspace.workspaceFile ? undefined : current.workspaceFolder,
117+
launchConfig,
118+
options
119+
);
115120
ctx.buildFinished(target.name, launchConfig, options);
116121
return result;
117122
}

0 commit comments

Comments
 (0)