From ffc7135c1f2ea7b3d2bdb2562e636497f6782a16 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 18 Jun 2024 09:31:33 +0000 Subject: [PATCH 1/2] Revert "Remove short-paths.test.ts" This reverts commit 10f4b470199f8344a5a1b95aecf2949d6df8f4a5. --- .../unit-tests/common/short-paths.test.ts | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 extensions/ql-vscode/test/unit-tests/common/short-paths.test.ts diff --git a/extensions/ql-vscode/test/unit-tests/common/short-paths.test.ts b/extensions/ql-vscode/test/unit-tests/common/short-paths.test.ts new file mode 100644 index 000000000..7d379c38d --- /dev/null +++ b/extensions/ql-vscode/test/unit-tests/common/short-paths.test.ts @@ -0,0 +1,96 @@ +import { platform } from "os"; +import type { BaseLogger } from "../../../src/common/logging"; +import { expandShortPaths } from "../../../src/common/short-paths"; +import { join } from "path"; + +describe("expandShortPaths", () => { + let logger: BaseLogger; + + beforeEach(() => { + logger = { + log: jest.fn(), + }; + }); + + describe("on POSIX", () => { + if (platform() === "win32") { + console.log(`Skipping test on Windows`); + return; + } + + it("should return the same path for non-Windows platforms", async () => { + const path = "/home/user/some~path"; + const result = await expandShortPaths(path, logger); + + expect(logger.log).not.toHaveBeenCalled(); + expect(result).toBe(path); + }); + }); + + describe("on Windows", () => { + if (platform() !== "win32") { + console.log(`Skipping test on non-Windows`); + return; + } + + it("should return the same path if no short components", async () => { + const path = "C:\\Program Files\\Some Folder"; + const result = await expandShortPaths(path, logger); + + expect(logger.log).toHaveBeenCalledWith( + `Expanding short paths in: ${path}`, + ); + expect(logger.log).toHaveBeenCalledWith( + "Skipping due to no short components", + ); + expect(result).toBe(path); + }); + + it("should not attempt to expand long paths with '~' in the name", async () => { + const testDir = join(__dirname, "../data/short-paths"); + const path = join(testDir, "textfile-with~tilde.txt"); + const result = await expandShortPaths(path, logger); + + expect(logger.log).toHaveBeenCalledWith( + `Expanding short paths in: ${path}`, + ); + expect(logger.log).toHaveBeenCalledWith( + `Expanding short path component: textfile-with~tilde.txt`, + ); + expect(logger.log).toHaveBeenCalledWith(`Component is not a short name`); + expect(result).toBe(join(testDir, "textfile-with~tilde.txt")); + }); + + it("should expand a short path", async () => { + const path = "C:\\PROGRA~1\\Some Folder"; + const result = await expandShortPaths(path, logger); + + expect(logger.log).toHaveBeenCalledWith( + `Expanding short paths in: ${path}`, + ); + expect(logger.log).toHaveBeenCalledWith( + `Expanding short path component: PROGRA~1`, + ); + expect(result).toBe("C:\\Program Files\\Some Folder"); + }); + + it("should expand multiple short paths", async () => { + const testDir = join(__dirname, "../data/short-paths"); + const path = join(testDir, "FOLDER~1", "TEXTFI~1.TXT"); + const result = await expandShortPaths(path, logger); + + expect(logger.log).toHaveBeenCalledWith( + `Expanding short paths in: ${path}`, + ); + expect(logger.log).toHaveBeenCalledWith( + `Expanding short path component: FOLDER~1`, + ); + expect(logger.log).toHaveBeenCalledWith( + `Expanding short path component: TEXTFI~1.TXT`, + ); + expect(result).toBe( + join(testDir, "folder with space", ".textfile+extra.characters.txt"), + ); + }); + }); +}); From 4a317d33a9bd38c0ddb88335ae53099ce0d6ecb4 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 18 Jun 2024 09:48:07 +0000 Subject: [PATCH 2/2] Enable 8.3 paths in unit tests --- .github/workflows/main.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9b2257151..e36bc9c2b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -144,6 +144,19 @@ jobs: matrix: os: [ubuntu-latest, windows-latest] steps: + # Enable 8.3 filename creation. This is not required to run the extension but it is required for the unit tests to pass. + # This feature is currently enabled by default in Windows 11 for the C: drive and therefore we must maintain support for it. + # This setting needs to be enabled before files are created, i.e. before we checkout the repository. + - name: Enable 8.3 filenames + shell: pwsh + if: ${{ matrix.os == 'windows-latest' }} + run: | + $shortNameEnableProcess = Start-Process -FilePath fsutil.exe -ArgumentList ('8dot3name', 'set', '0') -Wait -PassThru + $shortNameEnableExitCode = $shortNameEnableProcess.ExitCode + if ($shortNameEnableExitCode -ne 0) { + exit $shortNameEnableExitCode + } + - name: Checkout uses: actions/checkout@v4 with: