diff --git a/test/e2e/extensions/test-extension/extension.ts b/test/e2e/extensions/test-extension/extension.ts index ea4a1f896..a53e1a6f9 100644 --- a/test/e2e/extensions/test-extension/extension.ts +++ b/test/e2e/extensions/test-extension/extension.ts @@ -2,7 +2,8 @@ import * as vscode from "vscode" export function activate(context: vscode.ExtensionContext) { vscode.window.showInformationMessage("test extension loaded") - // Test extension + + // Prints the current proxy URI into a notification. context.subscriptions.push( vscode.commands.registerCommand("codeServerTest.proxyUri", () => { if (process.env.VSCODE_PROXY_URI) { @@ -13,7 +14,8 @@ export function activate(context: vscode.ExtensionContext) { }), ) - // asExternalUri extension + // Asks for a URI, then runs it through asExternalUri and prints the result + // into a notification. context.subscriptions.push( vscode.commands.registerCommand("codeServerTest.asExternalUri", async () => { const input = await vscode.window.showInputBox({ @@ -28,4 +30,29 @@ export function activate(context: vscode.ExtensionContext) { } }), ) + + const secretKey = "code-server-test-secret" + + // Asks for a string, then stores it as a secret. + context.subscriptions.push( + vscode.commands.registerCommand("codeServerTest.setSecret", async () => { + const input = await vscode.window.showInputBox({ + prompt: "Secret to store", + }) + + if (input) { + await context.secrets.store(secretKey, input) + vscode.window.showInformationMessage(`set secret: ${input}`) + } else { + vscode.window.showErrorMessage(`Failed to run test case. No input provided.`) + } + }), + ) + + // Prints the current secret, if any. + context.subscriptions.push( + vscode.commands.registerCommand("codeServerTest.getSecret", async () => { + vscode.window.showInformationMessage(`get secret: ${await context.secrets.get(secretKey)}`) + }), + ) } diff --git a/test/e2e/extensions/test-extension/package.json b/test/e2e/extensions/test-extension/package.json index c4a4fcefb..e96573389 100644 --- a/test/e2e/extensions/test-extension/package.json +++ b/test/e2e/extensions/test-extension/package.json @@ -22,6 +22,16 @@ "command": "codeServerTest.asExternalUri", "title": "asExternalUri test", "category": "code-server" + }, + { + "command": "codeServerTest.setSecret", + "title": "Set test secret", + "category": "code-server" + }, + { + "command": "codeServerTest.getSecret", + "title": "Get test secret", + "category": "code-server" } ] }, diff --git a/test/e2e/storage.test.ts b/test/e2e/storage.test.ts new file mode 100644 index 000000000..4af97e29a --- /dev/null +++ b/test/e2e/storage.test.ts @@ -0,0 +1,60 @@ +import { promises as fs } from "fs" +import * as path from "path" +import { describe, test, expect } from "./baseFixture" + +const tests = [ + { + name: "browser storage", + args: [], + }, + { + name: "remote storage", + args: ["--enable-remote-storage"], + }, +] + +for (const tc of tests) { + const args = ["--disable-workspace-trust", "--extensions-dir", path.join(__dirname, "./extensions"), ...tc.args] + describe(tc.name, args, {}, () => { + test("should store workbench state and secrets", async ({ codeServerPage }) => { + // Create and open a file. + const dir = await codeServerPage.workspaceDir + const file = path.join(dir, "foo") + await fs.writeFile(file, "bar") + await codeServerPage.openFile(file) + + // Store a secret. + const secret = "foo-bar-baz" + await codeServerPage.waitForTestExtensionLoaded() + await codeServerPage.executeCommandViaMenus("code-server: Set test secret") + await codeServerPage.page.waitForSelector(".quick-input-widget:focus-within") + await codeServerPage.page.keyboard.type(secret) + await codeServerPage.page.keyboard.press("Enter") + await expect(codeServerPage.page.getByText(`Info: set secret: ${secret}`)).toBeVisible() + + // There should be a workspace storage directory. + const userDir = path.join(dir, "User/workspaceStorage") + const dirs = await fs.readdir(userDir) + expect(dirs.length).toBe(1) + + const storageFile = path.join(userDir, dirs[0], "state.vscdb") + if (tc.args.includes("--enable-remote-storage")) { + // And a sqlite database that has the opened file in it. + const content = await fs.readFile(storageFile, "utf8") + expect(content).toContain(file) + } else { + // But no sqlite database. + expect(() => fs.stat(storageFile)).rejects.toThrow("ENOENT") + } + + // Should see the same file open after a reload. + await codeServerPage.page.reload({ waitUntil: "load" }) + await codeServerPage.waitForTab(file) + + // Should be able to retrieve the secret. + await codeServerPage.waitForTestExtensionLoaded() + await codeServerPage.executeCommandViaMenus("code-server: Get test secret") + await expect(codeServerPage.page.getByText(`Info: get secret: ${secret}`)).toBeVisible() + }) + }) +}