@mangar2/mqttservice
Version:
communicates with a MQTT-Style HTTP broker
104 lines (86 loc) • 4.31 kB
JavaScript
/**
* ---------------------------------------------------------------------------------------------------
* This software is licensed under the GNU LESSER GENERAL PUBLIC LICENSE Version 3. It is furnished
* "as is", without any support, and with no warranty, express or implied, as to its usefulness for
* any purpose.
*
* File: test.js
*
* Author: Volker Böhm
* Copyright: Volker Böhm
* ---------------------------------------------------------------------------------------------------
*/
const MqttService = require('@mangar2/mqttservice')
const UnitTest = require('@mangar2/unittest')
const Message = require('@mangar2/message')
var unitTest = new UnitTest(false)
const TEST_COUNT = 100;
(async function test () {
try {
const HOST = '127.0.0.1'
const PORT = 0
const TOKEN = '/a/b'
const receive = new MqttService.OnPublish(PORT, [])
const value = {}
let result
receive.on('publish', (message, qos) => {
qos = Number(qos)
if (value[message.topic] === undefined) {
value[message.topic] = 1
}
if (message.topic === '/a/0' || message.topic === 'single/0') {
unitTest.assertEqual(qos, 0, 'qos check 0')
} else if (message.topic === '/a/1' || message.topic === '/b/1' || message.topic === 'single/1') {
unitTest.assertEqual(qos, 1, 'qos check 1')
unitTest.assertEqual(message.value, value[message.topic], 'value check qos 1')
} else if (message.topic === '/a/2' || message.topic === '/c/2' || message.topic === 'single/2') {
unitTest.assertEqual(qos, 2, 'qos check 2')
unitTest.assertEqual(message.value, value[message.topic], 'value check qos 2')
} else {
unitTest.fail('unexpected topic: ' + message.topic)
}
value[message.topic]++
})
// listen
receive.listen()
const usedPort = receive.port
const publish = new MqttService.Publish(HOST, usedPort, { retry: 2 })
// qos 0 publish
result = await publish.publish(TOKEN, new Message('single/0', 1, 'test'), 0, 0)
unitTest.assertEqual(result, undefined, 'QoS 0 message have undefined result')
// qos 1 publish
result = await publish.publish(TOKEN, new Message('single/1', 1, 'test'), 1, 0)
unitTest.assertTrue(result, 'QoS 1 message successful')
// qos 2 publish
result = await publish.publish(TOKEN, new Message('single/2', 1, 'test'), 2, 0)
unitTest.assertTrue(result, 'QoS 2 message successful')
// syncron mass publish
for (let i = 1; i <= TEST_COUNT; i++) {
if (i % 10 === 0) unitTest.log(i + ' of ' + TEST_COUNT * 2)
await publish.publish(TOKEN, new Message('/a/0', i, 'test'), 0, 0)
await publish.publish(TOKEN, new Message('/a/1', i, 'test'), 1, 0)
await publish.publish(TOKEN, new Message('/b/1', i, 'test'), 1, 0)
await publish.publish(TOKEN, new Message('/a/2', i, 'test'), 2, 0)
await publish.publish(TOKEN, new Message('/c/2', i, 'test'), 2, 0)
}
const promises = []
// asyncron mass publish
for (let i = TEST_COUNT + 1; i <= TEST_COUNT * 2; i++) {
if (i % 10 === 0) unitTest.log(i + ' of ' + TEST_COUNT * 2)
promises.push(publish.publish(TOKEN, new Message('/a/0', i, 'test'), 0, 0))
promises.push(publish.publish(TOKEN, new Message('/a/1', i, 'test'), 1, 0))
promises.push(publish.publish(TOKEN, new Message('/b/1', i, 'test'), 1, 0))
promises.push(publish.publish(TOKEN, new Message('/a/2', i, 'test'), 2, 0))
promises.push(publish.publish(TOKEN, new Message('/c/2', i, 'test'), 2, 0))
}
unitTest.log('wait for all promises to finish ...')
await Promise.all(promises)
unitTest.showResult(TEST_COUNT * 9 * 2 + 8)
process.exit(0)
} catch (err) {
console.error(err)
console.error('Error: test ends with errors')
process.exit(1)
}
})()