Skip to content

Commit af75425

Browse files
committed
[CI TEST, DO NOT MERGE] extract stack exhaustion test
1 parent b3d0804 commit af75425

File tree

4 files changed

+88
-18
lines changed

4 files changed

+88
-18
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Flags: --expose-internals --stack-size=128
2+
'use strict';
3+
require('../common');
4+
const assert = require('assert');
5+
const { serializeError, deserializeError } = require('internal/error_serdes');
6+
7+
function cycle(err) {
8+
return deserializeError(serializeError(err));
9+
}
10+
11+
class ErrorWithCyclicCause extends Error {
12+
get cause() {
13+
return new ErrorWithCyclicCause();
14+
}
15+
}
16+
const errorWithCyclicCause = Object
17+
.defineProperty(new Error('Error with cause'), 'cause', { get() { return errorWithCyclicCause; } });
18+
19+
assert.strictEqual(Object.hasOwn(cycle(errorWithCyclicCause), 'cause'), true);
20+
21+
// When the cause is cyclic, it is serialized until Maxiumum call stack size is reached
22+
let depth = 0;
23+
let e = cycle(new ErrorWithCyclicCause('Error with cause'));
24+
while (e.cause) {
25+
e = e.cause;
26+
depth++;
27+
}
28+
assert(depth > 1);
29+
console.log('Successfully completed stack exhaust test at', depth);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Flags: --expose-internals --stack-size=3072
2+
'use strict';
3+
require('../common');
4+
const assert = require('assert');
5+
const { serializeError, deserializeError } = require('internal/error_serdes');
6+
7+
function cycle(err) {
8+
return deserializeError(serializeError(err));
9+
}
10+
11+
class ErrorWithCyclicCause extends Error {
12+
get cause() {
13+
return new ErrorWithCyclicCause();
14+
}
15+
}
16+
const errorWithCyclicCause = Object
17+
.defineProperty(new Error('Error with cause'), 'cause', { get() { return errorWithCyclicCause; } });
18+
19+
assert.strictEqual(Object.hasOwn(cycle(errorWithCyclicCause), 'cause'), true);
20+
21+
// When the cause is cyclic, it is serialized until Maxiumum call stack size is reached
22+
let depth = 0;
23+
let e = cycle(new ErrorWithCyclicCause('Error with cause'));
24+
while (e.cause) {
25+
e = e.cause;
26+
depth++;
27+
}
28+
assert(depth > 1);
29+
console.log('Successfully completed stack exhaust test at', depth);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Flags: --expose-internals
2+
'use strict';
3+
require('../common');
4+
const assert = require('assert');
5+
const { serializeError, deserializeError } = require('internal/error_serdes');
6+
7+
function cycle(err) {
8+
return deserializeError(serializeError(err));
9+
}
10+
11+
class ErrorWithCyclicCause extends Error {
12+
get cause() {
13+
return new ErrorWithCyclicCause();
14+
}
15+
}
16+
const errorWithCyclicCause = Object
17+
.defineProperty(new Error('Error with cause'), 'cause', { get() { return errorWithCyclicCause; } });
18+
19+
assert.strictEqual(Object.hasOwn(cycle(errorWithCyclicCause), 'cause'), true);
20+
21+
// When the cause is cyclic, it is serialized until Maxiumum call stack size is reached
22+
let depth = 0;
23+
let e = cycle(new ErrorWithCyclicCause('Error with cause'));
24+
while (e.cause) {
25+
e = e.cause;
26+
depth++;
27+
}
28+
assert(depth > 1);
29+
console.log('Successfully completed stack exhaust test at', depth);

test/parallel/test-error-serdes.js

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Flags: --expose-internals --stack-size=128
1+
// Flags: --expose-internals
22
'use strict';
33
require('../common');
44
const assert = require('assert');
@@ -57,17 +57,10 @@ class ErrorWithThowingCause extends Error {
5757
throw new Error('err');
5858
}
5959
}
60-
class ErrorWithCyclicCause extends Error {
61-
get cause() {
62-
return new ErrorWithCyclicCause();
63-
}
64-
}
6560
const errorWithCause = Object
6661
.defineProperty(new Error('Error with cause'), 'cause', { get() { return { foo: 'bar' }; } });
6762
const errorWithThrowingCause = Object
6863
.defineProperty(new Error('Error with cause'), 'cause', { get() { throw new Error('err'); } });
69-
const errorWithCyclicCause = Object
70-
.defineProperty(new Error('Error with cause'), 'cause', { get() { return errorWithCyclicCause; } });
7164

7265
assert.strictEqual(cycle(new Error('Error with cause', { cause: 0 })).cause, 0);
7366
assert.strictEqual(cycle(new Error('Error with cause', { cause: -1 })).cause, -1);
@@ -79,19 +72,9 @@ assert.strictEqual(cycle(new Error('Error with cause', { cause: 'foo' })).cause,
7972
assert.deepStrictEqual(cycle(new Error('Error with cause', { cause: new Error('err') })).cause, new Error('err'));
8073
assert.deepStrictEqual(cycle(errorWithCause).cause, { foo: 'bar' });
8174
assert.strictEqual(Object.hasOwn(cycle(errorWithThrowingCause), 'cause'), false);
82-
assert.strictEqual(Object.hasOwn(cycle(errorWithCyclicCause), 'cause'), true);
8375
assert.deepStrictEqual(cycle(new ErrorWithCause('Error with cause')).cause, new Error('err'));
8476
assert.strictEqual(cycle(new ErrorWithThowingCause('Error with cause')).cause, undefined);
8577
assert.strictEqual(Object.hasOwn(cycle(new ErrorWithThowingCause('Error with cause')), 'cause'), false);
86-
// When the cause is cyclic, it is serialized until Maxiumum call stack size is reached
87-
let depth = 0;
88-
let e = cycle(new ErrorWithCyclicCause('Error with cause'));
89-
while (e.cause) {
90-
e = e.cause;
91-
depth++;
92-
}
93-
assert(depth > 1);
94-
9578

9679
{
9780
const err = new ERR_INVALID_ARG_TYPE('object', 'Object', 42);

0 commit comments

Comments
 (0)