You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
5.6 KiB
201 lines
5.6 KiB
var mqtt = require('mqtt'); |
|
var websocket = require('ws'); |
|
var http = require('http'); |
|
|
|
var port = nextPort(); |
|
var path = '/test'; |
|
var mqttPath = '/mqttws'; |
|
var mqttTopic = 'atopic'; |
|
var ping = 'ping'; |
|
var pong = 'pong'; |
|
|
|
describe("mosca.Server - Mqtt-over-WS attached to existing http server", function() { |
|
var server, mqttServ; |
|
|
|
beforeEach(function(){ |
|
server = http.createServer(); |
|
mqttServ = new mosca.Server({interfaces:[]}); |
|
}); |
|
|
|
afterEach(function(){ |
|
server.close(); |
|
}); |
|
|
|
it("should not occupy 1883 port while attached to http server", function(done) { |
|
mqttServ.attachHttpServer(server); |
|
server.listen(1883, done); |
|
}); |
|
|
|
it("should be able to do mqtt over WebSocket", function(done) { |
|
mqttServ.attachHttpServer(server); |
|
server.listen(port, function(){ |
|
var client = mqtt.connect('ws://localhost:' + port); |
|
client.subscribe(mqttTopic); |
|
client.on("message", function(topic, payload) { |
|
expect(topic).to.equal(mqttTopic); |
|
expect(payload.toString()).to.equal(ping); |
|
done(); |
|
}); |
|
client.publish(mqttTopic, ping); |
|
}); |
|
}); |
|
|
|
it("should be able to do mqtt over WebSocket on specific path", function(done) { |
|
mqttServ.attachHttpServer(server, mqttPath); |
|
server.listen(port, function(){ |
|
var client = mqtt.connect('ws://localhost:' + port + mqttPath); |
|
client.subscribe(mqttTopic); |
|
client.on("message", function(topic, payload) { |
|
expect(topic).to.equal(mqttTopic); |
|
expect(payload.toString()).to.equal(ping); |
|
done(); |
|
}); |
|
client.publish(mqttTopic, ping); |
|
}); |
|
}); |
|
|
|
it("should not be able to do mqtt over WebSocket on different path", function(done) { |
|
mqttServ.attachHttpServer(server, mqttPath); |
|
server.listen(port, function(){ |
|
var client = mqtt.connect('ws://localhost:' + port + '/junk'); |
|
client.subscribe(mqttTopic); |
|
var failed = false;// ensuring done is called once |
|
client.on("message", function(topic, payload) { |
|
failed = true; |
|
done(failed); |
|
}); |
|
client.publish(mqttTopic, ping); |
|
setTimeout(function(){ |
|
if (!failed){ |
|
done(); |
|
} |
|
}, 3000); |
|
}); |
|
}); |
|
|
|
it("should not be able to do mqtt over WebSocket on root path", function(done) { |
|
mqttServ.attachHttpServer(server, mqttPath); |
|
server.listen(port, function(){ |
|
var client = mqtt.connect('ws://localhost:' + port); |
|
client.subscribe(mqttTopic); |
|
var failed = false; |
|
client.on("message", function(topic, payload) { |
|
failed = true; |
|
done(failed); |
|
}); |
|
client.publish(mqttTopic, ping); |
|
setTimeout(function(){ |
|
if (!failed){ |
|
done(); |
|
} |
|
}, 2000); |
|
}); |
|
}); |
|
}); |
|
|
|
describe("mosca.Server - Websocket and Mqtt-over-WS attached to the same http server", function() { |
|
var server, mqttServ, wss; |
|
|
|
beforeEach(function(){ |
|
server = http.createServer(); |
|
mqttServ = new mosca.Server({interfaces:[]}); |
|
|
|
wss = new websocket.Server({ |
|
server: server, |
|
path: path, |
|
perMessageDeflate: false |
|
}); |
|
}); |
|
|
|
afterEach(function(){ |
|
server.close(); |
|
}); |
|
|
|
it("ws client should not connect when mqtt is attached to http server without path", function(done) { |
|
mqttServ.attachHttpServer(server); |
|
server.listen(port, function(){ |
|
var ws = new websocket('ws://localhost:' + port + path, { |
|
perMessageDeflate: false |
|
}); |
|
|
|
ws.on('error', function(e) { |
|
expect(e).to.not.be.undefined; |
|
done(); |
|
}); |
|
}); |
|
}); |
|
|
|
it("ws client should be able to connect when specific path is used", function(done) { |
|
mqttServ.attachHttpServer(server, mqttPath); |
|
wss.on('connection', function(conn){ |
|
conn.on('message', function(msg){ |
|
expect(msg).to.equal(ping); |
|
conn.send(pong); |
|
}); |
|
}); |
|
|
|
server.listen(port, function(){ |
|
var ws = new websocket('ws://localhost:' + port + path, { |
|
perMessageDeflate: false |
|
}); |
|
|
|
ws.on('open', function(){ |
|
ws.send(ping); |
|
}); |
|
|
|
ws.on('message', function(msg){ |
|
expect(msg).to.equal(pong); |
|
done(); |
|
}); |
|
}); |
|
}); |
|
|
|
it("mqtt client should be able to connect as well", function(done) { |
|
mqttServ.attachHttpServer(server, mqttPath); |
|
server.listen(port, function(){ |
|
var client = mqtt.connect('ws://localhost:' + port + mqttPath); |
|
client.subscribe(mqttTopic); |
|
client.on("message", function(topic, payload) { |
|
expect(topic).to.equal(mqttTopic); |
|
expect(payload.toString()).to.equal(ping); |
|
done(); |
|
}); |
|
client.publish(mqttTopic, ping); |
|
}); |
|
}); |
|
|
|
it("both ws and mqtt client should be able to connect at the same time", function(done) { |
|
mqttServ.attachHttpServer(server, mqttPath); |
|
wss.on('connection', function(conn){ |
|
conn.on('message', function(msg){ |
|
expect(msg).to.equal(ping); |
|
conn.send(pong); |
|
}); |
|
}); |
|
|
|
server.listen(port, function(){ |
|
var client = mqtt.connect('ws://localhost:' + port + mqttPath); |
|
var ws = new websocket('ws://localhost:' + port + path, { |
|
perMessageDeflate: false |
|
}); |
|
|
|
client.on('connect', function () { |
|
client.subscribe(mqttTopic); |
|
setTimeout(function(){// wait for ws to connect |
|
ws.send(ping); |
|
}, 2000); |
|
}); |
|
|
|
ws.on('message', function(msg){ |
|
expect(msg).to.equal(pong); |
|
client.publish(mqttTopic, ping); |
|
}); |
|
|
|
client.on("message", function(topic, payload) { |
|
expect(topic).to.equal(mqttTopic); |
|
expect(payload.toString()).to.equal(ping); |
|
done(); |
|
}); |
|
}); |
|
}); |
|
});
|
|
|