34 lines
1.7 KiB
JavaScript
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});
|