1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Exec node spawn mode should clone messages it reuses

This commit is contained in:
Nick O'Leary 2016-10-11 14:49:48 +01:00
parent 8e7d52e645
commit f002560616
2 changed files with 95 additions and 41 deletions

View File

@ -1,5 +1,5 @@
/** /**
* Copyright 2013,2015 IBM Corp. * Copyright 2013,2016 IBM Corp.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -61,13 +61,13 @@ module.exports = function(RED) {
//console.log('[exec] stdout: ' + data); //console.log('[exec] stdout: ' + data);
if (isUtf8(data)) { msg.payload = data.toString(); } if (isUtf8(data)) { msg.payload = data.toString(); }
else { msg.payload = data; } else { msg.payload = data; }
node.send([msg,null,null]); node.send([RED.util.cloneMessage(msg),null,null]);
}); });
child.stderr.on('data', function (data) { child.stderr.on('data', function (data) {
//console.log('[exec] stderr: ' + data); //console.log('[exec] stderr: ' + data);
if (isUtf8(data)) { msg.payload = data.toString(); } if (isUtf8(data)) { msg.payload = data.toString(); }
else { msg.payload = new Buffer(data); } else { msg.payload = new Buffer(data); }
node.send([null,msg,null]); node.send([null,RED.util.cloneMessage(msg),null]);
}); });
child.on('close', function (code) { child.on('close', function (code) {
//console.log('[exec] result: ' + code); //console.log('[exec] result: ' + code);
@ -78,12 +78,12 @@ module.exports = function(RED) {
if (code === null) { node.status({fill:"red",shape:"dot",text:"timeout"}); } if (code === null) { node.status({fill:"red",shape:"dot",text:"timeout"}); }
else if (code < 0) { node.status({fill:"red",shape:"dot",text:"rc: "+code}); } else if (code < 0) { node.status({fill:"red",shape:"dot",text:"rc: "+code}); }
else { node.status({fill:"yellow",shape:"dot",text:"rc: "+code}); } else { node.status({fill:"yellow",shape:"dot",text:"rc: "+code}); }
node.send([null,null,msg]); node.send([null,null,RED.util.cloneMessage(msg)]);
}); });
child.on('error', function (code) { child.on('error', function (code) {
delete node.activeProcesses[child.pid]; delete node.activeProcesses[child.pid];
if (child.tout) { clearTimeout(child.tout); } if (child.tout) { clearTimeout(child.tout); }
node.error(code,msg); node.error(code,RED.util.cloneMessage(msg));
}); });
} }
else { else {

View File

@ -58,24 +58,42 @@ describe('exec node', function() {
arg3(null,arg1,arg1.toUpperCase()); arg3(null,arg1,arg1.toUpperCase());
}); });
helper.load(execNode, flow, function() { helper.load(execNode, flow, function() {
var n1 = helper.getNode("n1"); var n1 = helper.getNode("n1");
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
var n3 = helper.getNode("n3"); var n3 = helper.getNode("n3");
var n4 = helper.getNode("n4"); var n4 = helper.getNode("n4");
n2.on("input", function(msg) { var received = 0;
//console.log(msg); var messages = [null,null];
msg.should.have.property("payload"); var completeTest = function() {
msg.payload.should.be.a.String(); received++;
msg.payload.should.equal("echo"); if (received < 2) {
}); return;
n3.on("input", function(msg) { }
//console.log(msg); try{
msg.should.have.property("payload"); var msg = messages[0];
msg.payload.should.be.a.String, msg.should.have.property("payload");
msg.payload.should.equal("ECHO"); msg.payload.should.be.a.String();
child_process.exec.restore(); msg.payload.should.equal("echo");
done();
msg = messages[1];
msg.should.have.property("payload");
msg.payload.should.be.a.String,
msg.payload.should.equal("ECHO");
child_process.exec.restore();
done();
} catch(err) {
child_process.exec.restore();
done(err);
}
};
n2.on("input", function(msg) {
messages[0] = msg;
completeTest();
});
n3.on("input", function(msg) {
messages[1] = msg;
completeTest();
}); });
n1.receive({payload:"and"}); n1.receive({payload:"and"});
}); });
@ -96,19 +114,39 @@ describe('exec node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
var n3 = helper.getNode("n3"); var n3 = helper.getNode("n3");
var n4 = helper.getNode("n4"); var n4 = helper.getNode("n4");
var received = 0;
var messages = [null,null];
var completeTest = function() {
received++;
if (received < 2) {
return;
}
try{
var msg = messages[0];
msg.should.have.property("payload");
msg.payload.should.be.a.String();
msg.payload.should.equal("echo and more");
msg = messages[1];
msg.should.have.property("payload");
msg.payload.should.be.a.String();
msg.payload.should.equal("ECHO AND MORE");
child_process.exec.restore();
done();
} catch(err) {
child_process.exec.restore();
done(err);
}
};
n2.on("input", function(msg) { n2.on("input", function(msg) {
//console.log(msg); messages[0] = msg;
msg.should.have.property("payload"); completeTest();
msg.payload.should.be.a.String();
msg.payload.should.equal("echo and more");
}); });
n3.on("input", function(msg) { n3.on("input", function(msg) {
//console.log(msg); messages[1] = msg;
msg.should.have.property("payload"); completeTest();
msg.payload.should.be.a.String();
msg.payload.should.equal("ECHO AND MORE");
child_process.exec.restore();
done();
}); });
n1.receive({payload:"and"}); n1.receive({payload:"and"});
}); });
@ -252,15 +290,21 @@ describe('exec node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
var n3 = helper.getNode("n3"); var n3 = helper.getNode("n3");
var n4 = helper.getNode("n4"); var n4 = helper.getNode("n4");
n2.on("input", function(msg) { var received = 0;
msg.should.have.property("payload"); var messages = [null,null];
msg.payload.should.be.a.String(); var completeTest = function() {
msg.payload.should.equal("this now works\n"); received++;
}); if (received < 2) {
n4.on("input", function(msg) { return;
try { }
try{
var msg = messages[0];
msg.should.have.property("payload"); msg.should.have.property("payload");
msg.payload.should.be.a.String();
msg.payload.should.equal("this now works\n");
msg = messages[1];
msg.should.have.property("payload");
should.exist(msg.payload); should.exist(msg.payload);
msg.payload.should.be.a.Number(); msg.payload.should.be.a.Number();
msg.payload.should.equal(0); msg.payload.should.equal(0);
@ -268,8 +312,18 @@ describe('exec node', function() {
} catch(err) { } catch(err) {
done(err); done(err);
} }
};
n2.on("input", function(msg) {
messages[0] = msg;
completeTest();
}); });
n1.receive({payload:null}); n4.on("input", function(msg) {
messages[1] = msg;
completeTest();
});
n1.receive({payload:null,fred:123});
}); });
}); });