mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
248 lines
9.5 KiB
JavaScript
248 lines
9.5 KiB
JavaScript
"use strict";
|
|
/*jslint nomen: true, plusplus: true, vars: true */
|
|
var assert = require('assert');
|
|
var mocha = require('mocha'), describe = mocha.describe, it = mocha.it, after = mocha.after;
|
|
var virtualBaton = require('../../../examples/libraries/virtualBaton.js');
|
|
|
|
describe('temp', function () {
|
|
var messageCount = 0, testStart = Date.now();
|
|
function makeMessager(nodes, me, mode) { // shim for High Fidelity Message system
|
|
function noopSend(channel, string, source) {
|
|
}
|
|
function hasChannel(node, channel) {
|
|
return -1 !== node.subscribed.indexOf(channel);
|
|
}
|
|
function sendSync(channel, message, nodes, skip) {
|
|
nodes.forEach(function (node) {
|
|
if (!hasChannel(node, channel) || (node === skip)) {
|
|
return;
|
|
}
|
|
node.sender(channel, message, me.name);
|
|
});
|
|
}
|
|
nodes.forEach(function (node) {
|
|
node.sender = node.sender || noopSend;
|
|
node.subscribed = node.subscribed || [];
|
|
});
|
|
return {
|
|
subscriberCount: function () {
|
|
var c = 0;
|
|
nodes.forEach(function (n) {
|
|
if (n.subscribed.length) {
|
|
c++;
|
|
}
|
|
});
|
|
return c;
|
|
},
|
|
subscribe: function (channel) {
|
|
me.subscribed.push(channel);
|
|
},
|
|
unsubscribe: function (channel) {
|
|
me.subscribed.splice(me.subscribed.indexOf(channel), 1);
|
|
},
|
|
sendMessage: function (channel, message) {
|
|
if ((mode === 'immediate2Me') && hasChannel(me, channel)) {
|
|
me.sender(channel, message, me.name);
|
|
}
|
|
if (mode === 'immediate') {
|
|
sendSync(channel, message, nodes, null);
|
|
} else {
|
|
process.nextTick(function () {
|
|
sendSync(channel, message, nodes, (mode === 'immediate2Me') ? me : null);
|
|
});
|
|
}
|
|
},
|
|
messageReceived: {
|
|
connect: function (f) {
|
|
me.sender = function (c, m, i) {
|
|
messageCount++; f(c, m, i);
|
|
};
|
|
},
|
|
disconnect: function () {
|
|
me.sender = noopSend;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
var debug = {}; //{flow: true, send: false, receive: false};
|
|
function makeBaton(testKey, nodes, node, debug, mode, optimize) {
|
|
debug = debug || {};
|
|
var baton = virtualBaton({
|
|
batonName: testKey,
|
|
debugSend: debug.send,
|
|
debugReceive: debug.receive,
|
|
debugFlow: debug.flow,
|
|
useOptimizations: optimize,
|
|
connectionTest: function (id) {
|
|
return baton.validId(id);
|
|
},
|
|
globals: {
|
|
Messages: makeMessager(nodes, node, mode),
|
|
MyAvatar: {sessionUUID: node.name},
|
|
Script: {
|
|
setTimeout: setTimeout,
|
|
clearTimeout: clearTimeout,
|
|
setInterval: setInterval,
|
|
clearInterval: clearInterval
|
|
},
|
|
AvatarList: {
|
|
getAvatar: function (id) {
|
|
return {sessionUUID: id};
|
|
}
|
|
},
|
|
Entities: {getEntityProperties: function () {
|
|
}},
|
|
print: console.log
|
|
}
|
|
});
|
|
return baton;
|
|
}
|
|
function noRelease(batonName) {
|
|
assert.ok(!batonName, "should not release");
|
|
}
|
|
function defineABunch(mode, optimize) {
|
|
function makeKey(prefix) {
|
|
return prefix + mode + (optimize ? '-opt' : '');
|
|
}
|
|
var testKeys = makeKey('single-');
|
|
it(testKeys, function (done) {
|
|
var nodes = [{name: 'a'}];
|
|
var a = makeBaton(testKeys, nodes, nodes[0], debug, mode).claim(function (key) {
|
|
console.log('claimed a');
|
|
assert.equal(testKeys, key);
|
|
a.unload();
|
|
done();
|
|
}, noRelease);
|
|
});
|
|
var testKeydp = makeKey('dual-parallel-');
|
|
it(testKeydp, function (done) {
|
|
this.timeout(10000);
|
|
var nodes = [{name: 'ap'}, {name: 'bp'}];
|
|
var a = makeBaton(testKeydp, nodes, nodes[0], debug, mode, optimize),
|
|
b = makeBaton(testKeydp, nodes, nodes[1], debug, mode, optimize);
|
|
function accepted(key) { // Under some circumstances of network timing, either a or b can win.
|
|
console.log('claimed ap');
|
|
assert.equal(testKeydp, key);
|
|
done();
|
|
}
|
|
a.claim(accepted, noRelease);
|
|
b.claim(accepted, noRelease);
|
|
});
|
|
var testKeyds = makeKey('dual-serial-');
|
|
it(testKeyds, function (done) {
|
|
var nodes = [{name: 'as'}, {name: 'bs'}],
|
|
gotA = false,
|
|
gotB = false;
|
|
makeBaton(testKeyds, nodes, nodes[0], debug, mode, optimize).claim(function (key) {
|
|
console.log('claimed as', key);
|
|
assert.ok(!gotA, "should not get A after B");
|
|
gotA = true;
|
|
done();
|
|
}, noRelease);
|
|
setTimeout(function () {
|
|
makeBaton(testKeyds, nodes, nodes[1], debug, mode, optimize).claim(function (key) {
|
|
console.log('claimed bs', key);
|
|
assert.ok(!gotB, "should not get B after A");
|
|
gotB = true;
|
|
done();
|
|
}, noRelease);
|
|
}, 500);
|
|
});
|
|
var testKeydsl = makeKey('dual-serial-long-');
|
|
it(testKeydsl, function (done) {
|
|
this.timeout(5000);
|
|
var nodes = [{name: 'al'}, {name: 'bl'}],
|
|
gotA = false,
|
|
gotB = false,
|
|
releaseA = false;
|
|
makeBaton(testKeydsl, nodes, nodes[0], debug, mode, optimize).claim(function (key) {
|
|
console.log('claimed al', key);
|
|
assert.ok(!gotB, "should not get A after B");
|
|
gotA = true;
|
|
if (!gotB) {
|
|
done();
|
|
}
|
|
}, function () {
|
|
assert.ok(gotA, "Should claim it first");
|
|
releaseA = true;
|
|
if (gotB) {
|
|
done();
|
|
}
|
|
});
|
|
setTimeout(function () {
|
|
makeBaton(testKeydsl, nodes, nodes[1], debug, mode, optimize).claim(function (key) {
|
|
console.log('claimed bl', key);
|
|
gotB = true;
|
|
if (releaseA) {
|
|
done();
|
|
}
|
|
}, noRelease);
|
|
}, 3000);
|
|
});
|
|
var testKeydsr = makeKey('dual-serial-with-release-');
|
|
it(testKeydsr, function (done) {
|
|
this.timeout(5000);
|
|
var nodes = [{name: 'asr'}, {name: 'bsr'}],
|
|
gotClaimA = false,
|
|
gotReleaseA = false,
|
|
a = makeBaton(testKeydsr, nodes, nodes[0], debug, mode, optimize),
|
|
b = makeBaton(testKeydsr, nodes, nodes[1], debug, mode, optimize);
|
|
a.claim(function (key) {
|
|
console.log('claimed asr');
|
|
assert.equal(testKeydsr, key);
|
|
gotClaimA = true;
|
|
b.claim(function (key) {
|
|
console.log('claimed bsr');
|
|
assert.equal(testKeydsr, key);
|
|
assert.ok(gotReleaseA);
|
|
done();
|
|
}, noRelease);
|
|
a.release();
|
|
}, function (key) {
|
|
console.log('released asr');
|
|
assert.equal(testKeydsr, key);
|
|
assert.ok(gotClaimA);
|
|
gotReleaseA = true;
|
|
});
|
|
});
|
|
var testKeydpr = makeKey('dual-parallel-with-release-');
|
|
it(testKeydpr, function (done) {
|
|
this.timeout(5000);
|
|
var nodes = [{name: 'ar'}, {name: 'br'}];
|
|
var a = makeBaton(testKeydpr, nodes, nodes[0], debug, mode, optimize),
|
|
b = makeBaton(testKeydpr, nodes, nodes[1], debug, mode, optimize),
|
|
gotClaimA = false,
|
|
gotReleaseA = false,
|
|
gotClaimB = false;
|
|
a.claim(function (key) {
|
|
console.log('claimed ar');
|
|
assert.equal(testKeydpr, key);
|
|
gotClaimA = true;
|
|
assert.ok(!gotClaimB, "if b claimed, should not get a");
|
|
a.release();
|
|
}, function (key) {
|
|
console.log('released ar');
|
|
assert.equal(testKeydpr, key);
|
|
assert.ok(gotClaimA);
|
|
gotReleaseA = true;
|
|
});
|
|
b.claim(function (key) {
|
|
console.log('claimed br', gotClaimA ? 'with' : 'without', 'ar first');
|
|
assert.equal(testKeydpr, key);
|
|
gotClaimB = true;
|
|
assert.ok(!gotClaimA || gotReleaseA);
|
|
done();
|
|
}, noRelease);
|
|
});
|
|
}
|
|
function defineAllModeTests(optimize) {
|
|
defineABunch('delayed', optimize);
|
|
defineABunch('immediate2Me', optimize);
|
|
defineABunch('immediate', optimize);
|
|
}
|
|
defineAllModeTests(true);
|
|
defineAllModeTests(false);
|
|
after(function () {
|
|
console.log(messageCount, 'messages sent over', (Date.now() - testStart), 'ms.');
|
|
});
|
|
});
|