diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2d0ccaed..93876788 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,7 +33,7 @@ npm ci npm test ``` -The tests start their own Python HTTP server on port 8897 and use installed Chrome by default. To use bundled Chromium instead: +The tests start their own Python HTTP server on port 8897 (set `TEST_PORT` to change it) and use installed Chrome by default. To use bundled Chromium instead: ```sh npx playwright install chromium diff --git a/tests/browser.test.cjs b/tests/browser.test.cjs index 7898afbd..9d81f81d 100644 --- a/tests/browser.test.cjs +++ b/tests/browser.test.cjs @@ -4,11 +4,16 @@ const {chromium} = require('playwright'); const {spawn} = require('node:child_process'); const fs = require('node:fs'); let browser, server; -const base = 'http://127.0.0.1:8897/'; +const port = process.env.TEST_PORT || '8897'; +const base = `http://127.0.0.1:${port}/`; before(async()=>{ - server=spawn(process.env.PYTHON || 'python3',['-m','http.server','8897','--bind','127.0.0.1'],{stdio:'ignore'}); + server=spawn(process.env.PYTHON || 'python3',['-m','http.server',port,'--bind','127.0.0.1'],{stdio:'ignore'}); + // A server that exits early usually means the port is taken; fail rather than test another server's files. + let exited=false;server.on('exit',()=>{exited=true;}); // Consume the readiness response so its open stream does not outlive the hook. for(let i=0;i<50;i++){try{await (await fetch(base)).arrayBuffer();break;}catch{await new Promise(r=>setTimeout(r,100));}} + await new Promise(r=>setTimeout(r,200)); + if(exited) throw new Error(`Test server could not start on port ${port}; set TEST_PORT to a free port.`); browser=await chromium.launch({channel:process.env.BROWSER_CHANNEL || 'chrome',headless:true}); }); after(async()=>{await browser?.close();server?.kill();});