mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Merge master to 0.18
This commit is contained in:
@@ -100,6 +100,34 @@ describe('debug node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish complete message to console', function(done) {
|
||||
var flow = [{id:"n1", type:"debug", complete: "true", console: "true" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload:"test"});
|
||||
}, function(msg) {
|
||||
JSON.parse(msg).should.eql({
|
||||
topic:"debug",
|
||||
data:{id:"n1",msg:'{\n "payload": "test"\n}',format:"Object"}
|
||||
});
|
||||
}, function() {
|
||||
try {
|
||||
helper.log().called.should.be.true();
|
||||
var logEvents = helper.log().args.filter(function(evt) {
|
||||
return evt[0].type == "debug";
|
||||
});
|
||||
logEvents.should.have.length(1);
|
||||
var tstmp = logEvents[0][0].timestamp;
|
||||
logEvents[0][0].should.eql({level:helper.log().INFO, id:"n1",type:"debug",msg:'\n{ payload: \'test\' }',timestamp:tstmp});
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish other property', function(done) {
|
||||
var flow = [{id:"n1", type:"debug", complete: "foo" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
@@ -156,6 +184,20 @@ describe('debug node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish a number', function(done) {
|
||||
var flow = [{id:"n1", type:"debug", console:"true" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: 7});
|
||||
}, function(msg) {
|
||||
JSON.parse(msg).should.eql({
|
||||
topic:"debug",data:{id:"n1",msg:"7",property:"payload",format:"number"}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish with no payload', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
@@ -170,6 +212,20 @@ describe('debug node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish a null', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: null});
|
||||
}, function(msg) {
|
||||
JSON.parse(msg).should.eql({
|
||||
topic:"debug",data:{id:"n1",msg:'(undefined)',property:"payload",format:"null"}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish an object', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
@@ -222,6 +278,60 @@ describe('debug node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish an object to console', function(done) {
|
||||
var flow = [{id:"n1", type:"debug", console: "true"}];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: {type:'foo'}});
|
||||
}, function(msg) {
|
||||
JSON.parse(msg).should.eql({
|
||||
topic:"debug",data:{id:"n1",msg:'{\n "type": "foo"\n}',property:"payload",format:"Object"}
|
||||
});
|
||||
}, function() {
|
||||
try {
|
||||
helper.log().called.should.be.true();
|
||||
var logEvents = helper.log().args.filter(function(evt) {
|
||||
return evt[0].type == "debug";
|
||||
});
|
||||
logEvents.should.have.length(1);
|
||||
var tstmp = logEvents[0][0].timestamp;
|
||||
logEvents[0][0].should.eql({level:helper.log().INFO,id:"n1",type:"debug",msg:'\n{ type: \'foo\' }',timestamp:tstmp});
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should publish a string after a newline to console if the string contains \\n', function(done) {
|
||||
var flow = [{id:"n1", type:"debug", console: "true"}];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: "test\ntest"});
|
||||
}, function(msg) {
|
||||
JSON.parse(msg).should.eql({
|
||||
topic:"debug",data:{id:"n1",msg:"test\ntest",property:"payload",format:"string[9]"}
|
||||
});
|
||||
}, function() {
|
||||
try {
|
||||
helper.log().called.should.be.true();
|
||||
var logEvents = helper.log().args.filter(function(evt) {
|
||||
return evt[0].type == "debug";
|
||||
});
|
||||
logEvents.should.have.length(1);
|
||||
var tstmp = logEvents[0][0].timestamp;
|
||||
logEvents[0][0].should.eql({level:helper.log().INFO,id:"n1",type:"debug",msg:"\ntest\ntest",timestamp:tstmp});
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate a long message', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
@@ -243,6 +353,130 @@ describe('debug node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate a long string in the object', function(done) {
|
||||
var flow = [{id:"n1", type:"debug"}];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: {foo: Array(1002).join("X")}});
|
||||
}, function(msg) {
|
||||
var a = JSON.parse(msg);
|
||||
a.should.eql({
|
||||
topic:"debug",
|
||||
data:{
|
||||
id:"n1",
|
||||
msg:'{\n "foo": "'+Array(1001).join("X")+'..."\n}',
|
||||
property:"payload",
|
||||
format:"Object"
|
||||
}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate a large array', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: Array(1001).fill("X")});
|
||||
}, function(msg) {
|
||||
var a = JSON.parse(msg);
|
||||
a.should.eql({
|
||||
topic:"debug",
|
||||
data:{
|
||||
id:"n1",
|
||||
msg:JSON.stringify({
|
||||
__encoded__: true,
|
||||
type: "array",
|
||||
data: Array(1000).fill("X"),
|
||||
length: 1001
|
||||
},null," "),
|
||||
property:"payload",
|
||||
format:"array[1001]"
|
||||
}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate a large array in the object', function(done) {
|
||||
var flow = [{id:"n1", type:"debug"}];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: {foo: Array(1001).fill("X")}});
|
||||
}, function(msg) {
|
||||
var a = JSON.parse(msg);
|
||||
a.should.eql({
|
||||
topic:"debug",
|
||||
data:{
|
||||
id:"n1",
|
||||
msg:JSON.stringify({
|
||||
foo:{
|
||||
__encoded__: true,
|
||||
type: "array",
|
||||
data: Array(1000).fill("X"),
|
||||
length: 1001
|
||||
}
|
||||
},null," "),
|
||||
property:"payload",
|
||||
format:"Object"
|
||||
}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate a large buffer', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: Buffer(501).fill("\"")});
|
||||
}, function(msg) {
|
||||
var a = JSON.parse(msg);
|
||||
a.should.eql({
|
||||
topic:"debug",
|
||||
data:{
|
||||
id:"n1",
|
||||
msg: Array(1001).join("2"),
|
||||
property:"payload",
|
||||
format:"buffer[501]"
|
||||
}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate a large buffer in the object', function(done) {
|
||||
var flow = [{id:"n1", type:"debug"}];
|
||||
helper.load(debugNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
websocket_test(function() {
|
||||
n1.emit("input", {payload: {foo: Buffer(1001).fill("X")}});
|
||||
}, function(msg) {
|
||||
var a = JSON.parse(msg);
|
||||
a.should.eql({
|
||||
topic:"debug",
|
||||
data:{
|
||||
id:"n1",
|
||||
msg:JSON.stringify({
|
||||
foo:{
|
||||
type: "Buffer",
|
||||
data: Array(1000).fill(88),
|
||||
__encoded__: true,
|
||||
length: 1001
|
||||
}
|
||||
},null," "),
|
||||
property:"payload",
|
||||
format:"Object"
|
||||
}
|
||||
});
|
||||
}, done);
|
||||
});
|
||||
});
|
||||
|
||||
it('should convert Buffer to hex', function(done) {
|
||||
var flow = [{id:"n1", type:"debug" }];
|
||||
helper.load(debugNode, flow, function() {
|
||||
@@ -324,6 +558,18 @@ describe('debug node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
describe('get', function() {
|
||||
it('should return the view.html', function(done) {
|
||||
var flow = [{id:"n1", type:"debug"}];
|
||||
helper.load(debugNode, flow, function() {
|
||||
helper.request()
|
||||
.get('/debug/view/view.html')
|
||||
.expect(200)
|
||||
.end(done);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
function websocket_test(open_callback, message_callback, done_callback) {
|
||||
|
118
test/nodes/core/core/60-link_spec.js
Normal file
118
test/nodes/core/core/60-link_spec.js
Normal file
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* Copyright JS Foundation and other contributors, http://js.foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
**/
|
||||
|
||||
var should = require("should");
|
||||
var linkNode = require("../../../../nodes/core/core/60-link.js");
|
||||
var helper = require("../../helper.js");
|
||||
|
||||
describe('link Node', function() {
|
||||
|
||||
before(function(done) {
|
||||
helper.startServer(done);
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
helper.unload();
|
||||
});
|
||||
|
||||
it('should be loaded (link in)', function(done) {
|
||||
var flow = [{id:"n1", type:"link in", name: "link-in" }];
|
||||
helper.load(linkNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
n1.should.have.property('name', 'link-in');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should be loaded (link out)', function(done) {
|
||||
var flow = [{id:"n1", type:"link out", name: "link-out" }];
|
||||
helper.load(linkNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
n1.should.have.property('name', 'link-out');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should be linked', function(done) {
|
||||
var flow = [{id:"n1", type:"link out", name: "link-out", links:["n2"]},
|
||||
{id:"n2", type:"link in", name: "link-in", wires:[["n3"]]},
|
||||
{id:"n3", type:"helper"}];
|
||||
helper.load(linkNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n3 = helper.getNode("n3");
|
||||
n3.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', 'hello');
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
n1.receive({payload:"hello"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should be linked to multiple nodes', function(done) {
|
||||
var flow = [{id:"n1", type:"link out", name: "link-out", links:["n2", "n3"]},
|
||||
{id:"n2", type:"link in", name: "link-in0", wires:[["n4"]]},
|
||||
{id:"n3", type:"link in", name: "link-in1", wires:[["n4"]]},
|
||||
{id:"n4", type:"helper"} ];
|
||||
helper.load(linkNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n4 = helper.getNode("n4");
|
||||
var count = 0;
|
||||
n4.on("input", function (msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', 'hello');
|
||||
count++;
|
||||
if(count == 2) {
|
||||
done();
|
||||
}
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
n1.receive({payload:"hello"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should be linked from multiple nodes', function(done) {
|
||||
var flow = [{id:"n1", type:"link out", name: "link-out0", links:["n3"]},
|
||||
{id:"n2", type:"link out", name: "link-out1", links:["n3"]},
|
||||
{id:"n3", type:"link in", name: "link-in", wires:[["n4"]]},
|
||||
{id:"n4", type:"helper"} ];
|
||||
helper.load(linkNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var n4 = helper.getNode("n4");
|
||||
var count = 0;
|
||||
n4.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', 'hello');
|
||||
count++;
|
||||
if(count == 2) {
|
||||
done();
|
||||
}
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
n1.receive({payload:"hello"});
|
||||
n2.receive({payload:"hello"});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
@@ -76,11 +76,15 @@ describe('exec node', function() {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal("echo");
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",0);
|
||||
|
||||
msg = messages[1];
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal("ECHO");
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",0);
|
||||
|
||||
msg = messages[2];
|
||||
msg.should.have.property("payload");
|
||||
@@ -88,7 +92,8 @@ describe('exec node', function() {
|
||||
|
||||
child_process.exec.restore();
|
||||
done();
|
||||
} catch(err) {
|
||||
}
|
||||
catch(err) {
|
||||
child_process.exec.restore();
|
||||
done(err);
|
||||
}
|
||||
@@ -136,20 +141,23 @@ describe('exec node', function() {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal("echo and more");
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",0);
|
||||
|
||||
msg = messages[1];
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal("ECHO AND MORE");
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",0);
|
||||
child_process.exec.restore();
|
||||
done();
|
||||
} catch(err) {
|
||||
}
|
||||
catch(err) {
|
||||
child_process.exec.restore();
|
||||
done(err);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
n2.on("input", function(msg) {
|
||||
messages[0] = msg;
|
||||
completeTest();
|
||||
@@ -169,7 +177,7 @@ describe('exec node', function() {
|
||||
function(arg1, arg2, arg3, arg4) {
|
||||
//console.log(arg1);
|
||||
// arg3(error,stdout,stderr);
|
||||
arg3("error",new Buffer([0x01,0x02,0x03,0x88]));
|
||||
arg3("error",new Buffer([0x01,0x02,0x03,0x88]),new Buffer([0x01,0x02,0x03,0x88]));
|
||||
});
|
||||
helper.load(execNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
@@ -199,33 +207,11 @@ describe('exec node', function() {
|
||||
// Although Windows timeout command is equivalent to sleep, this cannot be used because it promptly outputs a message.
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"ping", addpay:false, append:"192.0.2.0 -n 1 -w 1000 > NUL", timer:"0.3", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"sleep", addpay:false, append:"1", timer:"0.3", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
}
|
||||
helper.load(execNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n4.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
});
|
||||
n1.receive({});
|
||||
});
|
||||
});
|
||||
|
||||
it('should be able to kill a long running command', function(done) {
|
||||
var flow;
|
||||
if (osType === "Windows_NT") {
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"ping", addpay:false, append:"192.0.2.0 -n 1 -w 1000 > NUL", timer:"2", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
} else {
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"sleep", addpay:false, append:"1", timer:"2", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
}
|
||||
helper.load(execNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
@@ -236,9 +222,42 @@ describe('exec node', function() {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({});
|
||||
});
|
||||
});
|
||||
|
||||
it('should be able to kill a long running command', function(done) {
|
||||
var flow;
|
||||
if (osType === "Windows_NT") {
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"ping", addpay:false, append:"192.0.2.0 -n 1 -w 1000 > NUL", timer:"2", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
}
|
||||
else {
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"sleep", addpay:false, append:"1", timer:"2", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
}
|
||||
helper.load(execNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",null);
|
||||
msg.rc.should.have.property("signal","SIGTERM");
|
||||
} catch(err) { done(err); }
|
||||
});
|
||||
n4.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
setTimeout(function() {
|
||||
n1.receive({kill:""});
|
||||
@@ -262,14 +281,19 @@ describe('exec node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",null);
|
||||
msg.rc.should.have.property("signal","SIGINT");
|
||||
} catch(err) { done(err); }
|
||||
});
|
||||
n4.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal",sig);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
} catch(err) { done(err); }
|
||||
});
|
||||
setTimeout(function() {
|
||||
n1.receive({kill:"SIGINT"});
|
||||
@@ -278,7 +302,6 @@ describe('exec node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
it('should return the rc for a failing command', function(done) {
|
||||
var flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"error", addpay:false, append:"", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
@@ -305,6 +328,9 @@ describe('exec node', function() {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal("error");
|
||||
msg.should.have.property("rc");
|
||||
msg.rc.should.have.property("code",1);
|
||||
msg.rc.should.have.property("message",undefined);
|
||||
|
||||
msg = messages[1];
|
||||
msg.should.have.property("payload");
|
||||
@@ -317,7 +343,8 @@ describe('exec node', function() {
|
||||
|
||||
child_process.exec.restore();
|
||||
done();
|
||||
} catch(err) {
|
||||
}
|
||||
catch(err) {
|
||||
child_process.exec.restore();
|
||||
done(err);
|
||||
}
|
||||
@@ -369,9 +396,8 @@ describe('exec node', function() {
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal(expected);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({payload:"hello world"});
|
||||
});
|
||||
@@ -397,10 +423,13 @@ describe('exec node', function() {
|
||||
var n4 = helper.getNode("n4");
|
||||
n2.on("input", function(msg) {
|
||||
//console.log(msg);
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal(expected);
|
||||
done();
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal(expected);
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({payload:12345});
|
||||
});
|
||||
@@ -431,9 +460,8 @@ describe('exec node', function() {
|
||||
msg.payload.length.should.equal(7);
|
||||
}
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({payload:new Buffer([0x01,0x02,0x03,0x88])});
|
||||
});
|
||||
@@ -474,12 +502,12 @@ describe('exec node', function() {
|
||||
should.exist(msg.payload);
|
||||
msg.payload.should.have.property("code",0);
|
||||
done();
|
||||
} catch(err) {
|
||||
}
|
||||
catch(err) {
|
||||
done(err);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
n2.on("input", function(msg) {
|
||||
messages[0] = msg;
|
||||
completeTest();
|
||||
@@ -501,10 +529,13 @@ describe('exec node', function() {
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n4.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("code");
|
||||
msg.payload.code.should.be.below(0);
|
||||
done();
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("code");
|
||||
msg.payload.code.should.be.below(0);
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({payload:null});
|
||||
});
|
||||
@@ -513,6 +544,7 @@ describe('exec node', function() {
|
||||
it('should return an error for a failing command', function(done) {
|
||||
var flow;
|
||||
var expected;
|
||||
var expectedFound = false;
|
||||
if (osType === "Windows_NT") {
|
||||
// Cannot use mkdir because Windows mkdir command automatically creates non-existent directories.
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"ping /foo/bar/doo/dah", addpay:false, append:"", useSpawn:"true", oldrc:"false"},
|
||||
@@ -521,7 +553,7 @@ describe('exec node', function() {
|
||||
} else {
|
||||
flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"mkdir /foo/bar/doo/dah", addpay:false, append:"", useSpawn:"true", oldrc:"false"},
|
||||
{id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}];
|
||||
expected = "mkdir: /foo/bar/doo: No such file or directory\n";
|
||||
expected = ' directory';
|
||||
}
|
||||
helper.load(execNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
@@ -529,14 +561,26 @@ describe('exec node', function() {
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n3.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
msg.payload.should.equal(expected);
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.be.a.String();
|
||||
if (msg.payload.indexOf(expected) >= 0) {
|
||||
// The error text on the stderr stream might get sent in more than one piece.
|
||||
// We only need to know that it occurred before the return code is sent,
|
||||
// as checked below in node n4.
|
||||
expectedFound = true;
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n4.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("code",1);
|
||||
done();
|
||||
try {
|
||||
expectedFound.should.be.true;
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("code",1);
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({payload:null});
|
||||
});
|
||||
@@ -557,10 +601,13 @@ describe('exec node', function() {
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n4.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("code",null);
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("code",null);
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.receive({});
|
||||
});
|
||||
@@ -581,9 +628,12 @@ describe('exec node', function() {
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n4.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal","SIGTERM");
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
setTimeout(function() {
|
||||
n1.receive({kill:""});
|
||||
@@ -608,9 +658,12 @@ describe('exec node', function() {
|
||||
var n3 = helper.getNode("n3");
|
||||
var n4 = helper.getNode("n4");
|
||||
n4.on("input", function(msg) {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal",sig);
|
||||
done();
|
||||
try {
|
||||
msg.should.have.property("payload");
|
||||
msg.payload.should.have.property("signal",sig);
|
||||
done();
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
setTimeout(function() {
|
||||
n1.receive({kill:"SIGINT"});
|
||||
|
@@ -52,6 +52,21 @@ describe('function node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should send returned message using send()', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"node.send(msg);"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should pass through _topic', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
@@ -160,6 +175,22 @@ describe('function node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should get keys in global context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=global.keys();return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().global.set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', ['count']);
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
function testNonObjectMessage(functionText,done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:functionText},
|
||||
{id:"n2", type:"helper"}];
|
||||
@@ -228,6 +259,251 @@ describe('function node', function() {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle node.on()', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"node.on('close',function(){node.log('closed')});"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
helper.getNode("n1").close();
|
||||
try {
|
||||
helper.log().called.should.be.true();
|
||||
var logEvents = helper.log().args.filter(function(evt) {
|
||||
return evt[0].type == "function";
|
||||
});
|
||||
logEvents.should.have.length(1);
|
||||
var msg = logEvents[0][0];
|
||||
msg.should.have.property('level', helper.log().INFO);
|
||||
msg.should.have.property('id', 'n1');
|
||||
msg.should.have.property('type', 'function');
|
||||
msg.should.have.property('msg', 'closed');
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
it('should set node context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"context.set('count','0');return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
n1.context().get("count").should.equal("0");
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get node context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=context.get('count');return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', '0');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get keys in node context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=context.keys();return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', ['count']);
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should set flow context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",z:"flowA",wires:[["n2"]],func:"flow.set('count','0');return msg;"},
|
||||
{id:"n2", type:"helper",z:"flowA"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
n2.context().flow.get("count").should.equal("0");
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get flow context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",z:"flowA",wires:[["n2"]],func:"msg.payload=flow.get('count');return msg;"},
|
||||
{id:"n2", type:"helper",z:"flowA"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().flow.set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', '0');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get flow context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",z:"flowA",wires:[["n2"]],func:"msg.payload=context.flow.get('count');return msg;"},
|
||||
{id:"n2", type:"helper",z:"flowA"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().flow.set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', '0');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get keys in flow context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",z:"flowA",wires:[["n2"]],func:"msg.payload=flow.keys();return msg;"},
|
||||
{id:"n2", type:"helper",z:"flowA"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().flow.set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', ['count']);
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should set global context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"global.set('count','0');return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
n2.context().global.get("count").should.equal("0");
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get global context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=global.get('count');return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().global.set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', '0');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get global context', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"msg.payload=context.global.get('count');return msg;"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n1.context().global.set("count","0");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', '0');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle setTimeout()', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"setTimeout(function(){node.send(msg);},1000);"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
var endTime = process.hrtime(startTime);
|
||||
var nanoTime = endTime[0] * 1000000000 + endTime[1];
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
if (900000000 < nanoTime && nanoTime < 1100000000) {
|
||||
done();
|
||||
} else {
|
||||
try {
|
||||
should.fail(null, null, "Delayed time was not between 900 and 1100 ms");
|
||||
} catch (err) {
|
||||
done(err);
|
||||
}
|
||||
}
|
||||
});
|
||||
var startTime = process.hrtime();
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle setInterval()', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"setInterval(function(){node.send(msg);},100);"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var count = 0;
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
count++;
|
||||
if (count > 2) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle clearInterval()', function(done) {
|
||||
var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"var id=setInterval(null,100);setTimeout(function(){clearInterval(id);node.send(msg);},1000);"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(functionNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('topic', 'bar');
|
||||
msg.should.have.property('payload', 'foo');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"foo",topic: "bar"});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Logger', function () {
|
||||
it('should log an Info Message', function (done) {
|
||||
var flow = [{id: "n1", type: "function", wires: [["n2"]], func: "node.log('test');"}];
|
||||
|
@@ -88,6 +88,18 @@ describe('template node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle escape characters in Mustache format and JSON output mode', function(done) {
|
||||
var flow = [{id:"n1", type:"template", field:"payload", syntax:"mustache", template:"{\"data\":\"{{payload}}\"}", output:"json", wires:[["n2"]]},{id:"n2",type:"helper"}];
|
||||
helper.load(templateNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
msg.payload.should.have.property('data', 'line\t1\nline\\2\r\nline\b3\f');
|
||||
done();
|
||||
});
|
||||
n1.receive({payload:"line\t1\nline\\2\r\nline\b3\f"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should modify payload in plain text mode', function(done) {
|
||||
var flow = [{id:"n1", type:"template", field:"payload", syntax:"plain", template:"payload={{payload}}",wires:[["n2"]]},{id:"n2",type:"helper"}];
|
||||
|
@@ -347,7 +347,7 @@ describe('delay Node', function() {
|
||||
* @param delay - the variable delay: milliseconds
|
||||
*/
|
||||
function variableDelayTest(aTimeoutFrom, aTimeoutTo, aTimeoutUnit, delay, done) {
|
||||
var flow = [{"id":"delayNode1","type":"delay","name":"delayNode","pauseType":"delayv","timeout":5,"timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":aTimeoutFrom,"randomLast":aTimeoutTo,"randomUnits":aTimeoutUnit,"drop":false,"wires":[["helperNode1"]]},
|
||||
var flow = [{"id":"delayNode1","type":"delay","name":"delayNode","pauseType":"delayv","timeout":0.5,"timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":aTimeoutFrom,"randomLast":aTimeoutTo,"randomUnits":aTimeoutUnit,"drop":false,"wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(delayNode, flow, function() {
|
||||
var delayNode1 = helper.getNode("delayNode1");
|
||||
@@ -400,12 +400,16 @@ describe('delay Node', function() {
|
||||
variableDelayTest("200", "300", "milliseconds", 250, done);
|
||||
});
|
||||
|
||||
it('variable delay is zero if msg.delay not specified', function(done) {
|
||||
variableDelayTest("0", "50", "milliseconds", null, done);
|
||||
it('variable delay is the default if msg.delay not specified', function(done) {
|
||||
variableDelayTest("450", "550", "milliseconds", null, done);
|
||||
});
|
||||
|
||||
it('variable delay is zero if msg.delay is zero', function(done) {
|
||||
variableDelayTest("0", "20", "milliseconds", 0, done);
|
||||
});
|
||||
|
||||
it('variable delay is zero if msg.delay is negative', function(done) {
|
||||
variableDelayTest("0", "50", "milliseconds", -250, done);
|
||||
variableDelayTest("0", "20", "milliseconds", -250, done);
|
||||
});
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user