Skip to content

Commit f002560

Browse files
committed
Exec node spawn mode should clone messages it reuses
1 parent 8e7d52e commit f002560

2 files changed

Lines changed: 95 additions & 41 deletions

File tree

nodes/core/core/75-exec.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2013,2015 IBM Corp.
2+
* Copyright 2013,2016 IBM Corp.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -61,13 +61,13 @@ module.exports = function(RED) {
6161
//console.log('[exec] stdout: ' + data);
6262
if (isUtf8(data)) { msg.payload = data.toString(); }
6363
else { msg.payload = data; }
64-
node.send([msg,null,null]);
64+
node.send([RED.util.cloneMessage(msg),null,null]);
6565
});
6666
child.stderr.on('data', function (data) {
6767
//console.log('[exec] stderr: ' + data);
6868
if (isUtf8(data)) { msg.payload = data.toString(); }
6969
else { msg.payload = new Buffer(data); }
70-
node.send([null,msg,null]);
70+
node.send([null,RED.util.cloneMessage(msg),null]);
7171
});
7272
child.on('close', function (code) {
7373
//console.log('[exec] result: ' + code);
@@ -78,12 +78,12 @@ module.exports = function(RED) {
7878
if (code === null) { node.status({fill:"red",shape:"dot",text:"timeout"}); }
7979
else if (code < 0) { node.status({fill:"red",shape:"dot",text:"rc: "+code}); }
8080
else { node.status({fill:"yellow",shape:"dot",text:"rc: "+code}); }
81-
node.send([null,null,msg]);
81+
node.send([null,null,RED.util.cloneMessage(msg)]);
8282
});
8383
child.on('error', function (code) {
8484
delete node.activeProcesses[child.pid];
8585
if (child.tout) { clearTimeout(child.tout); }
86-
node.error(code,msg);
86+
node.error(code,RED.util.cloneMessage(msg));
8787
});
8888
}
8989
else {

test/nodes/core/core/75-exec_spec.js

Lines changed: 90 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,42 @@ describe('exec node', function() {
5858
arg3(null,arg1,arg1.toUpperCase());
5959
});
6060

61-
helper.load(execNode, flow, function() {
62-
var n1 = helper.getNode("n1");
63-
var n2 = helper.getNode("n2");
64-
var n3 = helper.getNode("n3");
65-
var n4 = helper.getNode("n4");
66-
n2.on("input", function(msg) {
67-
//console.log(msg);
68-
msg.should.have.property("payload");
69-
msg.payload.should.be.a.String();
70-
msg.payload.should.equal("echo");
71-
});
72-
n3.on("input", function(msg) {
73-
//console.log(msg);
74-
msg.should.have.property("payload");
75-
msg.payload.should.be.a.String,
76-
msg.payload.should.equal("ECHO");
77-
child_process.exec.restore();
78-
done();
61+
helper.load(execNode, flow, function() {
62+
var n1 = helper.getNode("n1");
63+
var n2 = helper.getNode("n2");
64+
var n3 = helper.getNode("n3");
65+
var n4 = helper.getNode("n4");
66+
var received = 0;
67+
var messages = [null,null];
68+
var completeTest = function() {
69+
received++;
70+
if (received < 2) {
71+
return;
72+
}
73+
try{
74+
var msg = messages[0];
75+
msg.should.have.property("payload");
76+
msg.payload.should.be.a.String();
77+
msg.payload.should.equal("echo");
78+
79+
msg = messages[1];
80+
msg.should.have.property("payload");
81+
msg.payload.should.be.a.String,
82+
msg.payload.should.equal("ECHO");
83+
child_process.exec.restore();
84+
done();
85+
} catch(err) {
86+
child_process.exec.restore();
87+
done(err);
88+
}
89+
};
90+
n2.on("input", function(msg) {
91+
messages[0] = msg;
92+
completeTest();
93+
});
94+
n3.on("input", function(msg) {
95+
messages[1] = msg;
96+
completeTest();
7997
});
8098
n1.receive({payload:"and"});
8199
});
@@ -96,19 +114,39 @@ describe('exec node', function() {
96114
var n2 = helper.getNode("n2");
97115
var n3 = helper.getNode("n3");
98116
var n4 = helper.getNode("n4");
117+
var received = 0;
118+
var messages = [null,null];
119+
var completeTest = function() {
120+
received++;
121+
if (received < 2) {
122+
return;
123+
}
124+
try{
125+
var msg = messages[0];
126+
msg.should.have.property("payload");
127+
msg.payload.should.be.a.String();
128+
msg.payload.should.equal("echo and more");
129+
130+
msg = messages[1];
131+
msg.should.have.property("payload");
132+
msg.payload.should.be.a.String();
133+
msg.payload.should.equal("ECHO AND MORE");
134+
child_process.exec.restore();
135+
done();
136+
} catch(err) {
137+
child_process.exec.restore();
138+
done(err);
139+
}
140+
};
141+
142+
99143
n2.on("input", function(msg) {
100-
//console.log(msg);
101-
msg.should.have.property("payload");
102-
msg.payload.should.be.a.String();
103-
msg.payload.should.equal("echo and more");
144+
messages[0] = msg;
145+
completeTest();
104146
});
105147
n3.on("input", function(msg) {
106-
//console.log(msg);
107-
msg.should.have.property("payload");
108-
msg.payload.should.be.a.String();
109-
msg.payload.should.equal("ECHO AND MORE");
110-
child_process.exec.restore();
111-
done();
148+
messages[1] = msg;
149+
completeTest();
112150
});
113151
n1.receive({payload:"and"});
114152
});
@@ -252,24 +290,40 @@ describe('exec node', function() {
252290
var n2 = helper.getNode("n2");
253291
var n3 = helper.getNode("n3");
254292
var n4 = helper.getNode("n4");
255-
n2.on("input", function(msg) {
256-
msg.should.have.property("payload");
257-
msg.payload.should.be.a.String();
258-
msg.payload.should.equal("this now works\n");
259-
});
260-
n4.on("input", function(msg) {
261-
try {
293+
var received = 0;
294+
var messages = [null,null];
295+
var completeTest = function() {
296+
received++;
297+
if (received < 2) {
298+
return;
299+
}
300+
try{
301+
var msg = messages[0];
262302
msg.should.have.property("payload");
303+
msg.payload.should.be.a.String();
304+
msg.payload.should.equal("this now works\n");
263305

306+
msg = messages[1];
307+
msg.should.have.property("payload");
264308
should.exist(msg.payload);
265309
msg.payload.should.be.a.Number();
266310
msg.payload.should.equal(0);
267311
done();
268312
} catch(err) {
269313
done(err);
270314
}
315+
};
316+
317+
318+
n2.on("input", function(msg) {
319+
messages[0] = msg;
320+
completeTest();
271321
});
272-
n1.receive({payload:null});
322+
n4.on("input", function(msg) {
323+
messages[1] = msg;
324+
completeTest();
325+
});
326+
n1.receive({payload:null,fred:123});
273327
});
274328
});
275329

0 commit comments

Comments
 (0)