Skip to content

Commit 9930021

Browse files
committed
fix: reexport from findPort file
1 parent ff59579 commit 9930021

File tree

8 files changed

+150
-180
lines changed

8 files changed

+150
-180
lines changed

lib/Server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ class Server {
780780
}
781781

782782
return (
783-
Server.findPort(port || this.options.port)
783+
Server.getFreePort(port || this.options.port)
784784
// eslint-disable-next-line no-shadow
785785
.then((port) => {
786786
this.options.port = port;
@@ -846,7 +846,7 @@ class Server {
846846
};
847847
}
848848

849-
static findPort(port) {
849+
static getFreePort(port) {
850850
if (port) {
851851
return Promise.resolve(port);
852852
}

lib/utils/findPort.js

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,6 @@
11
'use strict';
22

3-
const pRetry = require('p-retry');
4-
const portfinder = require('portfinder');
3+
// TODO(@anshumanv) - Drop in next major release
4+
const getFreePort = require('../Server').getFreePort;
55

6-
function runPortFinder() {
7-
return new Promise((resolve, reject) => {
8-
// default port
9-
portfinder.basePort = 8080;
10-
portfinder.getPort((error, port) => {
11-
if (error) {
12-
return reject(error);
13-
}
14-
15-
return resolve(port);
16-
});
17-
});
18-
}
19-
20-
function findPort(port) {
21-
if (port && port !== 'auto') {
22-
return Promise.resolve(port);
23-
}
24-
25-
// Try to find unused port and listen on it for 3 times,
26-
// if port is not specified in options.
27-
const defaultPortRetry = parseInt(process.env.DEFAULT_PORT_RETRY, 10) || 3;
28-
29-
return pRetry(runPortFinder, { retries: defaultPortRetry });
30-
}
31-
32-
module.exports = findPort;
6+
module.exports = getFreePort;

test/server/Server.test.js

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
'use strict';
22

33
const { relative, sep } = require('path');
4+
const http = require('http');
45
const webpack = require('webpack');
56
const sockjs = require('sockjs/lib/transport');
7+
const portfinder = require('portfinder');
8+
const getFreePort = require('../../lib/Server').getFreePort;
69
const Server = require('../../lib/Server');
710
const config = require('../fixtures/simple-config/webpack.config');
811
const port = require('../ports-map').Server;
@@ -363,4 +366,142 @@ describe('Server', () => {
363366
expect(process.env.WEBPACK_SERVE).toBe(true);
364367
});
365368
});
369+
370+
describe('getFreePort', () => {
371+
let dummyServers = [];
372+
373+
afterEach(() => {
374+
delete process.env.DEFAULT_PORT_RETRY;
375+
376+
return dummyServers
377+
.reduce(
378+
(p, server) =>
379+
p.then(
380+
() =>
381+
new Promise((resolve) => {
382+
server.close(resolve);
383+
})
384+
),
385+
Promise.resolve()
386+
)
387+
.then(() => {
388+
dummyServers = [];
389+
});
390+
});
391+
392+
function createDummyServers(n) {
393+
return (Array.isArray(n) ? n : [...new Array(n)]).reduce(
394+
(p, _, i) =>
395+
p.then(
396+
() =>
397+
new Promise((resolve, reject) => {
398+
const server = http.createServer();
399+
400+
dummyServers.push(server);
401+
402+
server.listen(8080 + i, () => {
403+
resolve();
404+
});
405+
406+
server.on('error', (error) => {
407+
reject(error);
408+
});
409+
})
410+
),
411+
Promise.resolve()
412+
);
413+
}
414+
415+
it('should returns the port when the port is specified', () => {
416+
process.env.DEFAULT_PORT_RETRY = 5;
417+
418+
return getFreePort(8082).then((port) => {
419+
expect(port).toEqual(8082);
420+
});
421+
});
422+
423+
it('should returns the port when the port is null', () => {
424+
const retryCount = 2;
425+
426+
process.env.DEFAULT_PORT_RETRY = 2;
427+
428+
return createDummyServers(retryCount)
429+
.then(() => getFreePort(null))
430+
.then((port) => {
431+
expect(port).toEqual(8080 + retryCount);
432+
});
433+
});
434+
435+
it('should returns the port when the port is undefined', () => {
436+
const retryCount = 2;
437+
438+
process.env.DEFAULT_PORT_RETRY = 2;
439+
440+
return (
441+
createDummyServers(retryCount)
442+
// eslint-disable-next-line no-undefined
443+
.then(() => getFreePort(undefined))
444+
.then((port) => {
445+
expect(port).toEqual(8080 + retryCount);
446+
})
447+
);
448+
});
449+
450+
it('should retry finding the port for up to defaultPortRetry times (number)', () => {
451+
const retryCount = 3;
452+
453+
process.env.DEFAULT_PORT_RETRY = retryCount;
454+
455+
return createDummyServers(retryCount)
456+
.then(() => getFreePort())
457+
.then((port) => {
458+
expect(port).toEqual(8080 + retryCount);
459+
});
460+
});
461+
462+
it('should retry finding the port for up to defaultPortRetry times (string)', () => {
463+
const retryCount = 3;
464+
465+
process.env.DEFAULT_PORT_RETRY = `${retryCount}`;
466+
467+
return createDummyServers(retryCount)
468+
.then(() => getFreePort())
469+
.then((port) => {
470+
expect(port).toEqual(8080 + retryCount);
471+
});
472+
});
473+
474+
// TODO: fix me, Flaky on CI
475+
it.skip('should retry finding the port when serial ports are busy', () => {
476+
const busyPorts = [8080, 8081, 8082, 8083];
477+
478+
process.env.DEFAULT_PORT_RETRY = 3;
479+
480+
return createDummyServers(busyPorts)
481+
.then(() => getFreePort())
482+
.then((port) => {
483+
expect(port).toEqual(8080 + busyPorts.length);
484+
});
485+
});
486+
487+
it("should throws the error when the port isn't found", () => {
488+
expect.assertions(1);
489+
490+
const spy = jest
491+
.spyOn(portfinder, 'getPort')
492+
.mockImplementation((callback) => callback(new Error('busy')));
493+
494+
const retryCount = 1;
495+
496+
process.env.DEFAULT_PORT_RETRY = 0;
497+
498+
return createDummyServers(retryCount)
499+
.then(() => getFreePort())
500+
.catch((err) => {
501+
expect(err.message).toMatchSnapshot();
502+
503+
spy.mockRestore();
504+
});
505+
});
506+
});
366507
});

test/server/__snapshots__/Server.test.js.snap.webpack4

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,5 @@ Array [
5959
],
6060
]
6161
`;
62+
63+
exports[`Server getFreePort should throws the error when the port isn't found 1`] = `"busy"`;

test/server/__snapshots__/Server.test.js.snap.webpack5

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,5 @@ Array [
5959
],
6060
]
6161
`;
62+
63+
exports[`Server getFreePort should throws the error when the port isn't found 1`] = `"busy"`;

test/server/utils/__snapshots__/findPort.test.js.snap.webpack4

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/server/utils/__snapshots__/findPort.test.js.snap.webpack5

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/server/utils/findPort.test.js

Lines changed: 0 additions & 143 deletions
This file was deleted.

0 commit comments

Comments
 (0)