From 87543f024b450bee5f1c2ff03c01d8fae4fd705b Mon Sep 17 00:00:00 2001 From: Kirill Ponomarev Date: Tue, 3 Dec 2019 19:25:02 +0300 Subject: [PATCH] test: improve dns lookup coverage Adding tests covering promises-related code paths. PR-URL: https://github.com/nodejs/node/pull/30777 Reviewed-By: Rich Trott Reviewed-By: Ben Coe Reviewed-By: Ruben Bridgewater --- test/parallel/test-dns-lookup-promises.js | 139 ++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 test/parallel/test-dns-lookup-promises.js diff --git a/test/parallel/test-dns-lookup-promises.js b/test/parallel/test-dns-lookup-promises.js new file mode 100644 index 00000000000000..3e8e202c94c112 --- /dev/null +++ b/test/parallel/test-dns-lookup-promises.js @@ -0,0 +1,139 @@ +// Flags: --expose-internals +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { internalBinding } = require('internal/test/binding'); +const cares = internalBinding('cares_wrap'); + +// Stub `getaddrinfo` to proxy its call dynamic stub. This has to be done before +// we load the `dns` module to guarantee that the `dns` module uses the stub. +let getaddrinfoStub = null; +cares.getaddrinfo = (req) => getaddrinfoStub(req); + +const dnsPromises = require('dns').promises; + +function getaddrinfoNegative() { + return function getaddrinfoNegativeHandler(req) { + const originalReject = req.reject; + req.resolve = common.mustNotCall(); + req.reject = common.mustCall(originalReject); + req.oncomplete(internalBinding('uv').UV_ENOMEM); + }; +} + +function getaddrinfoPositive(addresses) { + return function getaddrinfo_positive(req) { + const originalResolve = req.resolve; + req.reject = common.mustNotCall(); + req.resolve = common.mustCall(originalResolve); + req.oncomplete(null, addresses); + }; +} + +async function lookupPositive() { + [ + { + stub: getaddrinfoPositive(['::1']), + factory: () => dnsPromises.lookup('example.com'), + expectation: { address: '::1', family: 6 } + }, + { + stub: getaddrinfoPositive(['127.0.0.1']), + factory: () => dnsPromises.lookup('example.com'), + expectation: { address: '127.0.0.1', family: 4 } + }, + { + stub: getaddrinfoPositive(['127.0.0.1'], { family: 4 }), + factory: () => dnsPromises.lookup('example.com'), + expectation: { address: '127.0.0.1', family: 4 } + }, + { + stub: getaddrinfoPositive(['some-address']), + factory: () => dnsPromises.lookup('example.com'), + expectation: { address: 'some-address', family: 0 } + }, + { + stub: getaddrinfoPositive(['some-address2']), + factory: () => dnsPromises.lookup('example.com', { family: 6 }), + expectation: { address: 'some-address2', family: 6 } + } + ].forEach(async ({ stub, factory, expectation }) => { + getaddrinfoStub = stub; + assert.deepStrictEqual(await factory(), expectation); + }); +} + +async function lookupNegative() { + getaddrinfoStub = getaddrinfoNegative(); + const expected = { + code: 'ENOMEM', + hostname: 'example.com', + syscall: 'getaddrinfo' + }; + return assert.rejects(dnsPromises.lookup('example.com'), expected); +} + +async function lookupallPositive() { + [ + { + stub: getaddrinfoPositive(['::1', '::2']), + factory: () => dnsPromises.lookup('example', { all: true }), + expectation: [ + { address: '::1', family: 6 }, + { address: '::2', family: 6 } + ] + }, + { + stub: getaddrinfoPositive(['::1', '::2']), + factory: () => dnsPromises.lookup('example', { all: true, family: 4 }), + expectation: [ + { address: '::1', family: 4 }, + { address: '::2', family: 4 } + ] + }, + { + stub: getaddrinfoPositive(['127.0.0.1', 'some-address']), + factory: () => dnsPromises.lookup('example', { all: true }), + expectation: [ + { address: '127.0.0.1', family: 4 }, + { address: 'some-address', family: 0 } + ] + }, + { + stub: getaddrinfoPositive(['127.0.0.1', 'some-address']), + factory: () => dnsPromises.lookup('example', { all: true, family: 6 }), + expectation: [ + { address: '127.0.0.1', family: 6 }, + { address: 'some-address', family: 6 } + ] + }, + { + stub: getaddrinfoPositive([]), + factory: () => dnsPromises.lookup('example', { all: true }), + expectation: [] + } + ].forEach(async ({ stub, factory, expectation }) => { + getaddrinfoStub = stub; + assert.deepStrictEqual(await factory(), expectation); + }); +} + +async function lookupallNegative() { + getaddrinfoStub = getaddrinfoNegative(); + const expected = { + code: 'ENOMEM', + hostname: 'example.com', + syscall: 'getaddrinfo' + }; + return assert.rejects(dnsPromises.lookup('example.com', { all: true }), + expected); +} + +(async () => { + await Promise.all([ + lookupPositive(), + lookupNegative(), + lookupallPositive(), + lookupallNegative() + ]).then(common.mustCall()); +})();