Skip to content

Commit

Permalink
Implement timeout for dns and set default to 5s. Close #6
Browse files Browse the repository at this point in the history
  • Loading branch information
bsingr committed Apr 17, 2019
1 parent 31fccd0 commit f68c0a4
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 5 deletions.
23 changes: 18 additions & 5 deletions src/probeDns.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
const measureDurationInMs = require('./measureDurationInMs');
const probeStatus = require('./probeStatus');
const dns = require('dns');
module.exports = (config) => {
return new Promise((resolve) => {
const { Resolver } = require('dns');
module.exports = (config, DNSResolver = Resolver) => {
return new Promise((resolvePromise) => {
let timedOut = false;
const resolve = (value) => {
clearTimeout(timeout);
resolvePromise(value);
};
const getDurationInMs = measureDurationInMs();
dns.resolveAny(config.host, (err, rawAddresses) => {
const resolver = new DNSResolver();
resolver.resolveAny(config.host, (err, rawAddresses) => {
const result = {
duration: getDurationInMs()
};
if (err) {
if (timedOut) {
result.err_code = 'TIMEOUT';
result.probe_status = probeStatus.error
} else if (err) {
result.err_code = err.code;
if (config.expect.err_code) {
if (config.expect.err_code == err.code) {
Expand All @@ -35,5 +44,9 @@ module.exports = (config) => {
}
resolve(result);
});
const timeout = setTimeout(() => {
timedOut = true;
resolver.cancel();
}, config.timeout || 5000);
});
};
28 changes: 28 additions & 0 deletions test/probeDnsTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,32 @@ describe('probeDns', () => {
res_addresses: 's3-website.eu-central-1.amazonaws.com'
}, metrics);
});

it('returns metrics for timeout', async () => {
class ResolverMock {
resolveAny(host, callback) {
setTimeout(() => {
callback()
}, 1000)
}
cancel() {
ResolverMock.cancelled = true
}
}
ResolverMock.cancelled = false
const metrics = await probeDns({
host: 'example.s3-website.eu-central-1.amazonaws.com',
expect: {
err_code: 'TIMEOUT'
},
timeout: 500
}, ResolverMock);
assert(metrics.duration >= 500, `duration >= 500, but was ${metrics.duration}`);
delete metrics.duration;
assert.deepEqual({
probe_status: 2,
err_code: 'TIMEOUT'
}, metrics);
assert.deepEqual(ResolverMock.cancelled, true)
});
});

0 comments on commit f68c0a4

Please sign in to comment.