mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
5e30559318
PR-URL: https://github.com/nodejs/node/pull/44959 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
146 lines
3.8 KiB
JavaScript
146 lines
3.8 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
// IBMi process priority is different.
|
|
if (common.isIBMi)
|
|
common.skip('IBMi has a different process priority');
|
|
|
|
const assert = require('assert');
|
|
const os = require('os');
|
|
const {
|
|
PRIORITY_LOW,
|
|
PRIORITY_BELOW_NORMAL,
|
|
PRIORITY_NORMAL,
|
|
PRIORITY_ABOVE_NORMAL,
|
|
PRIORITY_HIGH,
|
|
PRIORITY_HIGHEST
|
|
} = os.constants.priority;
|
|
|
|
// Validate priority constants.
|
|
assert.strictEqual(typeof PRIORITY_LOW, 'number');
|
|
assert.strictEqual(typeof PRIORITY_BELOW_NORMAL, 'number');
|
|
assert.strictEqual(typeof PRIORITY_NORMAL, 'number');
|
|
assert.strictEqual(typeof PRIORITY_ABOVE_NORMAL, 'number');
|
|
assert.strictEqual(typeof PRIORITY_HIGH, 'number');
|
|
assert.strictEqual(typeof PRIORITY_HIGHEST, 'number');
|
|
|
|
// Test pid type validation.
|
|
[null, true, false, 'foo', {}, [], /x/].forEach((pid) => {
|
|
const errObj = {
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
message: /The "pid" argument must be of type number\./
|
|
};
|
|
|
|
assert.throws(() => {
|
|
os.setPriority(pid, PRIORITY_NORMAL);
|
|
}, errObj);
|
|
|
|
assert.throws(() => {
|
|
os.getPriority(pid);
|
|
}, errObj);
|
|
});
|
|
|
|
// Test pid range validation.
|
|
[NaN, Infinity, -Infinity, 3.14, 2 ** 32].forEach((pid) => {
|
|
const errObj = {
|
|
code: 'ERR_OUT_OF_RANGE',
|
|
message: /The value of "pid" is out of range\./
|
|
};
|
|
|
|
assert.throws(() => {
|
|
os.setPriority(pid, PRIORITY_NORMAL);
|
|
}, errObj);
|
|
|
|
assert.throws(() => {
|
|
os.getPriority(pid);
|
|
}, errObj);
|
|
});
|
|
|
|
// Test priority type validation.
|
|
[null, true, false, 'foo', {}, [], /x/].forEach((priority) => {
|
|
assert.throws(() => {
|
|
os.setPriority(0, priority);
|
|
}, {
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
|
message: /The "priority" argument must be of type number\./
|
|
});
|
|
});
|
|
|
|
// Test priority range validation.
|
|
[
|
|
NaN,
|
|
Infinity,
|
|
-Infinity,
|
|
3.14,
|
|
2 ** 32,
|
|
PRIORITY_HIGHEST - 1,
|
|
PRIORITY_LOW + 1,
|
|
].forEach((priority) => {
|
|
assert.throws(() => {
|
|
os.setPriority(0, priority);
|
|
}, {
|
|
code: 'ERR_OUT_OF_RANGE',
|
|
message: /The value of "priority" is out of range\./
|
|
});
|
|
});
|
|
|
|
// Verify that valid values work.
|
|
for (let i = PRIORITY_HIGHEST; i <= PRIORITY_LOW; i++) {
|
|
// A pid of 0 corresponds to the current process.
|
|
try {
|
|
os.setPriority(0, i);
|
|
} catch (err) {
|
|
// The current user might not have sufficient permissions to set this
|
|
// specific priority level. Skip this priority, but keep trying lower
|
|
// priorities.
|
|
if (err.info.code === 'EACCES')
|
|
continue;
|
|
|
|
assert(err);
|
|
}
|
|
|
|
checkPriority(0, i);
|
|
|
|
// An undefined pid corresponds to the current process.
|
|
os.setPriority(i);
|
|
checkPriority(undefined, i);
|
|
|
|
// Specifying the actual pid works.
|
|
os.setPriority(process.pid, i);
|
|
checkPriority(process.pid, i);
|
|
}
|
|
|
|
{
|
|
assert.throws(() => { os.getPriority(-1); }, {
|
|
code: 'ERR_SYSTEM_ERROR',
|
|
message: /A system error occurred: uv_os_getpriority returned /,
|
|
name: 'SystemError'
|
|
});
|
|
}
|
|
|
|
|
|
function checkPriority(pid, expected) {
|
|
const priority = os.getPriority(pid);
|
|
|
|
// Verify that the priority values match on Unix, and are range mapped on
|
|
// Windows.
|
|
if (!common.isWindows) {
|
|
assert.strictEqual(priority, expected);
|
|
return;
|
|
}
|
|
|
|
// On Windows setting PRIORITY_HIGHEST will only work for elevated user,
|
|
// for others it will be silently reduced to PRIORITY_HIGH
|
|
if (expected < PRIORITY_HIGH)
|
|
assert.ok(priority === PRIORITY_HIGHEST || priority === PRIORITY_HIGH);
|
|
else if (expected < PRIORITY_ABOVE_NORMAL)
|
|
assert.strictEqual(priority, PRIORITY_HIGH);
|
|
else if (expected < PRIORITY_NORMAL)
|
|
assert.strictEqual(priority, PRIORITY_ABOVE_NORMAL);
|
|
else if (expected < PRIORITY_BELOW_NORMAL)
|
|
assert.strictEqual(priority, PRIORITY_NORMAL);
|
|
else if (expected < PRIORITY_LOW)
|
|
assert.strictEqual(priority, PRIORITY_BELOW_NORMAL);
|
|
else
|
|
assert.strictEqual(priority, PRIORITY_LOW);
|
|
}
|