UNPKG

lightstreamer-adapter

Version:

This package includes the resources needed to write Data Adapters and Metadata Adapters for Lightstreamer Server in a Node.js environment. The adapters will run in a separate process, communicating with the Server through the Adapter Remoting Infrastructu

268 lines (240 loc) 10.5 kB
import { DataProvider, MetadataProvider } from '../index.js'; import { TestStream } from './utils/teststream.js'; import { expect } from './utils/expect.mjs'; var currProtocolVersion = "1.9.1"; function testInitialization() { const reqRespStream = new TestStream(); const dataProvider = new DataProvider(reqRespStream); const test = expect(); test.equal(reqRespStream.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); dataProvider.on('init', function(message, response) { test.equal(message.parameters["P1"], "V1"); test.equal(message.parameters["P2"], "V2"); test.equal(message.parameters["keepalive_hint.millis"], null); test.equal(message.initResponseParams, null); response.success(); test.equal(reqRespStream.popTestData(), "ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.done(); }); reqRespStream.pushTestData("ID0|DPI|S|P1|S|V1|S|ARI.version|S|" + currProtocolVersion + "|S|P2|S|V2|S|keepalive_hint.millis|S|8000\r\n"); return test.finished; } function testFailedInitialization() { const reqRespStream = new TestStream(); const dataProvider = new DataProvider(reqRespStream); const test = expect(); test.equal(reqRespStream.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); dataProvider.on('init', function(message, response) { response.error("An exception", "data"); test.equal(reqRespStream.popTestData(), "ID0|DPI|ED|An+exception\n"); test.done(); }); reqRespStream.pushTestData("ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); return test.finished; } function testSubscribeWithSnapshot() { function isSnapshotAvailable(itemName) { test.equal(itemName, "An Item Name"); return true; } const reqRespStream = new TestStream(); const dataProvider = new DataProvider(reqRespStream, isSnapshotAvailable, null); const test = expect(); test.equal(reqRespStream.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); dataProvider.on('subscribe', function(itemName, response) { test.equal(itemName, "An Item Name"); response.success(); test.equal(reqRespStream.popTestData(), "ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(reqRespStream.popTestData(), "FAKEID|SUB|V\n"); test.equal(reqRespStream.popTestData(), null); test.done(); }); reqRespStream.pushTestData("ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); reqRespStream.pushTestData("FAKEID|SUB|S|An Item Name\r\n"); return test.finished; } function testFailedSubscribe() { const reqRespStream = new TestStream(); const dataProvider = new DataProvider(reqRespStream); const test = expect(); test.equal(reqRespStream.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); dataProvider.on('subscribe', function (itemName, response) { response.error("An exception", "subscription"); test.equal(reqRespStream.popTestData(), "ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(reqRespStream.popTestData(), "FAKEID|SUB|EU|An exception\n"); test.done(); }); reqRespStream.pushTestData("ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); reqRespStream.pushTestData("FAKEID|SUB|S|An Item Name\r\n"); return test.finished; } function testUnsubscribe() { const reqRespStream = new TestStream(); const dataProvider = new DataProvider(reqRespStream); const test = expect(); test.equal(reqRespStream.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); dataProvider.on('unsubscribe', function(itemName, response) { test.equal(itemName, "An Item Name"); response.success(); test.equal(reqRespStream.popTestData(), "ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(reqRespStream.popTestData(), "FAKEID|USB|V\n"); test.done(); }); reqRespStream.pushTestData("ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); reqRespStream.pushTestData("FAKEID|USB|S|An Item Name\r\n"); return test.finished; } function testUpdateByHash() { var fake = ""; const reqRespStream = new TestStream(); const dataProvider = new DataProvider(reqRespStream); const test = expect(); test.equal(reqRespStream.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); dataProvider.on('subscribe', function (itemName, response) { response.success(); test.equal(reqRespStream.popTestData(), "ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(reqRespStream.popTestData(), "FAKEID|SUB|V\n"); dataProvider.update("AnItemName", true, { "field1": "A string", "field2": "", "field3": null, "field4": 12.4, "field5": true, "field6": 0, "field7": NaN, "field8": fake.undef, //fake does not have an undef property "field9": false }); test.equal(reqRespStream.popTestData().substring(13), "|EOS|S|AnItemName|S|FAKEID\n"); test.equal(reqRespStream.popTestData().substring(13), "|UD3|S|AnItemName|S|FAKEID|B|1|" + "S|field1|S|A string|S|field2|S|$|S|field3|S|#|" + "S|field4|S|12.4|S|field5|S|true|S|field6|S|0|" + "S|field7|S|NaN|S|field8|S|undefined|S|field9|S|false\n"); test.done(); }); reqRespStream.pushTestData("ID0|DPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); reqRespStream.pushTestData("FAKEID|SUB|S|AnItemName\r\n"); return test.finished; } function testMDInitSuccess() { const s = new TestStream(); const mp = new MetadataProvider(s); const test = expect(); test.equal(s.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); mp.on('init', function(msg, resp) { test.equal(msg.parameters["P1"], "V1"); test.equal(msg.parameters["P2"], "V2"); test.equal(msg.parameters["keepalive_hint.millis"], null); test.equal(msg.initResponseParams, null); resp.success(); test.equal(s.popTestData(), "ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.done(); }); s.pushTestData("ID0|MPI|S|P1|S|V1|S|ARI.version|S|" + currProtocolVersion + "|S|P2|S|V2|S|keepalive_hint.millis|S|8000\r\n"); return test.finished } function testMDInitFailure() { const s = new TestStream(); const mp = new MetadataProvider(s); const test = expect(); test.equal(s.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); mp.on('init', function(msg, resp) { resp.error("An error"); test.equal(s.popTestData(), "ID0|MPI|E|An+error\n"); test.done(); }); s.pushTestData("ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); return test.finished; } function testMDNotifyNewSessionSuccess() { const s = new TestStream(); const mp = new MetadataProvider(s); const test = expect(); test.equal(s.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); mp.on("notifyNewSession", function(msg, resp) { test.equal(msg.verb, "notifyNewSession"); resp.success(); test.equal(s.popTestData(), "ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(s.popTestData(), "FAKEID|NNS|V\n"); test.done(); }); s.pushTestData("ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); s.pushTestData("FAKEID|NNS|S|user|S|FAKESESSID|S|prop1|S|val1|S|prop2|S|val2\n"); return test.finished; } function testMDNotifyNewSessionFailure() { const s = new TestStream(); const mp = new MetadataProvider(s); const test = expect(); test.equal(s.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); mp.on("notifyNewSession", function(msg, resp) { resp.error("An error"); test.equal(s.popTestData(), "ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(s.popTestData(), "FAKEID|NNS|E|An error\n"); test.done(); }); s.pushTestData("ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); s.pushTestData("FAKEID|NNS|S|user|S|FAKESESSID|S|prop1|S|val1|S|prop2|S|val2\n"); return test.finished; } function testMDNotifyMpnDeviceAccessSuccess() { const s = new TestStream(); const mp = new MetadataProvider(s); const test = expect(); test.equal(s.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); mp.on("notifyMpnDeviceAccess", function (msg, resp) { test.equal(msg.verb, "notifyMpnDeviceAccess"); resp.success(); test.equal(s.popTestData(), "ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(s.popTestData(), "FAKEID|MDA|V\n"); test.done(); }); s.pushTestData("ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); s.pushTestData("FAKEID|MDA|S|user|S|FAKESESSID|P|A|S|appID|S|deviceToken\n"); return test.finished; } function testMDNotifyMpnDeviceAccessFailure() { const s = new TestStream(); const mp = new MetadataProvider(s); const test = expect(); test.equal(s.popTestData(), "1|RAC|S|enableClosePacket|S|true|S|SDK|S|Node.js+Adapter+SDK\n"); mp.on("notifyMpnDeviceAccess", function(msg, resp) { var excData = {clientCode: -2, clientMessage: "Message for the client"}; resp.error("An error", "credits", excData); test.equal(s.popTestData(), "ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\n"); test.equal(s.popTestData(), "FAKEID|MDA|EC|An error|-2|Message for the client\n"); test.done(); }); s.pushTestData("ID0|MPI|S|ARI.version|S|" + currProtocolVersion + "\r\n"); s.pushTestData("FAKEID|MDA|S|user|S|FAKESESSID|P|A|S|appID|S|deviceToken\n"); return test.finished; } (async function main() { const to = setTimeout(() => { console.log('TEST FAILURE: timeout expired') process.exit(1) }, 3000) try { // DataProvider tests await testInitialization() await testFailedInitialization() await testSubscribeWithSnapshot() await testFailedSubscribe() await testUnsubscribe() await testUpdateByHash() // MetaDataProvider tests await testMDInitSuccess() await testMDInitFailure() await testMDNotifyNewSessionSuccess() await testMDNotifyNewSessionFailure() await testMDNotifyMpnDeviceAccessSuccess() await testMDNotifyMpnDeviceAccessFailure() console.log('OK') } catch(e) { console.error('TEST FAILURE:', e) process.exit(1) } finally { clearTimeout(to) } })();