Skip to content

Commit

Permalink
test: delay loading 'os' in test/common module
Browse files Browse the repository at this point in the history
There is a test that doesn't load the common module initially because it
needs to monkey-patch the 'os' module. I think it would be a good idea
to minimize the side-effects of loading common anyway, so let's defer
loading 'os' unless/until it's actually needed.

PR-URL: #30914
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Richard Lau <[email protected]>
  • Loading branch information
Trott authored and addaleax committed Dec 14, 2019
1 parent cb76f27 commit 1ddcb6d
Showing 1 changed file with 37 additions and 30 deletions.
67 changes: 37 additions & 30 deletions test/common/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,20 @@
/* eslint-disable node-core/crypto-check */
'use strict';
const process = global.process; // Some tests tamper with the process global.
const path = require('path');
const fs = require('fs');

const assert = require('assert');
const os = require('os');
const { exec, execSync, spawnSync } = require('child_process');
const fs = require('fs');
// Do not require 'os' until needed so that test-os-checked-fucnction can
// monkey patch it. If 'os' is required here, that test will fail.
const path = require('path');
const util = require('util');
const { isMainThread } = require('worker_threads');

const tmpdir = require('./tmpdir');
const bits = ['arm64', 'mips', 'mipsel', 'ppc64', 's390x', 'x64']
.includes(process.arch) ? 64 : 32;
const hasIntl = !!process.config.variables.v8_enable_i18n_support;
const { isMainThread } = require('worker_threads');

// Some tests assume a umask of 0o022 so set that up front. Tests that need a
// different umask will set it themselves.
Expand Down Expand Up @@ -102,23 +105,12 @@ if (process.argv.length === 2 &&

const isWindows = process.platform === 'win32';
const isAIX = process.platform === 'aix';
// On IBMi, process.platform and os.platform() both return 'aix',
// It is not enough to differentiate between IBMi and real AIX system.
const isIBMi = os.type() === 'OS400';
const isLinuxPPCBE = (process.platform === 'linux') &&
(process.arch === 'ppc64') &&
(os.endianness() === 'BE');
const isSunOS = process.platform === 'sunos';
const isFreeBSD = process.platform === 'freebsd';
const isOpenBSD = process.platform === 'openbsd';
const isLinux = process.platform === 'linux';
const isOSX = process.platform === 'darwin';

const enoughTestMem = os.totalmem() > 0x70000000; /* 1.75 Gb */
const cpus = os.cpus();
const enoughTestCpu = Array.isArray(cpus) &&
(cpus.length > 1 || cpus[0].speed > 999);

const rootDir = isWindows ? 'c:\\' : '/';

const buildType = process.config.target_defaults ?
Expand Down Expand Up @@ -198,15 +190,6 @@ const PIPE = (() => {
return path.join(pipePrefix, pipeName);
})();

const hasIPv6 = (() => {
const iFaces = os.networkInterfaces();
const re = isWindows ? /Loopback Pseudo-Interface/ : /lo/;
return Object.keys(iFaces).some((name) => {
return re.test(name) &&
iFaces[name].some(({ family }) => family === 'IPv6');
});
})();

/*
* Check that when running a test with
* `$node --abort-on-uncaught-exception $file child`
Expand Down Expand Up @@ -742,8 +725,6 @@ module.exports = {
childShouldThrowAndAbort,
createZeroFilledFile,
disableCrashOnUnhandledRejection,
enoughTestCpu,
enoughTestMem,
expectsError,
expectsInternalAssertion,
expectWarning,
Expand All @@ -753,14 +734,11 @@ module.exports = {
getTTYfd,
hasIntl,
hasCrypto,
hasIPv6,
hasMultiLocalhost,
isAIX,
isAlive,
isFreeBSD,
isIBMi,
isLinux,
isLinuxPPCBE,
isMainThread,
isOpenBSD,
isOSX,
Expand All @@ -784,12 +762,28 @@ module.exports = {
skipIfReportDisabled,
skipIfWorker,

get localhostIPv6() { return '::1'; },
get enoughTestCPU() {
const cpus = require('os').cpus();
return Array.isArray(cpus) && (cpus.length > 1 || cpus[0].speed > 999);
},

get enoughTestMeme() {
return require('os').totalmem() > 0x70000000; /* 1.75 Gb */
},

get hasFipsCrypto() {
return hasCrypto && require('crypto').getFips();
},

get hasIPv6() {
const iFaces = require('os').networkInterfaces();
const re = isWindows ? /Loopback Pseudo-Interface/ : /lo/;
return Object.keys(iFaces).some((name) => {
return re.test(name) &&
iFaces[name].some(({ family }) => family === 'IPv6');
});
},

get inFreeBSDJail() {
if (inFreeBSDJail !== null) return inFreeBSDJail;

Expand All @@ -802,6 +796,17 @@ module.exports = {
return inFreeBSDJail;
},

// On IBMi, process.platform and os.platform() both return 'aix',
// It is not enough to differentiate between IBMi and real AIX system.
get isIBMi() {
return require('os').type() === 'OS400';
},

get isLinuxPPCBE() {
return (process.platform === 'linux') && (process.arch === 'ppc64') &&
(require('os').endianness() === 'BE');
},

get localhostIPv4() {
if (localhostIPv4 !== null) return localhostIPv4;

Expand All @@ -823,6 +828,8 @@ module.exports = {
return localhostIPv4;
},

get localhostIPv6() { return '::1'; },

// opensslCli defined lazily to reduce overhead of spawnSync
get opensslCli() {
if (opensslCli !== null) return opensslCli;
Expand Down

0 comments on commit 1ddcb6d

Please sign in to comment.