UNPKG

iopa-tcp

Version:

API-First Transport Control Protocol (TCP) stack for Internet of Things (IoT), based on Internet of Protocols Alliance (IOPA) specification

168 lines (140 loc) 5.64 kB
/* * Copyright (c) 2016 Internet of Protocols Alliance (IOPA) * * 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. */ const iopa = require('iopa') , tcp = require('../index.js') , util = require('util') , Events = require('events') , BufferList = require('bl') var should = require('should'); describe('#TCPServer()', function () { var server, app; var events = new Events.EventEmitter(); var data = new BufferList(); before(function (done) { app = new iopa.App(); app.use(tcp); app.use(function (channelContext, next) { channelContext["server.RawStream"].on("data", function (chunk) { events.emit("test.Data", chunk); data.append(chunk); }); channelContext["server.RawStream"].on("end", function () { channelContext["test.SessionClose"](); events.emit("test.Finish", data); }); return next().then(function () { return new Promise(function (resolve, reject) { channelContext["test.SessionClose"] = resolve; channelContext["test.SessionError"] = reject; }); }); }); if (!process.env.PORT) process.env.PORT = 1883; server = app.createServer("tcp:"); server.listen({ port: process.env.PORT, address: process.env.IP }) .then(function () { done(); }); }); it('server should listen', function () { console.log("Server is on port " + server.port); }); it('client should connect and server should receive client packets', function (done) { app.dispatch(app.createContext("mqtt://127.0.0.1", {"response": true})) .then(function (client) { console.log("Client is on port " + client["server.LocalPort"]); events.on("test.Finish", function (data) { data.toString().should.equal('Hello World'); done(); }); try { client["server.RawStream"].write("Hello "); client["server.RawStream"].end("World"); } catch (ex) { console.log(ex); return Promise.reject(ex); } }) }); it('server should close', function (done) { server.close().then(done); }); it('client disconnects, server should also close', function (done) { var app = new iopa.App(); app.use(tcp); app.use(function (channelContext, next) { channelContext["server.CancelToken"].onCancelled( function (reason) { reason.should.equal('disconnect'); server2.close().then(function () { done(); channelContext["test.SessionClose"](); }) }); return next().then(function () { return new Promise(function (resolve, reject) { channelContext["test.SessionClose"] = resolve; channelContext["test.SessionError"] = reject; }); }); }); if (!process.env.PORT) process.env.PORT = 1884; var server2 = app.createServer("tcp:") server2.listen( { port: process.env.PORT, address: process.env.IP }) .then(function () { return server2.connect("mqtt://127.0.0.1") }) .then(function (client) { try { client["server.RawStream"].end(""); } catch (ex) { console.log(ex); return Promise.reject(ex); } }) }); it('server disconnects, client should also close', function (done) { //serverPipeline var serverChannelApp = new iopa.App(); serverChannelApp.use(tcp); serverChannelApp.use(function (channelContext, next) { return next().then(function () { return new Promise(function (resolve, reject) { channelContext["mqttPacketServer.SessionClose"] = resolve; channelContext["mqttPacketServer.SessionError"] = reject; }); }); }); var serverPipeline = serverChannelApp.build(); if (!process.env.PORT) process.env.PORT = 1883; var server3 = app.createServer("tcp:"); server3.listen({ port: process.env.PORT, address: process.env.IP }) .then(function () { return app.dispatch(app.createContext("mqtt://127.0.0.1", {"response": true})) }) .then(function (client) { client["server.CancelToken"].onCancelled(function (reason) { reason.should.equal("disconnect"); done(); }); server3.close(); return null; }); }); });