From ccbc78cfc6a9119de4a1c588a52c483a4a072c3a Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 11 May 2016 23:03:24 -0700 Subject: [PATCH] test: remove common.getServiceName() Replace lightly-used services file parsing in favor of confirming one of a small number of allowable values in service name lookup tests. In https://github.com/nodejs/node-v0.x-archive/issues/8047, it was decided that this sort of service file parsing was superior to hardcoding acceptable values, but I'm not convinced: * No guarantee that the host uses /etc/services before, e.g., nscd. * Increases complexity of tests without guaranteeing robustness. I think that simply checking against a small set of expected values may be a better solution. Ideally, there would also be a unit test that used a test double for the appropriate `cares` function and confirms that it is called with the correct parameters, but now we're getting way ahead of ourselves. PR-URL: https://github.com/nodejs/node/pull/6709 Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- test/common.js | 51 +--------------------------------- test/internet/test-dns-ipv4.js | 21 ++------------ test/internet/test-dns-ipv6.js | 19 +------------ 3 files changed, 4 insertions(+), 87 deletions(-) diff --git a/test/common.js b/test/common.js index 8d15b0408be788..f59461e40a3301 100644 --- a/test/common.js +++ b/test/common.js @@ -160,7 +160,7 @@ Object.defineProperty(exports, 'opensslCli', {get: function() { opensslCli = false; } return opensslCli; -}, enumerable: true }); +}, enumerable: true}); Object.defineProperty(exports, 'hasCrypto', { get: function() { @@ -395,55 +395,6 @@ exports.mustCall = function(fn, expected) { }; }; -var etcServicesFileName = path.join('/etc', 'services'); -if (exports.isWindows) { - 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 { - var servicesContent = fs.readFileSync(etcServicesFileName, - { encoding: 'utf8'}); - var regexp = `^(\\w+)\\s+\\s${port}/${protocol}\\s`; - 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; -}; - exports.hasMultiLocalhost = function hasMultiLocalhost() { var TCP = process.binding('tcp_wrap').TCP; var t = new TCP(); diff --git a/test/internet/test-dns-ipv4.js b/test/internet/test-dns-ipv4.js index 07814963924333..06c1056a26fe43 100644 --- a/test/internet/test-dns-ipv4.js +++ b/test/internet/test-dns-ipv4.js @@ -1,5 +1,5 @@ 'use strict'; -const common = require('../common'); +require('../common'); const assert = require('assert'); const dns = require('dns'); const net = require('net'); @@ -173,24 +173,7 @@ TEST(function test_lookupservice_ip_ipv4(done) { if (err) throw err; assert.equal(typeof host, 'string'); assert(host); - - /* - * 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); - + assert(['http', 'www', '80'].includes(service)); done(); }); diff --git a/test/internet/test-dns-ipv6.js b/test/internet/test-dns-ipv6.js index 2929361f16ecc8..a9e46c8478d52b 100644 --- a/test/internet/test-dns-ipv6.js +++ b/test/internet/test-dns-ipv6.js @@ -182,24 +182,7 @@ TEST(function test_lookupservice_ip_ipv6(done) { if (err) throw err; assert.equal(typeof host, 'string'); assert(host); - - /* - * 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); - + assert(['http', 'www', '80'].includes(service)); done(); });