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

Make Watch node test more reliable

- tidied up some unnecessary code
 - removed the 'size' check as that is highly prone to timing issues
This commit is contained in:
Nick O'Leary 2018-01-13 22:48:35 +00:00
parent 1f40d4f941
commit 8ffabf1813
No known key found for this signature in database
GPG Key ID: 4F2157149161A6C9

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
**/ **/
var fs = require("fs"); var fs = require("fs-extra");
var path = require("path"); var path = require("path");
var should = require("should"); var should = require("should");
var helper = require("../../helper.js"); var helper = require("../../helper.js");
@ -26,11 +26,6 @@ describe('watch Node', function() {
var resourcesDir = path.join(__dirname,"..","..","..","resources"); var resourcesDir = path.join(__dirname,"..","..","..","resources");
var baseDir = path.join(resourcesDir, "23-watch-test-dir"); 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; var count = 0;
function prepareDir() { function prepareDir() {
@ -41,63 +36,26 @@ describe('watch Node', function() {
file2ToWatch = path.join(subDirToWatch, "file2.txt"); file2ToWatch = path.join(subDirToWatch, "file2.txt");
fs.mkdirSync(dirToWatch); fs.mkdirSync(dirToWatch);
count++; count++;
return {
dirToWatch:dirToWatch,
file0ToWatch:file0ToWatch,
file1ToWatch:file1ToWatch,
subDirToWatch:subDirToWatch,
file2ToWatch:file2ToWatch
}
} }
function wait(msec, func) { function wait(msec, func) {
setTimeout(func, msec); 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) { before(function(done) {
fs.mkdirSync(baseDir); fs.ensureDirSync(baseDir);
done(); done();
}); });
after(function(done) { after(function(done) {
rmdir(baseDir, done); fs.removeSync(baseDir);
});
beforeEach(function(done) {
prepareDir();
done(); done();
}); });
@ -114,27 +72,32 @@ describe('watch Node', function() {
var count = 0; var count = 0;
var len = Object.keys(results).length; var len = Object.keys(results).length;
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('file'); try {
// console.log(msg);
msg.should.have.property('file');
var file = msg.file; var file = msg.file;
if(file in processed) { if (file in processed) {
// multiple messages come in rare case // multiple messages come in rare case
return; return;
} }
processed[file] = true; processed[file] = true;
(file in results).should.be.true; (file in results).should.be.true();
var result = results[file]; var result = results[file];
msg.should.have.property('payload', result.payload); msg.should.have.property('payload', result.payload);
msg.should.have.property('type', result.type); msg.should.have.property('type', result.type);
if('size' in result) { if('size' in result) {
msg.should.have.property('size', result.size); msg.should.have.property('size', result.size);
} }
count++; count++;
if(count === len) { if(count === len) {
n1.close(); n1.close();
// wait for close // wait for close
wait(500, done); wait(100, done);
}
}catch(err) {
done(err);
} }
}); });
// wait for preparation // wait for preparation
@ -143,106 +106,116 @@ describe('watch Node', function() {
} }
it('should watch a file to be changed', function(done) { it('should watch a file to be changed', function(done) {
fs.writeFileSync(file0ToWatch, ''); var files = prepareDir();
fs.writeFileSync(files.file0ToWatch, '');
var flow = [{id:"n1", type:"watch", name: "watch", var flow = [{id:"n1", type:"watch", name: "watch",
files: file0ToWatch, recursive: false, files: files.file0ToWatch, recursive: false,
wires:[["n2"]]}, wires:[["n2"]]},
{id:"n2", type:"helper"}]; {id:"n2", type:"helper"}];
var results = { var results = {
'file0.txt' : { 'file0.txt' : {
'payload' : file0ToWatch, 'payload' : files.file0ToWatch,
'topic': file0ToWatch, 'topic': files.file0ToWatch,
'type': 'file', 'type': 'file',
'size': 5 'size': 5
} }
}; };
testWatch(flow, function() { testWatch(flow, function() {
fs.appendFileSync(file0ToWatch, "ABCDE"); fs.appendFileSync(files.file0ToWatch, "ABCDE");
}, results, done); }, results, done);
}); });
it('should watch multiple files to be changed', function(done) { it('should watch multiple files to be changed', function(done) {
fs.writeFileSync(file0ToWatch, ''); var files = prepareDir();
fs.writeFileSync(file1ToWatch, ''); fs.writeFileSync(files.file0ToWatch, '');
var files = file0ToWatch +","+file1ToWatch; fs.writeFileSync(files.file1ToWatch, '');
var flow = [{id:"n1", type:"watch", name: "watch", var flow = [{id:"n1", type:"watch", name: "watch",
files: files, recursive: false, files: files.file0ToWatch +","+files.file1ToWatch, recursive: false,
wires:[["n2"]]}, wires:[["n2"]]},
{id:"n2", type:"helper"}]; {id:"n2", type:"helper"}];
var results = { var results = {
'file0.txt' : { 'file0.txt' : {
'payload' : file0ToWatch, 'payload' : files.file0ToWatch,
'topic': file0ToWatch, 'topic': files.file0ToWatch,
'type': 'file', 'type': 'file'//,
'size': 5 // 'size': 5
}, },
'file1.txt' : { 'file1.txt' : {
'payload' : file1ToWatch, 'payload' : files.file1ToWatch,
'topic': file1ToWatch, 'topic': files.file1ToWatch,
'type': 'file', 'type': 'file'//,
'size': 3 // 'size': 3
} }
}; };
testWatch(flow, function() { testWatch(flow, function() {
fs.appendFileSync(file0ToWatch, "ABCDE"); fs.appendFileSync(files.file0ToWatch, "ABCDE");
fs.appendFileSync(file1ToWatch, "123"); fs.appendFileSync(files.file1ToWatch, "123");
}, results, done); }, results, done);
}); });
it('should watch attribute of a file to be changed', function(done) { it('should watch attribute of a file to be changed', function(done) {
fs.writeFileSync(file0ToWatch, ''); var files = prepareDir();
fs.chmodSync(file0ToWatch, 0o444); fs.writeFileSync(files.file0ToWatch, '');
fs.chmodSync(files.file0ToWatch, 0o444);
var flow = [{id:"n1", type:"watch", name: "watch", var flow = [{id:"n1", type:"watch", name: "watch",
files: file0ToWatch, recursive: false, files: files.file0ToWatch, recursive: false,
wires:[["n2"]]}, wires:[["n2"]]},
{id:"n2", type:"helper"}]; {id:"n2", type:"helper"}];
var results = { var results = {
'file0.txt' : { 'file0.txt' : {
'payload' : file0ToWatch, 'payload' : files.file0ToWatch,
'topic': file0ToWatch, 'topic': files.file0ToWatch,
'type': 'file', 'type': 'file'//,
'size': 0 // 'size': 0
} }
}; };
testWatch(flow, function() { testWatch(flow, function() {
fs.chmodSync(file0ToWatch, 0o777); fs.chmodSync(files.file0ToWatch, 0o777);
}, results, done); }, results, done);
}); });
it('should watch a file in a directory to be changed', function(done) { it('should watch a file in a directory to be changed', function(done) {
fs.writeFileSync(file0ToWatch, ''); var files = prepareDir();
fs.writeFileSync(files.file0ToWatch, '');
var flow = [{id:"n1", type:"watch", name: "watch", var flow = [{id:"n1", type:"watch", name: "watch",
files: dirToWatch, recursive: true, files: files.dirToWatch, recursive: true,
wires:[["n2"]]}, wires:[["n2"]]},
{id:"n2", type:"helper"}]; {id:"n2", type:"helper"}];
var results = { var results = {
'file0.txt' : { 'file0.txt' : {
'payload' : file0ToWatch, 'payload' : files.file0ToWatch,
'topic': file0ToWatch, 'topic': files.file0ToWatch,
'type': 'file', 'type': 'file'//,
'size': 5 // 'size': 5
} }
}; };
testWatch(flow, function() { testWatch(flow, function() {
fs.appendFileSync(file0ToWatch, "ABCDE"); fs.appendFileSync(files.file0ToWatch, "ABCDE");
}, results, done); }, results, done);
}); });
it('should watch a sub directory in a directory to be changed', function(done) { it('should watch a sub directory in a directory to be changed', function(done) {
fs.mkdirSync(subDirToWatch); var files = prepareDir();
fs.mkdirSync(files.subDirToWatch);
var flow = [{id:"n1", type:"watch", name: "watch", var flow = [{id:"n1", type:"watch", name: "watch",
files: dirToWatch, recursive: true, files: files.dirToWatch, recursive: true,
wires:[["n2"]]}, wires:[["n2"]]},
{id:"n2", type:"helper"}]; {id:"n2", type:"helper"}];
var results = { var results = {
'subdir': {
payload: files.subDirToWatch,
topic: files.dirToWatch,
file: 'subdir',
type: 'directory'
},
'file2.txt': { 'file2.txt': {
payload: file2ToWatch, payload: files.file2ToWatch,
type: 'file', type: 'file'//,
size: 5 // size: 5
} }
}; };
testWatch(flow, function() { testWatch(flow, function() {
fs.appendFileSync(file2ToWatch, "ABCDE"); fs.appendFileSync(files.file2ToWatch, "ABCDE");
}, results, done); }, results, done);
}); });