86 lines
2.8 KiB
JavaScript
86 lines
2.8 KiB
JavaScript
|
'use strict';
|
||
|
const assert = require('assert');
|
||
|
const ref = require('../');
|
||
|
let weak; try { weak = require('weak-napi'); } catch (e) {}
|
||
|
|
||
|
describe('pointer', function() {
|
||
|
const test = Buffer.from('hello world');
|
||
|
|
||
|
beforeEach(gc);
|
||
|
|
||
|
it('should write and read back a pointer (Buffer) in a Buffer', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.pointer);
|
||
|
ref.writePointer(buf, 0, test)
|
||
|
const out = ref.readPointer(buf, 0, test.length);
|
||
|
assert.strictEqual(out.length, test.length)
|
||
|
for (let i = 0, l = out.length; i < l; i++) {
|
||
|
assert.strictEqual(out[i], test[i])
|
||
|
}
|
||
|
assert.strictEqual(ref.address(out), ref.address(test))
|
||
|
});
|
||
|
|
||
|
it('should retain references to a written pointer in a Buffer', function (done) {
|
||
|
if (weak === undefined)
|
||
|
return this.skip('weak not avaialbe');
|
||
|
let child_gc = false;
|
||
|
let parent_gc = false;
|
||
|
let child = Buffer.from('a pointer holding some data...');
|
||
|
let parent = Buffer.alloc(ref.sizeof.pointer);
|
||
|
|
||
|
weak(child, () => { child_gc = true });
|
||
|
weak(parent, () => { parent_gc = true });
|
||
|
ref.writePointer(parent, 0, child);
|
||
|
assert(!child_gc, '"child" has been garbage collected too soon');
|
||
|
assert(!parent_gc, '"parent" has been garbage collected too soon');
|
||
|
|
||
|
// try to GC `child`
|
||
|
child = null;
|
||
|
gc();
|
||
|
assert(!child_gc, '"child" has been garbage collected too soon');
|
||
|
assert(!parent_gc, '"parent" has been garbage collected too soon');
|
||
|
|
||
|
// now GC `parent`
|
||
|
parent = null;
|
||
|
gc();
|
||
|
setImmediate(() => {
|
||
|
setImmediate(() => {
|
||
|
assert(parent_gc, '"parent" has not been garbage collected');
|
||
|
gc();
|
||
|
setImmediate(() => {
|
||
|
setImmediate(() => {
|
||
|
assert(child_gc, '"child" has not been garbage collected');
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should throw an Error when reading from the NULL pointer', function() {
|
||
|
assert.throws(() => {
|
||
|
ref.NULL.readPointer();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should return a 0-length Buffer when reading a NULL pointer', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.pointer);
|
||
|
ref.writePointer(buf, 0, ref.NULL);
|
||
|
const out = ref.readPointer(buf, 0, 100);
|
||
|
assert.strictEqual(out.length, 0);
|
||
|
})
|
||
|
|
||
|
describe('offset', function() {
|
||
|
it('should read two pointers next to each other in memory', function() {
|
||
|
const buf = Buffer.alloc(ref.sizeof.pointer * 2);
|
||
|
const a = Buffer.from('hello');
|
||
|
const b = Buffer.from('world');
|
||
|
buf.writePointer(a, 0 * ref.sizeof.pointer);
|
||
|
buf.writePointer(b, 1 * ref.sizeof.pointer);
|
||
|
const _a = buf.readPointer(0 * ref.sizeof.pointer);
|
||
|
const _b = buf.readPointer(1 * ref.sizeof.pointer);
|
||
|
assert.strictEqual(a.address(), _a.address());
|
||
|
assert.strictEqual(b.address(), _b.address());
|
||
|
});
|
||
|
});
|
||
|
});
|