164 lines
6.0 KiB
JavaScript
164 lines
6.0 KiB
JavaScript
|
|
const assert = require('assert');
|
||
|
|
const http = require('http');
|
||
|
|
const net = require('net');
|
||
|
|
const waitPort = require('./wait-port');
|
||
|
|
|
||
|
|
describe('wait-port', () => {
|
||
|
|
|
||
|
|
it('should wait until a port is open IPv4', () => {
|
||
|
|
|
||
|
|
const server = net.createServer();
|
||
|
|
server.listen(9021, '127.0.0.1');
|
||
|
|
|
||
|
|
// Start waiting for port 9021 to open. If it opens we pass, otherwise we
|
||
|
|
// fail.
|
||
|
|
return waitPort({ host: '127.0.0.1', port: 9021, output: 'silent' })
|
||
|
|
.then(({ open, ipVersion }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === true, 'Waiting for the port should find it to open.');
|
||
|
|
assert(ipVersion === 4, 'Waiting for the port should find it on IPv4.');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should wait until a port is open IPv6', () => {
|
||
|
|
const server = net.createServer();
|
||
|
|
server.listen(9021, '::1');
|
||
|
|
|
||
|
|
// Start waiting for port 9021 to open. If it opens we pass, otherwise we
|
||
|
|
// fail.
|
||
|
|
return waitPort({ host: '::1', port: 9021, output: 'silent' })
|
||
|
|
.then(({ open, ipVersion }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === true, 'Waiting for the port should find it to open.');
|
||
|
|
assert(ipVersion === 4, 'Waiting for the port should find it on IPv4.');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should wait until a port is open IPv4 with localhost', () => {
|
||
|
|
const server = net.createServer();
|
||
|
|
server.listen(9021, '127.0.0.1');
|
||
|
|
|
||
|
|
// Start waiting for port 9021 to open. If it opens we pass, otherwise we
|
||
|
|
// fail.
|
||
|
|
return waitPort({ host: 'localhost', port: 9021, output: 'silent' })
|
||
|
|
.then(({ open, ipVersion }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === true, 'Waiting for the port should find it to open.');
|
||
|
|
assert(ipVersion === 4, 'Waiting for the port should find it on IPv4.');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should wait until a port is open IPv6 with localhost', () => {
|
||
|
|
const server = net.createServer();
|
||
|
|
setTimeout( ()=> {
|
||
|
|
server.listen(9021, '::1');
|
||
|
|
}, 1000);
|
||
|
|
|
||
|
|
// Start waiting for port 9021 to open. If it opens we pass, otherwise we
|
||
|
|
// fail.
|
||
|
|
return waitPort({ host: 'localhost', port: 9021, output: 'silent' })
|
||
|
|
.then(({ open, ipVersion }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === true, 'Waiting for the port should find it to open.');
|
||
|
|
assert(ipVersion === 6, 'Waiting for the port should find it on IPv4.');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should timeout after the specified time', () => {
|
||
|
|
const timeout = 5000;
|
||
|
|
const delta = 500;
|
||
|
|
|
||
|
|
// Start waiting for port 9021 to open.
|
||
|
|
const start = new Date();
|
||
|
|
return waitPort({ host: '127.0.0.1', port: 9021, timeout, output: 'silent' })
|
||
|
|
.then(({ open }) => {
|
||
|
|
assert(open === false, 'The port should not be open.');
|
||
|
|
|
||
|
|
// Make sure we are close to the timeout.
|
||
|
|
const elapsed = new Date() - start;
|
||
|
|
assert(((timeout - delta) < elapsed) && (elapsed < (timeout + delta)),
|
||
|
|
`Timeout took ${elapsed}ms, should be close to ${timeout}ms.`);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should timeout after the specified time even with a non-routable address', () => {
|
||
|
|
return waitPort({ host: '10.255.255.1', port: 9021, timeout: 500, output: 'silent' })
|
||
|
|
.then(({ open }) => {
|
||
|
|
assert(open === false, 'The port should not be open.');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should timeout after the specified time when waiting for http but only given tcp/ip', () => {
|
||
|
|
// We can create a TCP/IP server, but this should not be enough, cause we're waiting for http.
|
||
|
|
const server = net.createServer();
|
||
|
|
server.listen(9021, '127.0.0.1');
|
||
|
|
|
||
|
|
return waitPort({ protocol: 'http', host: '127.0.0.1', port: 9021, timeout: 500, output: 'silent' })
|
||
|
|
.then(({ open }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === false, 'The port should not be open for http.');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should timeout when waiting for an http server which is giving non-2XX responses', () => {
|
||
|
|
const server = http.createServer((req, res) => {
|
||
|
|
res.writeHead(400);
|
||
|
|
res.write('Bad input');
|
||
|
|
res.end();
|
||
|
|
}).listen(9022);
|
||
|
|
|
||
|
|
return waitPort({ protocol: 'http', host: '127.0.0.1', port: 9022, timeout: 3000, output: 'silent' })
|
||
|
|
.then(({ open }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === false, 'The success condition should not be met');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should error if the address is not found', () => {
|
||
|
|
|
||
|
|
// Wait for a point on an address (I hope) does not exist.
|
||
|
|
return waitPort({ host: 'ireallyhopethatthisdomainnamedoesnotexist.com', port: 9021, timeout: 3000, output: 'silent' })
|
||
|
|
.then(() => {
|
||
|
|
assert.fail('The operation should throw, rather than completing.');
|
||
|
|
})
|
||
|
|
.catch((err) => {
|
||
|
|
assert.strictEqual(err.name, 'ConnectionError', 'A ConnectionFailed error should be thrown');
|
||
|
|
assert(/.*address.*ireallyhopethatthisdomainnamedoesnotexist.com/.test(err.message));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should not error if the address is not found when the \'wait-for-dns\' flag is used', () => {
|
||
|
|
|
||
|
|
const timeout = 1000;
|
||
|
|
const delta = 500;
|
||
|
|
|
||
|
|
// Start waiting for port 9021 to open.
|
||
|
|
const start = new Date();
|
||
|
|
return waitPort({ host: 'ireallyhopethatthisdomainnamedoesnotexist.com', waitForDns: true, port: 9021, timeout, output: 'silent' })
|
||
|
|
.then(({ open }) => {
|
||
|
|
assert(open === false, 'The port should not be open.');
|
||
|
|
|
||
|
|
// Make sure we are close to the timeout.
|
||
|
|
const elapsed = new Date() - start;
|
||
|
|
assert(((timeout - delta) < elapsed) && (elapsed < (timeout + delta)),
|
||
|
|
`Timeout took ${elapsed}ms, should be close to ${timeout}ms.`);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
|
||
|
|
it('should successfully wait for a valid http response', () => {
|
||
|
|
const server = http.createServer((req, res) => {
|
||
|
|
res.writeHead(200);
|
||
|
|
res.write('OK');
|
||
|
|
res.end();
|
||
|
|
}).listen(9023);
|
||
|
|
|
||
|
|
return waitPort({ protocol: 'http', host: '127.0.0.1', port: 9023, timeout: 3000, output: 'silent' })
|
||
|
|
.then(({ open, ipVersion }) => {
|
||
|
|
server.close();
|
||
|
|
assert(open === true, 'The success condition should be met');
|
||
|
|
assert(ipVersion === 4, 'It should be open on IPv4');
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|