mirror of https://gitee.com/openkylin/nodejs.git
140 lines
4.1 KiB
JavaScript
140 lines
4.1 KiB
JavaScript
// 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());
|
|
})();
|