tests: do not hardcode service name in test-dns.
Instead of hard-coding http service name in test-dns, retrieve it from /etc/services. This is not ideal, but it's still better than hard-coding it. Fixes #8047. Signed-off-by: Timothy J Fontaine <tjfontaine@gmail.com>
This commit is contained in:
parent
7d1860a678
commit
f5f5bd76e6
@ -226,3 +226,58 @@ exports.checkSpawnSyncRet = function(ret) {
|
|||||||
assert.strictEqual(ret.status, 0);
|
assert.strictEqual(ret.status, 0);
|
||||||
assert.strictEqual(ret.error, undefined);
|
assert.strictEqual(ret.error, undefined);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var etcServicesFileName = path.join('/etc', 'services');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
etcServicesFileName = path.join(process.env.SystemRoot, 'System32', 'drivers',
|
||||||
|
'etc', 'services');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns a string that represents the service name associated
|
||||||
|
* to the service bound to port "port" and using protocol "protocol".
|
||||||
|
*
|
||||||
|
* If the service is not defined in the services file, it returns
|
||||||
|
* the port number as a string.
|
||||||
|
*
|
||||||
|
* Returns undefined if /etc/services (or its equivalent on non-UNIX
|
||||||
|
* platforms) can't be read.
|
||||||
|
*/
|
||||||
|
exports.getServiceName = function getServiceName(port, protocol) {
|
||||||
|
if (port == null) {
|
||||||
|
throw new Error("Missing port number");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof protocol !== 'string') {
|
||||||
|
throw new Error("Protocol must be a string");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default, if a service can't be found in /etc/services,
|
||||||
|
* its name is considered to be its port number.
|
||||||
|
*/
|
||||||
|
var serviceName = port.toString();
|
||||||
|
|
||||||
|
try {
|
||||||
|
/*
|
||||||
|
* I'm not a big fan of readFileSync, but reading /etc/services asynchronously
|
||||||
|
* here would require implementing a simple line parser, which seems overkill
|
||||||
|
* for a simple utility function that is not running concurrently with any
|
||||||
|
* other one.
|
||||||
|
*/
|
||||||
|
var servicesContent = fs.readFileSync(etcServicesFileName,
|
||||||
|
{ encoding: 'utf8'});
|
||||||
|
var regexp = util.format('^(\\w+)\\s+\\s%d/%s\\s', port, protocol);
|
||||||
|
var re = new RegExp(regexp, 'm');
|
||||||
|
|
||||||
|
var matches = re.exec(servicesContent);
|
||||||
|
if (matches && matches.length > 1) {
|
||||||
|
serviceName = matches[1];
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
console.error('Cannot read file: ', etcServicesFileName);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return serviceName;
|
||||||
|
}
|
||||||
|
@ -495,7 +495,23 @@ TEST(function test_lookupservice_ip_ipv4(done) {
|
|||||||
var req = dns.lookupService('127.0.0.1', 80, function(err, host, service) {
|
var req = dns.lookupService('127.0.0.1', 80, function(err, host, service) {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
assert.strictEqual(host, 'localhost');
|
assert.strictEqual(host, 'localhost');
|
||||||
assert.strictEqual(service, 'http');
|
|
||||||
|
/*
|
||||||
|
* Retrieve the actual HTTP service name as setup on the host currently
|
||||||
|
* running the test by reading it from /etc/services. This is not ideal,
|
||||||
|
* as the service name lookup could use another mechanism (e.g nscd), but
|
||||||
|
* it's already better than hardcoding it.
|
||||||
|
*/
|
||||||
|
var httpServiceName = common.getServiceName(80, 'tcp');
|
||||||
|
if (!httpServiceName) {
|
||||||
|
/*
|
||||||
|
* Couldn't find service name, reverting to the most sensible default
|
||||||
|
* for port 80.
|
||||||
|
*/
|
||||||
|
httpServiceName = 'http';
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.strictEqual(service, httpServiceName);
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@ -515,7 +531,23 @@ TEST(function test_lookupservice_ip_ipv6(done) {
|
|||||||
* that most sane platforms use either one of these two by default.
|
* that most sane platforms use either one of these two by default.
|
||||||
*/
|
*/
|
||||||
assert(host === 'localhost' || host === 'ip6-localhost');
|
assert(host === 'localhost' || host === 'ip6-localhost');
|
||||||
assert.strictEqual(service, 'http');
|
|
||||||
|
/*
|
||||||
|
* Retrieve the actual HTTP service name as setup on the host currently
|
||||||
|
* running the test by reading it from /etc/services. This is not ideal,
|
||||||
|
* as the service name lookup could use another mechanism (e.g nscd), but
|
||||||
|
* it's already better than hardcoding it.
|
||||||
|
*/
|
||||||
|
var httpServiceName = common.getServiceName(80, 'tcp');
|
||||||
|
if (!httpServiceName) {
|
||||||
|
/*
|
||||||
|
* Couldn't find service name, reverting to the most sensible default
|
||||||
|
* for port 80.
|
||||||
|
*/
|
||||||
|
httpServiceName = 'http';
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.strictEqual(service, httpServiceName);
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user