From b867df8677a8158e7e0757cde99fef672734235f Mon Sep 17 00:00:00 2001 From: biancode Date: Sun, 23 Jun 2024 09:15:35 +0200 Subject: [PATCH] test(server): use getPort to receive unique ports --- CHANGELOG.md | 14 +- package.json | 1 + test/units/flows/modbus-server-flows.js | 2 +- test/units/modbus-server-test.js | 296 +++++++++++++++--------- 4 files changed, 198 insertions(+), 115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9feecff3..89668e6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# [5.40.0](https://github.com/biancoroyal/node-red-contrib-modbus/compare/v5.27.2...v5.40.0) (2024-06-21) +# [5.40.0](https://github.com/biancoroyal/node-red-contrib-modbus/compare/v5.27.2...v5.40.0) (2024-06-23) ### Bug Fixes @@ -7,6 +7,7 @@ * **codeql:** version codeql ([163101f](https://github.com/biancoroyal/node-red-contrib-modbus/commit/163101f91c784a5202acd86b0a10302a22414495)) * **config:** [#442](https://github.com/biancoroyal/node-red-contrib-modbus/issues/442) fixing optional to save correct ([de88e25](https://github.com/biancoroyal/node-red-contrib-modbus/commit/de88e25b10e7e92ea8836d22ee91cb25796f3909)) * **modbus-client-core:** fixed test cases ([0697df3](https://github.com/biancoroyal/node-red-contrib-modbus/commit/0697df3f4fdf71434e3757f9ae68c6e6db22a948)) +* **modbus-client-flow:** fixed modbus client flow example ([8613c89](https://github.com/biancoroyal/node-red-contrib-modbus/commit/8613c892c54d7c73ca818a5fb34729232fb8acef)) * **modbus-fc-flex:** fixed test case for modbus flex fc file ([93b22f8](https://github.com/biancoroyal/node-red-contrib-modbus/commit/93b22f8cafe5dc269811cfef78fba1c05dc57c69)) * **modbus-flex-getter:** fixed port server and tcp port ([b48d92f](https://github.com/biancoroyal/node-red-contrib-modbus/commit/b48d92f28c108a1c6e7b6ad03db7089cfe5b13af)) * **modbus-flex-write:** fixed flow for modbus flex write ([a31b4c4](https://github.com/biancoroyal/node-red-contrib-modbus/commit/a31b4c40259d4ebc8033fbcd006758186efb347e)) @@ -16,6 +17,7 @@ * **modbus-write:** fix example flow for modbus write node ([04fd17c](https://github.com/biancoroyal/node-red-contrib-modbus/commit/04fd17c9890ce760e36b2ec9402814accfdc2459)) * **modbus:** added a new example flow and fixed test cases ([8181fd4](https://github.com/biancoroyal/node-red-contrib-modbus/commit/8181fd4f05abff6f57a7b4de636689e890cf0ea9)) * **modbus:** commented the test cases that are failed ([5998a5d](https://github.com/biancoroyal/node-red-contrib-modbus/commit/5998a5d2fceaaf1b8ba972ddba771b70e2a4c2a2)) +* **test_cases:** fixed test flow of modbus queue info ([732fa9c](https://github.com/biancoroyal/node-red-contrib-modbus/commit/732fa9c57e6b0c536bc50378f8e39081d12e11bc)) * **test_cases:** improved test cases ([bdafa18](https://github.com/biancoroyal/node-red-contrib-modbus/commit/bdafa18508069876ca522ace6e4a73be4c272c49)) * **test_flows:** fixed old test flows of read node, queue info node ([37b73ee](https://github.com/biancoroyal/node-red-contrib-modbus/commit/37b73ee0c845bb63b9b00d768b52bf8f76898290)) * **testcase:** fixed test case assertion ([803e7e0](https://github.com/biancoroyal/node-red-contrib-modbus/commit/803e7e08a53052f02ef6d0f4fa517353c228a88b)) @@ -287,7 +289,7 @@ -# [5.2.0](https://github.com/biancoroyal/node-red-contrib-modbus/compare/v4.1.3...v5.2.0) (2019-12-08) +# [5.2.0](https://github.com/biancoroyal/node-red-contrib-modbus/compare/5.1.0-0...v5.2.0) (2019-12-08) ### Bug Fixes @@ -301,6 +303,14 @@ ### Features * [#161](https://github.com/biancoroyal/node-red-contrib-modbus/issues/161) multiple RTU devices via UnitID ([b0b5011](https://github.com/biancoroyal/node-red-contrib-modbus/commit/b0b5011be4ab5e7c06ab44fd9df7b0ff5ddd0fd8)) + + + +# [5.1.0-0](https://github.com/biancoroyal/node-red-contrib-modbus/compare/v4.1.3...5.1.0-0) (2019-11-24) + + +### Features + * new state machine from xstate ([57aef99](https://github.com/biancoroyal/node-red-contrib-modbus/commit/57aef9956187ee9d70e862b226f3a3ef5e091528)) diff --git a/package.json b/package.json index 0a31c86b..fd46cc01 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "test:slow": "npm run lint && mocha ./test --recursive --reporter dot", "test:verbose": "npm run lint && mocha ./test --recursive", "test:withStop": "npm run lint && mocha ./test --recursive --bail", + "test:publish": "gulp clean && npm run prepublishOnly", "lint": "standard --fix", "test:e2e": "npm run lint && mocha './test/units/modbus-write-e2e-test.js' --parallel --recursive --reporter dot --timeout 100000", "test:units": "npm run lint && mocha './test/units/modbus-client-test.js' --parallel --recursive --reporter dot --timeout 100000", diff --git a/test/units/flows/modbus-server-flows.js b/test/units/flows/modbus-server-flows.js index 5bc9fc93..2322507e 100644 --- a/test/units/flows/modbus-server-flows.js +++ b/test/units/flows/modbus-server-flows.js @@ -129,7 +129,7 @@ module.exports = { z: '844e5e46fef5b7e2', name: 'modbusServer', logEnabled: false, - hostname: '192.168.99.1', + hostname: '127.0.0.1', serverPort: '5503', responseDelay: '50', delayUnit: 'ms', diff --git a/test/units/modbus-server-test.js b/test/units/modbus-server-test.js index 16a438e1..1b2c7ae8 100644 --- a/test/units/modbus-server-test.js +++ b/test/units/modbus-server-test.js @@ -20,6 +20,7 @@ const helper = require('node-red-node-test-helper') helper.init(require.resolve('node-red')) const testFlows = require('./flows/modbus-server-flows.js') +const { getPort } = require('../helper/test-helper-extensions') describe('Server node Testing', function () { before(function (done) { @@ -44,169 +45,240 @@ describe('Server node Testing', function () { describe('Node', function () { it('should send message when valid message and output not disabled', function (done) { - helper.load(testServerNodes, testFlows.testServerConfig, function () { - const modbusServer = helper.getNode('249922d5ac72b8cd') - const sendMessageSpy = sinon.spy(modbusServer, 'send') + const flow = Array.from(testFlows.testServerConfig) - const msg = { - payload: {} - } + getPort().then((port) => { + flow[0].serverPort = port - modbusServer.emit('input', msg) + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('249922d5ac72b8cd') + const sendMessageSpy = sinon.spy(modbusServer, 'send') - sinon.assert.calledOnce(sendMessageSpy) - done() + const msg = { + payload: {} + } + + modbusServer.emit('input', msg) + + sinon.assert.calledOnce(sendMessageSpy) + done() + }) }) }) it('should initialize node with correct configurations', function (done) { - helper.load(testServerNodes, testFlows.testServerConfig, function () { - const modbusServer = helper.getNode('249922d5ac72b8cd') - expect(modbusServer.name).to.equal('Test Modbus Server') - expect(modbusServer.logEnabled).to.equal(true) - expect(modbusServer.hostname).to.equal('127.0.0.1') - expect(modbusServer.serverPort).to.equal(5509) - expect(modbusServer.responseDelay).to.equal(100) - expect(modbusServer.delayUnit).to.equal('ms') - expect(modbusServer.showStatusActivities).to.equal(true) - expect(modbusServer.coilsBufferSize).to.equal(80000) - expect(modbusServer.holdingBufferSize).to.equal(80000) - expect(modbusServer.inputBufferSize).to.equal(80000) - expect(modbusServer.discreteBufferSize).to.equal(80000) - expect(modbusServer.showErrors).to.equal(true) - expect(modbusServer.internalDebugLog).to.be.a('function') - expect(modbusServer.netServer).to.be.an('object') - expect(modbusServer.modbusServer).to.be.an('object') - - done() + const flow = Array.from(testFlows.testServerConfig) + + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('249922d5ac72b8cd') + expect(modbusServer.name).to.equal('Test Modbus Server') + expect(modbusServer.logEnabled).to.equal(true) + expect(modbusServer.hostname).to.equal('127.0.0.1') + expect(modbusServer.serverPort).to.equal(port) + expect(modbusServer.responseDelay).to.equal(100) + expect(modbusServer.delayUnit).to.equal('ms') + expect(modbusServer.showStatusActivities).to.equal(true) + expect(modbusServer.coilsBufferSize).to.equal(80000) + expect(modbusServer.holdingBufferSize).to.equal(80000) + expect(modbusServer.inputBufferSize).to.equal(80000) + expect(modbusServer.discreteBufferSize).to.equal(80000) + expect(modbusServer.showErrors).to.equal(true) + expect(modbusServer.internalDebugLog).to.be.a('function') + expect(modbusServer.netServer).to.be.an('object') + expect(modbusServer.modbusServer).to.be.an('object') + + done() + }) }) }) it('should set node status to active on client connection', function () { - helper.load(testServerNodes, testFlows.testServerConfig, function () { - const modbusServer = helper.getNode('249922d5ac72b8cd') - modbusServer.modbusServer.emit('connection', { socket: { address: () => '127.0.0.1', remoteAddress: '192.168.1.100', remotePort: 1234 } }) + const flow = Array.from(testFlows.testServerConfig) - sinon.assert.calledWith(modbusServer.status, { fill: 'yellow', shape: 'dot', text: 'initialized' }) + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('249922d5ac72b8cd') + modbusServer.modbusServer.emit('connection', { + socket: { + address: () => '127.0.0.1', + remoteAddress: '192.168.1.100', + remotePort: 1234 + } + }) + + sinon.assert.calledWith(modbusServer.status, { fill: 'yellow', shape: 'dot', text: 'initialized' }) + }) }) }) it('should set responseDelay, delayUnit, showStatusActivities, and coilsBufferSize correctly', function (done) { - helper.load(testServerNodes, testFlows.testServerConfig, function () { - const modbusServer = helper.getNode('249922d5ac72b8cd') - expect(modbusServer.responseDelay).to.equal(100) - expect(modbusServer.delayUnit).to.equal('ms') - modbusServer.showStatusActivities.should.be.true() - modbusServer.showErrors.should.be.true() - expect(modbusServer.coilsBufferSize).to.equal(80000) - expect(modbusServer.holdingBufferSize).to.equal(80000) - expect(modbusServer.discreteBufferSize).to.equal(80000) - done() + const flow = Array.from(testFlows.testServerConfig) + + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('249922d5ac72b8cd') + expect(modbusServer.responseDelay).to.equal(100) + expect(modbusServer.delayUnit).to.equal('ms') + modbusServer.showStatusActivities.should.be.true() + modbusServer.showErrors.should.be.true() + expect(modbusServer.coilsBufferSize).to.equal(80000) + expect(modbusServer.holdingBufferSize).to.equal(80000) + expect(modbusServer.discreteBufferSize).to.equal(80000) + done() + }) }) }) - it('should handle errors during server initialization', function (done) { - helper.load(testServerNodes, testFlows.testSimpleNodeToLogError, function () { - const modbusServer = helper.getNode('178284ea.5055ab') - let errorMessage = '' - modbusServer.error = function (msg) { - errorMessage = msg - } - modbusServer.netServer.emit('error', (err) => { - console.error(`Server error: ${err.message}`, errorMessage) + it('should handle errors during server initialization error emit', function (done) { + const flow = Array.from(testFlows.testSimpleNodeToLogError) + + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('178284ea.5055ab') + let errorMessage = '' + modbusServer.error = function (msg) { + errorMessage = msg + } + modbusServer.netServer.emit('error', (err) => { + console.error(`Server error: ${err.message}`, errorMessage) + }) + done() }) - done() }) }) it('should log an error message when showErrors is true and the message is invalid', function (done) { - helper.load(testServerNodes, testFlows.testSimpleNodeToLogError, function () { - const modbusServer = helper.getNode('178284ea.5055ab') - const msg = { - payload: 'invalid message' - } - modbusServer.showErrors = true - - let errorMessage = '' - modbusServer.error = function (msg) { - errorMessage = msg - } - - modbusServer.emit('input', msg) - expect(errorMessage).to.equal('Is Not A Valid Memory Write Message To Server') - done() + const flow = Array.from(testFlows.testSimpleNodeToLogError) + + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('178284ea.5055ab') + const msg = { + payload: 'invalid message' + } + modbusServer.showErrors = true + + let errorMessage = '' + modbusServer.error = function (msg) { + errorMessage = msg + } + + modbusServer.emit('input', msg) + expect(errorMessage).to.equal('Is Not A Valid Memory Write Message To Server') + done() + }) }) }) - it('should handle errors during server initialization', function (done) { - helper.load(testServerNodes, testFlows.testSimpleNodeShouldBeLoadedFlow, function () { - const modbusServer = helper.getNode('178284ea.5055ab') - const msg = { - payload: { - register: 'coils', - address: 0 - }, - bufferData: Buffer.from([1, 2]), - bufferAddress: 0 - } - - let msgOutput = '' - modbusServer.send = function (msg) { - msgOutput = msg - } - - modbusServer.emit('input', msg) - - expect(msgOutput).to.deep.equal([ - { type: 'holding', message: msg, payload: modbusServer.modbusServer.holding }, - { type: 'coils', message: msg, payload: modbusServer.modbusServer.coils }, - { type: 'input', message: msg, payload: modbusServer.modbusServer.input }, - { type: 'discrete', message: msg, payload: modbusServer.modbusServer.discrete }, - { payload: 'request', type: 'message', message: msg } - ]) - done() + it('should handle errors during server input msg', function (done) { + const flow = Array.from(testFlows.testSimpleNodeShouldBeLoadedFlow) + + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('178284ea.5055ab') + const msg = { + payload: { + register: 'coils', + address: 0 + }, + bufferData: Buffer.from([1, 2]), + bufferAddress: 0 + } + + let msgOutput = '' + modbusServer.send = function (msg) { + msgOutput = msg + } + + modbusServer.emit('input', msg) + + expect(msgOutput).to.deep.equal([ + { type: 'holding', message: msg, payload: modbusServer.modbusServer.holding }, + { type: 'coils', message: msg, payload: modbusServer.modbusServer.coils }, + { type: 'input', message: msg, payload: modbusServer.modbusServer.input }, + { type: 'discrete', message: msg, payload: modbusServer.modbusServer.discrete }, + { payload: 'request', type: 'message', message: msg } + ]) + done() + }) }) }) it('simple Node should be loaded', function (done) { - helper.load(testServerNodes, testFlows.testSimpleNodeShouldBeLoadedFlow, function () { - const modbusServer = helper.getNode('178284ea.5055ab') - modbusServer.should.have.property('name', 'modbusServer') + const flow = Array.from(testFlows.testSimpleNodeShouldBeLoadedFlow) - done() + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('178284ea.5055ab') + modbusServer.should.have.property('name', 'modbusServer') + + done() + }) }) }) it('simple Node with wrong IP should be loaded', function (done) { - helper.load(testServerNodes, testFlows.testSimpleNodeWithWrongIPShouldBeLoadedFlow, function () { - const modbusServer = helper.getNode('178284ea.5055ab') - modbusServer.should.have.property('name', 'modbusServer') + const flow = Array.from(testFlows.testSimpleNodeWithWrongIPShouldBeLoadedFlow) + + getPort().then((port) => { + flow[1].serverPort = port - done() + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('178284ea.5055ab') + modbusServer.should.have.property('name', 'modbusServer') + done() + }) }) }) it('should send data on input', function (done) { - helper.load(testServerNodes, testFlows.testShouldSendDataOnInputFlow, function () { - const h1 = helper.getNode('h1') - h1.on('input', function () { - done() + const flow = Array.from(testFlows.testShouldSendDataOnInputFlow) + + getPort().then((port) => { + flow[1].serverPort = port + + helper.load(testServerNodes, flow, function () { + const h1 = helper.getNode('h1') + h1.on('input', function () { + done() + }) }) }) }) - it('should handle errors during server initialization', function (done) { - helper.load(testServerNodes, testFlows.testSimpleNodeShouldThrowErrorFlow, function () { - const modbusServer = helper.getNode('178284ea.5055ab') - expect(modbusServer.statusText).to.equal('error') - done() + it('should handle errors during server initialization and show in status', function (done) { + const flow = Array.from(testFlows.testSimpleNodeShouldThrowErrorFlow) + + getPort().then((port) => { + flow[0].serverPort = port + + helper.load(testServerNodes, flow, function () { + const modbusServer = helper.getNode('178284ea.5055ab') + expect(modbusServer.statusText).to.equal('error') + done() + }) }) }) }) describe('post', function () { it('should fail for invalid node', function (done) { - helper.load(testServerNodes, testFlows.testShouldSendDataOnInputFlow, function () { + helper.load(testServerNodes, [], function () { helper.request().post('/modbus-server/invalid').expect(404).end(done) }) })