'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});