nope-js-node
Version:
NoPE Runtime for Nodejs. For Browser-Support please use nope-browser
201 lines (200 loc) • 9.11 kB
JavaScript
;
/**
* @author Martin Karkowski
* @email m.karkowski@zema.de
* @desc [description]
*/
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const mocha_1 = require("mocha");
require("reflect-metadata");
const getLayer_nodejs_1 = require("../../communication/getLayer.nodejs");
const async_1 = require("../../helpers/async");
const nopeObservable_1 = require("../../observables/nopeObservable");
const ConnectivityManager_1 = require("./ConnectivityManager");
(0, mocha_1.describe)("NopeConnectivityManager", function () {
// Describe the required Test:
let first = new ConnectivityManager_1.NopeConnectivityManager({
communicator: (0, getLayer_nodejs_1.getLayer)("event", "", false),
logger: false,
}, () => new nopeObservable_1.NopeObservable(), "first");
(0, mocha_1.describe)("Configuration", function () {
let communicator = (0, getLayer_nodejs_1.getLayer)("event", "", false);
(0, mocha_1.beforeEach)((done) => {
first.dispose(true);
communicator = (0, getLayer_nodejs_1.getLayer)("event", "", false);
// Create a new Observer
first = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
logger: false,
}, () => new nopeObservable_1.NopeObservable(), "test");
first.ready.waitFor().then(() => done());
});
(0, mocha_1.it)("adapting timings", async () => {
// Remove the Old Timer
first.setTimings({
checkInterval: 10,
dead: 25,
remove: 30,
sendAliveInterval: 5,
slow: 15,
warn: 20,
});
first.dispose();
});
(0, mocha_1.it)("master-flag", async () => {
// Remove the Old Timer
(0, chai_1.expect)(first.isMaster, "Expecting to be the master");
first.isMaster = true;
(0, chai_1.expect)(first.isMaster, "Expecting to be the master");
first.isMaster = false;
(0, chai_1.expect)(!first.isMaster, "Expecting to be the master");
first.dispose();
});
});
(0, mocha_1.describe)("NopeConnectivityManager Communication", function () {
let communicator = (0, getLayer_nodejs_1.getLayer)("event", "", false);
(0, mocha_1.beforeEach)((done) => {
first.dispose(true);
communicator = (0, getLayer_nodejs_1.getLayer)("event", "", false);
// Create a new Observer
first = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
logger: false,
}, () => new nopeObservable_1.NopeObservable(), "first");
first.ready.waitFor().then(() => done());
});
(0, mocha_1.it)("new detection", (done) => {
let sub = null;
sub = first.dispatchers.onChange.subscribe((changes) => {
if (changes.added.length >= 1) {
done();
first.dispose(true);
sub.unsubscribe();
}
else {
done(new Error("Not found"));
first.dispose(true);
sub.unsubscribe();
}
});
const second = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
logger: false,
timeouts: {
checkInterval: 10,
dead: 25,
remove: 30,
sendAliveInterval: 5,
slow: 15,
warn: 20,
},
}, () => new nopeObservable_1.NopeObservable(), "second");
second.dispose(true);
});
(0, mocha_1.it)("removed detection", (done) => {
let sub = null;
let firstCall = true;
// We want our first dispatcher to detect the loss ==>
// We adapt the time. That our second dispatcher will be
// more less directly offline.
first.setTimings({
checkInterval: 10,
dead: 25,
remove: 30,
sendAliveInterval: 5,
slow: 15,
warn: 20,
});
sub = first.dispatchers.onChange.subscribe((changes) => {
if (firstCall) {
firstCall = false;
}
else {
if (changes.removed.length >= 1) {
done();
first.dispose(true);
second.dispose(true);
sub.unsubscribe();
}
else {
done(new Error("removing has not been detected"));
first.dispose(true);
second.dispose(true);
sub.unsubscribe();
}
}
});
const second = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
logger: false,
}, () => new nopeObservable_1.NopeObservable(), "second");
});
(0, mocha_1.it)("synchronizing time", async () => {
// Remove the Old Timer
first.dispose(true);
first = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
}, () => new nopeObservable_1.NopeObservable(), "first");
const timestamp = first.now;
// Now we want to simulate an delay.
let start = Date.now();
await (0, async_1.sleep)(30);
let end = Date.now();
// We have waited something like 100 ms (+-)
// thats our delay. Now if we use that delay,
// we are able sync our time.
first.syncTime(timestamp, end - start);
// Get the Adapted Timestamp.
const adapted = first.info.timestamp;
end = Date.now();
// Dispose our Delay.
first.dispose(true);
(0, chai_1.assert)(end - adapted < 5, "There should not be an delta.");
});
(0, mocha_1.it)("master", async () => {
// Wait for the Handshake
await (0, async_1.sleep)(10);
(0, chai_1.assert)(first.isMaster, "First should be master");
// Create the second Element.
const second = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
logger: false,
}, () => new nopeObservable_1.NopeObservable(), "second");
// Wait for the Handshake
await (0, async_1.sleep)(10);
(0, chai_1.assert)(first.isMaster, "First should be master");
(0, chai_1.assert)(second.isMaster == false, "Second should not be master");
(0, chai_1.assert)(first.master.id == first.id, "First should recognize the first as master");
(0, chai_1.assert)(second.master.id == first.id, "Second should recognize the first as master");
first.dispose(true);
second.dispose(true);
});
(0, mocha_1.it)("master - forced", async () => {
// Wait for the Handshake
await (0, async_1.sleep)(10);
(0, chai_1.assert)(first.isMaster, "First should be master");
first.isMaster = false;
// Create the second Element.
const second = new ConnectivityManager_1.NopeConnectivityManager({
communicator,
logger: false,
}, () => new nopeObservable_1.NopeObservable(), "second");
// Wait for the Handshake
await (0, async_1.sleep)(10);
(0, chai_1.assert)(first.isMaster == false, "First should not be master");
(0, chai_1.assert)(second.isMaster == true, "Second should be master");
(0, chai_1.assert)(first.master.id == second.id, "First should recognize the second as master");
(0, chai_1.assert)(second.master.id == second.id, "Second should recognize the second as master");
// Wait for the Handshake
first.isMaster = null;
await (0, async_1.sleep)(40);
(0, chai_1.assert)(first.isMaster === true, "First should be master");
(0, chai_1.assert)(second.isMaster == false, "Second should not be master");
(0, chai_1.assert)(first.master.id == first.id, "First should recognize the first as master");
(0, chai_1.assert)(second.master.id == first.id, "Second should recognize the first as master");
first.dispose(true);
second.dispose(true);
});
});
});