From ebcfa7cec6f4e9c4ede9c455eafef26537b457ce Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 9 Jan 2025 14:55:57 -0500 Subject: [PATCH 01/27] Fix some failures I kept hitting locally --- .../testexplorer/TestExplorerIntegration.test.ts | 1 + .../ui/PackageDependencyProvider.test.ts | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts b/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts index 374044db0..863588ecf 100644 --- a/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts +++ b/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts @@ -131,6 +131,7 @@ suite("Test Explorer Suite", function () { switch (process.platform) { case "linux": return "/usr/lib/liblldb.so"; + case "darwin": case "win32": return await (await SwiftToolchain.create()).getLLDBDebugAdapter(); default: diff --git a/test/integration-tests/ui/PackageDependencyProvider.test.ts b/test/integration-tests/ui/PackageDependencyProvider.test.ts index 75f6ea6a7..f99c80197 100644 --- a/test/integration-tests/ui/PackageDependencyProvider.test.ts +++ b/test/integration-tests/ui/PackageDependencyProvider.test.ts @@ -23,25 +23,31 @@ import { executeTaskAndWaitForResult, waitForNoRunningTasks } from "../../utilit import { getBuildAllTask, SwiftTask } from "../../../src/tasks/SwiftTaskProvider"; import { testAssetPath } from "../../fixtures"; import { activateExtensionForSuite, folderInRootWorkspace } from "../utilities/testutilities"; +import { FolderContext } from "../../../src/FolderContext"; +import { WorkspaceContext } from "../../../src/WorkspaceContext"; suite("PackageDependencyProvider Test Suite", function () { + let workspaceContext: WorkspaceContext; + let folderContext: FolderContext; let treeProvider: PackageDependenciesProvider; this.timeout(2 * 60 * 1000); // Allow up to 2 minutes to build activateExtensionForSuite({ async setup(ctx) { - const workspaceContext = ctx; + workspaceContext = ctx; await waitForNoRunningTasks(); - await folderInRootWorkspace("defaultPackage", workspaceContext); - const folderContext = await folderInRootWorkspace("dependencies", workspaceContext); + folderContext = await folderInRootWorkspace("dependencies", workspaceContext); await executeTaskAndWaitForResult((await getBuildAllTask(folderContext)) as SwiftTask); + await folderContext.reload(); treeProvider = new PackageDependenciesProvider(workspaceContext); - await workspaceContext.focusFolder(folderContext); }, async teardown() { treeProvider.dispose(); }, - testAssets: ["dependencies"], + }); + + setup(async () => { + await workspaceContext.focusFolder(folderContext); }); test("Includes remote dependency", async () => { From 41831a9cd0ffbc00c75d9f8e8d44ce3285f00175 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 13:34:49 -0500 Subject: [PATCH 02/27] Fix script permission --- docker/test-macos.sh | 79 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 docker/test-macos.sh diff --git a/docker/test-macos.sh b/docker/test-macos.sh new file mode 100755 index 000000000..e620259db --- /dev/null +++ b/docker/test-macos.sh @@ -0,0 +1,79 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the VS Code Swift open source project +## +## Copyright (c) 2024 the VS Code Swift project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of VS Code Swift project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +set -e + +NODE_VERSION="$(cat .nvmrc)" +NODE_NAME="node-v$NODE_VERSION-darwin-arm64" +NODE_ARCHIVE="$NODE_NAME.tar.gz" +ARTIFACTS="$PWD/.vscode-test" +VSCODE_SETTINGS="$ARTIFACTS/user-data/User/settings.json" +LSP_SETTINGS="$HOME/.sourcekit-lsp/config.json" + +export TMPDIR="$ARTIFACTS/tmp" +mkdir -p $TMPDIR + +function cleanup { + rm SHASUMS256.txt + rm $NODE_ARCHIVE + rm -rf "$ARTIFACTS" + rm -rf "$LSP_SETTINGS" +} +trap "cleanup" EXIT + +curl -O "https://nodejs.org/dist/v$NODE_VERSION/$NODE_ARCHIVE" +curl -O "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt" + +NODE_CHECKSUM="$(grep $NODE_ARCHIVE SHASUMS256.txt)" + +grep "$NODE_ARCHIVE" SHASUMS256.txt | sha256sum -c - + +tar -xzf $NODE_ARCHIVE -C $ARTIFACTS + +export NPM_CONFIG_CACHE="$ARTIFACTS/$NODE_NAME/cache" +export NPM_CONFIG_PREFIX="$ARTIFACTS/$NODE_NAME" +export NPM_CONFIG_USERCONFIG="$ARTIFACTS/$NODE_NAME/usernpmrc" +export NPM_CONFIG_GLOBALCONFIG="$ARTIFACTS/$NODE_NAME/globalnpmrc" + +PATH="$ARTIFACTS/$NODE_NAME/bin:$PATH" + +mkdir -p $(dirname "$VSCODE_SETTINGS") +cat < $VSCODE_SETTINGS +{ + "swift.buildArguments": [ + "--disable-sandbox", + "-Xswiftc", + "-disable-sandbox" + ] +} +EOT + +mkdir -p $(dirname "$LSP_SETTINGS") +cat < $LSP_SETTINGS +{ + "swiftPM": { + "disableSandbox": true, + "swiftCompilerFlags": [ + "-disable-sandbox" + ] + } +} +EOT + +npm ci -ignore-script node-pty +npm run lint +npm run format +npm run package +FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file From 19c032aa28c4ff68dd72f699a804d68d02fd6510 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 13:47:47 -0500 Subject: [PATCH 03/27] Sandbox config --- docker/sandbox.sb | 103 +++++++++++++++++++++++++++++++++++++++++++ docker/test-macos.sh | 10 ++--- 2 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 docker/sandbox.sb diff --git a/docker/sandbox.sb b/docker/sandbox.sb new file mode 100644 index 000000000..36ffd05b0 --- /dev/null +++ b/docker/sandbox.sb @@ -0,0 +1,103 @@ +(version 1) +; Deny everything by default +(deny default) + +; Get fonts +(import "system.sb") + +; Helpers +(define (param-regex param-name param-relative-regex) + (regex (string-append "^" (regex-quote (param param-name)) param-relative-regex))) +(define (param-subpath param-name param-relative-subpath) + (subpath (string-append (param param-name) param-relative-subpath))) +(define workspace + (param "workspace")) + +; Read +(allow file-read-metadata + (subpath "/")) +(allow file-read* + (subpath workspace) + (path "/") + (path "/private/etc/ssl/openssl.cnf") + (path "/Library/Preferences/com.apple.dt.Xcode.plist") + (path "/dev/dtracehelper") + (path "/dev/fd") + (path "/dev/null") + (path "/dev/ptmx") + (regex #"^/dev/tty.*") + (path "/etc/shells") + (path "/private/etc/shells") + (path "/private/etc/ssl/cert.pem") + (path "/usr/local/share/git-core/gitconfig") + (subpath "/Users/award999/repos/sourcekit-lsp/.build") ; REMOVE + (regex #"^/Users/[^/]+/.gitconfig$") + (regex #"^/Users/[^/]+/.sourcekit-lsp.*") + (regex #"^/Users/[^/]+/.swiftpm.*") + (regex #"^/Users/[^/]+/Library/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Developer/Toolchains") + (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") + (regex #"^/Users/[^/]+/Library/Caches/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Application Support/Code.*") + (regex #"^/Users/[^/]+/Library/Saved Application State/com.microsoft.VSCode.savedState.*") + (regex #"^/private/var/folders/[^/]+/[^/]+/.+") + (subpath "/Library/Developer/Toolchains") + (subpath "/Applications/Xcode.app") + (subpath "/Applications/Xcode-beta.app") + (subpath "/bin") + (subpath "/usr/bin") + (subpath "/usr/libexec/path_helper") + (regex #"^/Users/[^/]+/.vscode/argv.json") +) + +(allow mach-lookup) +(allow mach-register) + +; Write +(allow file-write* + (subpath workspace) + (path "/dev/null") + (path "/dev/ptmx") + (regex #"^/dev/tty.*") + (regex #"^/Users/[^/]+/.sourcekit-lsp.*") + (regex #"^/Users/[^/]+/Library/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Caches/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") + (regex #"^/Users/[^/]+/Library/Application Support/Code.*") + (regex #"^/private/var/folders/[^/]+/[^/]+/.+") + (regex #"^/Users/[^/]+/.vscode/argv.json") +) + +; Execute +(allow process-exec*) +(allow process-fork) + +; Network +(allow system-socket) +(allow network-outbound + (path "/private/var/run/mDNSResponder") + (remote tcp4 "*:443") +) + +; Open VSCode window +(allow file-ioctl) +; (allow file-issue-extension) +(allow iokit-open-user-client) +; (allow system-fsctl) ; HFSIOC_SET_HOTFILE_STATE + +; VSCode sockets +(allow network* + (param-regex "workspace" "/.vscode-test/user-data/1\.[0-9]+-main\.sock") +) + +; VSCode terminal +(allow pseudo-tty) + +; SourceKit-LSP +(allow job-creation) + +; JSON language server +(allow signal) + +; Uncomment when connected to Ottawa office network +(system-network) \ No newline at end of file diff --git a/docker/test-macos.sh b/docker/test-macos.sh index e620259db..ce9424b50 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -36,11 +36,11 @@ trap "cleanup" EXIT curl -O "https://nodejs.org/dist/v$NODE_VERSION/$NODE_ARCHIVE" curl -O "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt" -NODE_CHECKSUM="$(grep $NODE_ARCHIVE SHASUMS256.txt)" +NODE_CHECKSUM="$(grep "$NODE_ARCHIVE" SHASUMS256.txt)" grep "$NODE_ARCHIVE" SHASUMS256.txt | sha256sum -c - -tar -xzf $NODE_ARCHIVE -C $ARTIFACTS +tar -xzf "$NODE_ARCHIVE" -C "$ARTIFACTS" export NPM_CONFIG_CACHE="$ARTIFACTS/$NODE_NAME/cache" export NPM_CONFIG_PREFIX="$ARTIFACTS/$NODE_NAME" @@ -50,7 +50,7 @@ export NPM_CONFIG_GLOBALCONFIG="$ARTIFACTS/$NODE_NAME/globalnpmrc" PATH="$ARTIFACTS/$NODE_NAME/bin:$PATH" mkdir -p $(dirname "$VSCODE_SETTINGS") -cat < $VSCODE_SETTINGS +cat < "$VSCODE_SETTINGS" { "swift.buildArguments": [ "--disable-sandbox", @@ -60,8 +60,8 @@ cat < $VSCODE_SETTINGS } EOT -mkdir -p $(dirname "$LSP_SETTINGS") -cat < $LSP_SETTINGS +mkdir -p "$(dirname "$LSP_SETTINGS")" +cat < "$LSP_SETTINGS" { "swiftPM": { "disableSandbox": true, From 0f6dae75f0ef17de97438ccbeffd4267235cf8d8 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 13:55:56 -0500 Subject: [PATCH 04/27] Proxy port --- docker/sandbox.sb | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 36ffd05b0..3373908d5 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -77,6 +77,7 @@ (allow network-outbound (path "/private/var/run/mDNSResponder") (remote tcp4 "*:443") + (remote tcp4 "*:3128") ) ; Open VSCode window From a39e4f3d7edbaf917986b0e0973018ce29bb38cb Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 14:06:22 -0500 Subject: [PATCH 05/27] Use different command to check sha --- docker/test-macos.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docker/test-macos.sh b/docker/test-macos.sh index ce9424b50..48cb706a7 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -36,9 +36,7 @@ trap "cleanup" EXIT curl -O "https://nodejs.org/dist/v$NODE_VERSION/$NODE_ARCHIVE" curl -O "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt" -NODE_CHECKSUM="$(grep "$NODE_ARCHIVE" SHASUMS256.txt)" - -grep "$NODE_ARCHIVE" SHASUMS256.txt | sha256sum -c - +grep "$NODE_ARCHIVE" SHASUMS256.txt | shasum -a 256 -c - tar -xzf "$NODE_ARCHIVE" -C "$ARTIFACTS" From 1756a36abfd97ad6151740ba3c490bf5923e1856 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 14:08:49 -0500 Subject: [PATCH 06/27] Fix shellcheck errors --- docker/test-macos.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 48cb706a7..b551c4584 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -23,11 +23,11 @@ VSCODE_SETTINGS="$ARTIFACTS/user-data/User/settings.json" LSP_SETTINGS="$HOME/.sourcekit-lsp/config.json" export TMPDIR="$ARTIFACTS/tmp" -mkdir -p $TMPDIR +mkdir -p "$TMPDIR" function cleanup { rm SHASUMS256.txt - rm $NODE_ARCHIVE + rm "$NODE_ARCHIVE" rm -rf "$ARTIFACTS" rm -rf "$LSP_SETTINGS" } @@ -47,7 +47,7 @@ export NPM_CONFIG_GLOBALCONFIG="$ARTIFACTS/$NODE_NAME/globalnpmrc" PATH="$ARTIFACTS/$NODE_NAME/bin:$PATH" -mkdir -p $(dirname "$VSCODE_SETTINGS") +mkdir -p "$(dirname "$VSCODE_SETTINGS")" cat < "$VSCODE_SETTINGS" { "swift.buildArguments": [ From 4037923cde85bc9f574a48d6a019dcbe9f91aed8 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 14:17:20 -0500 Subject: [PATCH 07/27] use x64 arch --- docker/test-macos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/test-macos.sh b/docker/test-macos.sh index b551c4584..4c23d4ea3 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -16,7 +16,7 @@ set -e NODE_VERSION="$(cat .nvmrc)" -NODE_NAME="node-v$NODE_VERSION-darwin-arm64" +NODE_NAME="node-v$NODE_VERSION-darwin-x64" NODE_ARCHIVE="$NODE_NAME.tar.gz" ARTIFACTS="$PWD/.vscode-test" VSCODE_SETTINGS="$ARTIFACTS/user-data/User/settings.json" From 00a3d887df638037c770f32cf9d336accce7adac Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Thu, 12 Dec 2024 14:40:03 -0500 Subject: [PATCH 08/27] Fix downloading vscode --- docker/sandbox.sb | 6 +++--- docker/test-macos.sh | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 3373908d5..91b37eb2f 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -52,6 +52,8 @@ (allow mach-lookup) (allow mach-register) +(allow sysctl-read) +(allow ipc-posix-shm-read-data (literal "apple.shm.notification_center")) ; Write (allow file-write* @@ -76,6 +78,7 @@ (allow system-socket) (allow network-outbound (path "/private/var/run/mDNSResponder") + (remote tcp4 "*:80") (remote tcp4 "*:443") (remote tcp4 "*:3128") ) @@ -99,6 +102,3 @@ ; JSON language server (allow signal) - -; Uncomment when connected to Ottawa office network -(system-network) \ No newline at end of file diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 4c23d4ea3..9fc851f6d 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -74,4 +74,13 @@ npm ci -ignore-script node-pty npm run lint npm run format npm run package -FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file + +# Download vscode +mkdir -p .vscode-test +curl -O -L "https://code.visualstudio.com/sha/download?build=stable&os=darwin-universal" +unzip download -d .vscode-test +rm download + +# export npm_config_proxy="$HTTPS_PROXY" +export npm_config_https_proxy="$HTTPS_PROXY" +VSCODE_INSTALL="$(pwd)/.vscode-test/Visual Studio Code.app" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file From 81ac8d0c20240cd01fe16d785fcfcef38737aad8 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Fri, 13 Dec 2024 12:16:47 -0500 Subject: [PATCH 09/27] Allow reading plist --- docker/sandbox.sb | 1 + docker/test-macos.sh | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 91b37eb2f..2092a48c4 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -21,6 +21,7 @@ (path "/") (path "/private/etc/ssl/openssl.cnf") (path "/Library/Preferences/com.apple.dt.Xcode.plist") + (path "/Library/Preferences/com.apple.ViewBridge.plist") (path "/dev/dtracehelper") (path "/dev/fd") (path "/dev/null") diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 9fc851f6d..1d7e1b6c9 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -75,12 +75,6 @@ npm run lint npm run format npm run package -# Download vscode -mkdir -p .vscode-test -curl -O -L "https://code.visualstudio.com/sha/download?build=stable&os=darwin-universal" -unzip download -d .vscode-test -rm download - -# export npm_config_proxy="$HTTPS_PROXY" +# Need to set proxy to download VS Code export npm_config_https_proxy="$HTTPS_PROXY" -VSCODE_INSTALL="$(pwd)/.vscode-test/Visual Studio Code.app" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file +NO_PROXY="*" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file From 75a7619ea755db4348c0e120f50d96f0f5f8d958 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Fri, 13 Dec 2024 13:59:06 -0500 Subject: [PATCH 10/27] Shorter socket name --- .vscode-test.js | 6 ++++-- docker/test-macos.sh | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.vscode-test.js b/.vscode-test.js index 5fa7ce6ba..e9c64dac4 100644 --- a/.vscode-test.js +++ b/.vscode-test.js @@ -18,6 +18,8 @@ const path = require("path"); const isCIBuild = process.env["CI"] === "1"; const isFastTestRun = process.env["FAST_TEST_RUN"] === "1"; +const dataDir = process.env["VSCODE_DATA_DIR"]; + // "env" in launch.json doesn't seem to work with vscode-test const isDebugRun = !(process.env["_"] ?? "").endsWith("node_modules/.bin/vscode-test"); @@ -36,7 +38,7 @@ module.exports = defineConfig({ "--disable-crash-reporter", "--disable-workspace-trust", "--disable-telemetry", - ], + ].concat(dataDir ? ["--user-data-dir", dataDir] : []), mocha: { ui: "tdd", color: true, @@ -65,7 +67,7 @@ module.exports = defineConfig({ "--disable-crash-reporter", "--disable-workspace-trust", "--disable-telemetry", - ], + ].concat(dataDir ? ["--user-data-dir", dataDir] : []), mocha: { ui: "tdd", color: true, diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 1d7e1b6c9..ba0d455ee 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -77,4 +77,4 @@ npm run package # Need to set proxy to download VS Code export npm_config_https_proxy="$HTTPS_PROXY" -NO_PROXY="*" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file +VSCODE_DATA_DIR="$PWD/ud" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file From 1a780c55295e775887add1fc83d0248d6577cbf4 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 16 Dec 2024 09:43:57 -0500 Subject: [PATCH 11/27] Allow accessing entire .vscode folder --- docker/sandbox.sb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 2092a48c4..665b55bb2 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -48,7 +48,7 @@ (subpath "/bin") (subpath "/usr/bin") (subpath "/usr/libexec/path_helper") - (regex #"^/Users/[^/]+/.vscode/argv.json") + (regex #"^/Users/[^/]+/.vscode.*") ) (allow mach-lookup) @@ -68,7 +68,7 @@ (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") (regex #"^/Users/[^/]+/Library/Application Support/Code.*") (regex #"^/private/var/folders/[^/]+/[^/]+/.+") - (regex #"^/Users/[^/]+/.vscode/argv.json") + (regex #"^/Users/[^/]+/.vscode.*") ) ; Execute From 68d63ca59b10eeb69c354b0f89a82f59eaf843f4 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 16 Dec 2024 10:13:51 -0500 Subject: [PATCH 12/27] Allow writing xcode caches --- docker/sandbox.sb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 665b55bb2..c3e0ef15c 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -39,6 +39,7 @@ (regex #"^/Users/[^/]+/Library/Developer/Toolchains") (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") (regex #"^/Users/[^/]+/Library/Caches/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Caches/com.apple.dt.Xcode.*") (regex #"^/Users/[^/]+/Library/Application Support/Code.*") (regex #"^/Users/[^/]+/Library/Saved Application State/com.microsoft.VSCode.savedState.*") (regex #"^/private/var/folders/[^/]+/[^/]+/.+") @@ -65,6 +66,7 @@ (regex #"^/Users/[^/]+/.sourcekit-lsp.*") (regex #"^/Users/[^/]+/Library/org.swift.swiftpm.*") (regex #"^/Users/[^/]+/Library/Caches/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Caches/com.apple.dt.Xcode.*") (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") (regex #"^/Users/[^/]+/Library/Application Support/Code.*") (regex #"^/private/var/folders/[^/]+/[^/]+/.+") From 66c715b35dd562140cbd5ce42ae63c9a57df94e7 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 16 Dec 2024 11:16:36 -0500 Subject: [PATCH 13/27] Update socket path in sandbox --- .gitignore | 1 + .prettierignore | 3 +++ docker/sandbox.sb | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a09ca1cb4..da0219e89 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ default.profraw assets/documentation-webview assets/test/**/Package.resolved assets/swift-docc-render +ud diff --git a/.prettierignore b/.prettierignore index 42ce3550c..a7aad951d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -18,3 +18,6 @@ node_modules/ /coverage/ /dist/ /snippets/ + +# macOS CI +/ud/ \ No newline at end of file diff --git a/docker/sandbox.sb b/docker/sandbox.sb index c3e0ef15c..e55b75a57 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -94,7 +94,7 @@ ; VSCode sockets (allow network* - (param-regex "workspace" "/.vscode-test/user-data/1\.[0-9]+-main\.sock") + (param-regex "workspace" "/ud/1\.[0-9]+-main\.sock") ) ; VSCode terminal From f983193affd0c2b9bb8bc8b387b4faccea3e2f96 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Tue, 6 Aug 2024 13:52:12 -0400 Subject: [PATCH 14/27] Pass arguments to disable sandboxing when enabled New disableSandbox setting (only intended for testing right now) These particular commands (or subcommands) use sandboxing. To get our tests to run in a sandbox, we need to disable sandboxing because you cannot create a new sandbox when you're already running under a sandbox --- package.json | 12 +++++++++++- src/configuration.ts | 4 ++++ src/tasks/SwiftTaskProvider.ts | 4 +++- src/toolchain/BuildFlags.ts | 32 ++++++++++++++++++++++++++++++++ src/toolchain/toolchain.ts | 5 ++++- src/utilities/utilities.ts | 1 + 6 files changed, 55 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 2518ea3f8..32cd530c7 100644 --- a/package.json +++ b/package.json @@ -281,6 +281,11 @@ }, "markdownDescription": "Additional arguments to pass to swift commands that do package resolution, such as `swift package resolve`, `swift package update`, `swift build` and `swift test`. Keys and values should be provided as individual entries in the list." }, + "swift.disableSandbox": { + "type": "boolean", + "default": false, + "markdownDescription": "Disable sandboxing when running SwiftPM commands." + }, "swift.additionalTestArguments": { "type": "array", "default": [], @@ -689,7 +694,12 @@ "swift.swiftSDK": { "type": "string", "default": "", - "markdownDescription": "The [Swift SDK](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0387-cross-compilation-destinations.md) to compile against (`--swift-sdk` parameter).", + "markdownDescription": "The [Swift SDK](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0387-cross-compilation-destinations.md) to compile against (`--swift-sdk` parameter)." + }, + "swift.disableSandox": { + "type": "boolean", + "default": false, + "markdownDescription": "Disable sandboxing when running SwiftPM commands. You will almost always want this setting disabled.", "order": 4 }, "swift.diagnostics": { diff --git a/src/configuration.ts b/src/configuration.ts index d282378d1..f50979064 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -362,6 +362,10 @@ const configuration = { .getConfiguration("swift") .get("enableTerminalEnvironment", true); }, + /** Whether or not to disable SwiftPM sandboxing */ + get disableSandbox(): boolean { + return vscode.workspace.getConfiguration("swift").get("disableSandbox", false); + }, }; export default configuration; diff --git a/src/tasks/SwiftTaskProvider.ts b/src/tasks/SwiftTaskProvider.ts index fbf5ba946..50eb41516 100644 --- a/src/tasks/SwiftTaskProvider.ts +++ b/src/tasks/SwiftTaskProvider.ts @@ -271,7 +271,9 @@ export function createSwiftTask( cmdEnv: { [key: string]: string } = {} ): SwiftTask { const swift = toolchain.getToolchainExecutable("swift"); - args = toolchain.buildFlags.withSwiftPackageFlags(toolchain.buildFlags.withSwiftSDKFlags(args)); + args = toolchain.buildFlags.withSwiftSDKFlags(args); + args = toolchain.buildFlags.withSwiftPackageFlags(args); + args = toolchain.buildFlags.withDisableSandboxFlags(args); // Add relative path current working directory const cwd = config.cwd.fsPath; diff --git a/src/toolchain/BuildFlags.ts b/src/toolchain/BuildFlags.ts index 95f376dab..e660e15c2 100644 --- a/src/toolchain/BuildFlags.ts +++ b/src/toolchain/BuildFlags.ts @@ -192,6 +192,38 @@ export class BuildFlags { return indirect ? args.flatMap(arg => ["-Xswiftc", arg]) : args; } + /** + * Get modified swift arguments with new arguments for disabling + * sandboxing if the `swift.disableSandbox` setting is enabled. + * + * @param args original commandline arguments + */ + withDisableSandboxFlags(args: string[]): string[] { + if (!configuration.disableSandbox) { + return args; + } + switch (args[0]) { + case "package": { + return [args[0], ...BuildFlags.disableSandboxFlags(), ...args.slice(1)]; + } + case "build": + case "run": + case "test": { + return [...args, ...BuildFlags.disableSandboxFlags()]; + } + default: + // Do nothing for other commands + return args; + } + } + + /** + * Get flags for disabling sandboxing when running SwiftPM + */ + static disableSandboxFlags(): string[] { + return ["--disable-sandbox", "-Xswiftc", "-disable-sandbox"]; + } + /** * Filter argument list * @param args argument list diff --git a/src/toolchain/toolchain.ts b/src/toolchain/toolchain.ts index 9ee7b3938..10ed792a0 100644 --- a/src/toolchain/toolchain.ts +++ b/src/toolchain/toolchain.ts @@ -813,7 +813,10 @@ export class SwiftToolchain { private static async getSwiftTargetInfo(): Promise { try { try { - const { stdout } = await execSwift(["-print-target-info"], "default"); + const { stdout } = await execSwift( + ["-print-target-info", ...BuildFlags.disableSandboxFlags()], + "default" + ); const targetInfo = JSON.parse(stdout.trimEnd()) as SwiftTargetInfo; if (targetInfo.compilerVersion) { return targetInfo; diff --git a/src/utilities/utilities.ts b/src/utilities/utilities.ts index 31122bea1..2da26be27 100644 --- a/src/utilities/utilities.ts +++ b/src/utilities/utilities.ts @@ -188,6 +188,7 @@ export async function execSwift( } if (toolchain !== "default") { args = toolchain.buildFlags.withSwiftSDKFlags(args); + args = toolchain.buildFlags.withDisableSandboxFlags(args); } if (Object.keys(configuration.swiftEnvironmentVariables).length > 0) { // when adding environment vars we either combine with vars passed From 8008edad4d025795d076b8e79d0a0663b749f8b9 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 16 Dec 2024 11:58:28 -0500 Subject: [PATCH 15/27] Update sandbox setting --- docker/sandbox.sb | 1 - docker/test-macos.sh | 10 ++++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index e55b75a57..a706cff27 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -81,7 +81,6 @@ (allow system-socket) (allow network-outbound (path "/private/var/run/mDNSResponder") - (remote tcp4 "*:80") (remote tcp4 "*:443") (remote tcp4 "*:3128") ) diff --git a/docker/test-macos.sh b/docker/test-macos.sh index ba0d455ee..65d65ec81 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -19,7 +19,8 @@ NODE_VERSION="$(cat .nvmrc)" NODE_NAME="node-v$NODE_VERSION-darwin-x64" NODE_ARCHIVE="$NODE_NAME.tar.gz" ARTIFACTS="$PWD/.vscode-test" -VSCODE_SETTINGS="$ARTIFACTS/user-data/User/settings.json" +USER_DATA="$PWD/ud" +VSCODE_SETTINGS="$USER_DATA/User/settings.json" LSP_SETTINGS="$HOME/.sourcekit-lsp/config.json" export TMPDIR="$ARTIFACTS/tmp" @@ -30,6 +31,7 @@ function cleanup { rm "$NODE_ARCHIVE" rm -rf "$ARTIFACTS" rm -rf "$LSP_SETTINGS" + rm -rf "$USER_DATA" } trap "cleanup" EXIT @@ -50,11 +52,7 @@ PATH="$ARTIFACTS/$NODE_NAME/bin:$PATH" mkdir -p "$(dirname "$VSCODE_SETTINGS")" cat < "$VSCODE_SETTINGS" { - "swift.buildArguments": [ - "--disable-sandbox", - "-Xswiftc", - "-disable-sandbox" - ] + "swift.disableSandbox": true } EOT From 567ddf7452f72ccf4144242a61949c7677786923 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 16 Dec 2024 13:35:19 -0500 Subject: [PATCH 16/27] Disable hardware acceleration --- .vscode-test.js | 28 +++++++++++++++------------- docker/test-macos.sh | 1 + 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.vscode-test.js b/.vscode-test.js index e9c64dac4..1218d8fae 100644 --- a/.vscode-test.js +++ b/.vscode-test.js @@ -26,6 +26,19 @@ const isDebugRun = !(process.env["_"] ?? "").endsWith("node_modules/.bin/vscode- // so tests don't timeout when a breakpoint is hit const timeout = isDebugRun ? Number.MAX_SAFE_INTEGER : 3000; +const launchArgs = [ + "--disable-updates", + "--disable-crash-reporter", + "--disable-workspace-trust", + "--disable-telemetry", +]; +if (dataDir) { + launchArgs.push("--user-data-dir", dataDir); +} +if (process.platform === "darwin" && process.arch === "x64") { + launchArgs.push("--disable-gpu"); +} + module.exports = defineConfig({ tests: [ { @@ -33,12 +46,7 @@ module.exports = defineConfig({ files: ["dist/test/common.js", "dist/test/integration-tests/**/*.test.js"], version: process.env["VSCODE_VERSION"] ?? "stable", workspaceFolder: "./assets/test", - launchArgs: [ - "--disable-updates", - "--disable-crash-reporter", - "--disable-workspace-trust", - "--disable-telemetry", - ].concat(dataDir ? ["--user-data-dir", dataDir] : []), + launchArgs, mocha: { ui: "tdd", color: true, @@ -61,13 +69,7 @@ module.exports = defineConfig({ label: "unitTests", files: ["dist/test/common.js", "dist/test/unit-tests/**/*.test.js"], version: process.env["VSCODE_VERSION"] ?? "stable", - launchArgs: [ - "--disable-extensions", - "--disable-updates", - "--disable-crash-reporter", - "--disable-workspace-trust", - "--disable-telemetry", - ].concat(dataDir ? ["--user-data-dir", dataDir] : []), + launchArgs: launchArgs.concat("--disable-extensions"), mocha: { ui: "tdd", color: true, diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 65d65ec81..aad47f700 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -24,6 +24,7 @@ VSCODE_SETTINGS="$USER_DATA/User/settings.json" LSP_SETTINGS="$HOME/.sourcekit-lsp/config.json" export TMPDIR="$ARTIFACTS/tmp" +export TMP="$TMPDIR" mkdir -p "$TMPDIR" function cleanup { From 3303fbaae78298992ee99b165d034296ac7678cb Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Wed, 18 Dec 2024 14:45:21 -0500 Subject: [PATCH 17/27] Some cleanup --- docker/sandbox.sb | 24 +++++++++++--- docker/test-macos.sh | 6 ++-- src/SwiftPackage.ts | 10 ++++-- src/debugger/buildConfig.ts | 2 +- src/tasks/SwiftPluginTaskProvider.ts | 4 +-- src/tasks/SwiftTaskProvider.ts | 10 +++--- src/toolchain/BuildFlags.ts | 10 ++++-- src/utilities/utilities.ts | 3 +- .../tasks/SwiftPluginTaskProvider.test.ts | 12 ++++--- .../ui/PackageDependencyProvider.test.ts | 1 + .../LanguageClientManager.test.ts | 2 +- .../tasks/SwiftPluginTaskProvider.test.ts | 4 +-- .../tasks/SwiftTaskProvider.test.ts | 5 ++- test/unit-tests/toolchain/BuildFlags.test.ts | 32 +++++++++++-------- 14 files changed, 79 insertions(+), 46 deletions(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index a706cff27..a4adb7ec6 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -20,8 +20,6 @@ (subpath workspace) (path "/") (path "/private/etc/ssl/openssl.cnf") - (path "/Library/Preferences/com.apple.dt.Xcode.plist") - (path "/Library/Preferences/com.apple.ViewBridge.plist") (path "/dev/dtracehelper") (path "/dev/fd") (path "/dev/null") @@ -30,31 +28,46 @@ (path "/etc/shells") (path "/private/etc/shells") (path "/private/etc/ssl/cert.pem") - (path "/usr/local/share/git-core/gitconfig") - (subpath "/Users/award999/repos/sourcekit-lsp/.build") ; REMOVE + (regex #"^/Users/[^/]+/.vscode.*") (regex #"^/Users/[^/]+/.gitconfig$") + (regex #"^/Users/[^/]+/.gitignore$") + (regex #"^/Users/[^/]+/.lldbinit$") (regex #"^/Users/[^/]+/.sourcekit-lsp.*") (regex #"^/Users/[^/]+/.swiftpm.*") (regex #"^/Users/[^/]+/Library/org.swift.swiftpm.*") + (regex #"^/Users/[^/]+/Library/Developer/CommandLineTools") (regex #"^/Users/[^/]+/Library/Developer/Toolchains") (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") (regex #"^/Users/[^/]+/Library/Caches/org.swift.swiftpm.*") (regex #"^/Users/[^/]+/Library/Caches/com.apple.dt.Xcode.*") + (regex #"^/Users/[^/]+/Library/Caches/com.apple.python.*") (regex #"^/Users/[^/]+/Library/Application Support/Code.*") + (regex #"^/Users/[^/]+/Library/Application Support/Microsoft.*") + (regex #"^/Users/[^/]+/Library/Preferences/.*.plist") + (regex #"^/Users/[^/]+/Library/Python") + (regex #"^/Users/[^/]+/Library/SymbolCache/dsyms/uuids") (regex #"^/Users/[^/]+/Library/Saved Application State/com.microsoft.VSCode.savedState.*") (regex #"^/private/var/folders/[^/]+/[^/]+/.+") + (regex #"^/Library/Preferences/.*.plist") + (regex #"^/[^/]+/Library/Python") (subpath "/Library/Developer/Toolchains") + (subpath "/Library/Frameworks/UIAutomation.framework") + (subpath "/Library/Python") (subpath "/Applications/Xcode.app") (subpath "/Applications/Xcode-beta.app") (subpath "/bin") (subpath "/usr/bin") + (subpath "/usr/local/bin") (subpath "/usr/libexec/path_helper") - (regex #"^/Users/[^/]+/.vscode.*") + (subpath "/usr/local/share/git-core") + (subpath "/usr/local/share/hwtrace") ) (allow mach-lookup) +(allow mach-priv-task-port) (allow mach-register) (allow sysctl-read) +(allow system-debug) (allow ipc-posix-shm-read-data (literal "apple.shm.notification_center")) ; Write @@ -67,6 +80,7 @@ (regex #"^/Users/[^/]+/Library/org.swift.swiftpm.*") (regex #"^/Users/[^/]+/Library/Caches/org.swift.swiftpm.*") (regex #"^/Users/[^/]+/Library/Caches/com.apple.dt.Xcode.*") + (regex #"^/Users/[^/]+/Library/Caches/com.apple.python.*") (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") (regex #"^/Users/[^/]+/Library/Application Support/Code.*") (regex #"^/private/var/folders/[^/]+/[^/]+/.+") diff --git a/docker/test-macos.sh b/docker/test-macos.sh index aad47f700..89c85a402 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -15,8 +15,10 @@ set -e +platform=$([ $(arch) == "arm64" ] && echo "arm64" || echo "x64") + NODE_VERSION="$(cat .nvmrc)" -NODE_NAME="node-v$NODE_VERSION-darwin-x64" +NODE_NAME="node-v$NODE_VERSION-darwin-$platform" NODE_ARCHIVE="$NODE_NAME.tar.gz" ARTIFACTS="$PWD/.vscode-test" USER_DATA="$PWD/ud" @@ -76,4 +78,4 @@ npm run package # Need to set proxy to download VS Code export npm_config_https_proxy="$HTTPS_PROXY" -VSCODE_DATA_DIR="$PWD/ud" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file +VSCODE_DATA_DIR="$USER_DATA" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file diff --git a/src/SwiftPackage.ts b/src/SwiftPackage.ts index d645fbebc..84b3033a8 100644 --- a/src/SwiftPackage.ts +++ b/src/SwiftPackage.ts @@ -211,9 +211,13 @@ export class SwiftPackage implements PackageContents { toolchain: SwiftToolchain ): Promise { try { - let { stdout } = await execSwift(["package", "describe", "--type", "json"], toolchain, { - cwd: folder.fsPath, - }); + let { stdout } = await execSwift( + toolchain.buildFlags.withAdditionalFlags(["package", "describe", "--type", "json"]), + toolchain, + { + cwd: folder.fsPath, + } + ); // remove lines from `swift package describe` until we find a "{" while (!stdout.startsWith("{")) { const firstNewLine = stdout.indexOf("\n"); diff --git a/src/debugger/buildConfig.ts b/src/debugger/buildConfig.ts index f31ea8a2e..90d9b147b 100644 --- a/src/debugger/buildConfig.ts +++ b/src/debugger/buildConfig.ts @@ -535,7 +535,7 @@ export class TestingConfigurationFactory { } const swiftTestingArgs = [ - ...args, + ...this.ctx.workspaceContext.toolchain.buildFlags.withAdditionalFlags(args), "--enable-swift-testing", "--event-stream-version", "0", diff --git a/src/tasks/SwiftPluginTaskProvider.ts b/src/tasks/SwiftPluginTaskProvider.ts index f0339b2de..1de21d238 100644 --- a/src/tasks/SwiftPluginTaskProvider.ts +++ b/src/tasks/SwiftPluginTaskProvider.ts @@ -82,7 +82,7 @@ export class SwiftPluginTaskProvider implements vscode.TaskProvider { task.definition.command, ...task.definition.args, ]; - swiftArgs = this.workspaceContext.toolchain.buildFlags.withSwiftSDKFlags(swiftArgs); + swiftArgs = this.workspaceContext.toolchain.buildFlags.withAdditionalFlags(swiftArgs); const cwd = resolveTaskCwd(task, task.definition.cwd); const newTask = new vscode.Task( @@ -122,7 +122,7 @@ export class SwiftPluginTaskProvider implements vscode.TaskProvider { plugin.command, ...definition.args, ]; - swiftArgs = this.workspaceContext.toolchain.buildFlags.withSwiftSDKFlags(swiftArgs); + swiftArgs = this.workspaceContext.toolchain.buildFlags.withAdditionalFlags(swiftArgs); const presentation = config?.presentationOptions ?? {}; const task = new vscode.Task( diff --git a/src/tasks/SwiftTaskProvider.ts b/src/tasks/SwiftTaskProvider.ts index 50eb41516..542617500 100644 --- a/src/tasks/SwiftTaskProvider.ts +++ b/src/tasks/SwiftTaskProvider.ts @@ -271,9 +271,7 @@ export function createSwiftTask( cmdEnv: { [key: string]: string } = {} ): SwiftTask { const swift = toolchain.getToolchainExecutable("swift"); - args = toolchain.buildFlags.withSwiftSDKFlags(args); - args = toolchain.buildFlags.withSwiftPackageFlags(args); - args = toolchain.buildFlags.withDisableSandboxFlags(args); + args = toolchain.buildFlags.withAdditionalFlags(args); // Add relative path current working directory const cwd = config.cwd.fsPath; @@ -424,7 +422,8 @@ export class SwiftTaskProvider implements vscode.TaskProvider { resolveTask(task: vscode.Task, token: vscode.CancellationToken): vscode.Task { // We need to create a new Task object here. // Reusing the task parameter doesn't seem to work. - const swift = this.workspaceContext.toolchain.getToolchainExecutable("swift"); + const toolchain = this.workspaceContext.toolchain; + const swift = toolchain.getToolchainExecutable("swift"); // platform specific let platform: TaskPlatformSpecificConfig | undefined; if (process.platform === "win32") { @@ -435,7 +434,8 @@ export class SwiftTaskProvider implements vscode.TaskProvider { platform = task.definition.macos; } // get args and cwd values from either platform specific block or base - const args = platform?.args ?? task.definition.args; + let args = platform?.args ?? task.definition.args; + args = toolchain.buildFlags.withAdditionalFlags(args); const env = platform?.env ?? task.definition.env; const fullCwd = resolveTaskCwd(task, platform?.cwd ?? task.definition.cwd); diff --git a/src/toolchain/BuildFlags.ts b/src/toolchain/BuildFlags.ts index e660e15c2..90810439d 100644 --- a/src/toolchain/BuildFlags.ts +++ b/src/toolchain/BuildFlags.ts @@ -37,7 +37,7 @@ export class BuildFlags { * * @param args original commandline arguments */ - withSwiftSDKFlags(args: string[]): string[] { + private withSwiftSDKFlags(args: string[]): string[] { switch (args[0]) { case "package": { const subcommand = args.splice(0, 2).concat(this.buildPathFlags()); @@ -198,7 +198,7 @@ export class BuildFlags { * * @param args original commandline arguments */ - withDisableSandboxFlags(args: string[]): string[] { + private withDisableSandboxFlags(args: string[]): string[] { if (!configuration.disableSandbox) { return args; } @@ -217,6 +217,12 @@ export class BuildFlags { } } + withAdditionalFlags(args: string[]): string[] { + return this.withSwiftPackageFlags( + this.withDisableSandboxFlags(this.withSwiftSDKFlags(args)) + ); + } + /** * Get flags for disabling sandboxing when running SwiftPM */ diff --git a/src/utilities/utilities.ts b/src/utilities/utilities.ts index 2da26be27..d068b0cd4 100644 --- a/src/utilities/utilities.ts +++ b/src/utilities/utilities.ts @@ -187,8 +187,7 @@ export async function execSwift( swift = toolchain.getToolchainExecutable("swift"); } if (toolchain !== "default") { - args = toolchain.buildFlags.withSwiftSDKFlags(args); - args = toolchain.buildFlags.withDisableSandboxFlags(args); + args = toolchain.buildFlags.withAdditionalFlags(args); } if (Object.keys(configuration.swiftEnvironmentVariables).length > 0) { // when adding environment vars we either combine with vars passed diff --git a/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts b/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts index 47e1bc5e9..6beaef1dc 100644 --- a/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts +++ b/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts @@ -31,10 +31,12 @@ import { import { mutable } from "../../utilities/types"; import { SwiftExecution } from "../../../src/tasks/SwiftExecution"; -suite("SwiftPluginTaskProvider Test Suite", () => { +suite("SwiftPluginTaskProvider Test Suite", function () { let workspaceContext: WorkspaceContext; let folderContext: FolderContext; + this.timeout(60000); // Mostly only when running suite with .only + suite("settings plugin arguments", () => { activateExtensionForSuite({ async setup(ctx) { @@ -101,7 +103,7 @@ suite("SwiftPluginTaskProvider Test Suite", () => { const { exitCode, output } = await executeTaskAndWaitForResult(task); expect(exitCode).to.equal(0); expect(cleanOutput(output)).to.include("Hello, World!"); - }).timeout(60000); + }); test("Exit code on failure", async () => { const task = taskProvider.createSwiftPluginTask( @@ -118,7 +120,7 @@ suite("SwiftPluginTaskProvider Test Suite", () => { mutable(task.execution).command = "/definitely/not/swift"; const { exitCode, output } = await executeTaskAndWaitForResult(task); expect(exitCode, `${output}`).to.not.equal(0); - }).timeout(10000); + }); }); suite("provideTasks", () => { @@ -140,7 +142,7 @@ suite("SwiftPluginTaskProvider Test Suite", () => { await vscode.tasks.executeTask(task); const exitCode = await exitPromise; expect(exitCode).to.equal(0); - }).timeout(30000); // 30 seconds to run + }); }); suite("includes command plugin provided by tasks.json", async () => { @@ -161,7 +163,7 @@ suite("SwiftPluginTaskProvider Test Suite", () => { await vscode.tasks.executeTask(task); const exitCode = await exitPromise; expect(exitCode).to.equal(0); - }).timeout(30000); // 30 seconds to run + }); }); }); }); diff --git a/test/integration-tests/ui/PackageDependencyProvider.test.ts b/test/integration-tests/ui/PackageDependencyProvider.test.ts index f99c80197..c8d6dc9d2 100644 --- a/test/integration-tests/ui/PackageDependencyProvider.test.ts +++ b/test/integration-tests/ui/PackageDependencyProvider.test.ts @@ -40,6 +40,7 @@ suite("PackageDependencyProvider Test Suite", function () { await executeTaskAndWaitForResult((await getBuildAllTask(folderContext)) as SwiftTask); await folderContext.reload(); treeProvider = new PackageDependenciesProvider(workspaceContext); + await workspaceContext.focusFolder(folderContext); }, async teardown() { treeProvider.dispose(); diff --git a/test/unit-tests/sourcekit-lsp/LanguageClientManager.test.ts b/test/unit-tests/sourcekit-lsp/LanguageClientManager.test.ts index fd9009c02..a50da8e44 100644 --- a/test/unit-tests/sourcekit-lsp/LanguageClientManager.test.ts +++ b/test/unit-tests/sourcekit-lsp/LanguageClientManager.test.ts @@ -92,7 +92,7 @@ suite("LanguageClientManager Suite", () => { }); mockedToolchain = mockObject({ swiftVersion: new Version(6, 0, 0), - buildFlags: mockedBuildFlags, + buildFlags: mockedBuildFlags as unknown as BuildFlags, getToolchainExecutable: mockFn(s => s.withArgs("sourcekit-lsp").returns("/path/to/toolchain/bin/sourcekit-lsp") ), diff --git a/test/unit-tests/tasks/SwiftPluginTaskProvider.test.ts b/test/unit-tests/tasks/SwiftPluginTaskProvider.test.ts index 28be1b94a..762d24f3b 100644 --- a/test/unit-tests/tasks/SwiftPluginTaskProvider.test.ts +++ b/test/unit-tests/tasks/SwiftPluginTaskProvider.test.ts @@ -31,7 +31,7 @@ suite("SwiftPluginTaskProvider Unit Test Suite", () => { setup(async () => { buildFlags = mockObject({ - withSwiftSDKFlags: mockFn(s => s.callsFake(args => args)), + withAdditionalFlags: mockFn(s => s.callsFake(args => args)), }); toolchain = mockObject({ swiftVersion: new Version(6, 0, 0), @@ -192,7 +192,7 @@ suite("SwiftPluginTaskProvider Unit Test Suite", () => { }); test("includes sdk flags", async () => { - buildFlags.withSwiftSDKFlags + buildFlags.withAdditionalFlags .withArgs(match(["package", "my-plugin"])) .returns(["package", "my-plugin", "--sdk", "/path/to/sdk"]); const taskProvider = new SwiftPluginTaskProvider(instance(workspaceContext)); diff --git a/test/unit-tests/tasks/SwiftTaskProvider.test.ts b/test/unit-tests/tasks/SwiftTaskProvider.test.ts index f5a4198a3..566dfd9a1 100644 --- a/test/unit-tests/tasks/SwiftTaskProvider.test.ts +++ b/test/unit-tests/tasks/SwiftTaskProvider.test.ts @@ -49,8 +49,7 @@ suite("SwiftTaskProvider Unit Test Suite", () => { setup(async () => { buildFlags = mockObject({ - withSwiftSDKFlags: mockFn(s => s.returns([])), - withSwiftPackageFlags: mockFn(s => s.returns(s.args)), + withAdditionalFlags: mockFn(s => s.returns([])), }); toolchain = mockObject({ swiftVersion: new Version(6, 0, 0), @@ -184,7 +183,7 @@ suite("SwiftTaskProvider Unit Test Suite", () => { }); test("include sdk flags", () => { - buildFlags.withSwiftSDKFlags + buildFlags.withAdditionalFlags .withArgs(match(["build"])) .returns(["build", "--sdk", "/path/to/sdk"]); buildFlags.withSwiftPackageFlags diff --git a/test/unit-tests/toolchain/BuildFlags.test.ts b/test/unit-tests/toolchain/BuildFlags.test.ts index aba7b7f40..c069d4154 100644 --- a/test/unit-tests/toolchain/BuildFlags.test.ts +++ b/test/unit-tests/toolchain/BuildFlags.test.ts @@ -233,19 +233,19 @@ suite("BuildFlags Test Suite", () => { }); }); - suite("withSwiftSDKFlags", () => { + suite("withAdditionalFlags", () => { const sdkConfig = mockGlobalValue(configuration, "sdk"); test("package", () => { for (const sub of ["dump-symbol-graph", "diagnose-api-breaking-changes", "resolve"]) { sdkConfig.setValue(""); expect( - buildFlags.withSwiftSDKFlags(["package", sub, "--disable-sandbox"]) + buildFlags.withAdditionalFlags(["package", sub, "--disable-sandbox"]) ).to.deep.equal(["package", sub, "--disable-sandbox"]); sdkConfig.setValue("/some/full/path/to/sdk"); expect( - buildFlags.withSwiftSDKFlags(["package", sub, "--disable-sandbox"]) + buildFlags.withAdditionalFlags(["package", sub, "--disable-sandbox"]) ).to.deep.equal([ "package", sub, @@ -257,24 +257,24 @@ suite("BuildFlags Test Suite", () => { sdkConfig.setValue(""); expect( - buildFlags.withSwiftSDKFlags(["package", "init", "--disable-sandbox"]) + buildFlags.withAdditionalFlags(["package", "init", "--disable-sandbox"]) ).to.deep.equal(["package", "init", "--disable-sandbox"]); sdkConfig.setValue("/some/full/path/to/sdk"); expect( - buildFlags.withSwiftSDKFlags(["package", "init", "--disable-sandbox"]) + buildFlags.withAdditionalFlags(["package", "init", "--disable-sandbox"]) ).to.deep.equal(["package", "init", "--disable-sandbox"]); }); test("build", () => { sdkConfig.setValue(""); expect( - buildFlags.withSwiftSDKFlags(["build", "--target", "MyExecutable"]) + buildFlags.withAdditionalFlags(["build", "--target", "MyExecutable"]) ).to.deep.equal(["build", "--target", "MyExecutable"]); sdkConfig.setValue("/some/full/path/to/sdk"); expect( - buildFlags.withSwiftSDKFlags(["build", "--target", "MyExecutable"]) + buildFlags.withAdditionalFlags(["build", "--target", "MyExecutable"]) ).to.deep.equal([ "build", "--sdk", @@ -287,12 +287,12 @@ suite("BuildFlags Test Suite", () => { test("run", () => { sdkConfig.setValue(""); expect( - buildFlags.withSwiftSDKFlags(["run", "--product", "MyExecutable"]) + buildFlags.withAdditionalFlags(["run", "--product", "MyExecutable"]) ).to.deep.equal(["run", "--product", "MyExecutable"]); sdkConfig.setValue("/some/full/path/to/sdk"); expect( - buildFlags.withSwiftSDKFlags(["run", "--product", "MyExecutable"]) + buildFlags.withAdditionalFlags(["run", "--product", "MyExecutable"]) ).to.deep.equal([ "run", "--sdk", @@ -304,14 +304,14 @@ suite("BuildFlags Test Suite", () => { test("test", () => { sdkConfig.setValue(""); - expect(buildFlags.withSwiftSDKFlags(["test", "--filter", "MyTests"])).to.deep.equal([ + expect(buildFlags.withAdditionalFlags(["test", "--filter", "MyTests"])).to.deep.equal([ "test", "--filter", "MyTests", ]); sdkConfig.setValue("/some/full/path/to/sdk"); - expect(buildFlags.withSwiftSDKFlags(["test", "--filter", "MyTests"])).to.deep.equal([ + expect(buildFlags.withAdditionalFlags(["test", "--filter", "MyTests"])).to.deep.equal([ "test", "--sdk", "/some/full/path/to/sdk", @@ -322,10 +322,16 @@ suite("BuildFlags Test Suite", () => { test("other commands", () => { sdkConfig.setValue(""); - expect(buildFlags.withSwiftSDKFlags(["help", "repl"])).to.deep.equal(["help", "repl"]); + expect(buildFlags.withAdditionalFlags(["help", "repl"])).to.deep.equal([ + "help", + "repl", + ]); sdkConfig.setValue("/some/full/path/to/sdk"); - expect(buildFlags.withSwiftSDKFlags(["help", "repl"])).to.deep.equal(["help", "repl"]); + expect(buildFlags.withAdditionalFlags(["help", "repl"])).to.deep.equal([ + "help", + "repl", + ]); }); }); From 5d15cd36c1e793adb7fb218aeec3043533c8aa8d Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 13 Jan 2025 13:40:21 -0500 Subject: [PATCH 18/27] Fix some local failures --- assets/test/.vscode/tasks.json | 1 + docker/sandbox.sb | 19 +++-- docker/test-macos.sh | 6 ++ src/commands/dependencies/unedit.ts | 7 +- src/commands/dependencies/useLocal.ts | 8 ++- src/commands/resetPackage.ts | 5 +- src/tasks/SwiftTaskProvider.ts | 3 +- test/integration-tests/extension.test.ts | 5 +- .../tasks/SwiftPluginTaskProvider.test.ts | 39 ++++++---- .../TestExplorerIntegration.test.ts | 1 + .../utilities/testutilities.ts | 15 +++- .../tasks/SwiftTaskProvider.test.ts | 2 +- test/unit-tests/toolchain/BuildFlags.test.ts | 72 +++++++++++++++++-- 13 files changed, 147 insertions(+), 36 deletions(-) diff --git a/assets/test/.vscode/tasks.json b/assets/test/.vscode/tasks.json index d91e6ff96..406dec54f 100644 --- a/assets/test/.vscode/tasks.json +++ b/assets/test/.vscode/tasks.json @@ -35,6 +35,7 @@ "command": "command_plugin", "args": ["--foo"], "cwd": "command-plugin", + "disableSandbox": true, "problemMatcher": [ "$swiftc" ], diff --git a/docker/sandbox.sb b/docker/sandbox.sb index a4adb7ec6..1c88075a6 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -97,19 +97,28 @@ (path "/private/var/run/mDNSResponder") (remote tcp4 "*:443") (remote tcp4 "*:3128") + ; (local tcp4 "*:*") ; CodeLLDB ) -; Open VSCode window -(allow file-ioctl) -; (allow file-issue-extension) -(allow iokit-open-user-client) -; (allow system-fsctl) ; HFSIOC_SET_HOTFILE_STATE +; CodeLLDB +; (allow network-bind +; (local tcp4 "*:*") +; ) +; (allow network-inbound +; (local tcp4 "*:*") +; ) ; VSCode sockets (allow network* (param-regex "workspace" "/ud/1\.[0-9]+-main\.sock") ) +; Open VSCode window +(allow file-ioctl) +; (allow file-issue-extension) +(allow iokit-open-user-client) +; (allow system-fsctl) ; HFSIOC_SET_HOTFILE_STATE + ; VSCode terminal (allow pseudo-tty) diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 89c85a402..0f2f085a7 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -37,6 +37,7 @@ function cleanup { rm -rf "$USER_DATA" } trap "cleanup" EXIT +trap "cleanup" INT curl -O "https://nodejs.org/dist/v$NODE_VERSION/$NODE_ARCHIVE" curl -O "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt" @@ -76,6 +77,11 @@ npm run lint npm run format npm run package +# Ignore hooks when running locally for development +export GIT_CONFIG_COUNT=1 +export GIT_CONFIG_KEY_0="core.hookspath" +export GIT_CONFIG_VALUE_0="$PWD/hooks" + # Need to set proxy to download VS Code export npm_config_https_proxy="$HTTPS_PROXY" VSCODE_DATA_DIR="$USER_DATA" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file diff --git a/src/commands/dependencies/unedit.ts b/src/commands/dependencies/unedit.ts index 521d71afd..720709edd 100644 --- a/src/commands/dependencies/unedit.ts +++ b/src/commands/dependencies/unedit.ts @@ -44,7 +44,12 @@ async function uneditFolderDependency( ) { try { const uneditOperation = new SwiftExecOperation( - ["package", "unedit", ...args, identifier], + ctx.toolchain.buildFlags.withAdditionalFlags([ + "package", + "unedit", + ...args, + identifier, + ]), folder, `Finish editing ${identifier}`, { showStatusItem: true, checkAlreadyRunning: false, log: "Unedit" }, diff --git a/src/commands/dependencies/useLocal.ts b/src/commands/dependencies/useLocal.ts index e108cee71..c75a3c6c2 100644 --- a/src/commands/dependencies/useLocal.ts +++ b/src/commands/dependencies/useLocal.ts @@ -50,7 +50,13 @@ export async function useLocalDependency( folder = folders[0]; } const task = createSwiftTask( - ["package", "edit", "--path", folder.fsPath, identifier], + ctx.toolchain.buildFlags.withAdditionalFlags([ + "package", + "edit", + "--path", + folder.fsPath, + identifier, + ]), "Edit Package Dependency", { scope: currentFolder.workspaceFolder, diff --git a/src/commands/resetPackage.ts b/src/commands/resetPackage.ts index 6d621dee2..84c0c9141 100644 --- a/src/commands/resetPackage.ts +++ b/src/commands/resetPackage.ts @@ -35,7 +35,10 @@ export async function resetPackage(ctx: WorkspaceContext) { */ export async function folderResetPackage(folderContext: FolderContext) { const task = createSwiftTask( - ["package", "reset"], + folderContext.workspaceContext.toolchain.buildFlags.withAdditionalFlags([ + "package", + "reset", + ]), "Reset Package Dependencies", { cwd: folderContext.folder, diff --git a/src/tasks/SwiftTaskProvider.ts b/src/tasks/SwiftTaskProvider.ts index 542617500..77bd93689 100644 --- a/src/tasks/SwiftTaskProvider.ts +++ b/src/tasks/SwiftTaskProvider.ts @@ -434,8 +434,7 @@ export class SwiftTaskProvider implements vscode.TaskProvider { platform = task.definition.macos; } // get args and cwd values from either platform specific block or base - let args = platform?.args ?? task.definition.args; - args = toolchain.buildFlags.withAdditionalFlags(args); + const args = platform?.args ?? task.definition.args; const env = platform?.env ?? task.definition.env; const fullCwd = resolveTaskCwd(task, platform?.cwd ?? task.definition.cwd); diff --git a/test/integration-tests/extension.test.ts b/test/integration-tests/extension.test.ts index b9dad4080..ef63daaf6 100644 --- a/test/integration-tests/extension.test.ts +++ b/test/integration-tests/extension.test.ts @@ -17,6 +17,7 @@ import { WorkspaceContext } from "../../src/WorkspaceContext"; import { getBuildAllTask } from "../../src/tasks/SwiftTaskProvider"; import { SwiftExecution } from "../../src/tasks/SwiftExecution"; import { activateExtensionForTest } from "./utilities/testutilities"; +import { expect } from "chai"; suite("Extension Test Suite", () => { let workspaceContext: WorkspaceContext; @@ -48,8 +49,8 @@ suite("Extension Test Suite", () => { assert(folder); const buildAllTask = await getBuildAllTask(folder); const execution = buildAllTask.execution as SwiftExecution; - assert.strictEqual(buildAllTask.definition.type, "swift"); - assert.strictEqual(buildAllTask.name, "swift: Build All (defaultPackage)"); + expect(buildAllTask.definition.type).to.equal("swift"); + expect(buildAllTask.name).to.include("Build All (defaultPackage)"); for (const arg of ["build", "--build-tests", "--verbose"]) { assert(execution?.args.find(item => item === arg)); } diff --git a/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts b/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts index 6beaef1dc..85b17112a 100644 --- a/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts +++ b/test/integration-tests/tasks/SwiftPluginTaskProvider.test.ts @@ -30,6 +30,7 @@ import { } from "../../utilities/tasks"; import { mutable } from "../../utilities/types"; import { SwiftExecution } from "../../../src/tasks/SwiftExecution"; +import { SwiftTask } from "../../../src/tasks/SwiftTaskProvider"; suite("SwiftPluginTaskProvider Test Suite", function () { let workspaceContext: WorkspaceContext; @@ -61,17 +62,20 @@ suite("SwiftPluginTaskProvider Test Suite", function () { const tasks = await vscode.tasks.fetchTasks({ type: "swift-plugin" }); const task = tasks.find(t => t.name === "command-plugin"); const swiftExecution = task?.execution as SwiftExecution; - assert.deepEqual(swiftExecution.args, [ - "package", - "--disable-sandbox", - "--allow-writing-to-package-directory", - "--allow-writing-to-directory", - "/foo", - "/bar", - "--allow-network-connections", - "all", - "command_plugin", - ]); + assert.deepEqual( + swiftExecution.args, + workspaceContext.toolchain.buildFlags.withAdditionalFlags([ + "package", + "--disable-sandbox", + "--allow-writing-to-package-directory", + "--allow-writing-to-directory", + "/foo", + "/bar", + "--allow-network-connections", + "all", + "command_plugin", + ]) + ); }); }); @@ -125,15 +129,20 @@ suite("SwiftPluginTaskProvider Test Suite", function () { suite("provideTasks", () => { suite("includes command plugin provided by the extension", async () => { - let task: vscode.Task | undefined; + let task: SwiftTask | undefined; setup(async () => { const tasks = await vscode.tasks.fetchTasks({ type: "swift-plugin" }); - task = tasks.find(t => t.name === "command-plugin"); + task = tasks.find(t => t.name === "command-plugin") as SwiftTask; }); test("provides", () => { - expect(task?.detail).to.equal("swift package command_plugin"); + expect(task?.execution.args).to.deep.equal( + workspaceContext.toolchain.buildFlags.withAdditionalFlags([ + "package", + "command_plugin", + ]) + ); }); test("executes", async () => { @@ -154,7 +163,7 @@ suite("SwiftPluginTaskProvider Test Suite", function () { }); test("provides", () => { - expect(task?.detail).to.equal("swift package command_plugin --foo"); + expect(task?.detail).to.include("swift package command_plugin --foo"); }); test("executes", async () => { diff --git a/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts b/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts index 863588ecf..e04389ec2 100644 --- a/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts +++ b/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts @@ -71,6 +71,7 @@ suite("Test Explorer Suite", function () { // which starts searching the workspace for tests. await waitForTestExplorerReady(testExplorer); }, + requiresLSP: true, }); suite("Debugging", function () { diff --git a/test/integration-tests/utilities/testutilities.ts b/test/integration-tests/utilities/testutilities.ts index 806d30bb6..1a36f27bb 100644 --- a/test/integration-tests/utilities/testutilities.ts +++ b/test/integration-tests/utilities/testutilities.ts @@ -22,6 +22,7 @@ import { FolderContext } from "../../../src/FolderContext"; import { waitForNoRunningTasks } from "../../utilities/tasks"; import { closeAllEditors } from "../../utilities/commands"; import { isDeepStrictEqual } from "util"; +import { Version } from "../../../src/utilities/version"; function getRootWorkspaceFolder(): vscode.WorkspaceFolder { const result = vscode.workspace.workspaceFolders?.at(0); @@ -65,7 +66,8 @@ const extensionBootstrapper = (() => { | undefined, after: Mocha.HookFunction, teardown: ((this: Mocha.Context) => Promise) | undefined, - testAssets?: string[] + testAssets?: string[], + requiresLSP: boolean = false ) { let workspaceContext: WorkspaceContext | undefined; let autoTeardown: void | (() => Promise); @@ -76,6 +78,13 @@ const extensionBootstrapper = (() => { this.currentTest, testAssets ?? ["defaultPackage"] ); + if ( + process.platform === "darwin" && + workspaceContext.toolchain.swiftVersion.isLessThan(new Version(6, 1, 0)) && + requiresLSP + ) { + this.skip(); + } if (!setup) { return; } @@ -192,13 +201,15 @@ const extensionBootstrapper = (() => { ) => Promise<(() => Promise) | void>; teardown?: (this: Mocha.Context) => Promise; testAssets?: string[]; + requiresLSP?: boolean; }) { testRunnerSetup( mocha.before, config?.setup, mocha.after, config?.teardown, - config?.testAssets + config?.testAssets, + config?.requiresLSP ); }, diff --git a/test/unit-tests/tasks/SwiftTaskProvider.test.ts b/test/unit-tests/tasks/SwiftTaskProvider.test.ts index 566dfd9a1..9c33d7d38 100644 --- a/test/unit-tests/tasks/SwiftTaskProvider.test.ts +++ b/test/unit-tests/tasks/SwiftTaskProvider.test.ts @@ -49,7 +49,7 @@ suite("SwiftTaskProvider Unit Test Suite", () => { setup(async () => { buildFlags = mockObject({ - withAdditionalFlags: mockFn(s => s.returns([])), + withAdditionalFlags: mockFn(s => s.callsFake(arr => arr)), }); toolchain = mockObject({ swiftVersion: new Version(6, 0, 0), diff --git a/test/unit-tests/toolchain/BuildFlags.test.ts b/test/unit-tests/toolchain/BuildFlags.test.ts index c069d4154..0d57cade7 100644 --- a/test/unit-tests/toolchain/BuildFlags.test.ts +++ b/test/unit-tests/toolchain/BuildFlags.test.ts @@ -24,6 +24,8 @@ suite("BuildFlags Test Suite", () => { let mockedToolchain: MockedObject; let buildFlags: BuildFlags; + const sandboxConfig = mockGlobalValue(configuration, "disableSandbox"); + suiteSetup(async () => { mockedToolchain = mockObject({ swiftVersion: new Version(6, 0, 0), @@ -33,6 +35,7 @@ suite("BuildFlags Test Suite", () => { setup(() => { mockedPlatform.setValue("darwin"); + sandboxConfig.setValue(false); }); suite("getDarwinTarget", () => { @@ -256,14 +259,25 @@ suite("BuildFlags Test Suite", () => { } sdkConfig.setValue(""); - expect( - buildFlags.withAdditionalFlags(["package", "init", "--disable-sandbox"]) - ).to.deep.equal(["package", "init", "--disable-sandbox"]); + expect(buildFlags.withAdditionalFlags(["package", "init"])).to.deep.equal([ + "package", + "init", + ]); sdkConfig.setValue("/some/full/path/to/sdk"); - expect( - buildFlags.withAdditionalFlags(["package", "init", "--disable-sandbox"]) - ).to.deep.equal(["package", "init", "--disable-sandbox"]); + expect(buildFlags.withAdditionalFlags(["package", "init"])).to.deep.equal([ + "package", + "init", + ]); + + sandboxConfig.setValue(true); + expect(buildFlags.withAdditionalFlags(["package", "init"])).to.deep.equal([ + "package", + "--disable-sandbox", + "-Xswiftc", + "-disable-sandbox", + "init", + ]); }); test("build", () => { @@ -282,6 +296,20 @@ suite("BuildFlags Test Suite", () => { "--target", "MyExecutable", ]); + + sandboxConfig.setValue(true); + expect( + buildFlags.withAdditionalFlags(["build", "--target", "MyExecutable"]) + ).to.deep.equal([ + "build", + "--sdk", + "/some/full/path/to/sdk", + "--target", + "MyExecutable", + "--disable-sandbox", + "-Xswiftc", + "-disable-sandbox", + ]); }); test("run", () => { @@ -300,6 +328,20 @@ suite("BuildFlags Test Suite", () => { "--product", "MyExecutable", ]); + + sandboxConfig.setValue(true); + expect( + buildFlags.withAdditionalFlags(["run", "--product", "MyExecutable"]) + ).to.deep.equal([ + "run", + "--sdk", + "/some/full/path/to/sdk", + "--product", + "MyExecutable", + "--disable-sandbox", + "-Xswiftc", + "-disable-sandbox", + ]); }); test("test", () => { @@ -318,6 +360,18 @@ suite("BuildFlags Test Suite", () => { "--filter", "MyTests", ]); + + sandboxConfig.setValue(true); + expect(buildFlags.withAdditionalFlags(["test", "--filter", "MyTests"])).to.deep.equal([ + "test", + "--sdk", + "/some/full/path/to/sdk", + "--filter", + "MyTests", + "--disable-sandbox", + "-Xswiftc", + "-disable-sandbox", + ]); }); test("other commands", () => { @@ -332,6 +386,12 @@ suite("BuildFlags Test Suite", () => { "help", "repl", ]); + + sandboxConfig.setValue(true); + expect(buildFlags.withAdditionalFlags(["help", "repl"])).to.deep.equal([ + "help", + "repl", + ]); }); }); From 4d224a0eb9308f2e2d99bf1a29c5f18f137eb49d Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 13 Jan 2025 13:49:36 -0500 Subject: [PATCH 19/27] Add comment --- test/integration-tests/utilities/testutilities.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/integration-tests/utilities/testutilities.ts b/test/integration-tests/utilities/testutilities.ts index 1a36f27bb..b4959814c 100644 --- a/test/integration-tests/utilities/testutilities.ts +++ b/test/integration-tests/utilities/testutilities.ts @@ -78,6 +78,8 @@ const extensionBootstrapper = (() => { this.currentTest, testAssets ?? ["defaultPackage"] ); + // Need the `disableSandbox` configuration which is only in 6.1 + // https://github.com/swiftlang/sourcekit-lsp/commit/7e2d12a7a0d184cc820ae6af5ddbb8aa18b1501c if ( process.platform === "darwin" && workspaceContext.toolchain.swiftVersion.isLessThan(new Version(6, 1, 0)) && From 11db1981370ffaa28e8c788f5110d32a132ed401 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 13 Jan 2025 13:49:56 -0500 Subject: [PATCH 20/27] Fix soundness error --- docker/sandbox.sb | 1 + docker/test-macos.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 1c88075a6..e607a46f3 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -58,6 +58,7 @@ (subpath "/bin") (subpath "/usr/bin") (subpath "/usr/local/bin") + (subpath "/usr/lib/swift") (subpath "/usr/libexec/path_helper") (subpath "/usr/local/share/git-core") (subpath "/usr/local/share/hwtrace") diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 0f2f085a7..380635ac4 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -15,7 +15,7 @@ set -e -platform=$([ $(arch) == "arm64" ] && echo "arm64" || echo "x64") +platform=$([ "$(arch)" == "arm64" ] && echo "arm64" || echo "x64") NODE_VERSION="$(cat .nvmrc)" NODE_NAME="node-v$NODE_VERSION-darwin-$platform" From 5c44712d22f575412eeefb66c6b2ed39e4ad1de5 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 13 Jan 2025 14:04:20 -0500 Subject: [PATCH 21/27] Fix Swift rpath lookup --- .vscode-test.js | 4 ++++ docker/sandbox.sb | 22 +++++++++++++++++-- docker/test-macos.sh | 10 ++++++++- src/SwiftPackage.ts | 10 +++------ src/configuration.ts | 7 ++++++ src/extension.ts | 8 ++++--- src/toolchain/toolchain.ts | 5 +---- src/utilities/utilities.ts | 20 ++++++++++------- test/integration-tests/SwiftSnippet.test.ts | 1 + test/integration-tests/commands/build.test.ts | 1 + test/integration-tests/debugger/lldb.test.ts | 1 + test/integration-tests/extension.test.ts | 10 +++++---- .../TestExplorerIntegration.test.ts | 1 + .../utilities/testutilities.ts | 17 +++++++++++--- 14 files changed, 85 insertions(+), 32 deletions(-) diff --git a/.vscode-test.js b/.vscode-test.js index 1218d8fae..d3c219675 100644 --- a/.vscode-test.js +++ b/.vscode-test.js @@ -31,6 +31,10 @@ const launchArgs = [ "--disable-crash-reporter", "--disable-workspace-trust", "--disable-telemetry", + "--disable-extension", + "vscode.github", + "--disable-extension", + "vscode.github-authentication", ]; if (dataDir) { launchArgs.push("--user-data-dir", dataDir); diff --git a/docker/sandbox.sb b/docker/sandbox.sb index e607a46f3..3170bffda 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -3,7 +3,7 @@ (deny default) ; Get fonts -(import "system.sb") +; (import "system.sb") ; Helpers (define (param-regex param-name param-relative-regex) @@ -50,18 +50,33 @@ (regex #"^/private/var/folders/[^/]+/[^/]+/.+") (regex #"^/Library/Preferences/.*.plist") (regex #"^/[^/]+/Library/Python") + (subpath "/Library/Developer/CommandLineTools") (subpath "/Library/Developer/Toolchains") (subpath "/Library/Frameworks/UIAutomation.framework") (subpath "/Library/Python") + (subpath "/System/Library/Perl") (subpath "/Applications/Xcode.app") (subpath "/Applications/Xcode-beta.app") (subpath "/bin") (subpath "/usr/bin") (subpath "/usr/local/bin") - (subpath "/usr/lib/swift") (subpath "/usr/libexec/path_helper") (subpath "/usr/local/share/git-core") (subpath "/usr/local/share/hwtrace") + + (regex #".*/LLDB.framework/.*") + (regex #".*/Python3.framework/.*") + (regex #".*/branch-main/.*") + (regex #".*/usr/lib/swift/.*") + ; (regex #".*/Frameworks/.*") + ; (regex #".*/PrivateFrameworks/.*") + + ; (subpath "/System/Volumes/Preboot") + ; (subpath "/System/Volumes") + ; (subpath "/usr/lib") + ; (subpath "/Users/ec2-user") + ; (subpath "/Library/Developer/CommandLineTool") + ; (subpath "/") ) (allow mach-lookup) @@ -84,8 +99,11 @@ (regex #"^/Users/[^/]+/Library/Caches/com.apple.python.*") (regex #"^/Users/[^/]+/Library/Developer/Xcode/DerivedData.*") (regex #"^/Users/[^/]+/Library/Application Support/Code.*") + (regex #"^/Users/[^/]+/Library/Application Support/Microsoft.*") (regex #"^/private/var/folders/[^/]+/[^/]+/.+") (regex #"^/Users/[^/]+/.vscode.*") + + (regex #".*/branch-main.*") ) ; Execute diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 380635ac4..190cd7624 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -56,7 +56,13 @@ PATH="$ARTIFACTS/$NODE_NAME/bin:$PATH" mkdir -p "$(dirname "$VSCODE_SETTINGS")" cat < "$VSCODE_SETTINGS" { - "swift.disableSandbox": true + "swift.path": "/Users/ec2-user/jenkins/workspace/pr-vscode-swift-macos/branch-main/latest_toolchain/usr/bin" + "swift.disableSandbox": true, + "swift.debugger.disable": true, + "swift.debugger.path": "/Users/ec2-user/jenkins/workspace/pr-vscode-swift-macos/branch-main/latest_toolchain/usr/bin/lldb-dap", + "lldb.library": "/Applications/Xcode-beta.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/LLDB", + "lldb.launch.expressions": "native", + "lldb.suppressUpdateNotifications": true } EOT @@ -84,4 +90,6 @@ export GIT_CONFIG_VALUE_0="$PWD/hooks" # Need to set proxy to download VS Code export npm_config_https_proxy="$HTTPS_PROXY" + +# export DEVELOPER_DIR=/Applications/Xcode-beta.app VSCODE_DATA_DIR="$USER_DATA" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file diff --git a/src/SwiftPackage.ts b/src/SwiftPackage.ts index 84b3033a8..d645fbebc 100644 --- a/src/SwiftPackage.ts +++ b/src/SwiftPackage.ts @@ -211,13 +211,9 @@ export class SwiftPackage implements PackageContents { toolchain: SwiftToolchain ): Promise { try { - let { stdout } = await execSwift( - toolchain.buildFlags.withAdditionalFlags(["package", "describe", "--type", "json"]), - toolchain, - { - cwd: folder.fsPath, - } - ); + let { stdout } = await execSwift(["package", "describe", "--type", "json"], toolchain, { + cwd: folder.fsPath, + }); // remove lines from `swift package describe` until we find a "{" while (!stdout.startsWith("{")) { const firstNewLine = stdout.indexOf("\n"); diff --git a/src/configuration.ts b/src/configuration.ts index f50979064..0f24aa1d3 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -51,6 +51,8 @@ export interface DebuggerConfiguration { readonly useDebugAdapterFromToolchain: boolean; /** Return path to debug adapter */ readonly customDebugAdapterPath: string; + /** Whether or not to disable setting up the debugger */ + readonly disable: boolean; } /** workspace folder configuration */ @@ -199,6 +201,11 @@ const configuration = { get customDebugAdapterPath(): string { return vscode.workspace.getConfiguration("swift.debugger").get("path", ""); }, + get disable(): boolean { + return vscode.workspace + .getConfiguration("swift.debugger") + .get("disable", false); + }, }; }, /** Files and directories to exclude from the code coverage. */ diff --git a/src/extension.ts b/src/extension.ts index 612ea9e3b..c7b85ae9e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -38,7 +38,7 @@ import { showReloadExtensionNotification } from "./ui/ReloadExtension"; import { checkAndWarnAboutWindowsSymlinks } from "./ui/win32"; import { SwiftEnvironmentVariablesManager, SwiftTerminalProfileProvider } from "./terminal"; import { resolveFolderDependencies } from "./commands/dependencies/resolve"; -import { SelectedXcodeWatcher } from "./toolchain/SelectedXcodeWatcher"; +// import { SelectedXcodeWatcher } from "./toolchain/SelectedXcodeWatcher"; /** * External API as exposed by the extension. Can be queried by other extensions @@ -128,8 +128,10 @@ export async function activate(context: vscode.ExtensionContext): Promise { const workspaceContext = await WorkspaceContext.create(context, outputChannel, toolchain); context.subscriptions.push(...commands.register(workspaceContext)); context.subscriptions.push(workspaceContext); - context.subscriptions.push(registerDebugger(workspaceContext)); - context.subscriptions.push(new SelectedXcodeWatcher(outputChannel)); + if (!configuration.debugger.disable) { + context.subscriptions.push(registerDebugger(workspaceContext)); + } + // context.subscriptions.push(new SelectedXcodeWatcher(outputChannel)); // listen for workspace folder changes and active text editor changes workspaceContext.setupEventListeners(); diff --git a/src/toolchain/toolchain.ts b/src/toolchain/toolchain.ts index 10ed792a0..9ee7b3938 100644 --- a/src/toolchain/toolchain.ts +++ b/src/toolchain/toolchain.ts @@ -813,10 +813,7 @@ export class SwiftToolchain { private static async getSwiftTargetInfo(): Promise { try { try { - const { stdout } = await execSwift( - ["-print-target-info", ...BuildFlags.disableSandboxFlags()], - "default" - ); + const { stdout } = await execSwift(["-print-target-info"], "default"); const targetInfo = JSON.parse(stdout.trimEnd()) as SwiftTargetInfo; if (targetInfo.compilerVersion) { return targetInfo; diff --git a/src/utilities/utilities.ts b/src/utilities/utilities.ts index d068b0cd4..6aec5ccc8 100644 --- a/src/utilities/utilities.ts +++ b/src/utilities/utilities.ts @@ -109,14 +109,18 @@ export async function execFile( options.env = { ...(options.env ?? process.env), ...runtimeEnv }; } } - return new Promise<{ stdout: string; stderr: string }>((resolve, reject) => - cp.execFile(executable, args, options, (error, stdout, stderr) => { - if (error) { - reject(new ExecFileError(error, stdout, stderr)); - } - resolve({ stdout, stderr }); - }) - ); + return new Promise<{ stdout: string; stderr: string }>((resolve, reject) => { + try { + cp.execFile(executable, args, options, (error, stdout, stderr) => { + if (error) { + reject(new ExecFileError(error, stdout, stderr)); + } + resolve({ stdout, stderr }); + }); + } catch (e) { + reject(e); + } + }); } export async function execFileStreamOutput( diff --git a/test/integration-tests/SwiftSnippet.test.ts b/test/integration-tests/SwiftSnippet.test.ts index 72c594b7d..55918f60b 100644 --- a/test/integration-tests/SwiftSnippet.test.ts +++ b/test/integration-tests/SwiftSnippet.test.ts @@ -62,6 +62,7 @@ suite("SwiftSnippet Test Suite @slow", function () { // Set a breakpoint vscode.debug.addBreakpoints(breakpoints); }, + requiresDebugger: true, }); suiteTeardown(async () => { diff --git a/test/integration-tests/commands/build.test.ts b/test/integration-tests/commands/build.test.ts index 59d6b1201..71b9e28bc 100644 --- a/test/integration-tests/commands/build.test.ts +++ b/test/integration-tests/commands/build.test.ts @@ -56,6 +56,7 @@ suite("Build Commands @slow", function () { async teardown() { await vscode.commands.executeCommand(Workbench.ACTION_CLOSEALLEDITORS); }, + requiresDebugger: true, }); test("Swift: Run Build", async () => { diff --git a/test/integration-tests/debugger/lldb.test.ts b/test/integration-tests/debugger/lldb.test.ts index aa070721c..2a66f8b2e 100644 --- a/test/integration-tests/debugger/lldb.test.ts +++ b/test/integration-tests/debugger/lldb.test.ts @@ -34,6 +34,7 @@ suite("lldb contract test suite", () => { } workspaceContext = ctx; }, + requiresDebugger: true, }); test("getLldbProcess Contract Test, make sure the command returns", async () => { diff --git a/test/integration-tests/extension.test.ts b/test/integration-tests/extension.test.ts index ef63daaf6..346b34510 100644 --- a/test/integration-tests/extension.test.ts +++ b/test/integration-tests/extension.test.ts @@ -19,7 +19,8 @@ import { SwiftExecution } from "../../src/tasks/SwiftExecution"; import { activateExtensionForTest } from "./utilities/testutilities"; import { expect } from "chai"; -suite("Extension Test Suite", () => { +suite("Extension Test Suite", function () { + this.timeout(60000); let workspaceContext: WorkspaceContext; activateExtensionForTest({ @@ -42,7 +43,8 @@ suite("Extension Test Suite", () => { }).timeout(5000);*/ }); - suite("Workspace", () => { + suite("Workspace", function () { + this.timeout(60000); /** Verify tasks.json is being loaded */ test("Tasks.json", async () => { const folder = workspaceContext.folders.find(f => f.name === "test/defaultPackage"); @@ -54,6 +56,6 @@ suite("Extension Test Suite", () => { for (const arg of ["build", "--build-tests", "--verbose"]) { assert(execution?.args.find(item => item === arg)); } - }); + }).timeout(60000); }); -}).timeout(15000); +}); diff --git a/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts b/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts index e04389ec2..badb3a1e6 100644 --- a/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts +++ b/test/integration-tests/testexplorer/TestExplorerIntegration.test.ts @@ -72,6 +72,7 @@ suite("Test Explorer Suite", function () { await waitForTestExplorerReady(testExplorer); }, requiresLSP: true, + requiresDebugger: true, }); suite("Debugging", function () { diff --git a/test/integration-tests/utilities/testutilities.ts b/test/integration-tests/utilities/testutilities.ts index b4959814c..3bac12678 100644 --- a/test/integration-tests/utilities/testutilities.ts +++ b/test/integration-tests/utilities/testutilities.ts @@ -23,6 +23,7 @@ import { waitForNoRunningTasks } from "../../utilities/tasks"; import { closeAllEditors } from "../../utilities/commands"; import { isDeepStrictEqual } from "util"; import { Version } from "../../../src/utilities/version"; +import configuration from "../../../src/configuration"; function getRootWorkspaceFolder(): vscode.WorkspaceFolder { const result = vscode.workspace.workspaceFolders?.at(0); @@ -67,7 +68,8 @@ const extensionBootstrapper = (() => { after: Mocha.HookFunction, teardown: ((this: Mocha.Context) => Promise) | undefined, testAssets?: string[], - requiresLSP: boolean = false + requiresLSP: boolean = false, + requiresDebugger: boolean = false ) { let workspaceContext: WorkspaceContext | undefined; let autoTeardown: void | (() => Promise); @@ -87,6 +89,9 @@ const extensionBootstrapper = (() => { ) { this.skip(); } + if (requiresDebugger && configuration.debugger.disable) { + this.skip(); + } if (!setup) { return; } @@ -204,6 +209,7 @@ const extensionBootstrapper = (() => { teardown?: (this: Mocha.Context) => Promise; testAssets?: string[]; requiresLSP?: boolean; + requiresDebugger?: boolean; }) { testRunnerSetup( mocha.before, @@ -211,7 +217,8 @@ const extensionBootstrapper = (() => { mocha.after, config?.teardown, config?.testAssets, - config?.requiresLSP + config?.requiresLSP, + config?.requiresDebugger ); }, @@ -222,13 +229,17 @@ const extensionBootstrapper = (() => { ) => Promise<(() => Promise) | void>; teardown?: (this: Mocha.Context) => Promise; testAssets?: string[]; + requiresLSP?: boolean; + requiresDebugger?: boolean; }) { testRunnerSetup( mocha.beforeEach, config?.setup, mocha.afterEach, config?.teardown, - config?.testAssets + config?.testAssets, + config?.requiresLSP, + config?.requiresDebugger ); }, }; From b5a7fd38a16522ee329a2320a85342ea484cff92 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Fri, 7 Feb 2025 13:56:10 -0500 Subject: [PATCH 22/27] Longer timeouts since this build machine seems slower --- test/integration-tests/BackgroundCompilation.test.ts | 2 +- test/integration-tests/DiagnosticsManager.test.ts | 6 +++--- test/integration-tests/SwiftSnippet.test.ts | 2 +- test/integration-tests/commands/build.test.ts | 2 +- .../language/LanguageClientIntegration.test.ts | 2 +- test/integration-tests/ui/PackageDependencyProvider.test.ts | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/integration-tests/BackgroundCompilation.test.ts b/test/integration-tests/BackgroundCompilation.test.ts index 90c8660a4..13df067aa 100644 --- a/test/integration-tests/BackgroundCompilation.test.ts +++ b/test/integration-tests/BackgroundCompilation.test.ts @@ -58,5 +58,5 @@ suite("BackgroundCompilation Test Suite", () => { await vscode.workspace.save(uri); await taskPromise; - }).timeout(120000); + }).timeout(180000); }); diff --git a/test/integration-tests/DiagnosticsManager.test.ts b/test/integration-tests/DiagnosticsManager.test.ts index 5855a5d99..b0a783090 100644 --- a/test/integration-tests/DiagnosticsManager.test.ts +++ b/test/integration-tests/DiagnosticsManager.test.ts @@ -216,7 +216,7 @@ suite("DiagnosticsManager Test Suite", async function () { // after first build and can cause intermittent // failure if `swiftc` diagnostic is fixed suiteSetup(async function () { - this.timeout(2 * 60 * 1000); // Allow 2 minutes to build + this.timeout(3 * 60 * 1000); // Allow 3 minutes to build const task = createBuildAllTask(folderContext); // This return exit code and output for the task but we will omit it here // because the failures are expected and we just want the task to build @@ -1062,7 +1062,7 @@ suite("DiagnosticsManager Test Suite", async function () { assertHasDiagnostic(mainUri, expectedDiagnostic1); assertHasDiagnostic(mainUri, expectedDiagnostic2); - }).timeout(2 * 60 * 1000); // Allow 2 minutes to build + }).timeout(3 * 60 * 1000); // Allow 3 minutes to build test("Provides clang diagnostics", async () => { // Build for indexing @@ -1099,6 +1099,6 @@ suite("DiagnosticsManager Test Suite", async function () { assertHasDiagnostic(cUri, expectedDiagnostic1); assertHasDiagnostic(cUri, expectedDiagnostic2); - }).timeout(2 * 60 * 1000); // Allow 2 minutes to build + }).timeout(3 * 60 * 1000); // Allow 3 minutes to build }); }); diff --git a/test/integration-tests/SwiftSnippet.test.ts b/test/integration-tests/SwiftSnippet.test.ts index 55918f60b..82b0342f4 100644 --- a/test/integration-tests/SwiftSnippet.test.ts +++ b/test/integration-tests/SwiftSnippet.test.ts @@ -37,7 +37,7 @@ function normalizePath(...segments: string[]): string { } suite("SwiftSnippet Test Suite @slow", function () { - this.timeout(120000); + this.timeout(180000); const uri = testAssetUri("defaultPackage/Snippets/hello.swift"); const breakpoints = [ diff --git a/test/integration-tests/commands/build.test.ts b/test/integration-tests/commands/build.test.ts index 71b9e28bc..e3109e0d3 100644 --- a/test/integration-tests/commands/build.test.ts +++ b/test/integration-tests/commands/build.test.ts @@ -28,7 +28,7 @@ import { Version } from "../../../src/utilities/version"; suite("Build Commands @slow", function () { // Default timeout is a bit too short, give it a little bit more time - this.timeout(2 * 60 * 1000); + this.timeout(3 * 60 * 1000); let folderContext: FolderContext; let workspaceContext: WorkspaceContext; diff --git a/test/integration-tests/language/LanguageClientIntegration.test.ts b/test/integration-tests/language/LanguageClientIntegration.test.ts index 3caab8c8d..883cc49a1 100644 --- a/test/integration-tests/language/LanguageClientIntegration.test.ts +++ b/test/integration-tests/language/LanguageClientIntegration.test.ts @@ -33,7 +33,7 @@ async function buildProject(ctx: WorkspaceContext, name: string) { } suite("Language Client Integration Suite @slow", function () { - this.timeout(2 * 60 * 1000); + this.timeout(3 * 60 * 1000); let clientManager: LanguageClientManager; let workspaceContext: WorkspaceContext; diff --git a/test/integration-tests/ui/PackageDependencyProvider.test.ts b/test/integration-tests/ui/PackageDependencyProvider.test.ts index c8d6dc9d2..69e7885c9 100644 --- a/test/integration-tests/ui/PackageDependencyProvider.test.ts +++ b/test/integration-tests/ui/PackageDependencyProvider.test.ts @@ -30,7 +30,7 @@ suite("PackageDependencyProvider Test Suite", function () { let workspaceContext: WorkspaceContext; let folderContext: FolderContext; let treeProvider: PackageDependenciesProvider; - this.timeout(2 * 60 * 1000); // Allow up to 2 minutes to build + this.timeout(3 * 60 * 1000); // Allow up to 3 minutes to build activateExtensionForSuite({ async setup(ctx) { From e465395b85faf41a50fd1949689f3402afe04236 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Fri, 7 Feb 2025 13:57:12 -0500 Subject: [PATCH 23/27] Cleanup sanbox config --- docker/sandbox.sb | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/docker/sandbox.sb b/docker/sandbox.sb index 3170bffda..04c2294ee 100644 --- a/docker/sandbox.sb +++ b/docker/sandbox.sb @@ -3,7 +3,7 @@ (deny default) ; Get fonts -; (import "system.sb") +(import "system.sb") ; Helpers (define (param-regex param-name param-relative-regex) @@ -28,6 +28,7 @@ (path "/etc/shells") (path "/private/etc/shells") (path "/private/etc/ssl/cert.pem") + (path "/System/Library/OpenSSL/openssl.cnf") (regex #"^/Users/[^/]+/.vscode.*") (regex #"^/Users/[^/]+/.gitconfig$") (regex #"^/Users/[^/]+/.gitignore$") @@ -68,15 +69,6 @@ (regex #".*/Python3.framework/.*") (regex #".*/branch-main/.*") (regex #".*/usr/lib/swift/.*") - ; (regex #".*/Frameworks/.*") - ; (regex #".*/PrivateFrameworks/.*") - - ; (subpath "/System/Volumes/Preboot") - ; (subpath "/System/Volumes") - ; (subpath "/usr/lib") - ; (subpath "/Users/ec2-user") - ; (subpath "/Library/Developer/CommandLineTool") - ; (subpath "/") ) (allow mach-lookup) @@ -134,9 +126,7 @@ ; Open VSCode window (allow file-ioctl) -; (allow file-issue-extension) (allow iokit-open-user-client) -; (allow system-fsctl) ; HFSIOC_SET_HOTFILE_STATE ; VSCode terminal (allow pseudo-tty) From 04583153ad2e86c8f715574b1463c5dfde33a7c5 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 10 Feb 2025 11:01:34 -0500 Subject: [PATCH 24/27] Fix failing xcode watcher unit test --- .../toolchain/SelectedXcodeWatcher.test.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/test/unit-tests/toolchain/SelectedXcodeWatcher.test.ts b/test/unit-tests/toolchain/SelectedXcodeWatcher.test.ts index c87d77a4c..490bca449 100644 --- a/test/unit-tests/toolchain/SelectedXcodeWatcher.test.ts +++ b/test/unit-tests/toolchain/SelectedXcodeWatcher.test.ts @@ -16,11 +16,20 @@ import * as vscode from "vscode"; import { expect } from "chai"; import { SelectedXcodeWatcher } from "../../../src/toolchain/SelectedXcodeWatcher"; import { SwiftOutputChannel } from "../../../src/ui/SwiftOutputChannel"; -import { instance, MockedObject, mockFn, mockGlobalObject, mockObject } from "../../MockUtils"; +import { + instance, + MockedObject, + mockFn, + mockGlobalObject, + mockGlobalValue, + mockObject, +} from "../../MockUtils"; +import configuration from "../../../src/configuration"; suite("Selected Xcode Watcher", () => { const mockedVSCodeWindow = mockGlobalObject(vscode, "window"); let mockOutputChannel: MockedObject; + const pathConfig = mockGlobalValue(configuration, "path"); setup(function () { // Xcode only exists on macOS, so the SelectedXcodeWatcher is macOS-only. @@ -31,6 +40,8 @@ suite("Selected Xcode Watcher", () => { mockOutputChannel = mockObject({ appendLine: mockFn(), }); + + pathConfig.setValue(""); }); async function run(symLinksOnCallback: (string | undefined)[]) { @@ -72,4 +83,12 @@ suite("Selected Xcode Watcher", () => { "Reload Extensions" ); }); + + test("Ignores when path is explicitly set", async () => { + pathConfig.setValue("/path/to/swift/bin"); + + await run(["/foo", "/bar"]); + + expect(mockedVSCodeWindow.showWarningMessage).to.have.not.been.called; + }); }); From 00d97a1ee438b6ac0be3d62dac9de7afc6503b30 Mon Sep 17 00:00:00 2001 From: award999 Date: Mon, 10 Feb 2025 14:36:42 -0500 Subject: [PATCH 25/27] Update package.json Co-authored-by: Paul LeMarquand --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 32cd530c7..e618045c9 100644 --- a/package.json +++ b/package.json @@ -699,7 +699,7 @@ "swift.disableSandox": { "type": "boolean", "default": false, - "markdownDescription": "Disable sandboxing when running SwiftPM commands. You will almost always want this setting disabled.", + "markdownDescription": "Disable sandboxing when running SwiftPM commands. In most cases you should keep the sandbox enabled and leave this setting set to `false`", "order": 4 }, "swift.diagnostics": { From 462fadf93382de889eb56d4eeba901a74dbeb670 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 10 Feb 2025 14:41:35 -0500 Subject: [PATCH 26/27] Fix review comments --- .vscode-test.js | 1 + docker/test-macos.sh | 1 - src/extension.ts | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode-test.js b/.vscode-test.js index d3c219675..8ffeec923 100644 --- a/.vscode-test.js +++ b/.vscode-test.js @@ -39,6 +39,7 @@ const launchArgs = [ if (dataDir) { launchArgs.push("--user-data-dir", dataDir); } +// GPU hardware acceleration not working on Darwin for intel if (process.platform === "darwin" && process.arch === "x64") { launchArgs.push("--disable-gpu"); } diff --git a/docker/test-macos.sh b/docker/test-macos.sh index 190cd7624..1ab37a84c 100755 --- a/docker/test-macos.sh +++ b/docker/test-macos.sh @@ -91,5 +91,4 @@ export GIT_CONFIG_VALUE_0="$PWD/hooks" # Need to set proxy to download VS Code export npm_config_https_proxy="$HTTPS_PROXY" -# export DEVELOPER_DIR=/Applications/Xcode-beta.app VSCODE_DATA_DIR="$USER_DATA" CI=1 FAST_TEST_RUN=1 npm run coverage -- --coverage-output "$PWD/coverage" \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index c7b85ae9e..b87f950fc 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -38,7 +38,7 @@ import { showReloadExtensionNotification } from "./ui/ReloadExtension"; import { checkAndWarnAboutWindowsSymlinks } from "./ui/win32"; import { SwiftEnvironmentVariablesManager, SwiftTerminalProfileProvider } from "./terminal"; import { resolveFolderDependencies } from "./commands/dependencies/resolve"; -// import { SelectedXcodeWatcher } from "./toolchain/SelectedXcodeWatcher"; +import { SelectedXcodeWatcher } from "./toolchain/SelectedXcodeWatcher"; /** * External API as exposed by the extension. Can be queried by other extensions @@ -131,7 +131,7 @@ export async function activate(context: vscode.ExtensionContext): Promise { if (!configuration.debugger.disable) { context.subscriptions.push(registerDebugger(workspaceContext)); } - // context.subscriptions.push(new SelectedXcodeWatcher(outputChannel)); + context.subscriptions.push(new SelectedXcodeWatcher(outputChannel)); // listen for workspace folder changes and active text editor changes workspaceContext.setupEventListeners(); From e61dea71b3362127c385da0984b58d524bfd1726 Mon Sep 17 00:00:00 2001 From: Adam Ward Date: Mon, 10 Feb 2025 15:13:37 -0500 Subject: [PATCH 27/27] Fix failing test after rebase --- test/unit-tests/tasks/SwiftTaskProvider.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/unit-tests/tasks/SwiftTaskProvider.test.ts b/test/unit-tests/tasks/SwiftTaskProvider.test.ts index 9c33d7d38..f5523e79f 100644 --- a/test/unit-tests/tasks/SwiftTaskProvider.test.ts +++ b/test/unit-tests/tasks/SwiftTaskProvider.test.ts @@ -185,9 +185,6 @@ suite("SwiftTaskProvider Unit Test Suite", () => { test("include sdk flags", () => { buildFlags.withAdditionalFlags .withArgs(match(["build"])) - .returns(["build", "--sdk", "/path/to/sdk"]); - buildFlags.withSwiftPackageFlags - .withArgs(match(["build", "--sdk", "/path/to/sdk"])) .returns(["build", "--sdk", "/path/to/sdk", "--replace-scm-with-registry"]); const task = createSwiftTask( ["build"],