Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
test: delay loading 'os' in test/common module
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.
  • Loading branch information
Trott committed Dec 12, 2019
commit df52e03144a6d91f74b9f47758906409323896ec
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