зеркало из https://github.com/microsoft/napajs.git
convert transport builtin types test to TypeScript (#168)
This commit is contained in:
Родитель
1bf7fed967
Коммит
191fe79030
|
@ -15,7 +15,6 @@ test/module/test-dir
|
||||||
test/module/test-file
|
test/module/test-file
|
||||||
!test/module/node_modules
|
!test/module/node_modules
|
||||||
!test/module/**/*.js
|
!test/module/**/*.js
|
||||||
!test/transport-builtin-test.js
|
|
||||||
|
|
||||||
!unittest/module/test-files/node_modules
|
!unittest/module/test-files/node_modules
|
||||||
|
|
||||||
|
|
|
@ -1,246 +0,0 @@
|
||||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
||||||
// Licensed under the MIT license.
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
const napa = require('../lib/index');
|
|
||||||
let zoneId = 'transport-test-zone';
|
|
||||||
let zone = napa.zone.create(zoneId, { workers: 4 });
|
|
||||||
|
|
||||||
/// Construct an expected result string.
|
|
||||||
/// constructExpectedResult(5, 5, 255) returns '0,0,0,0,0'
|
|
||||||
/// constructExpectedResult(2, 5, 255) returns '0,0,255,255,255'
|
|
||||||
/// constructExpectedResult(0, 5, 255) returns '255,255,255,255,255'
|
|
||||||
global.constructExpectedResult =
|
|
||||||
function constructExpectedResult(i, length, value) {
|
|
||||||
const assert = require('assert');
|
|
||||||
assert(i >= 0 && length >= i);
|
|
||||||
let expected = '';
|
|
||||||
for (var t = 0; t < i; t++) {
|
|
||||||
if (t > 0) expected += ',';
|
|
||||||
expected += '0';
|
|
||||||
}
|
|
||||||
for (var t = i; t < length; t++) {
|
|
||||||
if (t > 0) expected += ',';
|
|
||||||
expected += value.toString();
|
|
||||||
}
|
|
||||||
return expected;
|
|
||||||
}
|
|
||||||
zone.broadcast("global.constructExpectedResult = " + constructExpectedResult.toString());
|
|
||||||
|
|
||||||
function transportSharedArrayBuffer() {
|
|
||||||
var promises = [];
|
|
||||||
var sab = new SharedArrayBuffer(4);
|
|
||||||
for (var i = 0; i < 4; i++) {
|
|
||||||
promises[i] = zone.execute((sab, i) => {
|
|
||||||
var ta = new Uint8Array(sab);
|
|
||||||
ta[i] = 100;
|
|
||||||
}, [sab, i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.all(promises).then(values => {
|
|
||||||
var ta = new Uint8Array(sab);
|
|
||||||
assert.deepEqual(ta.toString(), '100,100,100,100');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.transportSharedArrayBuffer = transportSharedArrayBuffer;
|
|
||||||
|
|
||||||
function transportCompositeObjectOfSharedArrayBuffer() {
|
|
||||||
let sab = new SharedArrayBuffer(4);
|
|
||||||
let ta1 = new Uint8Array(sab);
|
|
||||||
let ta2 = new Uint8Array(sab);
|
|
||||||
let obj = { sab: sab, tas: { ta1: ta1, ta2: ta2 }, ta22:ta2 };
|
|
||||||
return zone.execute((obj) => {
|
|
||||||
var ta = new Uint8Array(obj.sab);
|
|
||||||
ta[0] = 99;
|
|
||||||
obj.tas.ta1[1] = 88;
|
|
||||||
obj.tas.ta2[2] = 77;
|
|
||||||
obj.ta22[3] = 66;
|
|
||||||
}, [obj]).then((result) => {
|
|
||||||
var ta_sab = new Uint8Array(sab);
|
|
||||||
assert.deepEqual(ta_sab.toString(), '99,88,77,66');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.transportCompositeObjectOfSharedArrayBuffer = transportCompositeObjectOfSharedArrayBuffer;
|
|
||||||
|
|
||||||
function recursivelySetElementOfSharedArrayBuffer(zoneId, sab, i, value) {
|
|
||||||
if (i < 0) return;
|
|
||||||
let ta = new Uint8Array(sab);
|
|
||||||
ta[i] = value;
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
// SharedArrayBuffer shares storage when it is transported,
|
|
||||||
// so elements with index > i have been set to {value} by those finished zone.executions.
|
|
||||||
let expected = global.constructExpectedResult(i, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
|
|
||||||
const napa = require('../lib/index');
|
|
||||||
let zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
|
||||||
zone.execute(
|
|
||||||
recursivelySetElementOfSharedArrayBuffer,
|
|
||||||
[zoneId, sab, i - 1, value]
|
|
||||||
).then((result) => {
|
|
||||||
// SharedArrayBuffer shares storage when it is transported,
|
|
||||||
// if i > 0, ta[i - 1] has been set to {value} by the previous zone.execute,
|
|
||||||
// so ta.toString() should be larger than {expected} constructed before.
|
|
||||||
if (i > 0) assert(ta.toString() > expected);
|
|
||||||
else if (i === 0) assert.equal(ta.toString(), expected);
|
|
||||||
else assert(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function recursivelyTransportSharedArrayBuffer(length, timeout) {
|
|
||||||
let value = 255;
|
|
||||||
let sab = new SharedArrayBuffer(length);
|
|
||||||
let ta = new Uint8Array(sab);
|
|
||||||
recursivelySetElementOfSharedArrayBuffer(zoneId, sab, length - 1, value);
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
// Because SharedArrayBuffer will share storage when it is transported,
|
|
||||||
// once the recursive process finished, all elements of
|
|
||||||
// the original TypeArray (based on SharedArrayBuffer) should have been set to {value}.
|
|
||||||
let expected = global.constructExpectedResult(0, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
resolve();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.recursivelyTransportSharedArrayBuffer = recursivelyTransportSharedArrayBuffer;
|
|
||||||
|
|
||||||
|
|
||||||
function recursivelySetElementOfTypedArray_SAB(zoneId, ta, i, value) {
|
|
||||||
if (i < 0) return;
|
|
||||||
ta[i] = value;
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
// SharedArrayBuffer shares storage when it is transported,
|
|
||||||
// so elements with index > i have been set to {value} by those finished zone.executions.
|
|
||||||
let expected = global.constructExpectedResult(i, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
|
|
||||||
const napa = require('../lib/index');
|
|
||||||
let zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
|
||||||
zone.execute(
|
|
||||||
recursivelySetElementOfTypedArray_SAB,
|
|
||||||
[zoneId, ta, i - 1, value]
|
|
||||||
).then((result) => {
|
|
||||||
// SharedArrayBuffer shares storage when it is transported,
|
|
||||||
// if i > 0, ta[i - 1] has been set to {value} by the previous zone.execute,
|
|
||||||
// so ta.toString() should be larger than {expected} constructed before.
|
|
||||||
if (i > 0) assert(ta.toString() > expected);
|
|
||||||
else if (i === 0) assert.equal(ta.toString(), expected);
|
|
||||||
else assert(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function recursivelyTransportTypedArray_SAB(length, timeout) {
|
|
||||||
let value = 255;
|
|
||||||
let sab = new SharedArrayBuffer(length);
|
|
||||||
let ta = new Uint8Array(sab);
|
|
||||||
recursivelySetElementOfTypedArray_SAB(zoneId, ta, length - 1, value);
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
// Because SharedArrayBuffer will share storage when it is transported,
|
|
||||||
// once the recursive process finished, all elements of
|
|
||||||
// the original TypeArray (based on SharedArrayBuffer) should have been set to {value}.
|
|
||||||
let expected = global.constructExpectedResult(0, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
resolve();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.recursivelyTransportTypedArray_SAB = recursivelyTransportTypedArray_SAB;
|
|
||||||
|
|
||||||
|
|
||||||
function recursivelySetElementOfArrayBuffer(zoneId, ab, i, value) {
|
|
||||||
if (i < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let ta = new Uint8Array(ab);
|
|
||||||
ta[i] = value;
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
// ArrayBuffer's storage will be copied when it is transported.
|
|
||||||
// Elements with index > i should all be {value}.
|
|
||||||
// They are copied from the previous zone.execution.
|
|
||||||
let expected = global.constructExpectedResult(i, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
|
|
||||||
const napa = require('../lib/index');
|
|
||||||
let zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
|
||||||
zone.execute(
|
|
||||||
recursivelySetElementOfArrayBuffer,
|
|
||||||
[zoneId, ab, i - 1, value]
|
|
||||||
).then((result) => {
|
|
||||||
// The original TypeArray (based on ArrayBuffer) shouldn't been changed by the just-finished zone.execute.
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function recursivelyTransportArrayBuffer(length, timeout) {
|
|
||||||
let value = 255;
|
|
||||||
let ab = new ArrayBuffer(length);
|
|
||||||
let ta = new Uint8Array(ab);
|
|
||||||
recursivelySetElementOfArrayBuffer(zoneId, ab, length - 1, value);
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
// Except ta[ta-length -1] was set to {value} before the 1st transportation,
|
|
||||||
// the original TypeArray (based on ArrayBuffer) shouldn't been changed by the recursive execution.
|
|
||||||
let expected = global.constructExpectedResult(ta.length - 1, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
resolve();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.recursivelyTransportArrayBuffer = recursivelyTransportArrayBuffer;
|
|
||||||
|
|
||||||
|
|
||||||
function recursivelySetElementOfTypeArray_AB(zoneId, ta, i, value) {
|
|
||||||
if (i < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ta[i] = value;
|
|
||||||
|
|
||||||
const assert = require('assert');
|
|
||||||
|
|
||||||
// ArrayBuffer's storage will be copied when it is transported.
|
|
||||||
// Elements with index > i should all be {value}.
|
|
||||||
// They are copied from the previous zone.execution.
|
|
||||||
let expected = global.constructExpectedResult(i, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
|
|
||||||
const napa = require('../lib/index');
|
|
||||||
let zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
|
||||||
zone.execute(
|
|
||||||
recursivelySetElementOfTypeArray_AB,
|
|
||||||
[zoneId, ta, i - 1, value]
|
|
||||||
).then((result) => {
|
|
||||||
// The original TypeArray (based on ArrayBuffer) shouldn't been changed by the just-finished zone.execute.
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function recursivelyTransportTypedArray_AB(length, timeout) {
|
|
||||||
let value = 255;
|
|
||||||
let ab = new ArrayBuffer(length);
|
|
||||||
let ta = new Uint8Array(ab);
|
|
||||||
recursivelySetElementOfTypeArray_AB(zoneId, ta, length - 1, value);
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
// Except ta[ta-length -1] was set to {value} before the 1st transportation,
|
|
||||||
// the original TypeArray (based on ArrayBuffer) shouldn't been changed by the recursive execution.
|
|
||||||
let expected = global.constructExpectedResult(ta.length - 1, ta.length, value);
|
|
||||||
assert.equal(ta.toString(), expected);
|
|
||||||
resolve();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.recursivelyTransportTypedArray_AB = recursivelyTransportTypedArray_AB;
|
|
|
@ -6,9 +6,6 @@ import * as assert from 'assert';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as t from './napa-zone/test';
|
import * as t from './napa-zone/test';
|
||||||
|
|
||||||
// TODO #150 (helloshuangzi): Update TypeScript version and convert './transport-builtin-test' to TypeScript.
|
|
||||||
var transportBuiltin = require('./transport-builtin-test');
|
|
||||||
|
|
||||||
describe('napajs/transport', () => {
|
describe('napajs/transport', () => {
|
||||||
let napaZone = napa.zone.create('zone10');
|
let napaZone = napa.zone.create('zone10');
|
||||||
describe('TransportContext', () => {
|
describe('TransportContext', () => {
|
||||||
|
@ -49,7 +46,7 @@ describe('napajs/transport', () => {
|
||||||
it('@node: simple types', () => {
|
it('@node: simple types', () => {
|
||||||
t.simpleTypeTransportTest();
|
t.simpleTypeTransportTest();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('@napa: simple types', () => {
|
it('@napa: simple types', () => {
|
||||||
napaZone.execute('./napa-zone/test', "simpleTypeTransportTest");
|
napaZone.execute('./napa-zone/test', "simpleTypeTransportTest");
|
||||||
}).timeout(3000);
|
}).timeout(3000);
|
||||||
|
@ -96,40 +93,258 @@ describe('napajs/transport', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
function transportBuiltinObjects() {
|
function transportBuiltinObjects() {
|
||||||
|
let zoneId: string = 'transport-built-in-test-zone';
|
||||||
|
let transportTestZone: napa.zone.Zone = napa.zone.create(zoneId, { workers: 4 });
|
||||||
|
|
||||||
|
/// Construct an expected result string.
|
||||||
|
/// constructExpectedResult(5, 5, 255, 0) returns '0,0,0,0,0'
|
||||||
|
/// constructExpectedResult(2, 5, 255, 0) returns '0,0,255,255,255'
|
||||||
|
/// constructExpectedResult(0, 5, 255, 0) returns '255,255,255,255,255'
|
||||||
|
function constructExpectedResult(i: number, size: number, expectedValue: number, defaultValue: number = 0): string {
|
||||||
|
const assert = require('assert');
|
||||||
|
assert(i >= 0 && size >= i);
|
||||||
|
let expected: string = '';
|
||||||
|
for (let t: number = 0; t < i; t++) {
|
||||||
|
if (t > 0) expected += ',';
|
||||||
|
expected += defaultValue.toString();
|
||||||
|
}
|
||||||
|
for (var t = i; t < size; t++) {
|
||||||
|
if (t > 0) expected += ',';
|
||||||
|
expected += expectedValue.toString();
|
||||||
|
}
|
||||||
|
return expected;
|
||||||
|
}
|
||||||
|
(<any>global).constructExpectedResult = constructExpectedResult;
|
||||||
|
transportTestZone.broadcast("global.constructExpectedResult = " + constructExpectedResult.toString());
|
||||||
|
|
||||||
it('@node: transport SharedArrayBuffer (SAB)', () => {
|
it('@node: transport SharedArrayBuffer (SAB)', () => {
|
||||||
return transportBuiltin.transportSharedArrayBuffer();
|
let promises: Array<Promise<any>> = [];
|
||||||
|
let sab: SharedArrayBuffer = new SharedArrayBuffer(4);
|
||||||
|
for (let i: number = 0; i < 4; i++) {
|
||||||
|
promises[i] = transportTestZone.execute((sab, i) => {
|
||||||
|
let ta: Uint8Array = new Uint8Array(sab);
|
||||||
|
ta[i] = 100;
|
||||||
|
}, [sab, i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all(promises).then((values: Array<napa.zone.Result>) => {
|
||||||
|
let ta: Uint8Array = new Uint8Array(sab);
|
||||||
|
assert.deepEqual(ta.toString(), '100,100,100,100');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('@node: transport composite object of SharedArrayBuffer', () => {
|
it('@node: transport composite object of SharedArrayBuffer', () => {
|
||||||
return transportBuiltin.transportCompositeObjectOfSharedArrayBuffer();
|
let sab: SharedArrayBuffer = new SharedArrayBuffer(4);
|
||||||
|
let ta1: Uint8Array = new Uint8Array(sab);
|
||||||
|
let ta2: Uint8Array = new Uint8Array(sab);
|
||||||
|
let obj: Object = { sab: sab, tas: { ta1: ta1, ta2: ta2 }, ta22:ta2 };
|
||||||
|
return transportTestZone.execute((obj) => {
|
||||||
|
let ta: Uint8Array = new Uint8Array(obj.sab);
|
||||||
|
ta[0] = 99;
|
||||||
|
obj.tas.ta1[1] = 88;
|
||||||
|
obj.tas.ta2[2] = 77;
|
||||||
|
obj.ta22[3] = 66;
|
||||||
|
}, [obj]).then((result: napa.zone.Result) => {
|
||||||
|
var ta_sab: Uint8Array = new Uint8Array(sab);
|
||||||
|
assert.deepEqual(ta_sab.toString(), '99,88,77,66');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function recursivelySetElementOfSharedArrayBuffer(zoneId: string, sab: SharedArrayBuffer, i: number, value: number) {
|
||||||
|
if (i < 0) return;
|
||||||
|
let ta: Uint8Array = new Uint8Array(sab);
|
||||||
|
ta[i] = value;
|
||||||
|
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
// SharedArrayBuffer shares storage when it is transported,
|
||||||
|
// so elements with index > i have been set to {value} by those finished zone.executions.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(i, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
|
||||||
|
const napa = require('../lib/index');
|
||||||
|
let zone: napa.zone.Zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
||||||
|
zone.execute(
|
||||||
|
recursivelySetElementOfSharedArrayBuffer,
|
||||||
|
[zoneId, sab, i - 1, value]
|
||||||
|
).then((result: napa.zone.Result) => {
|
||||||
|
// SharedArrayBuffer shares storage when it is transported,
|
||||||
|
// if i > 0, ta[i - 1] has been set to {value} by the previous zone.execute,
|
||||||
|
// so ta.toString() should be larger than {expected} constructed before.
|
||||||
|
if (i > 0) assert(ta.toString() > expected);
|
||||||
|
else if (i === 0) assert.equal(ta.toString(), expected);
|
||||||
|
else assert(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
||||||
it('@node: recursively transport received SharedArrayBuffer (SAB)', () => {
|
it('@node: recursively transport received SharedArrayBuffer (SAB)', () => {
|
||||||
return transportBuiltin.recursivelyTransportSharedArrayBuffer(8, 50);
|
let size: number = 8;
|
||||||
|
let timeout: number = 50;
|
||||||
|
let value: number = 255;
|
||||||
|
let sab: SharedArrayBuffer = new SharedArrayBuffer(size);
|
||||||
|
let ta: Uint8Array = new Uint8Array(sab);
|
||||||
|
recursivelySetElementOfSharedArrayBuffer(zoneId, sab, size - 1, value);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
// Because SharedArrayBuffer will share storage when it is transported,
|
||||||
|
// once the recursive process finished, all elements of
|
||||||
|
// the original TypeArray (based on SharedArrayBuffer) should have been set to {value}.
|
||||||
|
let expected = (<any>global).constructExpectedResult(0, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
resolve();
|
||||||
|
}, timeout);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function recursivelySetElementOfTypedArray_SAB(zoneId: string, ta: Uint8Array, i: number, value: number) {
|
||||||
|
if (i < 0) return;
|
||||||
|
ta[i] = value;
|
||||||
|
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
// SharedArrayBuffer shares storage when it is transported,
|
||||||
|
// so elements with index > i have been set to {value} by those finished zone.executions.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(i, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
|
||||||
|
const napa = require('../lib/index');
|
||||||
|
let zone: napa.zone.Zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
||||||
|
zone.execute(
|
||||||
|
recursivelySetElementOfTypedArray_SAB,
|
||||||
|
[zoneId, ta, i - 1, value]
|
||||||
|
).then((result: napa.zone.Result) => {
|
||||||
|
// SharedArrayBuffer shares storage when it is transported,
|
||||||
|
// if i > 0, ta[i - 1] has been set to {value} by the previous zone.execute,
|
||||||
|
// so ta.toString() should be larger than {expected} constructed before.
|
||||||
|
if (i > 0) assert(ta.toString() > expected);
|
||||||
|
else if (i === 0) assert.equal(ta.toString(), expected);
|
||||||
|
else assert(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
||||||
it('@node: recursively transport received TypedArray based on SAB', () => {
|
it('@node: recursively transport received TypedArray based on SAB', () => {
|
||||||
return transportBuiltin.recursivelyTransportTypedArray_SAB(8, 50);
|
let size: number = 8;
|
||||||
|
let timeout: number = 50;
|
||||||
|
let value: number = 255;
|
||||||
|
let sab: SharedArrayBuffer = new SharedArrayBuffer(size);
|
||||||
|
let ta: Uint8Array = new Uint8Array(sab);
|
||||||
|
recursivelySetElementOfTypedArray_SAB(zoneId, ta, size - 1, value);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
// Because SharedArrayBuffer will share storage when it is transported,
|
||||||
|
// once the recursive process finished, all elements of
|
||||||
|
// the original TypeArray (based on SharedArrayBuffer) should have been set to {value}.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(0, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
resolve();
|
||||||
|
}, timeout);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function recursivelySetElementOfArrayBuffer(zoneId: string, ab: ArrayBuffer, i: number, value: number) {
|
||||||
|
if (i < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let ta: Uint8Array = new Uint8Array(ab);
|
||||||
|
ta[i] = value;
|
||||||
|
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
// ArrayBuffer's storage will be copied when it is transported.
|
||||||
|
// Elements with index > i should all be {value}.
|
||||||
|
// They are copied from the previous zone.execution.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(i, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
|
||||||
|
const napa = require('../lib/index');
|
||||||
|
let zone: napa.zone.Zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
||||||
|
zone.execute(
|
||||||
|
recursivelySetElementOfArrayBuffer,
|
||||||
|
[zoneId, ab, i - 1, value]
|
||||||
|
).then((result: napa.zone.Result) => {
|
||||||
|
// The original TypeArray (based on ArrayBuffer) shouldn't been changed by the just-finished zone.execute.
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
||||||
it('@node: recursively transport received ArrayBuffer (AB)', () => {
|
it('@node: recursively transport received ArrayBuffer (AB)', () => {
|
||||||
return transportBuiltin.recursivelyTransportArrayBuffer(8, 50);
|
let size: number = 8;
|
||||||
|
let timeout: number = 50;
|
||||||
|
let value: number = 255;
|
||||||
|
let ab: ArrayBuffer = new ArrayBuffer(size);
|
||||||
|
let ta: Uint8Array = new Uint8Array(ab);
|
||||||
|
recursivelySetElementOfArrayBuffer(zoneId, ab, size - 1, value);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
// Except ta[ta-length -1] was set to {value} before the 1st transportation,
|
||||||
|
// the original TypeArray (based on ArrayBuffer) shouldn't been changed by the recursive execution.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(ta.length - 1, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
resolve();
|
||||||
|
}, timeout);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function recursivelySetElementOfTypeArray_AB(zoneId: string, ta: Uint8Array, i: number, value: number) {
|
||||||
|
if (i < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ta[i] = value;
|
||||||
|
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
// ArrayBuffer's storage will be copied when it is transported.
|
||||||
|
// Elements with index > i should all be {value}.
|
||||||
|
// They are copied from the previous zone.execution.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(i, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
|
||||||
|
const napa = require('../lib/index');
|
||||||
|
let zone: napa.zone.Zone = (i % 4 < 2) ? napa.zone.get(zoneId) : napa.zone.node;
|
||||||
|
zone.execute(
|
||||||
|
recursivelySetElementOfTypeArray_AB,
|
||||||
|
[zoneId, ta, i - 1, value]
|
||||||
|
).then((result: napa.zone.Result) => {
|
||||||
|
// The original TypeArray (based on ArrayBuffer) shouldn't been changed by the just-finished zone.execute.
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
// @node: node -> napa -> napa -> node -> node -> napa -> napa
|
||||||
it('@node: recursively transport received TypedArray based on AB', () => {
|
it('@node: recursively transport received TypedArray based on AB', () => {
|
||||||
return transportBuiltin.recursivelyTransportTypedArray_AB(8, 50);
|
let size: number = 8;
|
||||||
|
let timeout: number = 50;
|
||||||
|
let value: number = 255;
|
||||||
|
let ab: ArrayBuffer = new ArrayBuffer(size);
|
||||||
|
let ta: Uint8Array = new Uint8Array(ab);
|
||||||
|
recursivelySetElementOfTypeArray_AB(zoneId, ta, size - 1, value);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
// Except ta[ta-length -1] was set to {value} before the 1st transportation,
|
||||||
|
// the original TypeArray (based on ArrayBuffer) shouldn't been changed by the recursive execution.
|
||||||
|
let expected: string = (<any>global).constructExpectedResult(ta.length - 1, ta.length, value);
|
||||||
|
assert.equal(ta.toString(), expected);
|
||||||
|
resolve();
|
||||||
|
}, timeout);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var builtinTestGroup = 'Transport built-in objects';
|
let builtinTestGroup = 'Transport built-in objects';
|
||||||
if (process.version >= 'v9.0.0' || process.version.indexOf('.') > 2) {
|
let nodeVersionMajor = parseInt(process.versions.node.split('.')[0]);
|
||||||
|
if (nodeVersionMajor >= 9) {
|
||||||
describe(builtinTestGroup, transportBuiltinObjects);
|
describe(builtinTestGroup, transportBuiltinObjects);
|
||||||
} else {
|
} else {
|
||||||
describe.skip(builtinTestGroup, transportBuiltinObjects);
|
describe.skip(builtinTestGroup, transportBuiltinObjects);
|
||||||
require('npmlog').warn(builtinTestGroup, 'This test group is skipped since it requires node newer than v9.0.0');
|
require('npmlog').warn(builtinTestGroup, 'This test group is skipped since it requires node v9.0.0 or above.');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,6 +6,6 @@
|
||||||
"noImplicitAny": true,
|
"noImplicitAny": true,
|
||||||
"declaration": false,
|
"declaration": false,
|
||||||
"preserveConstEnums": true,
|
"preserveConstEnums": true,
|
||||||
"lib": [ "es2015" ]
|
"lib": [ "es2017" ]
|
||||||
}
|
}
|
||||||
}
|
}
|
Загрузка…
Ссылка в новой задаче