bend_puzzle/test/v4791-server-startup-smoke-test.js
2026-08-01 16:06:14 +09:00

34 lines
1.7 KiB
JavaScript

'use strict';
const assert=require('assert/strict');
const http=require('http');
const {parsePort,defaultPortCandidates,listenWithPortFallback}=require('../server');
function close(server){return new Promise(resolve=>server.close(()=>resolve()))}
function listen(server,port=0){return new Promise((resolve,reject)=>{server.once('error',reject);server.listen(port,'127.0.0.1',()=>resolve(server.address().port))})}
(async()=>{
assert.equal(parsePort(undefined),8080);
assert.equal(parsePort('0'),0);
assert.equal(parsePort('4312'),4312);
assert.throws(()=>parsePort('invalid'),/Invalid server port/);
assert.deepEqual(defaultPortCandidates(8080).slice(0,3),[8080,3000,3001]);
const blocker=http.createServer((_req,res)=>res.end('occupied'));
const occupiedPort=await listen(blocker);
const fallbackServer=http.createServer((_req,res)=>res.end('LinkField'));
const listening=await listenWithPortFallback(fallbackServer,{host:'127.0.0.1',preferredPort:occupiedPort,explicitPort:false,candidates:[occupiedPort,0]});
assert.equal(listening.usedFallback,true);
assert.notEqual(listening.port,occupiedPort);
const response=await fetch(`http://127.0.0.1:${listening.port}/`);
assert.equal(await response.text(),'LinkField');
const explicitServer=http.createServer();
await assert.rejects(
listenWithPortFallback(explicitServer,{host:'127.0.0.1',preferredPort:occupiedPort,explicitPort:true}),
error=>error?.code==='EADDRINUSE'&&/already in use/.test(error.message)
);
await close(fallbackServer);
await close(blocker);
console.log('LinkField v48.0 server startup fallback smoke test passed');
})().catch(error=>{console.error(error);process.exitCode=1});