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);
|
||||
});
|
||||
|
||||
/**
|
||||
|
249
test/nodes/core/io/23-watch_spec.js
Normal file
249
test/nodes/core/io/23-watch_spec.js
Normal file
@@ -0,0 +1,249 @@
|
||||
/**
|
||||
* 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 fs = require("fs");
|
||||
var path = require("path");
|
||||
var should = require("should");
|
||||
var helper = require("../../helper.js");
|
||||
var watchNode = require("../../../../nodes/core/io/23-watch.js");
|
||||
|
||||
|
||||
describe('watch Node', function() {
|
||||
this.timeout(5000);
|
||||
|
||||
var resourcesDir = path.join(__dirname,"..","..","..","resources");
|
||||
var baseDir = path.join(resourcesDir, "23-watch-test-dir");
|
||||
var dirToWatch = undefined;
|
||||
var subDirToWatch = undefined;
|
||||
var file0ToWatch = undefined;
|
||||
var file1ToWatch = undefined;
|
||||
var file2ToWatch = undefined;
|
||||
var count = 0;
|
||||
|
||||
function prepareDir() {
|
||||
dirToWatch = path.join(baseDir, "base"+count);
|
||||
file0ToWatch = path.join(dirToWatch, "file0.txt");
|
||||
file1ToWatch = path.join(dirToWatch, "file1.txt");
|
||||
subDirToWatch = path.join(dirToWatch, "subdir");
|
||||
file2ToWatch = path.join(subDirToWatch, "file2.txt");
|
||||
fs.mkdirSync(dirToWatch);
|
||||
count++;
|
||||
}
|
||||
|
||||
function wait(msec, func) {
|
||||
setTimeout(func, msec);
|
||||
}
|
||||
|
||||
function rmdir(dir_path, done) {
|
||||
function collect(dir_path, files, dirs) {
|
||||
var elems = fs.readdirSync(dir_path);
|
||||
elems.forEach(function(elem) {
|
||||
var elem_path = path.join(dir_path, elem);
|
||||
var stat = fs.lstatSync(elem_path);
|
||||
if(stat.isDirectory()) {
|
||||
var r = collect(elem_path, files, dirs);
|
||||
files = r[0];
|
||||
dirs = r[1];
|
||||
} else {
|
||||
files.push(elem_path);
|
||||
}
|
||||
});
|
||||
dirs.push(dir_path);
|
||||
return [files, dirs];
|
||||
}
|
||||
function seq(func, list, cont) {
|
||||
if(list.length > 0) {
|
||||
var elem = list.shift();
|
||||
func(elem, function(err) {
|
||||
if(err) {
|
||||
throw err;
|
||||
}
|
||||
seq(func, list, cont);
|
||||
});
|
||||
}
|
||||
else {
|
||||
cont();
|
||||
}
|
||||
}
|
||||
var r = collect(dir_path, [], []);
|
||||
var files = r[0];
|
||||
var dirs = r[1];
|
||||
seq(fs.unlink, files,
|
||||
function() {
|
||||
seq(fs.rmdir, dirs, done);
|
||||
});
|
||||
}
|
||||
|
||||
before(function(done) {
|
||||
fs.mkdirSync(baseDir);
|
||||
done();
|
||||
});
|
||||
|
||||
after(function(done) {
|
||||
rmdir(baseDir, done);
|
||||
});
|
||||
|
||||
beforeEach(function(done) {
|
||||
prepareDir();
|
||||
done();
|
||||
});
|
||||
|
||||
afterEach(function(done) {
|
||||
helper.unload();
|
||||
done();
|
||||
});
|
||||
|
||||
function testWatch(flow, change_func, results, done) {
|
||||
var processed = {};
|
||||
helper.load(watchNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var count = 0;
|
||||
var len = Object.keys(results).length;
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.property('file');
|
||||
|
||||
var file = msg.file;
|
||||
if(file in processed) {
|
||||
// multiple messages come in rare case
|
||||
return;
|
||||
}
|
||||
processed[file] = true;
|
||||
(file in results).should.be.true;
|
||||
|
||||
var result = results[file];
|
||||
msg.should.have.property('payload', result.payload);
|
||||
msg.should.have.property('type', result.type);
|
||||
if('size' in result) {
|
||||
msg.should.have.property('size', result.size);
|
||||
}
|
||||
count++;
|
||||
if(count === len) {
|
||||
n1.close();
|
||||
// wait for close
|
||||
wait(500, done);
|
||||
}
|
||||
});
|
||||
// wait for preparation
|
||||
wait(500, change_func);
|
||||
});
|
||||
}
|
||||
|
||||
it('should watch a file to be changed', function(done) {
|
||||
fs.writeFileSync(file0ToWatch, '');
|
||||
var flow = [{id:"n1", type:"watch", name: "watch",
|
||||
files: file0ToWatch, recursive: false,
|
||||
wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = {
|
||||
'file0.txt' : {
|
||||
'payload' : file0ToWatch,
|
||||
'topic': file0ToWatch,
|
||||
'type': 'file',
|
||||
'size': 5
|
||||
}
|
||||
};
|
||||
testWatch(flow, function() {
|
||||
fs.appendFileSync(file0ToWatch, "ABCDE");
|
||||
}, results, done);
|
||||
});
|
||||
|
||||
it('should watch multiple files to be changed', function(done) {
|
||||
fs.writeFileSync(file0ToWatch, '');
|
||||
fs.writeFileSync(file1ToWatch, '');
|
||||
var files = file0ToWatch +","+file1ToWatch;
|
||||
var flow = [{id:"n1", type:"watch", name: "watch",
|
||||
files: files, recursive: false,
|
||||
wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = {
|
||||
'file0.txt' : {
|
||||
'payload' : file0ToWatch,
|
||||
'topic': file0ToWatch,
|
||||
'type': 'file',
|
||||
'size': 5
|
||||
},
|
||||
'file1.txt' : {
|
||||
'payload' : file1ToWatch,
|
||||
'topic': file1ToWatch,
|
||||
'type': 'file',
|
||||
'size': 3
|
||||
}
|
||||
};
|
||||
testWatch(flow, function() {
|
||||
fs.appendFileSync(file0ToWatch, "ABCDE");
|
||||
fs.appendFileSync(file1ToWatch, "123");
|
||||
}, results, done);
|
||||
});
|
||||
|
||||
it('should watch attribute of a file to be changed', function(done) {
|
||||
fs.writeFileSync(file0ToWatch, '');
|
||||
fs.chmodSync(file0ToWatch, 0o444);
|
||||
var flow = [{id:"n1", type:"watch", name: "watch",
|
||||
files: file0ToWatch, recursive: false,
|
||||
wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = {
|
||||
'file0.txt' : {
|
||||
'payload' : file0ToWatch,
|
||||
'topic': file0ToWatch,
|
||||
'type': 'file',
|
||||
'size': 0
|
||||
}
|
||||
};
|
||||
testWatch(flow, function() {
|
||||
fs.chmodSync(file0ToWatch, 0o777);
|
||||
}, results, done);
|
||||
});
|
||||
|
||||
it('should watch a file in a directory to be changed', function(done) {
|
||||
fs.writeFileSync(file0ToWatch, '');
|
||||
var flow = [{id:"n1", type:"watch", name: "watch",
|
||||
files: dirToWatch, recursive: true,
|
||||
wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = {
|
||||
'file0.txt' : {
|
||||
'payload' : file0ToWatch,
|
||||
'topic': file0ToWatch,
|
||||
'type': 'file',
|
||||
'size': 5
|
||||
}
|
||||
};
|
||||
testWatch(flow, function() {
|
||||
fs.appendFileSync(file0ToWatch, "ABCDE");
|
||||
}, results, done);
|
||||
});
|
||||
|
||||
it('should watch a sub directory in a directory to be changed', function(done) {
|
||||
fs.mkdirSync(subDirToWatch);
|
||||
var flow = [{id:"n1", type:"watch", name: "watch",
|
||||
files: dirToWatch, recursive: true,
|
||||
wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
var results = {
|
||||
'file2.txt': {
|
||||
payload: file2ToWatch,
|
||||
type: 'file',
|
||||
size: 5
|
||||
}
|
||||
};
|
||||
testWatch(flow, function() {
|
||||
fs.appendFileSync(file2ToWatch, "ABCDE");
|
||||
}, results, done);
|
||||
});
|
||||
|
||||
});
|
229
test/nodes/core/io/31-tcpin_spec.js
Normal file
229
test/nodes/core/io/31-tcpin_spec.js
Normal file
@@ -0,0 +1,229 @@
|
||||
/**
|
||||
* 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 net = require("net");
|
||||
var should = require("should");
|
||||
var helper = require("../../helper.js");
|
||||
var tcpinNode = require("../../../../nodes/core/io/31-tcpin.js");
|
||||
|
||||
|
||||
describe('TCP in Node', function() {
|
||||
var port = 9200;
|
||||
var server = undefined;
|
||||
var server_port = 9300;
|
||||
var reply_data = undefined;
|
||||
|
||||
before(function(done) {
|
||||
done();
|
||||
});
|
||||
|
||||
after(function() {
|
||||
});
|
||||
|
||||
beforeEach(function(done) {
|
||||
startServer(done);
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
stopServer();
|
||||
helper.unload();
|
||||
});
|
||||
|
||||
function sendArray(sock, array) {
|
||||
if(array.length > 0) {
|
||||
sock.write(array[0], function() {
|
||||
sendArray(sock, array.slice(1));
|
||||
});
|
||||
}
|
||||
else {
|
||||
sock.end();
|
||||
}
|
||||
}
|
||||
|
||||
function startServer(done) {
|
||||
server_port += 1;
|
||||
server = net.createServer(function(c) {
|
||||
sendArray(c, reply_data);
|
||||
}).listen(server_port, "localhost", function(err) {
|
||||
done(err);
|
||||
});
|
||||
}
|
||||
|
||||
function stopServer() {
|
||||
server.close();
|
||||
}
|
||||
|
||||
function send(wdata) {
|
||||
var opt = {port:port, host:"localhost"};
|
||||
var client = net.createConnection(opt, function() {
|
||||
client.write(wdata[0], function() {
|
||||
client.end();
|
||||
if(wdata.length > 1) {
|
||||
send(wdata.slice(1));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function eql(v0, v1) {
|
||||
return((v0 === v1) || ((typeof v0) === 'object' && v0.equals(v1)));
|
||||
}
|
||||
|
||||
function testTCP(flow, wdata, rdata, is_server, done) {
|
||||
if(is_server) {
|
||||
reply_data = wdata;
|
||||
}
|
||||
helper.load(tcpinNode, flow, function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var rcount = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if(eql(msg.payload, rdata[rcount])) {
|
||||
rcount++;
|
||||
}
|
||||
else {
|
||||
should.fail();
|
||||
}
|
||||
if(rcount === rdata.length) {
|
||||
done();
|
||||
}
|
||||
});
|
||||
if(!is_server) {
|
||||
send(wdata);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function testTCP0(flow, wdata, rdata, done) {
|
||||
testTCP(flow, wdata, rdata, false, done);
|
||||
}
|
||||
|
||||
function testTCP1(flow, wdata, rdata, done) {
|
||||
testTCP(flow, wdata, rdata, true, done);
|
||||
}
|
||||
|
||||
it('should recv data (Stream/Buffer)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"buffer", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo"], [Buffer("foo")], done);
|
||||
});
|
||||
|
||||
it('should recv data (Stream/String/Delimiter:\\n)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"\n", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo\nbar"], ["foo", "bar"], done);
|
||||
});
|
||||
|
||||
it('should recv data (Stream/String/No delimiter)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo\nbar"], ["foo\nbar"], done);
|
||||
});
|
||||
|
||||
it('should recv data (Stream/Base64)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo"], [Buffer("foo").toString('base64')], done);
|
||||
});
|
||||
|
||||
it('should recv data (Single/Buffer)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"single", datatype:"buffer", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo"], [Buffer("foo")], done);
|
||||
});
|
||||
|
||||
it('should recv data (Single/String)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"single", datatype:"utf8", newline:"\n", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo\nbar\nbaz"], ["foo\nbar\nbaz"], done);
|
||||
});
|
||||
|
||||
it('should recv data (Stream/Base64)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"single", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo"], [Buffer("foo").toString('base64')], done);
|
||||
});
|
||||
|
||||
it('should recv multiple data (Stream/Buffer)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"buffer", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo", "bar"], [Buffer("foo"), Buffer("bar")], done);
|
||||
});
|
||||
|
||||
it('should recv multiple data (Stream/String/Delimiter:\\n)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"\n", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo", "bar\nbaz"], ["foo", "bar", "baz"], done);
|
||||
});
|
||||
|
||||
it('should recv multiple data (Stream/String/No delimiter)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"utf8", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP0(flow, ["foo", "bar\nbaz"], ["foo", "bar\nbaz"], done);
|
||||
});
|
||||
|
||||
it('should recv multiple data (Stream/Base64)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"server", host:"localhost", port:port, datamode:"stream", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
var wdata = ["foo", "bar"];
|
||||
var rdata = wdata.map(function(x) {
|
||||
return Buffer(x).toString('base64');
|
||||
});
|
||||
testTCP0(flow, wdata, rdata, done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Stream/Buffer)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"stream", datatype:"buffer", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo"], [Buffer("foo")], done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Stream/String/Delimiter:\\n)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"stream", datatype:"utf8", newline:"\n", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo\nbar"], ["foo", "bar"], done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Stream/String/No delimiter)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"stream", datatype:"utf8", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo\nbar"], ["foo\nbar"], done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Stream/Base64)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"stream", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo"], [Buffer("foo").toString('base64')], done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Single/Buffer)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"single", datatype:"buffer", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo"], [Buffer("foo")], done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Single/String)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"single", datatype:"utf8", newline:"\n", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo\nbar\nbaz"], ["foo\nbar\nbaz"], done);
|
||||
});
|
||||
|
||||
it('should connect & recv data (Stream/Base64)', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp in", server:"client", host:"localhost", port:server_port, datamode:"single", datatype:"base64", newline:"", topic:"", base64:false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP1(flow, ["foo"], [Buffer("foo").toString('base64')], done);
|
||||
});
|
||||
|
||||
});
|
110
test/nodes/core/io/31-tcprequest_spec.js
Normal file
110
test/nodes/core/io/31-tcprequest_spec.js
Normal file
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* 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 net = require("net");
|
||||
var should = require("should");
|
||||
var helper = require("../../helper.js");
|
||||
var tcpinNode = require("../../../../nodes/core/io/31-tcpin.js");
|
||||
|
||||
|
||||
describe('TCP Request Node', function() {
|
||||
var server = undefined;
|
||||
var port = 9000;
|
||||
|
||||
function startServer(done) {
|
||||
port += 1;
|
||||
server = net.createServer(function(c) {
|
||||
c.on('data', function(data) {
|
||||
var rdata = "ACK:"+data.toString();
|
||||
c.write(rdata);
|
||||
});
|
||||
c.on('error', function(err) {
|
||||
startServer(done);
|
||||
});
|
||||
}).listen(port, "127.0.0.1", function(err) {
|
||||
done();
|
||||
});
|
||||
}
|
||||
|
||||
before(function(done) {
|
||||
startServer(done);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
server.close();
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
helper.unload();
|
||||
});
|
||||
|
||||
function testTCP(flow, val0, val1, done) {
|
||||
helper.load(tcpinNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', Buffer(val1));
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
if((typeof val0) === 'object') {
|
||||
n1.receive(val0);
|
||||
} else {
|
||||
n1.receive({payload:val0});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
it('should send & recv data', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp request", server:"localhost", port:port, out:"time", splitc: "0", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP(flow, "foo", "ACK:foo", done)
|
||||
});
|
||||
|
||||
it('should send & recv data when specified character received', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp request", server:"localhost", port:port, out:"char", splitc: "0", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP(flow, "foo0bar0", "ACK:foo0", done);
|
||||
});
|
||||
|
||||
it('should send & recv data after fixed number of chars received', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp request", server:"localhost", port:port, out:"count", splitc: "7", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP(flow, "foo bar", "ACK:foo", done);
|
||||
});
|
||||
|
||||
it('should send & receive, then keep connection', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp request", server:"localhost", port:port, out:"sit", splitc: "5", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP(flow, "foo", "ACK:foo", done);
|
||||
});
|
||||
|
||||
it('should send & close', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp request", server:"localhost", port:port, out:"sit", splitc: "5", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP(flow, "foo", "ACK:foo", done);
|
||||
});
|
||||
|
||||
it('should send & recv data to/from server:port from msg', function(done) {
|
||||
var flow = [{id:"n1", type:"tcp request", server:"", port:"", out:"time", splitc: "0", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
testTCP(flow, {payload:"foo", host:"localhost", port:port}, "ACK:foo", done)
|
||||
});
|
||||
|
||||
});
|
93
test/nodes/core/io/32-udpin_spec.js
Normal file
93
test/nodes/core/io/32-udpin_spec.js
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* 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 dgram = require("dgram");
|
||||
var should = require("should");
|
||||
var helper = require("../../helper.js");
|
||||
var udpNode = require("../../../../nodes/core/io/32-udp.js");
|
||||
|
||||
|
||||
describe('UDP in Node', function() {
|
||||
var port = 9100;
|
||||
|
||||
before(function(done) {
|
||||
helper.startServer(done);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
helper.unload();
|
||||
});
|
||||
|
||||
function sendIPv4(msg) {
|
||||
var sock = dgram.createSocket('udp4');
|
||||
sock.send(msg, 0, msg.length, port, "127.0.0.1", function(msg) {
|
||||
sock.close();
|
||||
});
|
||||
}
|
||||
|
||||
function checkRecv(dt, proto, val0, val1, done) {
|
||||
var flow = [{id:"n1", type:"udp in",
|
||||
group: "", multicast:false,
|
||||
port:port, ipv:proto,
|
||||
datatype: dt, iface: "",
|
||||
wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(udpNode, flow, function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
var ip = ((proto === 'udp6') ? '::ffff:':'') +'127.0.0.1';
|
||||
msg.should.have.property('ip', ip);
|
||||
msg.should.have.property('port');
|
||||
msg.should.have.property('payload');
|
||||
msg.payload.should.deepEqual(val1);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
sendIPv4(val0);
|
||||
});
|
||||
}
|
||||
|
||||
it('should recv IPv4 data (Buffer)', function(done) {
|
||||
checkRecv('buffer', 'udp4', 'hello', Buffer('hello'), done);
|
||||
});
|
||||
|
||||
it('should recv IPv4 data (String)', function(done) {
|
||||
checkRecv('utf8', 'udp4', 'hello', 'hello', done);
|
||||
});
|
||||
|
||||
it('should recv IPv4 data (base64)', function(done) {
|
||||
checkRecv('base64', 'udp4', 'hello', Buffer('hello').toString('base64'), done);
|
||||
});
|
||||
|
||||
it('should recv IPv6 data (Buffer)', function(done) {
|
||||
checkRecv('buffer', 'udp6', 'hello', Buffer('hello'), done);
|
||||
});
|
||||
|
||||
it('should recv IPv6 data (String)', function(done) {
|
||||
checkRecv('utf8', 'udp6', 'hello', 'hello', done);
|
||||
});
|
||||
|
||||
it('should recv IPv6 data (base64)', function(done) {
|
||||
checkRecv('base64', 'udp6', 'hello', Buffer('hello').toString('base64'), done);
|
||||
});
|
||||
|
||||
});
|
85
test/nodes/core/io/32-udpout_spec.js
Normal file
85
test/nodes/core/io/32-udpout_spec.js
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* 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 dgram = require("dgram");
|
||||
var should = require("should");
|
||||
var helper = require("../../helper.js");
|
||||
var udpNode = require("../../../../nodes/core/io/32-udp.js");
|
||||
|
||||
|
||||
describe('UDP out Node', function() {
|
||||
var port = 9200;
|
||||
|
||||
before(function(done) {
|
||||
helper.startServer(done);
|
||||
});
|
||||
|
||||
after(function() {
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
helper.unload();
|
||||
});
|
||||
|
||||
function recvData(data, done) {
|
||||
var sock = dgram.createSocket('udp4');
|
||||
sock.on('message', function(msg, rinfo) {
|
||||
msg.should.deepEqual(data);
|
||||
done();
|
||||
});
|
||||
sock.bind(port, '127.0.0.1');
|
||||
port++;
|
||||
}
|
||||
|
||||
function checkSend(proto, val0, val1, decode, dest_in_msg, done) {
|
||||
var dst_ip = dest_in_msg ? undefined : "127.0.0.1";
|
||||
var dst_port = dest_in_msg ? undefined : port;
|
||||
var flow = [{id:"n1", type:"udp out",
|
||||
addr:dst_ip, port:dst_port, iface: "",
|
||||
ipv:proto, outport: "random",
|
||||
base64:decode, multicast:false,
|
||||
wires:[] }];
|
||||
helper.load(udpNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var msg = {};
|
||||
if(decode) {
|
||||
msg.payload = Buffer("hello").toString('base64');
|
||||
}
|
||||
else {
|
||||
msg.payload = "hello";
|
||||
}
|
||||
if(dest_in_msg) {
|
||||
msg.ip = "127.0.0.1";
|
||||
msg.port = port;
|
||||
}
|
||||
recvData(val1, done);
|
||||
n1.receive(msg);
|
||||
});
|
||||
}
|
||||
|
||||
it('should send IPv4 data', function(done) {
|
||||
checkSend('udp4', 'hello', Buffer('hello'), false, false, done);
|
||||
});
|
||||
|
||||
it('should send IPv4 data (base64)', function(done) {
|
||||
checkSend('udp4', 'hello', Buffer('hello'), true, false, done);
|
||||
});
|
||||
|
||||
it('should send IPv4 data with dest from msg', function(done) {
|
||||
checkSend('udp4', 'hello', Buffer('hello'), false, true, done);
|
||||
});
|
||||
|
||||
});
|
@@ -187,6 +187,10 @@ describe('switch Node', function() {
|
||||
twoFieldSwitchTest("btwn", "3", "5", true, true, 4, done);
|
||||
});
|
||||
|
||||
it('should check if payload is between given string values', function(done) {
|
||||
twoFieldSwitchTest("btwn", "c", "e", true, true, "d", done);
|
||||
});
|
||||
|
||||
it('should check if payload is not between given values', function(done) {
|
||||
twoFieldSwitchTest("btwn", 3, 5, true, false, 12, done);
|
||||
});
|
||||
@@ -489,4 +493,9 @@ describe('switch Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle JSONata expression', function(done) {
|
||||
var flow = [{id:"switchNode1",type:"switch",name:"switchNode",property:"$abs(payload)",propertyType:"jsonata",rules:[{"t":"btwn","v":"$sqrt(16)","vt":"jsonata","v2":"$sqrt(36)","v2t":"jsonata"}],checkall:true,outputs:1,wires:[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
customFlowSwitchTest(flow, true, -5, done);
|
||||
});
|
||||
});
|
||||
|
@@ -64,7 +64,6 @@ describe('change Node', function() {
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
var rule = helper.getNode("changeNode1").rules[0];
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal("changed");
|
||||
@@ -77,13 +76,31 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('sets the value of global context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t":"set","p":"globalValue","pt":"global","to":"changed","tot":"str"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
changeNode1.context().global.get("globalValue").should.equal("changed");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().global.set("globalValue","changeMe");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('sets the value and type of the message property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "set", "p": "payload", "pt": "msg", "to": "12345", "tot": "num" }],"reg":false,"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
var rule = helper.getNode("changeNode1").rules[0];
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal(12345);
|
||||
@@ -263,6 +280,44 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value to flow context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"flowValue","tot":"flow"}],"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.eql("Hello World!");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().flow.set("flowValue","Hello World!");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value to global context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"globalValue","tot":"global"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.eql("Hello World!");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().global.set("globalValue","Hello World!");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value to a number', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"123","tot":"num"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
@@ -281,6 +336,24 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value to a boolean value', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"true","tot":"bool"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.eql(true);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value to a js object', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":'{"a":123}',"tot":"json"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
@@ -299,13 +372,31 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value to a buffer object', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"[72,101,108,108,111,32,87,111,114,108,100]","tot":"bin"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
var buff = Buffer.from("Hello World");
|
||||
msg.payload.should.eql(buff);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('sets the value of the message property to the current timestamp', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change","rules":[{"t":"set","p":"ts","pt":"msg","to":"","tot":"date"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
var rule = helper.getNode("changeNode1").rules[0];
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
(Date.now() - msg.ts).should.be.approximately(0,50);
|
||||
@@ -318,6 +409,24 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value using jsonata', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"$length(payload)","tot":"jsonata"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.eql(12);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.receive({payload:"Hello World!"});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
describe('#change', function() {
|
||||
it('changes the value of the message property', function(done) {
|
||||
@@ -344,7 +453,6 @@ describe('change Node', function() {
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
var rule = helper.getNode("changeNode1").rules[0];
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal("Change456Me");
|
||||
@@ -365,7 +473,6 @@ describe('change Node', function() {
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
var rule = helper.getNode("changeNode1").rules[0];
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal(456);
|
||||
@@ -541,6 +648,63 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value using flow context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"change","p":"payload","from":"topic","to":"123","fromt":"flow","tot":"str"}],"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal("abc123abc");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().flow.set("topic","ABC");
|
||||
changeNode1.receive({payload:"abcABCabc"});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value using global context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"change","p":"payload","from":"topic","to":"123","fromt":"global","tot":"str"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal("abc123abc");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().global.set("topic","ABC");
|
||||
changeNode1.receive({payload:"abcABCabc"});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the number using global context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"change","p":"payload","from":"topic","to":"ABC","fromt":"global","tot":"str"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.equal("ABC");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().global.set("topic",123);
|
||||
changeNode1.receive({payload:123});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value using number - string payload', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"change","p":"payload","from":"123","to":"456","fromt":"num","tot":"str"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
@@ -612,6 +776,103 @@ describe('change Node', function() {
|
||||
changeNode1.receive({payload:true});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value of the global context', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "change", "p": "payload", "pt": "global", "from": "Hello", "fromt": "str", "to": "Goodbye", "tot": "str" }],"reg":false,"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[],"z":"flow"}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
helperNode1.context().global.get("payload").should.equal("Goodbye World!");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().global.set("payload","Hello World!");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value and doesnt change type of the flow context for partial match', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "change", "p": "payload", "pt": "flow", "from": "123", "fromt": "str", "to": "456", "tot": "num" }],"reg":false,"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[],"z":"flow"}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
helperNode1.context().flow.get("payload").should.equal("Change456Me");
|
||||
helperNode1.context().flow.get("payload").should.be.a.String();
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().flow.set("payload","Change123Me");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value and type of the flow context if a complete match', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "change", "p": "payload", "pt": "flow", "from": "123", "fromt": "str", "to": "456", "tot": "num" }],"reg":false,"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[],"z":"flow"}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
helperNode1.context().flow.get("payload").should.equal(456);
|
||||
helperNode1.context().flow.get("payload").should.be.a.Number();
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().flow.set("payload","123");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value using number - number flow context', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "change", "p": "payload", "pt": "flow", "from": "123", "fromt": "num", "to": "abc", "tot": "str" }],"reg":false,"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[],"z":"flow"}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
helperNode1.context().flow.get("payload").should.equal("abc");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().flow.set("payload",123);
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('changes the value using boolean - boolean flow context', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "change", "p": "payload", "pt": "flow", "from": "true", "fromt": "bool", "to": "abc", "tot": "str" }],"reg":false,"name":"changeNode","wires":[["helperNode1"]],"z":"flow"},
|
||||
{id:"helperNode1", type:"helper", wires:[],"z":"flow"}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
helperNode1.context().flow.get("payload").should.equal("abc");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().flow.set("payload",true);
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("#delete", function() {
|
||||
@@ -633,6 +894,25 @@ describe('change Node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('deletes the value of global context property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change",rules:[{ "t": "delete", "p": "globalValue", "pt": "global"}],"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
helper.load(changeNode, flow, function() {
|
||||
var changeNode1 = helper.getNode("changeNode1");
|
||||
var helperNode1 = helper.getNode("helperNode1");
|
||||
helperNode1.on("input", function(msg) {
|
||||
try {
|
||||
changeNode1.context().global.should.not.have.property("globalValue");
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
changeNode1.context().global.set("globalValue","Hello World!");
|
||||
changeNode1.receive({payload:""});
|
||||
});
|
||||
});
|
||||
|
||||
it('deletes the value of a multi-level message property', function(done) {
|
||||
var flow = [{"id":"changeNode1","type":"change","action":"delete","property":"foo.bar","from":"","to":"","reg":false,"name":"changeNode","wires":[["helperNode1"]]},
|
||||
{id:"helperNode1", type:"helper", wires:[]}];
|
||||
|
@@ -559,6 +559,31 @@ describe('JOIN node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should join complete message objects into an array after a count', function(done) {
|
||||
var flow = [{id:"n1", type:"join", wires:[["n2"]], build:"array", timeout:0, count:3, propertyType:"full",mode:"custom"},
|
||||
{id:"n2", type:"helper"}];
|
||||
helper.load(joinNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.payload.should.be.an.Array();
|
||||
msg.payload[0].should.be.an.Object();
|
||||
msg.payload[0].should.have.property("payload","a");
|
||||
msg.payload[1].should.be.an.Object();
|
||||
msg.payload[1].should.have.property("payload","b");
|
||||
msg.payload[2].should.be.an.Object();
|
||||
msg.payload[2].should.have.property("payload","c");
|
||||
done();
|
||||
}
|
||||
catch(e) { done(e); }
|
||||
});
|
||||
n1.receive({payload:"a"});
|
||||
n1.receive({payload:"b"});
|
||||
n1.receive({payload:"c"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should join split things back into an array', function(done) {
|
||||
var flow = [{id:"n1", type:"join", wires:[["n2"]]},
|
||||
{id:"n2", type:"helper"}];
|
||||
|
@@ -198,19 +198,55 @@ describe('CSV node', function() {
|
||||
describe('json object to csv', function() {
|
||||
|
||||
it('should convert a simple object back to a csv', function(done) {
|
||||
var flow = [ { id:"n1", type:"csv", temp:"a,b,c,d", wires:[["n2"]] },
|
||||
var flow = [ { id:"n1", type:"csv", temp:"a,b,c,,e", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(csvNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', '4,3,2,1\n');
|
||||
msg.should.have.property('payload', '4,foo,true,,0\n');
|
||||
done();
|
||||
}
|
||||
catch(e) { done(e); }
|
||||
});
|
||||
var testJson = { d: 1, b: 3, c: 2, a: 4 };
|
||||
var testJson = { e:0, d:1, b:"foo", c:true, a:4 };
|
||||
n1.emit("input", {payload:testJson});
|
||||
});
|
||||
});
|
||||
|
||||
it('should convert a simple object back to a csv with no template', function(done) {
|
||||
var flow = [ { id:"n1", type:"csv", temp:" ", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(csvNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', '1,foo,"ba""r","di,ng"\n');
|
||||
done();
|
||||
}
|
||||
catch(e) { done(e); }
|
||||
});
|
||||
var testJson = { d:1, b:"foo", c:"ba\"r", a:"di,ng" };
|
||||
n1.emit("input", {payload:testJson});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle a template with spaces in the property names', function(done) {
|
||||
var flow = [ { id:"n1", type:"csv", temp:"a,b o,c p,,e", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(csvNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', '4,foo,true,,0\n');
|
||||
done();
|
||||
}
|
||||
catch(e) { done(e); }
|
||||
});
|
||||
var testJson = { e:0, d:1, "b o":"foo", "c p":true, a:4 };
|
||||
n1.emit("input", {payload:testJson});
|
||||
});
|
||||
});
|
||||
@@ -241,12 +277,12 @@ describe('CSV node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
msg.should.have.property('payload', '0,1,2,3,4\n');
|
||||
msg.should.have.property('payload', ',0,1,foo,"ba""r","di,ng"\n');
|
||||
done();
|
||||
}
|
||||
catch(e) { done(e); }
|
||||
});
|
||||
var testJson = [0,1,2,3,4];
|
||||
var testJson = ["",0,1,"foo",'ba"r','di,ng'];
|
||||
n1.emit("input", {payload:testJson});
|
||||
});
|
||||
});
|
||||
|
@@ -154,32 +154,43 @@ describe('file Nodes', function() {
|
||||
var f = fs.readFileSync(fileToTest).toString();
|
||||
f.should.equal("onetwo");
|
||||
|
||||
// Delete the file
|
||||
fs.unlinkSync(fileToTest);
|
||||
|
||||
// Recreate it
|
||||
fs.writeFileSync(fileToTest,"");
|
||||
|
||||
// Send two more messages to the file
|
||||
n1.emit("input", {payload:"three"});
|
||||
n1.emit("input", {payload:"four"});
|
||||
|
||||
setTimeout(function() {
|
||||
// Check the file was updated
|
||||
try {
|
||||
var f = fs.readFileSync(fileToTest).toString();
|
||||
f.should.equal("threefour");
|
||||
fs.unlinkSync(fileToTest);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
},wait);
|
||||
if (os.type() === "Windows_NT") {
|
||||
var dummyFile = path.join(resourcesDir,"50-file-test-dummy.txt");
|
||||
fs.rename(fileToTest, dummyFile, function() {
|
||||
recreateTest(n1, dummyFile);
|
||||
});
|
||||
} else {
|
||||
recreateTest(n1, fileToTest);
|
||||
}
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
},wait);
|
||||
});
|
||||
|
||||
function recreateTest(n1, fileToDelete) {
|
||||
// Delete the file
|
||||
fs.unlinkSync(fileToDelete);
|
||||
|
||||
// Recreate it
|
||||
fs.writeFileSync(fileToTest,"");
|
||||
|
||||
// Send two more messages to the file
|
||||
n1.emit("input", {payload:"three"});
|
||||
n1.emit("input", {payload:"four"});
|
||||
|
||||
setTimeout(function() {
|
||||
// Check the file was updated
|
||||
try {
|
||||
var f = fs.readFileSync(fileToTest).toString();
|
||||
f.should.equal("threefour");
|
||||
fs.unlinkSync(fileToTest);
|
||||
done();
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
},wait);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
@@ -26,11 +26,11 @@ var registry = require("../../../../red/runtime/nodes/registry");
|
||||
|
||||
describe("red/nodes/index", function() {
|
||||
before(function() {
|
||||
sinon.stub(flows,"startFlows");
|
||||
sinon.stub(index,"startFlows");
|
||||
process.env.NODE_RED_HOME = path.resolve(path.join(__dirname,"..","..","..",".."))
|
||||
});
|
||||
after(function() {
|
||||
flows.startFlows.restore();
|
||||
index.startFlows.restore();
|
||||
delete process.env.NODE_RED_HOME;
|
||||
});
|
||||
|
||||
|
@@ -17,8 +17,10 @@
|
||||
var should = require("should");
|
||||
var fs = require('fs-extra');
|
||||
var path = require('path');
|
||||
var sinon = require('sinon');
|
||||
|
||||
var localfilesystem = require("../../../../red/runtime/storage/localfilesystem");
|
||||
var log = require("../../../../red/runtime/log");
|
||||
|
||||
describe('LocalFileSystem', function() {
|
||||
var userDir = path.join(__dirname,".testUserHome");
|
||||
@@ -279,6 +281,45 @@ describe('LocalFileSystem', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should fsync the flows file',function(done) {
|
||||
var flowFile = 'test.json';
|
||||
var flowFilePath = path.join(userDir,flowFile);
|
||||
localfilesystem.init({userDir:userDir, flowFile:flowFilePath}).then(function() {
|
||||
sinon.spy(fs,"fsync");
|
||||
localfilesystem.saveFlows(testFlow).then(function() {
|
||||
fs.fsync.callCount.should.eql(1);
|
||||
fs.fsync.restore();
|
||||
done();
|
||||
}).otherwise(function(err) {
|
||||
done(err);
|
||||
});
|
||||
}).otherwise(function(err) {
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
it('should log fsync errors and continue',function(done) {
|
||||
var flowFile = 'test.json';
|
||||
var flowFilePath = path.join(userDir,flowFile);
|
||||
localfilesystem.init({userDir:userDir, flowFile:flowFilePath}).then(function() {
|
||||
sinon.stub(fs,"fsync", function(fd, cb) {
|
||||
cb(new Error());
|
||||
});
|
||||
sinon.spy(log,"warn");
|
||||
localfilesystem.saveFlows(testFlow).then(function() {
|
||||
log.warn.callCount.should.eql(1);
|
||||
log.warn.restore();
|
||||
fs.fsync.callCount.should.eql(1);
|
||||
fs.fsync.restore();
|
||||
done();
|
||||
}).otherwise(function(err) {
|
||||
done(err);
|
||||
});
|
||||
}).otherwise(function(err) {
|
||||
done(err);
|
||||
});
|
||||
});
|
||||
|
||||
it('should backup the flows file', function(done) {
|
||||
var defaultFlowFile = 'flows_'+require('os').hostname()+'.json';
|
||||
var defaultFlowFilePath = path.join(userDir,defaultFlowFile);
|
||||
|
Reference in New Issue
Block a user