1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00
node-red/test/unit/@node-red/runtime/lib/index_spec.js

252 lines
10 KiB
JavaScript
Raw Permalink Normal View History

/**
* 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 sinon = require("sinon");
var path = require("path");
2018-08-20 17:17:24 +02:00
var NR_TEST_UTILS = require("nr-test-utils");
2018-08-20 17:17:24 +02:00
var api = NR_TEST_UTILS.require("@node-red/runtime/lib/api");
var runtime = NR_TEST_UTILS.require("@node-red/runtime");
var redNodes = NR_TEST_UTILS.require("@node-red/runtime/lib/nodes");
var storage = NR_TEST_UTILS.require("@node-red/runtime/lib/storage");
var settings = NR_TEST_UTILS.require("@node-red/runtime/lib/settings");
2018-12-04 16:59:43 +01:00
var util = NR_TEST_UTILS.require("@node-red/util");
2018-08-20 17:17:24 +02:00
var log = NR_TEST_UTILS.require("@node-red/util").log;
describe("runtime", function() {
afterEach(function() {
if (console.log.restore) {
console.log.restore();
}
})
before(function() {
2018-08-20 17:17:24 +02:00
process.env.NODE_RED_HOME = NR_TEST_UTILS.resolve("node-red");
});
after(function() {
delete process.env.NODE_RED_HOME;
});
2018-04-23 15:24:51 +02:00
function mockUtil(metrics) {
2018-12-04 16:59:43 +01:00
2018-04-23 15:24:51 +02:00
return {
log:{
log: sinon.stub(),
warn: sinon.stub(),
info: sinon.stub(),
2018-04-24 16:01:49 +02:00
trace: sinon.stub(),
2018-04-23 15:24:51 +02:00
metric: sinon.stub().returns(!!metrics),
_: function() { return "abc"}
},
i18n: {
registerMessageCatalog: function(){
return Promise.resolve();
}
}
}
}
describe("init", function() {
beforeEach(function() {
sinon.stub(log,"init",function() {});
sinon.stub(settings,"init",function() {});
2015-11-24 23:38:42 +01:00
sinon.stub(redNodes,"init",function() {})
});
afterEach(function() {
log.init.restore();
settings.init.restore();
2015-11-24 23:38:42 +01:00
redNodes.init.restore();
})
it("initialises components", function() {
2018-04-23 15:24:51 +02:00
runtime.init({testSettings: true, httpAdminRoot:"/"},mockUtil());
2016-10-10 14:27:43 +02:00
settings.init.called.should.be.true();
redNodes.init.called.should.be.true();
});
it("returns version", function() {
2018-04-23 15:24:51 +02:00
runtime.init({testSettings: true, httpAdminRoot:"/"},mockUtil());
2018-08-20 17:17:24 +02:00
return runtime.version().then(version => {
/^\d+\.\d+\.\d+(-.*)?$/.test(version).should.be.true();
2018-08-20 17:17:24 +02:00
});
})
});
2015-03-21 18:42:06 +01:00
describe("start",function() {
var storageInit;
var settingsLoad;
var redNodesInit;
var redNodesLoad;
var redNodesCleanModuleList;
var redNodesGetNodeList;
var redNodesLoadFlows;
var redNodesStartFlows;
var redNodesLoadContextsPlugin;
2018-12-04 16:59:43 +01:00
var i18nRegisterMessageCatalog;
2015-03-21 18:42:06 +01:00
beforeEach(function() {
2018-04-24 16:01:49 +02:00
storageInit = sinon.stub(storage,"init",function(settings) {return Promise.resolve();});
2015-03-21 18:42:06 +01:00
redNodesInit = sinon.stub(redNodes,"init", function() {});
2018-04-24 16:01:49 +02:00
redNodesLoad = sinon.stub(redNodes,"load", function() {return Promise.resolve()});
2015-03-21 18:42:06 +01:00
redNodesCleanModuleList = sinon.stub(redNodes,"cleanModuleList",function(){});
2018-04-24 16:01:49 +02:00
redNodesLoadFlows = sinon.stub(redNodes,"loadFlows",function() {return Promise.resolve()});
redNodesStartFlows = sinon.stub(redNodes,"startFlows",function() {});
2018-07-30 00:47:19 +02:00
redNodesLoadContextsPlugin = sinon.stub(redNodes,"loadContextsPlugin",function() {return Promise.resolve()});
2018-12-04 16:59:43 +01:00
i18nRegisterMessageCatalog = sinon.stub(util.i18n,"registerMessageCatalog",function() {return Promise.resolve()});
2015-03-21 18:42:06 +01:00
});
afterEach(function() {
storageInit.restore();
redNodesInit.restore();
redNodesLoad.restore();
redNodesGetNodeList.restore();
2015-03-21 18:42:06 +01:00
redNodesCleanModuleList.restore();
redNodesLoadFlows.restore();
redNodesStartFlows.restore();
redNodesLoadContextsPlugin.restore();
2018-12-04 16:59:43 +01:00
i18nRegisterMessageCatalog.restore();
2015-03-21 18:42:06 +01:00
});
it("reports errored/missing modules",function(done) {
redNodesGetNodeList = sinon.stub(redNodes,"getNodeList", function(cb) {
2015-03-21 18:42:06 +01:00
return [
{ err:"errored",name:"errName" }, // error
{ module:"module",enabled:true,loaded:false,types:["typeA","typeB"]} // missing
].filter(cb);
2015-03-21 18:42:06 +01:00
});
2018-04-23 15:24:51 +02:00
var util = mockUtil();
2018-04-24 16:01:49 +02:00
runtime.init({testSettings: true, httpAdminRoot:"/", load:function() { return Promise.resolve();}},util);
2018-04-23 15:24:51 +02:00
// sinon.stub(console,"log");
runtime.start().then(function() {
2018-04-23 15:24:51 +02:00
// console.log.restore();
2015-03-21 18:42:06 +01:00
try {
2016-10-10 14:27:43 +02:00
storageInit.calledOnce.should.be.true();
redNodesInit.calledOnce.should.be.true();
redNodesLoad.calledOnce.should.be.true();
redNodesLoadFlows.calledOnce.should.be.true();
2018-04-23 15:24:51 +02:00
util.log.warn.calledWithMatch("Failed to register 1 node type");
util.log.warn.calledWithMatch("Missing node modules");
util.log.warn.calledWithMatch(" - module: typeA, typeB");
2016-10-10 14:27:43 +02:00
redNodesCleanModuleList.calledOnce.should.be.true();
2015-03-21 18:42:06 +01:00
done();
} catch(err) {
done(err);
}
2018-04-23 15:24:51 +02:00
}).catch(err=>{done(err)});
2015-03-21 18:42:06 +01:00
});
it("initiates load of missing modules",function(done) {
redNodesGetNodeList = sinon.stub(redNodes,"getNodeList", function(cb) {
2015-03-21 18:42:06 +01:00
return [
{ err:"errored",name:"errName" }, // error
{ err:"errored",name:"errName" }, // error
{ module:"module",enabled:true,loaded:false,types:["typeA","typeB"]}, // missing
{ module:"node-red",enabled:true,loaded:false,types:["typeC","typeD"]} // missing
].filter(cb);
2015-03-21 18:42:06 +01:00
});
2018-04-24 16:01:49 +02:00
var serverInstallModule = sinon.stub(redNodes,"installModule",function(name) { return Promise.resolve({nodes:[]});});
2018-04-23 15:24:51 +02:00
var util = mockUtil();
2018-04-24 16:01:49 +02:00
runtime.init({testSettings: true, autoInstallModules:true, httpAdminRoot:"/", load:function() { return Promise.resolve();}},util);
sinon.stub(console,"log");
runtime.start().then(function() {
console.log.restore();
2015-03-21 18:42:06 +01:00
try {
2018-04-23 15:24:51 +02:00
util.log.warn.calledWithMatch("Failed to register 2 node types");
util.log.warn.calledWithMatch("Missing node modules");
util.log.warn.calledWithMatch(" - module: typeA, typeB");
util.log.warn.calledWithMatch(" - node-red: typeC, typeD");
2016-10-10 14:27:43 +02:00
redNodesCleanModuleList.calledOnce.should.be.false();
serverInstallModule.calledOnce.should.be.true();
2015-03-21 18:42:06 +01:00
serverInstallModule.calledWithMatch("module");
done();
} catch(err) {
done(err);
} finally {
serverInstallModule.restore();
}
2018-04-23 15:24:51 +02:00
}).catch(err=>{done(err)});
2015-03-21 18:42:06 +01:00
});
it("reports errored modules when verbose is enabled",function(done) {
redNodesGetNodeList = sinon.stub(redNodes,"getNodeList", function(cb) {
2015-03-21 18:42:06 +01:00
return [
{ err:"errored",name:"errName" } // error
].filter(cb);
2015-03-21 18:42:06 +01:00
});
2018-04-23 15:24:51 +02:00
var util = mockUtil();
2018-04-24 16:01:49 +02:00
runtime.init({testSettings: true, verbose:true, httpAdminRoot:"/", load:function() { return Promise.resolve();}},util);
sinon.stub(console,"log");
runtime.start().then(function() {
console.log.restore();
2015-03-21 18:42:06 +01:00
try {
2018-04-23 15:24:51 +02:00
util.log.warn.neverCalledWithMatch("Failed to register 1 node type");
util.log.warn.calledWithMatch("[errName] errored");
2015-03-21 18:42:06 +01:00
done();
} catch(err) {
done(err);
}
2018-04-23 15:24:51 +02:00
}).catch(err=>{done(err)});
2015-03-21 18:42:06 +01:00
});
2015-03-21 18:42:06 +01:00
it("reports runtime metrics",function(done) {
2018-07-30 00:47:19 +02:00
var stopFlows = sinon.stub(redNodes,"stopFlows",function() { return Promise.resolve();} );
2015-03-21 18:42:06 +01:00
redNodesGetNodeList = sinon.stub(redNodes,"getNodeList", function() {return []});
2018-04-23 15:24:51 +02:00
var util = mockUtil(true);
2018-12-04 16:59:43 +01:00
runtime.init(
{testSettings: true, runtimeMetricInterval:200, httpAdminRoot:"/", load:function() { return Promise.resolve();}},
{},
undefined,
util);
// sinon.stub(console,"log");
runtime.start().then(function() {
2018-12-04 16:59:43 +01:00
// console.log.restore();
2015-03-21 18:42:06 +01:00
setTimeout(function() {
try {
2018-04-23 15:24:51 +02:00
util.log.log.args.should.have.lengthOf(3);
util.log.log.args[0][0].should.have.property("event","runtime.memory.rss");
util.log.log.args[1][0].should.have.property("event","runtime.memory.heapTotal");
util.log.log.args[2][0].should.have.property("event","runtime.memory.heapUsed");
2015-03-21 18:42:06 +01:00
done();
} catch(err) {
done(err);
} finally {
runtime.stop();
2015-03-21 18:42:06 +01:00
stopFlows.restore();
}
},300);
2018-04-23 15:24:51 +02:00
}).catch(err=>{done(err)});
});
2015-03-21 18:42:06 +01:00
});
2018-05-30 03:24:27 +02:00
it("stops components", function(done) {
2018-07-30 00:47:19 +02:00
var stopFlows = sinon.stub(redNodes,"stopFlows",function() { return Promise.resolve();} );
var closeContextsPlugin = sinon.stub(redNodes,"closeContextsPlugin",function() { return Promise.resolve();} );
2018-05-30 03:24:27 +02:00
runtime.stop().then(function(){
stopFlows.called.should.be.true();
closeContextsPlugin.called.should.be.true();
2018-07-30 00:47:19 +02:00
stopFlows.restore();
closeContextsPlugin.restore();
2018-05-30 03:24:27 +02:00
done();
}).catch(function(err){
stopFlows.restore();
closeContextsPlugin.restore();
2018-07-30 00:47:19 +02:00
return done(err)
2018-05-30 03:24:27 +02:00
});
});
});