diff --git a/test/sanity/package.json b/test/sanity/package.json index 5a3885122f6..1402946cba9 100644 --- a/test/sanity/package.json +++ b/test/sanity/package.json @@ -4,7 +4,7 @@ "license": "MIT", "main": "./out/index.js", "scripts": { - "postinstall": "npx playwright install chromium webkit", + "postinstall": "playwright install --with-deps chromium webkit", "compile": "node ../../node_modules/typescript/bin/tsc", "start": "node ./out/index.js" }, diff --git a/test/sanity/src/context.ts b/test/sanity/src/context.ts index 5f5e3a4268a..d8118b985e9 100644 --- a/test/sanity/src/context.ts +++ b/test/sanity/src/context.ts @@ -121,7 +121,7 @@ export class TestContext { for (let attempt = 0; attempt < maxRetries; attempt++) { if (attempt > 0) { - const delay = Math.pow(2, attempt) * 1000; + const delay = Math.pow(2, attempt - 1) * 1000; this.log(`Retrying fetch (attempt ${attempt + 1}/${maxRetries}) after ${delay}ms`); await new Promise(resolve => setTimeout(resolve, delay)); } @@ -564,7 +564,7 @@ export class TestContext { * @param folder The optional workspace folder path to open. * @returns The constructed web server URL. */ - public getWebServerUrl(port: string, token?: string, folder?: string): string { + public getWebServerUrl(port: string, token?: string, folder?: string): URL { const url = new URL(`http://localhost:${port}`); if (token) { url.searchParams.set('tkn', token); @@ -576,7 +576,7 @@ export class TestContext { } url.searchParams.set('folder', folder); } - return url.toString(); + return url; } /** diff --git a/test/sanity/src/server.test.ts b/test/sanity/src/server.test.ts index d0f8e2dad2c..9b0431f080b 100644 --- a/test/sanity/src/server.test.ts +++ b/test/sanity/src/server.test.ts @@ -94,6 +94,8 @@ export function setup(context: TestContext) { context.log(`Starting server ${entryPoint} with args ${args.join(' ')}`); const server = spawn(entryPoint, args, { shell: true, detached: os.platform() !== 'win32' }); + let testError: Error | undefined; + server.stderr.on('data', (data) => { context.error(`[Server Error] ${data.toString().trim()}`); }); @@ -107,7 +109,10 @@ export function setup(context: TestContext) { const port = /Extension host agent listening on (\d+)/.exec(text)?.[1]; if (port) { const url = context.getWebServerUrl(port); - runWebTest(url).finally(() => context.killProcessTree(server.pid!)); + url.pathname = '/version'; + runWebTest(url.toString()) + .catch((error) => { testError = error; }) + .finally(() => context.killProcessTree(server.pid!)); } }); @@ -115,17 +120,19 @@ export function setup(context: TestContext) { server.on('error', reject); server.on('exit', resolve); }); + + if (testError) { + throw testError; + } } async function runWebTest(url: string) { - try { - context.log(`Fetching ${url}`); - const response = await fetch(url); - assert.equal(response.status, 200); - assert.equal(await response.text(), context.commit); - } catch (error) { - assert.fail(error instanceof Error ? error.message : String(error)); - } + context.log(`Fetching ${url}`); + const response = await fetch(url); + assert.strictEqual(response.status, 200, `Expected status 200 but got ${response.status}`); + + const text = await response.text(); + assert.strictEqual(text, context.commit, `Expected commit ${context.commit} but got ${text}`); } }); } diff --git a/test/sanity/src/serverWeb.test.ts b/test/sanity/src/serverWeb.test.ts index 397b48b6c60..4a59cde7756 100644 --- a/test/sanity/src/serverWeb.test.ts +++ b/test/sanity/src/serverWeb.test.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import assert from 'assert'; import { spawn } from 'child_process'; import os from 'os'; import { TestContext } from './context'; @@ -100,6 +99,8 @@ export function setup(context: TestContext) { context.log(`Starting server ${entryPoint} with args ${args.join(' ')}`); const server = spawn(entryPoint, args, { shell: true, detached: os.platform() !== 'win32' }); + let testError: Error | undefined; + server.stderr.on('data', (data) => { context.error(`[Server Error] ${data.toString().trim()}`); }); @@ -112,8 +113,10 @@ export function setup(context: TestContext) { const port = /Extension host agent listening on (\d+)/.exec(text)?.[1]; if (port) { - const url = context.getWebServerUrl(port, token, test.workspaceDir); - runUITest(url, test).finally(() => context.killProcessTree(server.pid!)); + const url = context.getWebServerUrl(port, token, test.workspaceDir).toString(); + runUITest(url, test) + .catch((error) => { testError = error; }) + .finally(() => context.killProcessTree(server.pid!)); } }); @@ -121,28 +124,28 @@ export function setup(context: TestContext) { server.on('error', reject); server.on('exit', resolve); }); + + if (testError) { + throw testError; + } } async function runUITest(url: string, test: UITest) { - try { - const browser = await context.launchBrowser(); - const page = await browser.newPage(); + const browser = await context.launchBrowser(); + const page = await browser.newPage(); - context.log(`Navigating to ${url}`); - await page.goto(url, { waitUntil: 'networkidle' }); + context.log(`Navigating to ${url}`); + await page.goto(url, { waitUntil: 'networkidle' }); - context.log('Waiting for the workbench to load'); - await page.waitForSelector('.monaco-workbench'); + context.log('Waiting for the workbench to load'); + await page.waitForSelector('.monaco-workbench'); - await test.run(page); + await test.run(page); - context.log('Closing browser'); - await browser.close(); + context.log('Closing browser'); + await browser.close(); - test.validate(); - } catch (error) { - assert.fail(error instanceof Error ? error.message : String(error)); - } + test.validate(); } }); }