diff --git a/nodes/core/core/75-exec.js b/nodes/core/core/75-exec.js index 0847957a4..8205edfef 100644 --- a/nodes/core/core/75-exec.js +++ b/nodes/core/core/75-exec.js @@ -106,14 +106,16 @@ module.exports = function(RED) { if(stderr) { msg2 = {payload: stderr}; } - var msg3 = {payload:0}; + var msg3 = null; node.status({}); //console.log('[exec] stdout: ' + stdout); //console.log('[exec] stderr: ' + stderr); if (error !== null) { - msg3 = {payload:error.code}; + msg3 = {payload:error}; node.status({fill:"red",shape:"dot",text:"error: "+error.code}); //console.log('[exec] error: ' + error); + } else { + msg3 = {payload: { code: 0 }} } node.send([msg,msg2,msg3]); if (child.tout) { clearTimeout(child.tout); } diff --git a/test/nodes/core/core/75-exec_spec.js b/test/nodes/core/core/75-exec_spec.js index 3d5540233..e9f66a157 100644 --- a/test/nodes/core/core/75-exec_spec.js +++ b/test/nodes/core/core/75-exec_spec.js @@ -52,48 +52,57 @@ describe('exec node', function() { var flow = [{id:"n1",type:"exec",wires:[["n2"],["n3"],["n4"]],command:"echo", addpay:false, append:""}, {id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}]; var spy = sinon.stub(child_process, 'exec', - function(arg1,arg2,arg3,arg4) { - //console.log(arg1); - // arg3(error,stdout,stderr); - arg3(null,arg1,arg1.toUpperCase()); + function(arg1,arg2,arg3,arg4) { + //console.log(arg1); + // arg3(error,stdout,stderr); + arg3(null,arg1,arg1.toUpperCase()); + }); + + 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"); + var received = 0; + var messages = [null,null,null]; + var completeTest = function() { + received++; + if (received < 3) { + return; + } + try{ + var msg = messages[0]; + msg.should.have.property("payload"); + msg.payload.should.be.a.String(); + msg.payload.should.equal("echo"); + + msg = messages[1]; + msg.should.have.property("payload"); + msg.payload.should.be.a.String, + msg.payload.should.equal("ECHO"); + + msg = messages[2]; + msg.should.have.property("payload"); + msg.payload.should.have.property("code",0); + + child_process.exec.restore(); + done(); + } catch(err) { + child_process.exec.restore(); + done(err); + } + }; + n2.on("input", function(msg) { + messages[0] = msg; + completeTest(); }); - - 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"); - 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"); - - 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(); + n3.on("input", function(msg) { + messages[1] = msg; + completeTest(); + }); + n4.on("input", function(msg) { + messages[2] = msg; + completeTest(); }); n1.receive({payload:"and"}); }); @@ -210,6 +219,68 @@ describe('exec node', function() { n1.receive({}); }); }); + + + 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:""}, + {id:"n2", type:"helper"},{id:"n3", type:"helper"},{id:"n4", type:"helper"}]; + var spy = sinon.stub(child_process, 'exec', + function(arg1,arg2,arg3,arg4) { + //console.log(arg1); + // arg3(error,stdout,stderr); + arg3({code: 1},arg1,arg1.toUpperCase()); + }); + + 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"); + var received = 0; + var messages = [null,null,null]; + var completeTest = function() { + received++; + if (received < 3) { + return; + } + try{ + var msg = messages[0]; + msg.should.have.property("payload"); + msg.payload.should.be.a.String(); + msg.payload.should.equal("error"); + + msg = messages[1]; + msg.should.have.property("payload"); + msg.payload.should.be.a.String, + msg.payload.should.equal("ERROR"); + + msg = messages[2]; + msg.should.have.property("payload"); + msg.payload.should.have.property("code",1); + + 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(); + }); + n4.on("input", function(msg) { + messages[2] = msg; + completeTest(); + }); + n1.receive({payload:"and"}); + }); + }); + }); describe('calling spawn', function() { @@ -367,9 +438,7 @@ describe('exec node', function() { msg.payload.should.equal("mkdir: /foo/bar/doo: No such file or directory\n"); }); n4.on("input", function(msg) { - msg.should.have.property("payload"); - msg.payload.should.be.a.Number(); - msg.payload.should.equal(1); + msg.should.have.property("payload",1); done(); }); n1.receive({payload:null});