Skip to content

Commit

Permalink
test: mock the lookup function in parallel tests
Browse files Browse the repository at this point in the history
These tests should not make any DNS calls. The lookup would fail
when the DNS requests are hijacked and time out instead of erroring
out.

PR-URL: nodejs#17296
Refs: nodejs/help#687
Reviewed-By: Refael Ackermann <[email protected]>
Reviewed-By: Rich Trott <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
joyeecheung committed Mar 30, 2018
1 parent fde95ff commit d989b20
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 20 deletions.
27 changes: 18 additions & 9 deletions test/parallel/test-net-better-error-messages-port-hostname.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
'use strict';

// This tests that the error thrown from net.createConnection
// comes with host and port properties.
// See https://github.com/nodejs/node-v0.x-archive/issues/7005

const common = require('../common');
const net = require('net');
const assert = require('assert');

const { addresses } = require('../common/internet');
const {
errorLookupMock,
mockedErrorCode
} = require('../common/dns');

// Using port 0 as hostname used is already invalid.
const c = net.createConnection(0, 'this.hostname.is.invalid');
const c = net.createConnection({
port: 0,
host: addresses.INVALID_HOST,
lookup: common.mustCall(errorLookupMock())
});

c.on('connect', common.mustNotCall());

c.on('error', common.mustCall(function(e) {
// If Name Service Switch is available on the operating system then it
// might be configured differently (/etc/nsswitch.conf).
// If the system is configured with no dns the error code will be EAI_AGAIN,
// but if there are more services after the dns entry, for example some
// linux distributions ship a myhostname service by default which would
// still produce the ENOTFOUND error.
assert.ok(e.code === 'ENOTFOUND' || e.code === 'EAI_AGAIN');
assert.strictEqual(e.code, mockedErrorCode);
assert.strictEqual(e.port, 0);
assert.strictEqual(e.hostname, 'this.hostname.is.invalid');
assert.strictEqual(e.hostname, addresses.INVALID_HOST);
}));
29 changes: 18 additions & 11 deletions test/parallel/test-net-connect-immediate-finish.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,35 @@
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

// This tests that if the socket is still in the 'connecting' state
// when the user calls socket.end() ('finish'), the socket would emit
// 'connect' and defer the handling until the 'connect' event is handled.

const common = require('../common');
const assert = require('assert');
const net = require('net');

const { addresses } = require('../common/internet');
const {
errorLookupMock,
mockedErrorCode,
mockedSysCall
} = require('../common/dns');

const client = net.connect({
host: 'this.hostname.is.invalid',
port: common.PORT
host: addresses.INVALID_HOST,
port: common.PORT,
lookup: common.mustCall(errorLookupMock())
});

client.once('error', common.mustCall((err) => {
assert(err);
assert.strictEqual(err.code, err.errno);
// If Name Service Switch is available on the operating system then it
// might be configured differently (/etc/nsswitch.conf).
// If the system is configured with no dns the error code will be EAI_AGAIN,
// but if there are more services after the dns entry, for example some
// linux distributions ship a myhostname service by default which would
// still produce the ENOTFOUND error.
assert.ok(err.code === 'ENOTFOUND' || err.code === 'EAI_AGAIN');
assert.strictEqual(err.code, mockedErrorCode);
assert.strictEqual(err.host, err.hostname);
assert.strictEqual(err.host, 'this.hostname.is.invalid');
assert.strictEqual(err.syscall, 'getaddrinfo');
assert.strictEqual(err.host, addresses.INVALID_HOST);
assert.strictEqual(err.syscall, mockedSysCall);
}));

client.end();

0 comments on commit d989b20

Please sign in to comment.