obniz
Version:
obniz sdk for javascript
405 lines (360 loc) • 10.2 kB
JavaScript
'no_html_test_build';
let chai = require('chai');
let expect = chai.expect;
let sinon = require('sinon');
let path = require('path');
let testUtil = require('../testUtil.js');
chai.use(require('chai-like'));
chai.use(testUtil.obnizAssert);
const getPort = require('get-port');
let waitMs = 50;
describe('obniz.index', function() {
beforeEach(function() {});
afterEach(function() {});
it('instance', function() {
sinon.stub(console, 'error');
sinon.stub(console, 'log');
let obniz = testUtil.createObniz(3000, 'OBNIZ_ID_HERE');
expect(obniz).to.be.obniz;
sinon.assert.calledOnce(console.error);
sinon.assert.calledWith(console.error, 'invalid obniz id');
console.error.restore(); // Unwraps the spy
console.log.restore(); // Unwraps the spy
});
it('connect', function() {
let port = undefined;
let server = undefined;
let obniz = undefined;
return getPort()
.then(function(p) {
port = p;
server = testUtil.createServer(port);
let result = new Promise(function(resolve) {
server.on('connection', function() {
resolve();
});
});
obniz = testUtil.createObniz(port, '11111111');
return result;
})
.then(function() {
return wait(waitMs);
})
.then(function() {
expect(obniz).to.be.obniz;
expect(server.clients.size, 'server connection').to.equal(1);
obniz.close();
server.close();
});
});
it('soft_redirect', function() {
let port, server, port2, server2, obniz;
return getPort()
.then(function(p) {
port = p;
server = testUtil.createServer(port);
return getPort();
})
.then(function(p2) {
port2 = p2;
server2 = testUtil.createServer(port2);
let result = new Promise(function(resolve) {
server.on('connection', function() {
resolve();
});
});
obniz = testUtil.createObniz(port, '11111111');
expect(obniz).to.be.obniz;
return result;
})
.then(function() {
return wait(waitMs);
})
.then(function() {
expect(server.clients.size, 'before server not connected').to.equal(1);
let result = new Promise(function(resolve) {
server2.on('connection', function() {
resolve();
});
});
let val = [{ ws: { redirect: 'ws://localhost:' + port2 } }];
if (testUtil.isNode()) {
let validator = require('../obnizJsonValidator');
let results = validator.responseValidate(val, 'json');
require('chai').expect(results.valid, results.errors).to.be.true;
}
server.clients
.values()
.next()
.value.send(JSON.stringify(val));
return result;
})
.then(function() {
return wait(waitMs);
})
.then(function() {
expect(server.clients.size, 'before server remain connection').to.equal(
0
);
expect(server2.clients.size, 'after server not connected').to.equal(1);
obniz.close();
server.close();
server2.close();
});
});
if (testUtil.needBrowserTest()) {
it('browser', function() {
this.timeout(10000);
let port1, port2, port3, server1, server2, server3;
return getPort()
.then(function(p) {
port1 = p;
server1 = testUtil.createServer(port1);
return getPort();
})
.then(function(p) {
port2 = p;
server2 = testUtil.createServer(port2);
return getPort();
})
.then(function(p) {
port3 = p;
server3 = testUtil.createServer(port3);
server2.on('connection', function() {
setTimeout(function() {
let val = [{ ws: { redirect: 'ws://localhost:' + port3 } }];
server2.clients
.values()
.next()
.value.send(JSON.stringify(val));
}, 10);
});
return getPort();
})
.then(function() {
return testUtil.ejs(path.resolve(__dirname, 'index.ejs'), {
port1,
port2,
port3,
});
})
.then(function(val) {
expect(val.failures).to.equal(0);
return wait(waitMs);
})
.then(function() {
server1.close();
server2.close();
server3.close();
});
});
}
it('compress', function() {
return new Promise(resolve => {
testUtil.setupObnizPromise(this, resolve, { binary: true });
})
.then(() => {
expect(this.obniz).to.be.obniz;
expect(this.obniz).to.be.finished; // input queue
this.obniz.io1.output(true);
return new Promise(resolve => {
setTimeout(resolve, 5);
});
})
.then(() => {
expect(this.obniz).sendBinary(new Uint8Array([2, 0, 2, 1, 1]));
expect(this.obniz).to.be.finished;
return new Promise(resolve => {
testUtil.releaseObnizePromise(this, resolve);
});
})
.then(function() {
return Promise.resolve();
});
});
it('onconnect', function() {
let called = false;
return new Promise(resolve => {
testUtil.setupNotConnectedYetObnizPromise(this, resolve);
})
.then(() => {
expect(this.obniz).to.be.obniz;
expect(this.obniz).to.be.finished; // input queue
this.obniz.onconnect = function() {
called = true;
};
testUtil.receiveJson(this.obniz, [
{
ws: {
ready: true,
obniz: {
firmware: '1.0.3',
},
},
},
]);
return new Promise(resolve => {
setTimeout(resolve, 500);
});
})
.then(() => {
return new Promise(resolve => {
testUtil.releaseObnizePromise(this, resolve);
});
})
.then(() => {
expect(called).to.be.true;
});
});
it('repeat', function() {
let called = false;
return new Promise(resolve => {
testUtil.setupNotConnectedYetObnizPromise(this, resolve);
})
.then(() => {
expect(this.obniz).to.be.obniz;
expect(this.obniz).to.be.finished; // input queue
this.obniz.repeat(function() {
called = true;
});
testUtil.receiveJson(this.obniz, [
{
ws: {
ready: true,
obniz: {
firmware: '1.0.3',
},
},
},
]);
return new Promise(resolve => {
setTimeout(resolve, 500);
});
})
.then(() => {
return new Promise(resolve => {
this.obniz.looper = null;
testUtil.releaseObnizePromise(this, resolve);
});
})
.then(() => {
expect(called).to.be.true;
});
});
it('connect_repeat', function() {
let results = true;
return new Promise(resolve => {
testUtil.setupNotConnectedYetObnizPromise(this, resolve);
})
.then(() => {
expect(this.obniz).to.be.obniz;
expect(this.obniz).to.be.finished; // input queue
let called = false;
this.obniz.onconnect = function() {
results = results && called === false;
called = true;
};
this.obniz.repeat(function() {
results = results && called === true;
called = true;
});
testUtil.receiveJson(this.obniz, [
{
ws: {
ready: true,
obniz: {
firmware: '1.0.3',
},
},
},
]);
return new Promise(resolve => {
setTimeout(resolve, 500);
});
})
.then(() => {
return new Promise(resolve => {
this.obniz.looper = null;
testUtil.releaseObnizePromise(this, resolve);
});
})
.then(() => {
expect(results).to.be.true;
});
});
it('connectWait', function() {
let called = false;
return new Promise(resolve => {
testUtil.setupNotConnectedYetObnizPromise(this, resolve);
})
.then(() => {
expect(this.obniz).to.be.obniz;
expect(this.obniz).to.be.finished; // input queue
this.obniz.connectWait().then(connected => {
called = connected === true;
});
testUtil.receiveJson(this.obniz, [
{
ws: {
ready: true,
obniz: {
firmware: '1.0.3',
},
},
},
]);
return new Promise(resolve => {
setTimeout(resolve, 500);
});
})
.then(() => {
return new Promise(resolve => {
testUtil.releaseObnizePromise(this, resolve);
});
})
.then(() => {
expect(called).to.be.true;
});
});
it('connectWaitTimeout', function() {
let called = false;
return new Promise(resolve => {
testUtil.setupNotConnectedYetObnizPromise(this, resolve);
})
.then(() => {
expect(this.obniz).to.be.obniz;
expect(this.obniz).to.be.finished; // input queue
this.obniz.connectWait({ timeout: 1 }).then(connected => {
called = connected === false;
});
return new Promise(resolve => {
setTimeout(() => {
testUtil.receiveJson(this.obniz, [
{
ws: {
ready: true,
obniz: {
firmware: '1.0.3',
},
},
},
]);
resolve();
}, 1500);
});
})
.then(() => {
return new Promise(resolve => {
testUtil.releaseObnizePromise(this, resolve);
});
})
.then(() => {
expect(called).to.be.true;
});
});
function wait(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
}
});