test a few extra paths in several nodes

trigger, switch and file
(and linted delay just because)
This commit is contained in:
Dave Conway-Jones
2016-04-23 21:06:48 +01:00
parent 595ff63b72
commit d0f57efe0b
4 changed files with 164 additions and 56 deletions

View File

@@ -28,7 +28,6 @@ var secondsToMinutes = 60;
var secondsToHours = 3600;
var secondsToDays = 86400;
describe('delay Node', function() {
beforeEach(function(done) {
@@ -71,11 +70,11 @@ describe('delay Node', function() {
});
var TimeUnitEnum = {
MILLIS : "milliseconds",
SECONDS : "seconds",
MINUTES : "minutes",
HOURS : "hours",
DAYS : "days"
MILLIS : "milliseconds",
SECONDS : "seconds",
MINUTES : "minutes",
HOURS : "hours",
DAYS : "days"
}
/**
@@ -90,7 +89,7 @@ describe('delay Node', function() {
var minExpected = expectedValue - toleranceFraction;
var maxExpected = expectedValue + toleranceFraction;
if(actualValue >= minExpected && actualValue <= maxExpected) {
if (actualValue >= minExpected && actualValue <= maxExpected) {
toReturn = true;
} else {
toReturn = false;
@@ -117,23 +116,23 @@ describe('delay Node', function() {
var aTimeoutUnifiedToSeconds;
// calculating the timeout in seconds
if(aTimeoutUnit == TimeUnitEnum.MILLIS) {
if (aTimeoutUnit == TimeUnitEnum.MILLIS) {
aTimeoutUnifiedToSeconds = aTimeout / millisToSeconds;
} else if(aTimeoutUnit == TimeUnitEnum.SECONDS) {
} else if (aTimeoutUnit == TimeUnitEnum.SECONDS) {
aTimeoutUnifiedToSeconds = aTimeout;
} else if(aTimeoutUnit == TimeUnitEnum.MINUTES) {
} else if (aTimeoutUnit == TimeUnitEnum.MINUTES) {
aTimeoutUnifiedToSeconds = aTimeout * secondsToMinutes;
} else if(aTimeoutUnit == TimeUnitEnum.HOURS) {
} else if (aTimeoutUnit == TimeUnitEnum.HOURS) {
aTimeoutUnifiedToSeconds = aTimeout * secondsToHours;
} else if(aTimeoutUnit == TimeUnitEnum.DAYS) {
} else if (aTimeoutUnit == TimeUnitEnum.DAYS) {
aTimeoutUnifiedToSeconds = aTimeout * secondsToDays;
}
if(closeEnough(runtimeSeconds, aTimeoutUnifiedToSeconds, GRACE_PERCENTAGE)) {
if (closeEnough(runtimeSeconds, aTimeoutUnifiedToSeconds, GRACE_PERCENTAGE)) {
done();
} else {
try {
should.fail(null, null, "Delayed runtime seconds " + runtimeSeconds + " was not close enough to exlected timeout seconds: " + aTimeoutUnifiedToSeconds);
should.fail(null, null, "Delayed runtime seconds " + runtimeSeconds + " was not close enough to exlected timeout seconds: " + aTimeoutUnifiedToSeconds);
} catch (err) {
done(err);
}
@@ -188,7 +187,7 @@ describe('delay Node', function() {
var receiveTimestamp;
helperNode1.on("input", function(msg) {
if(receiveTimestamp) {
if (receiveTimestamp) {
var elapse = process.hrtime(receiveTimestamp);
var receiveInterval = (elapse[0] * 1000) + ((elapse[1] / nanosToSeconds) * 1000);
receiveInterval.should.be.above(rate * 0.9);
@@ -200,16 +199,16 @@ describe('delay Node', function() {
var possibleMaxMessageCount = Math.ceil(aLimit * (runtimeInMillis / 1000) + aLimit); // +aLimit as at the start of the 2nd period, we're allowing the 3rd burst
var i = 0;
for(; i < possibleMaxMessageCount + 1; i++) {
for (; i < possibleMaxMessageCount + 1; i++) {
delayNode1.receive({payload:i});
}
setTimeout(function() {
try {
receivedMessagesStack.length.should.be.lessThan(possibleMaxMessageCount);
for(var j = 0; j < receivedMessagesStack.length; j++) {
if(receivedMessagesStack[j].payload === j) {
if(j === (receivedMessagesStack.length -1)) { // last message, all matched so far
for (var j = 0; j < receivedMessagesStack.length; j++) {
if (receivedMessagesStack[j].payload === j) {
if (j === (receivedMessagesStack.length -1)) { // last message, all matched so far
done();
}
} else {
@@ -250,7 +249,7 @@ describe('delay Node', function() {
var receiveTimestamp;
helperNode1.on("input", function(msg) {
if(receiveTimestamp) {
if (receiveTimestamp) {
var elapse = process.hrtime(receiveTimestamp);
var receiveInterval = (elapse[0] * 1000) + ((elapse[1] / nanosToSeconds) * 1000);
receiveInterval.should.be.above(rate * 0.9);
@@ -264,9 +263,9 @@ describe('delay Node', function() {
var i = 0;
delayNode1.receive({payload:i});
i++;
for(; i < possibleMaxMessageCount + 1; i++) {
for (; i < possibleMaxMessageCount + 1; i++) {
setTimeout(function() {
delayNode1.receive({payload:i});
delayNode1.receive({payload:i});
}, 2 * ((rate * i) / possibleMaxMessageCount) );
}
@@ -281,9 +280,9 @@ describe('delay Node', function() {
receivedMessagesStack.length.should.be.greaterThan(2); // ensure that we receive more than 1st and last message
receivedMessagesStack[0].payload.should.be.exactly(0); // means we received the last message injected just before test termination
var foundAtLeastOneDrop = false;
for(var i = 0; i < receivedMessagesStack.length; i++) {
if(i > 0) {
if(receivedMessagesStack[i].payload - receivedMessagesStack[i - 1].payload > 1) {
for (var i = 0; i < receivedMessagesStack.length; i++) {
if (i > 0) {
if (receivedMessagesStack[i].payload - receivedMessagesStack[i - 1].payload > 1) {
foundAtLeastOneDrop = true;
}
}
@@ -317,11 +316,11 @@ describe('delay Node', function() {
* @param allowedGracePercent - The percentage of grace allowed
*/
function inBetweenDelays(timeoutFrom, timeoutTo, actualTimeout, allowedGracePercent) {
if(closeEnough(actualTimeout, timeoutFrom, allowedGracePercent)) {
if (closeEnough(actualTimeout, timeoutFrom, allowedGracePercent)) {
return true;
} else if(closeEnough(actualTimeout, timeoutTo, allowedGracePercent)) {
} else if (closeEnough(actualTimeout, timeoutTo, allowedGracePercent)) {
return true;
} else if(timeoutFrom < actualTimeout && timeoutTo > actualTimeout) {
} else if (timeoutFrom < actualTimeout && timeoutTo > actualTimeout) {
return true;
} else {
return false;
@@ -349,28 +348,28 @@ describe('delay Node', function() {
var aTimeoutToUnifiedToSeconds;
// calculating the timeout in seconds
if(aTimeoutUnit == TimeUnitEnum.MILLIS) {
if (aTimeoutUnit == TimeUnitEnum.MILLIS) {
aTimeoutFromUnifiedToSeconds = aTimeoutFrom / millisToSeconds;
aTimeoutToUnifiedToSeconds = aTimeoutTo / millisToSeconds;
} else if(aTimeoutUnit == TimeUnitEnum.SECONDS) {
} else if (aTimeoutUnit == TimeUnitEnum.SECONDS) {
aTimeoutFromUnifiedToSeconds = aTimeoutFrom;
aTimeoutToUnifiedToSeconds = aTimeoutTo;
} else if(aTimeoutUnit == TimeUnitEnum.MINUTES) {
} else if (aTimeoutUnit == TimeUnitEnum.MINUTES) {
aTimeoutFromUnifiedToSeconds = aTimeoutFrom * secondsToMinutes;
aTimeoutToUnifiedToSeconds = aTimeoutTo * secondsToMinutes;
} else if(aTimeoutUnit == TimeUnitEnum.HOURS) {
} else if (aTimeoutUnit == TimeUnitEnum.HOURS) {
aTimeoutFromUnifiedToSeconds = aTimeoutFrom * secondsToHours;
aTimeoutToUnifiedToSeconds = aTimeoutTo * secondsToHours;
} else if(aTimeoutUnit == TimeUnitEnum.DAYS) {
} else if (aTimeoutUnit == TimeUnitEnum.DAYS) {
aTimeoutFromUnifiedToSeconds = aTimeoutFrom * secondsToDays;
aTimeoutToUnifiedToSeconds = aTimeoutTo * secondsToDays;
}
if(inBetweenDelays(aTimeoutFromUnifiedToSeconds, aTimeoutToUnifiedToSeconds, runtimeSeconds, GRACE_PERCENTAGE)) {
if (inBetweenDelays(aTimeoutFromUnifiedToSeconds, aTimeoutToUnifiedToSeconds, runtimeSeconds, GRACE_PERCENTAGE)) {
done();
} else {
try {
should.fail(null, null, "Delayed runtime seconds " + runtimeSeconds + " was not \"in between enough\" enough to expected values of: " + aTimeoutFromUnifiedToSeconds + " and " + aTimeoutToUnifiedToSeconds);
should.fail(null, null, "Delayed runtime seconds " + runtimeSeconds + " was not \"in between enough\" enough to expected values of: " + aTimeoutFromUnifiedToSeconds + " and " + aTimeoutToUnifiedToSeconds);
} catch (err) {
done(err);
}
@@ -420,20 +419,20 @@ describe('delay Node', function() {
var messageBurstSize = 1500;
// we ensure that we note that a warning is received for buffer growth
sinon.stub(delayNode1, 'warn', function(warning){
if(warning.indexOf("buffer exceeded 1000 messages" > -1)) {
sinon.stub(delayNode1, 'warn', function(warning) {
if (warning.indexOf("buffer exceeded 1000 messages" > -1)) {
receivedWarning = true;
}
});
// we ensure that the warning is received for buffer size and that we get the last message
helperNode1.on("input", function(msg) {
if(msg.payload === (messageBurstSize - 1) && receivedWarning === true) {
if (msg.payload === (messageBurstSize - 1) && receivedWarning === true) {
done(); // it will timeout if we don't receive the last message
}
});
// send 1500 messages as quickly as possible
for(var i = 0; i < messageBurstSize; i++) {
for (var i = 0; i < messageBurstSize; i++) {
delayNode1.receive({payload:i});
}
});

View File

@@ -285,13 +285,39 @@ describe('trigger Node', function() {
var n2 = helper.getNode("n2");
var c = 0;
n2.on("input", function(msg) {
c += 1;
msg.should.have.a.property("payload", 1);
});
setTimeout( function() {
n1.emit("input", {reset:true});
done();
},500);
n1.emit("input", {payload:null});
if (c === 2) { done(); }
},100);
n1.emit("input", {payload:null}); // trigger
n1.emit("input", {payload:null}); // blocked
n1.emit("input", {payload:null}); // blocked
n1.emit("input", {reset:true}); // clear the blockage
n1.emit("input", {payload:null}); // trigger
});
});
it('should be able to set infinite timeout, and clear timeout by message', function(done) {
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", reset:"boo", duration:-5, wires:[["n2"]] },
{id:"n2", type:"helper"} ];
helper.load(triggerNode, flow, function() {
var n1 = helper.getNode("n1");
var n2 = helper.getNode("n2");
var c = 0;
n2.on("input", function(msg) {
c += 1;
msg.should.have.a.property("payload", 1);
});
setTimeout( function() {
if (c === 2) { done(); }
},100);
n1.emit("input", {payload:null}); // trigger
n1.emit("input", {payload:null}); // blocked
n1.emit("input", {payload:null}); // blocked
n1.emit("input", {payload:"boo"}); // clear the blockage
n1.emit("input", {payload:null}); // trigger
});
});