Skip to content

Commit e3a324b

Browse files
author
Gabriel Schulhof
committed
test: use async/await for gc
Convert tests that gc into async functions that await 10 ticks after each gc. This is because gc has become async and because references will soon be deleted via a native `SetImmediate()`. Re: nodejs/node#34386
1 parent 5af645f commit e3a324b

File tree

9 files changed

+174
-150
lines changed

9 files changed

+174
-150
lines changed

test/arraybuffer.js

Lines changed: 74 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,78 @@
11
'use strict';
22
const buildType = process.config.target_defaults.default_configuration;
33
const assert = require('assert');
4-
const testUtil = require('./testUtil');
5-
6-
test(require(`./build/${buildType}/binding.node`));
7-
test(require(`./build/${buildType}/binding_noexcept.node`));
8-
9-
function test(binding) {
10-
testUtil.runGCTests([
11-
'Internal ArrayBuffer',
12-
() => {
13-
const test = binding.arraybuffer.createBuffer();
14-
binding.arraybuffer.checkBuffer(test);
15-
assert.ok(test instanceof ArrayBuffer);
16-
17-
const test2 = test.slice(0);
18-
binding.arraybuffer.checkBuffer(test2);
19-
},
20-
21-
'External ArrayBuffer',
22-
() => {
23-
const test = binding.arraybuffer.createExternalBuffer();
24-
binding.arraybuffer.checkBuffer(test);
25-
assert.ok(test instanceof ArrayBuffer);
26-
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
27-
},
28-
() => {
29-
global.gc();
30-
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
31-
},
32-
33-
'External ArrayBuffer with finalizer',
34-
() => {
35-
const test = binding.arraybuffer.createExternalBufferWithFinalize();
36-
binding.arraybuffer.checkBuffer(test);
37-
assert.ok(test instanceof ArrayBuffer);
38-
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
39-
},
40-
() => {
41-
global.gc();
42-
},
43-
() => {
44-
assert.strictEqual(1, binding.arraybuffer.getFinalizeCount());
45-
},
46-
47-
'External ArrayBuffer with finalizer hint',
48-
() => {
49-
const test = binding.arraybuffer.createExternalBufferWithFinalizeHint();
50-
binding.arraybuffer.checkBuffer(test);
51-
assert.ok(test instanceof ArrayBuffer);
52-
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
53-
},
54-
() => {
55-
global.gc();
56-
},
57-
() => {
58-
assert.strictEqual(1, binding.arraybuffer.getFinalizeCount());
59-
},
60-
61-
'ArrayBuffer with constructor',
62-
() => {
63-
assert.strictEqual(true, binding.arraybuffer.checkEmptyBuffer());
64-
const test = binding.arraybuffer.createBufferWithConstructor();
65-
binding.arraybuffer.checkBuffer(test);
66-
assert.ok(test instanceof ArrayBuffer);
67-
},
68-
69-
'ArrayBuffer updates data pointer and length when detached',
70-
() => {
71-
const mem = new WebAssembly.Memory({ initial: 1 });
72-
binding.arraybuffer.checkDetachUpdatesData(mem.buffer, () => mem.grow(1));
73-
},
74-
]);
4+
const tick = require('util').promisify(require('./testUtil').tick);
5+
6+
test(require(`./build/${buildType}/binding.node`))
7+
.then(() => test(require(`./build/${buildType}/binding_noexcept.node`)))
8+
9+
async function test(binding) {
10+
// Internal ArrayBuffer
11+
(() => {
12+
const test = binding.arraybuffer.createBuffer();
13+
binding.arraybuffer.checkBuffer(test);
14+
assert.ok(test instanceof ArrayBuffer);
15+
16+
const test2 = test.slice(0);
17+
binding.arraybuffer.checkBuffer(test2);
18+
})();
19+
20+
global.gc();
21+
await tick(10);
22+
23+
// External ArrayBuffer
24+
(() => {
25+
const test = binding.arraybuffer.createExternalBuffer();
26+
binding.arraybuffer.checkBuffer(test);
27+
assert.ok(test instanceof ArrayBuffer);
28+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
29+
})();
30+
31+
global.gc();
32+
await tick(10);
33+
34+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
35+
36+
// External ArrayBuffer with finalizer
37+
(() => {
38+
const test = binding.arraybuffer.createExternalBufferWithFinalize();
39+
binding.arraybuffer.checkBuffer(test);
40+
assert.ok(test instanceof ArrayBuffer);
41+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
42+
})();
43+
44+
global.gc();
45+
await tick(10);
46+
47+
assert.strictEqual(1, binding.arraybuffer.getFinalizeCount());
48+
49+
// External ArrayBuffer with finalizer hint
50+
(() => {
51+
const test = binding.arraybuffer.createExternalBufferWithFinalizeHint();
52+
binding.arraybuffer.checkBuffer(test);
53+
assert.ok(test instanceof ArrayBuffer);
54+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
55+
})();
56+
57+
global.gc();
58+
await tick(10);
59+
60+
assert.strictEqual(1, binding.arraybuffer.getFinalizeCount());
61+
62+
// ArrayBuffer with constructor
63+
(() => {
64+
assert.strictEqual(true, binding.arraybuffer.checkEmptyBuffer());
65+
const test = binding.arraybuffer.createBufferWithConstructor();
66+
binding.arraybuffer.checkBuffer(test);
67+
assert.ok(test instanceof ArrayBuffer);
68+
})();
69+
70+
global.gc();
71+
await tick(10);
72+
73+
// ArrayBuffer updates data pointer and length when detached
74+
(() => {
75+
const mem = new WebAssembly.Memory({ initial: 1 });
76+
binding.arraybuffer.checkDetachUpdatesData(mem.buffer, () => mem.grow(1));
77+
})();
7578
}

test/buffer.js

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,68 +3,72 @@ const buildType = process.config.target_defaults.default_configuration;
33
const assert = require('assert');
44
const testUtil = require('./testUtil');
55
const safeBuffer = require('safe-buffer');
6+
const tick = require('util').promisify(require('./testUtil').tick);
67

7-
test(require(`./build/${buildType}/binding.node`));
8-
test(require(`./build/${buildType}/binding_noexcept.node`));
8+
test(require(`./build/${buildType}/binding.node`))
9+
.then(() => test(require(`./build/${buildType}/binding_noexcept.node`)));
910

10-
function test(binding) {
11-
testUtil.runGCTests([
12-
'Internal Buffer',
13-
() => {
14-
const test = binding.buffer.createBuffer();
15-
binding.buffer.checkBuffer(test);
16-
assert.ok(test instanceof Buffer);
11+
async function test(binding) {
12+
// Internal Buffer
13+
(() => {
14+
const test = binding.buffer.createBuffer();
15+
binding.buffer.checkBuffer(test);
16+
assert.ok(test instanceof Buffer);
1717

18-
const test2 = safeBuffer.Buffer.alloc(test.length);
19-
test.copy(test2);
20-
binding.buffer.checkBuffer(test2);
21-
},
18+
const test2 = safeBuffer.Buffer.alloc(test.length);
19+
test.copy(test2);
20+
binding.buffer.checkBuffer(test2);
21+
})();
2222

23-
'Buffer copy',
24-
() => {
25-
const test = binding.buffer.createBufferCopy();
26-
binding.buffer.checkBuffer(test);
27-
assert.ok(test instanceof Buffer);
28-
},
23+
global.gc();
24+
await tick(10);
2925

30-
'External Buffer',
31-
() => {
32-
const test = binding.buffer.createExternalBuffer();
33-
binding.buffer.checkBuffer(test);
34-
assert.ok(test instanceof Buffer);
35-
assert.strictEqual(0, binding.buffer.getFinalizeCount());
36-
},
37-
() => {
38-
global.gc();
39-
assert.strictEqual(0, binding.buffer.getFinalizeCount());
40-
},
26+
// Buffer copy
27+
(() => {
28+
const test = binding.buffer.createBufferCopy();
29+
binding.buffer.checkBuffer(test);
30+
assert.ok(test instanceof Buffer);
31+
})();
32+
33+
global.gc();
34+
await tick(10);
4135

42-
'External Buffer with finalizer',
43-
() => {
44-
const test = binding.buffer.createExternalBufferWithFinalize();
36+
// External Buffer
37+
(() => {
38+
const test = binding.buffer.createExternalBuffer();
39+
binding.buffer.checkBuffer(test);
40+
assert.ok(test instanceof Buffer);
41+
assert.strictEqual(0, binding.buffer.getFinalizeCount());
42+
})();
43+
44+
global.gc();
45+
await tick(10);
46+
47+
assert.strictEqual(0, binding.buffer.getFinalizeCount());
48+
49+
// External Buffer with finalizer
50+
(() => {
51+
const test = binding.buffer.createExternalBufferWithFinalize();
52+
binding.buffer.checkBuffer(test);
53+
assert.ok(test instanceof Buffer);
54+
assert.strictEqual(0, binding.buffer.getFinalizeCount());
55+
})();
56+
57+
global.gc();
58+
await tick(10);
59+
60+
assert.strictEqual(1, binding.buffer.getFinalizeCount());
61+
62+
// External Buffer with finalizer hint
63+
(() => {
64+
const test = binding.buffer.createExternalBufferWithFinalizeHint();
4565
binding.buffer.checkBuffer(test);
4666
assert.ok(test instanceof Buffer);
4767
assert.strictEqual(0, binding.buffer.getFinalizeCount());
48-
},
49-
() => {
50-
global.gc();
51-
},
52-
() => {
53-
assert.strictEqual(1, binding.buffer.getFinalizeCount());
54-
},
68+
})();
69+
70+
global.gc();
71+
await tick(10);
5572

56-
'External Buffer with finalizer hint',
57-
() => {
58-
const test = binding.buffer.createExternalBufferWithFinalizeHint();
59-
binding.buffer.checkBuffer(test);
60-
assert.ok(test instanceof Buffer);
61-
assert.strictEqual(0, binding.buffer.getFinalizeCount());
62-
},
63-
() => {
64-
global.gc();
65-
},
66-
() => {
67-
assert.strictEqual(1, binding.buffer.getFinalizeCount());
68-
},
69-
]);
73+
assert.strictEqual(1, binding.buffer.getFinalizeCount());
7074
}

test/object/finalizer.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,23 @@
22

33
const buildType = process.config.target_defaults.default_configuration;
44
const assert = require('assert');
5+
const tick = require('util').promisify(require('../testUtil').tick);
56

6-
test(require(`../build/${buildType}/binding.node`));
7-
test(require(`../build/${buildType}/binding_noexcept.node`));
7+
test(require(`../build/${buildType}/binding.node`))
8+
.then(() => test(require(`../build/${buildType}/binding_noexcept.node`)));
89

910
function createWeakRef(binding, bindingToTest) {
1011
return binding.object[bindingToTest]({});
1112
}
1213

13-
function test(binding) {
14+
async function test(binding) {
1415
const obj1 = createWeakRef(binding, 'addFinalizer');
1516
global.gc();
17+
await tick(10);
1618
assert.deepStrictEqual(obj1, { finalizerCalled: true });
1719

1820
const obj2 = createWeakRef(binding, 'addFinalizerWithHint');
1921
global.gc();
22+
await tick(10);
2023
assert.deepStrictEqual(obj2, { finalizerCalledWithCorrectHint: true });
2124
}

test/objectwrap-removewrap.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ if (process.argv[2] === 'child') {
88
const buildType = process.config.target_defaults.default_configuration;
99
const assert = require('assert');
1010
const { spawnSync } = require('child_process');
11+
const tick = require('util').promisify(require('./testUtil').tick);
1112

12-
const test = (bindingName) => {
13+
async function test(bindingName) {
1314
const binding = require(bindingName);
1415
const Test = binding.objectwrap_removewrap.Test;
1516
const getDtorCalled = binding.objectwrap_removewrap.getDtorCalled;
@@ -19,7 +20,10 @@ const test = (bindingName) => {
1920
new Test();
2021
});
2122
assert.strictEqual(getDtorCalled(), 1);
22-
global.gc(); // Does not crash.
23+
24+
// Does not crash.
25+
global.gc();
26+
await tick(10);
2327

2428
// Start a child process that creates a single wrapped instance to ensure that
2529
// it is properly freed at its exit. It must not segfault.
@@ -31,5 +35,5 @@ const test = (bindingName) => {
3135
assert.strictEqual(child.status, 0);
3236
}
3337

34-
test(`./build/${buildType}/binding.node`);
35-
test(`./build/${buildType}/binding_noexcept.node`);
38+
test(`./build/${buildType}/binding.node`)
39+
.then(() => test(`./build/${buildType}/binding_noexcept.node`));

test/objectwrap.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
'use strict';
22
const buildType = process.config.target_defaults.default_configuration;
33
const assert = require('assert');
4+
const tick = require('util').promisify(require('./testUtil').tick);
45

5-
const test = (binding) => {
6+
async function test(binding) {
67
const Test = binding.objectwrap.Test;
78

89
const testValue = (obj, clazz) => {
@@ -237,7 +238,7 @@ const test = (binding) => {
237238
}
238239
};
239240

240-
const testFinalize = (clazz) => {
241+
async function testFinalize(clazz) {
241242

242243
let finalizeCalled = false;
243244
const finalizeCb = function(called) {
@@ -250,9 +251,9 @@ const test = (binding) => {
250251
})();
251252

252253
global.gc();
254+
await tick(10);
253255

254256
assert.strictEqual(finalizeCalled, true);
255-
256257
};
257258

258259
const testObj = (obj, clazz) => {
@@ -265,22 +266,23 @@ const test = (binding) => {
265266
testConventions(obj, clazz);
266267
}
267268

268-
const testClass = (clazz) => {
269+
async function testClass(clazz) {
269270
testStaticValue(clazz);
270271
testStaticAccessor(clazz);
271272
testStaticMethod(clazz);
272273

273274
testStaticEnumerables(clazz);
274-
testFinalize(clazz);
275+
await testFinalize(clazz);
275276
};
276277

277278
// `Test` is needed for accessing exposed symbols
278279
testObj(new Test(), Test);
279-
testClass(Test);
280+
await testClass(Test);
280281

281282
// Make sure the C++ object can be garbage collected without issues.
282-
setImmediate(global.gc);
283+
global.gc();
284+
await tick(10);
283285
}
284286

285-
test(require(`./build/${buildType}/binding.node`));
286-
test(require(`./build/${buildType}/binding_noexcept.node`));
287+
test(require(`./build/${buildType}/binding.node`))
288+
.then(() => test(require(`./build/${buildType}/binding_noexcept.node`)));

0 commit comments

Comments
 (0)