/
test-heapsnapshot-near-heap-limit-by-api.js
131 lines (121 loc) Β· 3.6 KB
/
test-heapsnapshot-near-heap-limit-by-api.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copy from test-heapsnapshot-near-heap-limit.js
'use strict';
const common = require('../common');
if (common.isPi) {
common.skip('Too slow for Raspberry Pi devices');
}
const tmpdir = require('../common/tmpdir');
const assert = require('assert');
const { spawnSync } = require('child_process');
const fixtures = require('../common/fixtures');
const fs = require('fs');
const v8 = require('v8');
if (process.env.isChild === '1') {
require(fixtures.path('workload', 'grow.js'));
const count = ~~process.env.count || 1;
for (let i = 0; i < count; i++) {
v8.setHeapSnapshotNearHeapLimit(+process.env.limit);
}
return;
}
const invalidValues = [-1, '', {}, NaN, undefined];
let errorCount = 0;
for (let i = 0; i < invalidValues.length; i++) {
try {
v8.setHeapSnapshotNearHeapLimit(invalidValues[i]);
} catch (e) {
console.log(e);
errorCount++;
}
}
assert.strictEqual(errorCount, invalidValues.length);
// Set twice
v8.setHeapSnapshotNearHeapLimit(1);
v8.setHeapSnapshotNearHeapLimit(2);
const env = {
...process.env,
NODE_DEBUG_NATIVE: 'diagnostics',
isChild: 1,
};
{
console.log('\nTesting set by cmd option and api');
tmpdir.refresh();
const child = spawnSync(process.execPath, [
'--trace-gc',
'--heapsnapshot-near-heap-limit=1',
'--max-old-space-size=50',
fixtures.path('workload', 'grow.js'),
], {
cwd: tmpdir.path,
env: {
...env,
limit: 1,
},
});
console.log(child.stdout.toString());
const stderr = child.stderr.toString();
console.log(stderr);
assert(common.nodeProcessAborted(child.status, child.signal),
'process should have aborted, but did not');
const list = fs.readdirSync(tmpdir.path)
.filter((file) => file.endsWith('.heapsnapshot'));
const risky = [...stderr.matchAll(
/Not generating snapshots because it's too risky/g)].length;
assert(list.length + risky > 0 && list.length <= 1,
`Generated ${list.length} snapshots ` +
`and ${risky} was too risky`);
}
{
console.log('\nTesting limit = 1');
tmpdir.refresh();
const child = spawnSync(process.execPath, [
'--trace-gc',
'--max-old-space-size=50',
__filename,
], {
cwd: tmpdir.path,
env: {
...env,
limit: 1,
},
});
console.log(child.stdout.toString());
const stderr = child.stderr.toString();
console.log(stderr);
assert(common.nodeProcessAborted(child.status, child.signal),
'process should have aborted, but did not');
const list = fs.readdirSync(tmpdir.path)
.filter((file) => file.endsWith('.heapsnapshot'));
const risky = [...stderr.matchAll(
/Not generating snapshots because it's too risky/g)].length;
assert(list.length + risky > 0 && list.length <= 1,
`Generated ${list.length} snapshots ` +
`and ${risky} was too risky`);
}
{
console.log('\nTesting limit = 3');
tmpdir.refresh();
const child = spawnSync(process.execPath, [
'--trace-gc',
'--max-old-space-size=50',
__filename,
], {
cwd: tmpdir.path,
env: {
...env,
limit: 3,
},
});
console.log(child.stdout.toString());
const stderr = child.stderr.toString();
console.log(stderr);
assert(common.nodeProcessAborted(child.status, child.signal),
'process should have aborted, but did not');
const list = fs.readdirSync(tmpdir.path)
.filter((file) => file.endsWith('.heapsnapshot'));
const risky = [...stderr.matchAll(
/Not generating snapshots because it's too risky/g)].length;
assert(list.length + risky > 0 && list.length <= 3,
`Generated ${list.length} snapshots ` +
`and ${risky} was too risky`);
}