diff --git a/config.json b/config.json index 95b1843..a94963f 100644 --- a/config.json +++ b/config.json @@ -4,6 +4,7 @@ "ip": "127.0.0.1", "port": "8080", "restUrl": "http://localhost:8080/dh/rest", + "authRestUrl": "http://localhost:8090/dh/rest", "backendRestUrl": "http://localhost:8090/dh/rest", "jwt": "admin_token" }, diff --git a/integration-tests/common/utils.js b/integration-tests/common/utils.js index 2cd564c..6b45721 100644 --- a/integration-tests/common/utils.js +++ b/integration-tests/common/utils.js @@ -27,6 +27,8 @@ var utils = { url: getParam("restUrl") , + authUrl: getParam("authRestUrl") , + admin: { login: 'dhadmin', password: 'dhadmin_#911', @@ -36,11 +38,11 @@ var utils = { loggingOff: false, jwt: { - admin: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNTU5MzQ3MjAwMDAwLCJ0b2tlblR5cGUiOiJBQ0NFU1MifX0.0WFWniapCEMcUriveLfvRG3wNQvC4IcEMcYYacrFXlU', - admin_refresh: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNTU5MzQ3MjAwMDAwLCJ0b2tlblR5cGUiOiJSRUZSRVNIIn19.kCFPLoGGoCyaHqS3Vv5tjK_d2xQcPKTsM2z4PjPP64Q', - admin_refresh_exp: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNDY0NzkzMjkwNTY0LCJ0b2tlblR5cGUiOiJSRUZSRVNIIn19.x_qb6Dy5zKmaD8IZ2E9fXCM894gcZ-Qj2L8CcCxruD8', - admin_refresh_invalid: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNTE0NzY0ODAwMDAwLCJ0b2tlblR5cGUiOiJBQ0NFU1MifX0.OhEltY7vNKZMo-JLPb9MxB3LUwbXrP_Arhajp_pYSc0', - admin_refresh_invalid_signature: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNTU5MzQ3MjAwMDAwLCJ0b2tlblR5cGUiOiJSRUZSRVNIIn19.kCFPLoGGoCyaHqS3Vv5tjK_d2xQcPKTsM2z4PhKP64Q', + admin: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNTU5MzQ3MjAwMDAwLCJ0IjoxfX0.pBjhmAQ31t5Y1AogEau8m8nCDjRCCndBLtQ3f6R-IBw', + admin_refresh: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNTU5MzQ3MjAwMDAwLCJ0IjowfX0.ocTz-0FY_I0QY3TqIqyCBKBNX4xN-N7IdHWqUY865Hw', + admin_refresh_exp: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNDY0NzkzMjkwNTY0LCJ0IjowfX0.njLWzNksQ29hwT0hvxZVxQY0MQA5JHrZHPv6x6YEaqI', + admin_refresh_invalid: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNTE0NzY0ODAwMDAwLCJ0IjoxfX0.dkA2H1MGmJHdAT382tqt-xhcmwwlTimGwnabS5HdfJc', + admin_refresh_invalid_signature: 'eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNTU5MzQ3MjAwMDAwLCJ0IjowfX0.lo2T-wbXe1J9DvVyxJtFkNlo76uH_kSVwVY-FxLZRkk', createMany: function (params, done) { var paramsCopy = params.slice(0); function createJWT(callback) { @@ -102,124 +104,27 @@ var utils = { var expDate = new Date(); expDate.setFullYear(expDate.getFullYear() + 10); - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin, data: {userId: userId, actions: actions, networkIds: networkIds, deviceIds: deviceIds, expiration: expDate }}, callback); + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin, data: {userId: userId, actions: actions, networkIds: networkIds, deviceIds: deviceIds, expiration: expDate }}, callback); } }, - - accessKey: { - - admin: "1jwKgLYi/CdfBTI9KByfYxwyQ6HUIEfnGSgakdpFjgk=", - - createMany: function (params, done) { - var paramsCopy = params.slice(0); - - function createAccessKey(callback) { - var p = paramsCopy.shift(); - setTimeout(function () { - utils.accessKey.create(p.user, p.label, p.actions, p.deviceIds, p.networkIds, - function (err, result) { - if (err) { - callback(err); - } - - callback(null, result.key); - }) - }, 10); - } - - var callbacks = []; - for (var i = 0; i < params.length; i++) { - callbacks.push( - createAccessKey - ); - } - - async.series(callbacks, done); - }, - - create: function (user, label, actions, deviceIds, networkIds, callback) { - - label || (label = utils.getName('access-key')); - - if (actions && !Array.isArray(actions)) { - actions = [actions]; - } - - if (deviceIds && !Array.isArray(deviceIds)) { - deviceIds = [deviceIds]; - } - - if (networkIds && !Array.isArray(networkIds)) { - networkIds = [networkIds]; - } - - var expDate = new Date(); - expDate.setFullYear(expDate.getFullYear() + 10); - - var params = this.getParamsObj(label, user, expDate, void 0, networkIds, actions, deviceIds, void 0); - utils.create(path.CURRENT_ACCESS_KEY, params, callback); - }, - - getParams: function (label, user, expDate, domains, networkIds, actions, deviceIds, subnets) { - - expDate || (expDate = new Date()); - expDate.setFullYear(expDate.getFullYear() + 10); - - return this.getParamsObj(label, user, expDate, - domains || ['www.example.com'], - networkIds || [1, 2], - actions || ['GetNetwork', 'GetDevice'], - deviceIds || ['11111111-2222-3333-4444-555555555555'], - subnets || ['127.0.0.1']); - }, - - getParamsObj: function (label, user, expDate, domains, networkIds, actions, deviceIds, subnets) { - - var permission = {}; - - if (domains) { - permission.domains = domains; - } - - if (networkIds) { - permission.networkIds = networkIds; - } - - if (actions) { - permission.actions = actions; - } - - if (deviceIds) { - permission.deviceIds = deviceIds; - } - - if (subnets) { - permission.subnets = subnets; - } - - var params = { - data: { - label: label, - permissions: [permission] - } - }; - - if (user) { - params.user = user; - } - - if (expDate) { - params.data.expirationDate = expDate.toISOString(); - } - - return params; - }, - - expectAccessKey: function (actual, expected) { - assert.strictEqual(+new Date(actual.expirationDate), +new Date(expected.expirationDate)); - assert.strictEqual(actual.label, expected.label); - assert.deepEqual(actual.permissions, expected.permissions); - } + + action: { + Any: 0, + None: 1, + GetNetwork: 2, + GetDevice: 3, + GetDeviceNotification: 4, + GetDeviceCommand: 5, + RegisterDevice: 6, + CreateDeviceCommand: 7, + UpdateDeviceCommand: 8, + CreateDeviceNotification: 9, + GetCurrentUser: 10, + UpdateCurrentUser: 11, + ManageUser: 12, + ManageConfiguration: 13, + ManageNetwork: 14, + ManageToken: 15 }, device: { @@ -299,6 +204,21 @@ var utils = { }); }, + createAuth: function ($path, params, cb) { + new Http(this.authUrl, $path, this.loggingOff) + .post(params, function (err, result, xhr) { + if (err) { + err.httpStatus = xhr.status; + return cb(err); + } + + var resource = path.get($path, result.id); + assert.strictEqual(xhr.status, status.EXPECTED_CREATED); + + cb(null, result, resource); + }); + }, + get: function ($path, params, cb, responseStatus) { if(!responseStatus){responseStatus = status.EXPECTED_READ} new Http(this.url, path.get($path, params.id, params.query), this.loggingOff) @@ -314,6 +234,21 @@ var utils = { }); }, + getAuth: function ($path, params, cb, responseStatus) { + if(!responseStatus){responseStatus = status.EXPECTED_READ} + new Http(getParam("authRestUrl"), path.get($path, params.id, params.query), this.loggingOff) + .get(params, function (err, result, xhr) { + if (err) { + err.httpStatus = xhr.status; + return cb(err); + } + + assert.strictEqual(xhr.status, responseStatus); + + cb(null, result); + }); + }, + getBackend: function ($path, params, cb, responseStatus) { if(!responseStatus){responseStatus = status.EXPECTED_READ} new Http(getParam("backendRestUrl"), path.get($path, params.id, params.query), this.loggingOff) diff --git a/integration-tests/common/websocket.js b/integration-tests/common/websocket.js index 08a3a26..8c45128 100644 --- a/integration-tests/common/websocket.js +++ b/integration-tests/common/websocket.js @@ -98,7 +98,7 @@ Websocket.prototype = { self.context.handled = true; done(new Error('send() timeout: hasn\'t got message \'' + self.context.params.action + '\'')); - }, 20000); + }, 30000); }, waitFor: function (action, timeout, callback) { diff --git a/integration-tests/rest-api-info.js b/integration-tests/rest-api-info.js index 76444ee..32aeef2 100644 --- a/integration-tests/rest-api-info.js +++ b/integration-tests/rest-api-info.js @@ -3,35 +3,41 @@ var utils = require('./common/utils'); var path = require('./common/path'); describe('REST API Info', function () { - - it('should return api info', function (done) { - utils.get(path.INFO, {}, function (err, result) { - if (err) { - done(err); - } - - assert.strictEqual(utils.core.hasStringValue(result.apiVersion), true); - assert.strictEqual(utils.core.hasStringValue(result.serverTimestamp), true); - assert.strictEqual(utils.core.hasStringValue(result.webSocketServerUrl), true); - - done(); - }) - }); - - it('should return cache info', function (done) { - utils.get(path.INFO_CACHE, {}, function (err, result) { - if (err) { - done(err); - } - - assert.strictEqual(utils.core.hasStringValue(result.serverTimestamp), true); - assert.strictEqual(utils.core.hasStringValue(result.cacheStats), true); - - done(); - }) + this.timeout(90000); + + describe('Should Return Info', function () { + + it('should return api info', function (done) { + utils.get(path.INFO, {}, function (err, result) { + if (err) { + done(err); + } + + assert.strictEqual(utils.core.hasStringValue(result.apiVersion), true); + assert.strictEqual(utils.core.hasStringValue(result.serverTimestamp), true); + assert.strictEqual(utils.core.hasStringValue(result.webSocketServerUrl), true); + + done(); + }); + }); + + it('should return cache info', function (done) { + utils.get(path.INFO_CACHE, {}, function (err, result) { + if (err) { + done(err); + } + + assert.strictEqual(utils.core.hasStringValue(result.serverTimestamp), true); + assert.strictEqual(utils.core.hasStringValue(result.cacheStats), true); + + done(); + }); + }); + }); after(function (done) { utils.clearDataJWT(done); }); + }); \ No newline at end of file diff --git a/integration-tests/rest-configuration.js b/integration-tests/rest-configuration.js index 3dbffe1..13205e9 100644 --- a/integration-tests/rest-configuration.js +++ b/integration-tests/rest-configuration.js @@ -151,5 +151,8 @@ describe('REST API Configuration', function () { }); }); + after(function (done) { + utils.clearDataJWT(done); + }); }); diff --git a/integration-tests/rest-device-command.js b/integration-tests/rest-device-command.js index 5af79fa..50da7b0 100644 --- a/integration-tests/rest-device-command.js +++ b/integration-tests/rest-device-command.js @@ -100,11 +100,9 @@ describe('REST API Device Command', function () { var params = helper.getParamsObj(utils.getName('cmd-2'), jwt); utils.create(path.current, params, function (err) { - setTimeout(function () { - callback(err); - }, 2000); - }) - }) + callback(err); + }); + }); } async.series([ @@ -283,6 +281,7 @@ describe('REST API Device Command', function () { assert.strictEqual(!(!err), false, 'No error'); assert.strictEqual(utils.core.isArrayOfLength(result, 2), true, 'Is array of 2 objects'); assert.strictEqual(result.some(hasCommand), true); + assert.strictEqual(result[0].networkId, networkId, 'Result has networkId'); done(); }); @@ -304,14 +303,12 @@ describe('REST API Device Command', function () { }); setTimeout(function () { - var params = helper.getParamsObj(COMMAND_2, jwt); - utils.create(path.current, params, function () {}); + var params1 = helper.getParamsObj(COMMAND, jwt); + var params2 = helper.getParamsObj(COMMAND_2, jwt); + utils.create(path.current, params2, function () {}); + utils.create(path.current, params1, function () {}); }, 100); - setTimeout(function () { - var params = helper.getParamsObj(COMMAND, jwt); - utils.create(path.current, params, function () {}); - }, 100); }); it('should return array with commands when poll with waitTimeout=3', function (done) { @@ -328,8 +325,8 @@ describe('REST API Device Command', function () { setTimeout(function () { var params = helper.getParamsObj(COMMAND, jwt); utils.create(path.current, params, function () {}); - }, 1000); - }) + }, 100); + }); it('should return array with commands when poll updated with waitTimeout=3', function (done) { var params = { @@ -352,7 +349,7 @@ describe('REST API Device Command', function () { utils.update(path.current, params, function () {}); }); }, 100); - }) + }); it('should return empty array with commands when poll updated with waitTimeout=3', function (done) { var params = { @@ -406,7 +403,6 @@ describe('REST API Device Command', function () { utils.create(path.current, params, function () {}); } }, 100) - }) }); @@ -447,14 +443,12 @@ describe('REST API Device Command', function () { }); setTimeout(function () { - var params = helper.getParamsObj(COMMAND_2, jwt); - utils.create(path.current, params, function () {}); + var params1 = helper.getParamsObj(COMMAND, jwt); + var params2 = helper.getParamsObj(COMMAND_2, jwt); + utils.create(path.current, params2, function () {}); + utils.create(path.current, params1, function () {}); }, 100); - setTimeout(function () { - var params = helper.getParamsObj(COMMAND, jwt); - utils.create(path.current, params, function () {}); - }, 100); }); it('should not return command with the same timestamp', function (done) { @@ -492,12 +486,14 @@ describe('REST API Device Command', function () { async.series([pollWithoutTimestamp, updateCommand], pollWithTimestamp); - var params = helper.getParamsObj(COMMAND, jwt); - setTimeout(function(){utils.create(path.current, params, function (err, result) { - assert.strictEqual(!(!err), false, 'No error'); - globalId = result.id; - globalTimestamp = result.timestamp - });}, 100); + setTimeout(function() { + var params = helper.getParamsObj(COMMAND, jwt); + utils.create(path.current, params, function (err, result) { + assert.strictEqual(!(!err), false, 'No error'); + globalId = result.id; + globalTimestamp = result.timestamp + }); + }, 100); }); it('should return an error when polling for the non existent device with client jwt', function (done) { @@ -584,13 +580,9 @@ describe('REST API Device Command', function () { setTimeout(function () { var params = helper.getParamsObj(COMMAND_2, utils.jwt.admin); utils.create(path.COMMAND.get(OTHER_DEVICE_ID), params, function () {}); - }, 200); - - setTimeout(function () { - var params = helper.getParamsObj(COMMAND_2, utils.jwt.admin); utils.create(path.current, params, function () {}); - }, 200); - }) + }, 100); + }); }); describe('#Poll Many No Wait', function () { @@ -646,8 +638,7 @@ describe('REST API Device Command', function () { var params = {jwt: jwt}; params.id = commandId; params.data = commandUpdate; - utils.update(path.current, params, function () {}); - setTimeout(function () { + utils.update(path.current, params, function () { var params = {jwt: jwt}; var $path = path.combine(path.current, commandId, path.POLL); params.query = path.query('waitTimeout', 0); @@ -657,7 +648,7 @@ describe('REST API Device Command', function () { assert.deepEqual(result.result, commandUpdate.result); done(); }); - },10); + }); }); }); diff --git a/integration-tests/rest-device-notification.js b/integration-tests/rest-device-notification.js index b09a8f1..48feab3 100644 --- a/integration-tests/rest-device-notification.js +++ b/integration-tests/rest-device-notification.js @@ -86,13 +86,13 @@ describe('REST API Device Notification', function () { var params = [ { user: user, - actions: ['GetDeviceNotification','CreateDeviceNotification'], + actions: ['GetDeviceNotification', 'CreateDeviceNotification'], networkIds: networkId, deviceIds: DEVICE_ID }, { user: nonNetworkUser, - actions: ['GetDeviceNotification','CreateDeviceNotification'], + actions: ['GetDeviceNotification', 'CreateDeviceNotification'], networkIds: void 0, deviceIds: DEVICE_ID } @@ -169,7 +169,7 @@ describe('REST API Device Notification', function () { done(); }) - }, 200); + }, 100); }); it('should get notifications by start date', function (done) { @@ -186,7 +186,7 @@ describe('REST API Device Notification', function () { done(); }) - }, 400); + }, 100); }); it('should return empty notifications list when start date is out of range', function (done) { @@ -312,6 +312,7 @@ describe('REST API Device Notification', function () { assert.strictEqual(!(!err), false, 'No error'); assert.strictEqual(utils.core.isArrayNonEmpty(result), true, 'Is array of 2 objects'); assert.strictEqual(result.some(hasNotification), true); + assert.strictEqual(result[0].networkId, networkId, 'Result has networkId'); done(); }); @@ -333,14 +334,12 @@ describe('REST API Device Notification', function () { }); setTimeout(function () { - var params = helper.getParamsObj(NOTIFICATION_2, jwt1); - utils.create(path.current, params, function () {}); + var params1 = helper.getParamsObj(NOTIFICATION, jwt1); + var params2 = helper.getParamsObj(NOTIFICATION_2, jwt1); + utils.create(path.current, params2, function () {}); + utils.create(path.current, params1, function () {}); }, 100); - setTimeout(function () { - var params = helper.getParamsObj(NOTIFICATION, jwt1); - utils.create(path.current, params, function () {}); - }, 100); }); it('should return array with notifications when poll with waitTimeout=3', function (done) { @@ -398,13 +397,10 @@ describe('REST API Device Notification', function () { }); setTimeout(function () { - var params = helper.getParamsObj(NOTIFICATION_2, jwt1); - utils.create(path.current, params, function () {}); - }, 100); - - setTimeout(function () { - var params = helper.getParamsObj(NOTIFICATION, jwt1); - utils.create(path.current, params, function () {}); + var params1 = helper.getParamsObj(NOTIFICATION, jwt1); + var params2 = helper.getParamsObj(NOTIFICATION_2, jwt1); + utils.create(path.current, params2, function () {}); + utils.create(path.current, params1, function () {}); }, 100); }); @@ -492,13 +488,9 @@ describe('REST API Device Notification', function () { setTimeout(function () { var params = helper.getParamsObj(NOTIFICATION_2, utils.jwt.admin); utils.create(path.NOTIFICATION.get(OTHER_DEVICE_ID), params, function () {}); - }, 100); - - setTimeout(function () { - var params = helper.getParamsObj(NOTIFICATION_2, utils.jwt.admin); utils.create(path.current, params, function () {}); }, 100); - }) + }); }); describe('#Poll Many No Wait', function () { diff --git a/integration-tests/rest-device.js b/integration-tests/rest-device.js index afaad1a..fa373ca 100644 --- a/integration-tests/rest-device.js +++ b/integration-tests/rest-device.js @@ -505,7 +505,7 @@ describe('REST API Device Unit', function () { before(function (done) { function createJWT(callback) { - utils.jwt.create(user.id, '*', networkId, NEW_DEVICE_ID, function (err, result) { + utils.jwt.create(user.id, ['*'], networkId, NEW_DEVICE_ID, function (err, result) { if (err) { return callback(err); } diff --git a/integration-tests/rest-jwt.js b/integration-tests/rest-jwt.js index c7a8b34..6965a12 100644 --- a/integration-tests/rest-jwt.js +++ b/integration-tests/rest-jwt.js @@ -61,7 +61,7 @@ describe('REST API JSON Web Tokens', function () { describe('#Login', function() { it('should create token using basic authentication with valid credentials', function (done) { - utils.create(path.JWT, {data: { + utils.createAuth(path.JWT, {data: { login: utils.admin.login, password: utils.admin.password } @@ -78,7 +78,7 @@ describe('REST API JSON Web Tokens', function () { }); it('should create a token with admin permissions for an admin user', function (done) { - utils.create(path.JWT, {data: { + utils.createAuth(path.JWT, {data: { login: adminUser.login, password: adminUser.password } @@ -90,16 +90,16 @@ describe('REST API JSON Web Tokens', function () { assert(result.accessToken != null); var jwtTokenVO = utils.parseJwt(result.accessToken); - jwtTokenVO.payload.actions.should.containEql('*'); - jwtTokenVO.payload.networkIds.should.containEql('*'); - jwtTokenVO.payload.deviceIds.should.containEql('*'); + jwtTokenVO.payload.a.should.containEql(0); + jwtTokenVO.payload.n.should.containEql('*'); + jwtTokenVO.payload.d.should.containEql('*'); done(); }); }); it('should create a token with client permissions for a client user', function (done) { - utils.create(path.JWT, {data: { + utils.createAuth(path.JWT, {data: { login: user.login, password: user.password } @@ -111,8 +111,8 @@ describe('REST API JSON Web Tokens', function () { assert(result.accessToken != null); var jwtTokenVO = utils.parseJwt(result.accessToken); - if (jwtTokenVO.payload.networkIds.length > 0) { - jwtTokenVO.payload.deviceIds.should.containEql('*'); + if (jwtTokenVO.payload.n.length > 0) { + jwtTokenVO.payload.d.should.containEql('*'); } done(); @@ -120,7 +120,7 @@ describe('REST API JSON Web Tokens', function () { }); it('should return error when creating token using basic authentication with invalid credentials', function (done) { - utils.create(path.JWT, {data: { + utils.createAuth(path.JWT, {data: { login: utils.admin.login, password: 1111 } @@ -158,7 +158,7 @@ describe('REST API JSON Web Tokens', function () { }); it('should create token with all permissions, networks and devices', function (done) { - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin, + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin, data: { userId: 1, actions: ['*'], @@ -178,7 +178,7 @@ describe('REST API JSON Web Tokens', function () { }); it('should create token with custom expiration date', function (done) { - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin, + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin, data: { userId: 1, actions: ['*'], @@ -191,9 +191,9 @@ describe('REST API JSON Web Tokens', function () { return done(err); } - assert.strictEqual(result.accessToken.includes('eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNTE0NzY0ODAwMDAwLCJ0b2tlblR5cGUiOiJBQ0NFU1MifX0'), + assert.strictEqual(result.accessToken.includes('eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNTE0NzY0ODAwMDAwLCJ0IjoxfX0.dkA2H1MGmJHdAT382tqt-xhcmwwlTimGwnabS5HdfJc'), true); - assert.strictEqual(result.refreshToken.includes('eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InVzZXJJZCI6MSwiYWN0aW9ucyI6WyIqIl0sIm5ldHdvcmtJZHMiOlsiKiJdLCJkZXZpY2VJZHMiOlsiKiJdLCJleHBpcmF0aW9uIjoxNTE0NzY0ODAwMDAwLCJ0b2tlblR5cGUiOiJSRUZSRVNIIn19'), + assert.strictEqual(result.refreshToken.includes('eyJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjp7InUiOjEsImEiOlswXSwibiI6WyIqIl0sImQiOlsiKiJdLCJlIjoxNTE0NzY0ODAwMDAwLCJ0IjowfX0.XBkLSomCiFtGvaZeNe1e-uMKUQB_PIH87Zz0FmZyyxs'), true); done(); @@ -201,7 +201,7 @@ describe('REST API JSON Web Tokens', function () { }); it('should create access token without provided expiration date', function (done) { - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin, + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin, data: { userId: 1, actions: ['*'], @@ -221,15 +221,15 @@ describe('REST API JSON Web Tokens', function () { var expAccessTime = new Date().getTime() + defaultAccessTokenLifeTime; var expRefreshTime = new Date().getTime() + defaultRefreshTokenLifeTime; - assert(accessTokenVO.payload.expiration - expAccessTime < 1000); - assert(refreshTokenVO.payload.expiration - expRefreshTime < 1000); + assert(accessTokenVO.payload.e - expAccessTime < 1000); + assert(refreshTokenVO.payload.e - expRefreshTime < 1000); done(); }); }); it('should create access token without provided expiration date', function (done) { - utils.create(path.JWT + '/refresh', { + utils.createAuth(path.JWT + '/refresh', { data: { refreshToken: utils.jwt.admin_refresh @@ -243,14 +243,14 @@ describe('REST API JSON Web Tokens', function () { var accessTokenVO = utils.parseJwt(result.accessToken); var expTime = new Date().getTime() + defaultAccessTokenLifeTime; - assert(accessTokenVO.payload.expiration - expTime < 1000); + assert(accessTokenVO.payload.e - expTime < 1000); done(); }); }); it('should return error when creating token with refresh jwt', function (done) { - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin_refresh, + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin_refresh, data: { userId: 1, actions: ['*'], @@ -265,7 +265,7 @@ describe('REST API JSON Web Tokens', function () { }); it('should create token with ManageToken permission', function (done) { - utils.create(path.JWT + '/create', {jwt: jwt1, + utils.createAuth(path.JWT + '/create', {jwt: jwt1, data: { userId: 1, actions: ['*'], @@ -285,14 +285,14 @@ describe('REST API JSON Web Tokens', function () { }); it('should not create token without ManageToken permission', function(done){ - utils.create(path.JWT + '/create', {jwt: jwt2, + utils.createAuth(path.JWT + '/create', {jwt: jwt2, data: { userId: 1, actions: ['*'], networkIds: ['*'], deviceIds: ['*'] } - }, function (err) { + }, function (err, result) { assert.strictEqual(!(!err), true, 'Error object created'); assert.strictEqual(err.error, 'Access is denied'); assert.strictEqual(err.httpStatus, status.FORBIDDEN); @@ -301,23 +301,24 @@ describe('REST API JSON Web Tokens', function () { }); it('should not create token for invalid User', function (done) { - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin, + var invalidUserId = utils.NON_EXISTING_ID; + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin, data: { - userId: 9999999999999, + userId: invalidUserId, actions: ['*'], networkIds: ['*'], deviceIds: ['*'] } }, function (err) { assert.strictEqual(!(!err), true, 'Error object created'); - assert.strictEqual(err.error, 'Invalid request parameters'); + assert.strictEqual(err.error, format('User with id = %d not found', invalidUserId)); assert.strictEqual(err.httpStatus, status.NOT_FOUND); done(); }); }); it('should not create token with error User is not active', function (done) { - utils.create(path.JWT + '/create', {jwt: utils.jwt.admin, + utils.createAuth(path.JWT + '/create', {jwt: utils.jwt.admin, data: { userId: inactiveUser.id, actions: ['*'], @@ -326,8 +327,8 @@ describe('REST API JSON Web Tokens', function () { } }, function (err) { assert.strictEqual(!(!err), true, 'Error object created'); - assert.strictEqual(err.error, 'Invalid request parameters'); - assert.strictEqual(err.httpStatus, status.BAD_REQUEST); + assert.strictEqual(err.error, 'User is locked or disabled'); + assert.strictEqual(err.httpStatus, status.FORBIDDEN); done(); }); @@ -356,33 +357,33 @@ describe('REST API JSON Web Tokens', function () { }); it('should not refresh token with error refresh token is not valid', function (done) { - utils.create(path.JWT + '/refresh', { + utils.createAuth(path.JWT + '/refresh', { data: { refreshToken: utils.jwt.admin_refresh_invalid } }, function (err) { assert.strictEqual(!(!err), true, 'Error object created'); - assert.strictEqual(err.error, 'Bad Request'); + assert.strictEqual(err.error, 'Token is not valid'); assert.strictEqual(err.httpStatus, status.BAD_REQUEST); done(); }); }); it('should not refresh token with error refresh token has expired', function (done) { - utils.create(path.JWT + '/refresh', { + utils.createAuth(path.JWT + '/refresh', { data: { refreshToken: utils.jwt.admin_refresh_exp } }, function (err) { assert.strictEqual(!(!err), true, 'Error object created'); - assert.strictEqual(err.error, 'Unauthorized'); - assert.strictEqual(err.httpStatus, status.NOT_AUTHORIZED); + assert.strictEqual(err.error, 'Token has expired'); + assert.strictEqual(err.httpStatus, status.BAD_REQUEST); done(); }); }); it('should not refresh token with error refresh token has invalid signature', function (done) { - utils.create(path.JWT + '/refresh', { + utils.createAuth(path.JWT + '/refresh', { data: { refreshToken: utils.jwt.admin_refresh_invalid_signature } @@ -394,4 +395,8 @@ describe('REST API JSON Web Tokens', function () { }); }); }); + + after(function (done) { + utils.clearDataJWT(done); + }); }); diff --git a/integration-tests/ws-api-info.js b/integration-tests/ws-api-info.js index d573aa7..940c99e 100644 --- a/integration-tests/ws-api-info.js +++ b/integration-tests/ws-api-info.js @@ -17,6 +17,45 @@ describe('WebSocket API Server Info', function () { }); }); + describe('#server/json-error', function () { + + it('should get malformed json error when request message is not a proper json', function (done) { + + function waitForSocketConnection(client, callback){ + setTimeout( + function () { + if (client.readyState === 1) { + if(callback != null){ + callback(); + } + return; + } else { + waitForSocketConnection(client, callback); + } + }, 5); + } + + var client = new global.WebSocket(url); + var assert = require('assert'); + var malformedJson = 'not a Json'; + + waitForSocketConnection(client, function () { + client.send(malformedJson); + console.log('-> "%s"', malformedJson); + }); + + client.onmessage = function (evt) { + var received_msg = evt.data; + console.log('<- %s', received_msg); + var responseJSON = JSON.parse(received_msg); + assert.equal(responseJSON.code, 400); + assert.equal(responseJSON.error, 'Malformed Json received.'); + done(); + }; + + }); + }); + describe('#server/info', function () { it('should get server info, no auth', function (done) { diff --git a/integration-tests/ws-auth.js b/integration-tests/ws-auth.js index 62eab32..c360641 100644 --- a/integration-tests/ws-auth.js +++ b/integration-tests/ws-auth.js @@ -22,7 +22,7 @@ describe('WebSocket API Authentication', function () { function getWsUrl(callback) { - req.get(path.INFO).params({jwt: utils.jwt.admin}).send(function (err, result) { + utils.get(path.INFO, {jwt: utils.jwt.admin} ,function (err, result) { if (err) { return callback(err); } @@ -30,7 +30,7 @@ describe('WebSocket API Authentication', function () { callback(); }); } - + function createNetwork(callback) { var params = { jwt: utils.jwt.admin, @@ -495,9 +495,9 @@ describe('WebSocket API Authentication', function () { client.params({ action: 'token/refresh', requestId: getRequestId(), - token: utils.jwt.admin_refresh_invalid + refreshToken: utils.jwt.admin_refresh_invalid }) - .expectError(401, 'Invalid credentials') + .expectError(400, 'Token is not valid') .send(callback); } @@ -525,9 +525,9 @@ describe('WebSocket API Authentication', function () { client.params({ action: 'token/refresh', requestId: getRequestId(), - token: utils.jwt.admin_refresh_exp + refreshToken: utils.jwt.admin_refresh_exp }) - .expectError(401, 'Invalid credentials') + .expectError(400, 'Token has expired') .send(callback); } diff --git a/integration-tests/ws-command.js b/integration-tests/ws-command.js index d3178f8..39d70d7 100644 --- a/integration-tests/ws-command.js +++ b/integration-tests/ws-command.js @@ -9,7 +9,7 @@ var Websocket = require('./common/websocket'); var getRequestId = utils.core.getRequestId; describe('WebSocket API Command', function () { - this.timeout(10000); + this.timeout(90000); var url = null; var DEVICE = utils.getName('ws-cmd-device'); @@ -37,7 +37,7 @@ describe('WebSocket API Command', function () { var conn = null; var adminConn = null; var connInvalidToken = null; - var startTestTimestamp = new Date().toISOString(); + var startTestTimestamp = null; before(function (done) { function getWsUrl(callback) { @@ -107,42 +107,6 @@ describe('WebSocket API Command', function () { .send(callback); } - function insertCommand1(callback) { - var params = { - jwt: utils.jwt.admin, - data: { - command: COMMAND1 - } - }; - - utils.create(path.COMMAND.get(deviceId), params, function (err, result) { - if (err) { - return callback(err); - } - - commandId1 = result.id; - callback(); - }); - } - - function insertCommand2(callback) { - var params = { - jwt: utils.jwt.admin, - data: { - command: COMMAND2 - } - }; - - utils.create(path.COMMAND.get(deviceId), params, function (err, result) { - if (err) { - return callback(err); - } - - commandId2 = result.id; - callback(); - }); - } - function createToken(callback) { var args = { actions: [ @@ -227,8 +191,6 @@ describe('WebSocket API Command', function () { createUser, createDevice, createDevice1, - insertCommand1, - insertCommand2, createToken, createInvalidToken, createConn, @@ -320,6 +282,53 @@ describe('WebSocket API Command', function () { }); describe('#command/list', function () { + + var timestamp = null; + + before(function (done) { + function insertCommand1(callback) { + var params = { + jwt: utils.jwt.admin, + data: { + command: COMMAND1 + } + }; + + utils.create(path.COMMAND.get(deviceId), params, function (err, result) { + if (err) { + return callback(err); + } + + commandId1 = result.id; + timestamp = new Date().getTime(); + callback(); + }); + } + + function insertCommand2(callback) { + var params = { + jwt: utils.jwt.admin, + data: { + command: COMMAND2 + } + }; + + utils.create(path.COMMAND.get(deviceId), params, function (err, result) { + if (err) { + return callback(err); + } + + commandId2 = result.id; + callback(); + }); + } + + async.series([ + insertCommand1, + insertCommand2 + ], done); + + }); it('should check if inserted commands are in results', function (done) { var requestId = getRequestId(); @@ -342,6 +351,50 @@ describe('WebSocket API Command', function () { }).send(done); }); + it('should check if start timestamp limits commands in results', function (done) { + var requestId = getRequestId(); + + conn.params({ + action: 'command/list', + requestId: requestId, + start: timestamp, + deviceId: deviceId + }).expect({ + action: 'command/list', + status: 'success', + requestId: requestId + }).assert(function (result) { + var commandIds = result.commands.map(function (command) { + return command.id; + }); + var areCommandsInList = commandIds.indexOf(commandId1) < 0 && commandIds.indexOf(commandId2) >= 0; + + assert.equal(areCommandsInList, true, "Commands with required ids are not in the list"); + }).send(done); + }); + + it('should check if command with correct name is in results', function (done) { + var requestId = getRequestId(); + + conn.params({ + action: 'command/list', + requestId: requestId, + command: COMMAND2, + deviceId: deviceId + }).expect({ + action: 'command/list', + status: 'success', + requestId: requestId + }).assert(function (result) { + var commandIds = result.commands.map(function (command) { + return command.id; + }); + var areCommandsInList = commandIds.indexOf(commandId1) < 0 && commandIds.indexOf(commandId2) >= 0; + + assert.equal(areCommandsInList, true, "Commands with required ids are not in the list"); + }).send(done); + }); + it('should fail when using wrong jwt', function (done) { connInvalidToken.params({ action: 'command/list', @@ -401,6 +454,7 @@ describe('WebSocket API Command', function () { }) .assert(function (result) { assert.equal(result.command.id, commandId1, "Commands with required id is not returned"); + assert.equal(result.command.networkId, networkId, "Commands with networkId is not returned"); }) .send(done); } @@ -493,6 +547,52 @@ describe('WebSocket API Command', function () { }); describe('#command/subscribe', function () { + + startTestTimestamp = new Date().toISOString(); + + before(function (done) { + function insertCommand1(callback) { + var params = { + jwt: utils.jwt.admin, + data: { + command: COMMAND1 + } + }; + + utils.create(path.COMMAND.get(deviceId), params, function (err, result) { + if (err) { + return callback(err); + } + + commandId1 = result.id; + callback(); + }); + } + + function insertCommand2(callback) { + var params = { + jwt: utils.jwt.admin, + data: { + command: COMMAND2 + } + }; + + utils.create(path.COMMAND.get(deviceId), params, function (err, result) { + if (err) { + return callback(err); + } + + commandId2 = result.id; + callback(); + }); + } + + async.series([ + insertCommand1, + insertCommand2 + ], done); + + }); function runTest(client, ts, done) { var requestId = getRequestId(); @@ -625,13 +725,17 @@ describe('WebSocket API Command', function () { if (err) { return done(err); } + + var requestId = getRequestId(); client.params({ action: 'command/unsubscribe', - requestId: getRequestId(), + requestId: requestId, subscriptionId: subscriptionId - }) - .send(done); + }).expect({ + action: 'command/unsubscribe', + requestId: requestId + }).send(done); } } } @@ -695,23 +799,26 @@ describe('WebSocket API Command', function () { command: { command: COMMAND } }); - setTimeout(function () { - req.create(path.COMMAND.get(deviceId)) - .params({ - jwt: utils.jwt.admin, - data: {command: COMMAND} - }) - .send(); - }, 500); + req.create(path.COMMAND.get(deviceId)) + .params({ + jwt: utils.jwt.admin, + data: {command: COMMAND} + }) + .send(); function cleanUp(err) { if (err) { return done(err); } + + var requestId = getRequestId(); conn.params({ action: 'command/unsubscribe', - requestId: getRequestId() + requestId: requestId + }).expect({ + action: 'command/unsubscribe', + requestId: requestId }) .send(done); } @@ -745,24 +852,27 @@ describe('WebSocket API Command', function () { command: { command: COMMAND } }); - setTimeout(function () { - req.create(path.COMMAND.get(deviceId)) - .params({ - jwt: utils.jwt.admin, - data: {command: COMMAND} - }) - .send(); - }, 500); + req.create(path.COMMAND.get(deviceId)) + .params({ + jwt: utils.jwt.admin, + data: {command: COMMAND} + }) + .send(); function cleanUp(err) { if (err) { return done(err); } + + var requestId = getRequestId(); adminConn.params({ action: 'command/unsubscribe', - requestId: getRequestId(), + requestId: requestId, subscriptionId: subscriptionId + }).expect({ + action: 'command/unsubscribe', + requestId: requestId }) .send(done); } @@ -1061,14 +1171,12 @@ describe('WebSocket API Command', function () { subscriptionId: subscriptionId }); - setTimeout(function () { - req.create(path.COMMAND.get(newDeviceId)) - .params({ - jwt: utils.jwt.admin, - data: {command: COMMAND} - }) - .send(); - }, 1000); + req.create(path.COMMAND.get(newDeviceId)) + .params({ + jwt: utils.jwt.admin, + data: {command: COMMAND} + }) + .send(); function cleanUp(err) { @@ -1151,15 +1259,13 @@ describe('WebSocket API Command', function () { subscriptionId: subscriptionId }); - setTimeout(function () { - req.create(path.COMMAND.get(newDeviceId)) - .params({ - jwt: utils.jwt.admin, - data: {command: COMMAND} - }) - .send(); - }, 1000); - + req.create(path.COMMAND.get(newDeviceId)) + .params({ + jwt: utils.jwt.admin, + data: {command: COMMAND} + }) + .send(); + function cleanUp(err) { if (err) { return done(err); @@ -1263,6 +1369,8 @@ describe('WebSocket API Command', function () { return done(err); } + var requestId = getRequestId(); + conn.params({ action: 'device/delete', requestId: requestId, @@ -1273,14 +1381,17 @@ describe('WebSocket API Command', function () { requestId: requestId, status: 'success' }) - .send(); - - conn.params({ - action: 'command/unsubscribe', - requestId: getRequestId(), - subscriptionId: subscriptionId - }) - .send(done); + .send(function () { + var requestId = getRequestId(); + conn.params({ + action: 'command/unsubscribe', + requestId: requestId, + subscriptionId: subscriptionId + }).expect({ + action: 'command/unsubscribe', + requestId: requestId + }).send(done); + }); } } }); @@ -1335,14 +1446,12 @@ describe('WebSocket API Command', function () { cleanUp(); }); - setTimeout(function() { - req.create(path.COMMAND.get(newDeviceId)) - .params({ - jwt: utils.jwt.admin, - data: {command: COMMAND} - }) - }, 1000); - + req.create(path.COMMAND.get(newDeviceId)) + .params({ + jwt: utils.jwt.admin, + data: {command: COMMAND} + }) + function cleanUp(err) { if (err) { return done(err); @@ -1359,12 +1468,15 @@ describe('WebSocket API Command', function () { status: 'success' }) .send(function () { + var requestId = getRequestId(); conn.params({ action: 'command/unsubscribe', - requestId: getRequestId(), + requestId: requestId, subscriptionId: subscriptionId - }) - .send(done); + }).expect({ + action: 'command/unsubscribe', + requestId: requestId + }).send(done); }); @@ -1430,13 +1542,11 @@ describe('WebSocket API Command', function () { done(); }); - setTimeout(function() { - req.create(path.COMMAND.get(deviceId)) - .params({ - jwt: utils.jwt.admin, - data: {command: COMMAND} - }).send(); - }, 100); + req.create(path.COMMAND.get(deviceId)) + .params({ + jwt: utils.jwt.admin, + data: {command: COMMAND} + }).send(); } } @@ -1594,9 +1704,7 @@ describe('WebSocket API Command', function () { } it('should notify when command was inserted, jwt auth', function (done) { - setTimeout(function () { - runTest(conn, done); - }, 500); + runTest(conn, done); }); function runTestNoSubscr(client, done) { @@ -1628,9 +1736,7 @@ describe('WebSocket API Command', function () { }); it('should notify when command was inserted, device auth', function (done) { - setTimeout(function () { - runTest(conn, done); - }, 500); + runTest(conn, done); }); it('should not notify when command was inserted without prior subscription, device auth', function (done) { @@ -1679,7 +1785,7 @@ describe('WebSocket API Command', function () { }) .expect({ action: 'command/update', - status: "success" + status: 'success' }) .send(done); } diff --git a/integration-tests/ws-notification.js b/integration-tests/ws-notification.js index ac806dc..a86257f 100644 --- a/integration-tests/ws-notification.js +++ b/integration-tests/ws-notification.js @@ -33,6 +33,7 @@ describe('WebSocket API Notification', function () { var networkId1 = null; var notificationId1 = null; var notificationId2 = null; + var timestamp = null; var conn = null; var adminConn = null; @@ -124,6 +125,7 @@ describe('WebSocket API Notification', function () { } notificationId1 = result.id; + timestamp = new Date().getTime(); callback(); }); } @@ -295,6 +297,7 @@ describe('WebSocket API Notification', function () { req.get(path.NOTIFICATION.get(deviceId)) .params({jwt: token, id: notificationId}) .expect({id: notificationId}) + .expect({networkId: networkId}) .expect(notification) .send(done); } @@ -361,9 +364,9 @@ describe('WebSocket API Notification', function () { describe('#notification/list', function () { - function runTest(client, done) { + it('should check if inserted notifications are in results', function (done) { var requestId = getRequestId(); - client.params({ + conn.params({ action: 'notification/list', requestId: requestId, deviceId: deviceId @@ -377,16 +380,62 @@ describe('WebSocket API Notification', function () { var notificationIds = result.notifications.map(function (notification) { return notification.id; }); - var areNotificationsInList = notificationIds.indexOf(notificationId1) >= 0 + var areNotificationsInList = notificationIds.indexOf(notificationId1) >= 0 && notificationIds.indexOf(notificationId2) >= 0; assert.equal(areNotificationsInList, true, "Commands with required ids are not in the list"); }) .send(done); - } + }); - it('should check if inserted notifications are in results', function (done) { - runTest(conn, done); + it('should check if start timestamp limits notifications in results', function (done) { + var requestId = getRequestId(); + conn.params({ + action: 'notification/list', + requestId: requestId, + start: timestamp, + deviceId: deviceId + }) + .expect({ + action: 'notification/list', + status: 'success', + requestId: requestId + }) + .assert(function (result) { + var notificationIds = result.notifications.map(function (notification) { + return notification.id; + }); + var areNotificationsInList = notificationIds.indexOf(notificationId1) < 0 + && notificationIds.indexOf(notificationId2) >= 0; + + assert.equal(areNotificationsInList, true, "Commands with required ids are not in the list"); + }) + .send(done); + }); + + it('should check if notification with correct name is in results', function (done) { + var requestId = getRequestId(); + conn.params({ + action: 'notification/list', + requestId: requestId, + notification: NOTIFICATION2, + deviceId: deviceId + }) + .expect({ + action: 'notification/list', + status: 'success', + requestId: requestId + }) + .assert(function (result) { + var notificationIds = result.notifications.map(function (notification) { + return notification.id; + }); + var areNotificationsInList = notificationIds.indexOf(notificationId1) < 0 + && notificationIds.indexOf(notificationId2) >= 0; + + assert.equal(areNotificationsInList, true, "Commands with required ids are not in the list"); + }) + .send(done); }); it('should fail when using wrong jwt', function (done) { @@ -494,7 +543,7 @@ describe('WebSocket API Notification', function () { deviceId: deviceId, notificationId: invalidNotificationId }) - .expectError(400, 'Invalid request parameters') + .expectError(400, 'Notification id should be an integer value.') .send(done); }); @@ -546,15 +595,13 @@ describe('WebSocket API Notification', function () { subscriptionId: subscriptionId }); - setTimeout(function() { - req.create(path.NOTIFICATION.get(deviceId)) - .params({ - jwt: token, - data: {notification: NOTIFICATION} - }) - .send(); - }, 1000); - + req.create(path.NOTIFICATION.get(deviceId)) + .params({ + jwt: token, + data: {notification: NOTIFICATION} + }) + .send(); + function cleanUp(err) { if (err) { return done(err); @@ -841,11 +888,16 @@ describe('WebSocket API Notification', function () { return done(err); } + var requestId = getRequestId(); conn.params({ action: 'notification/unsubscribe', - requestId: getRequestId(), + requestId: requestId, subscriptionId: subscriptionId + }).expect({ + action: 'notification/unsubscribe', + requestId: requestId, }) + .send(done); } } @@ -892,10 +944,14 @@ describe('WebSocket API Notification', function () { return done(err); } + var requestId = getRequestId(); adminConn.params({ action: 'notification/unsubscribe', - requestId: getRequestId(), + requestId: requestId, subscriptionId: subscriptionId + }).expect({ + action: 'notification/unsubscribe', + requestId: requestId }) .send(done); } @@ -954,14 +1010,12 @@ describe('WebSocket API Notification', function () { subscriptionId: subscriptionId }); - setTimeout(function () { - req.create(path.NOTIFICATION.get(newDeviceId)) - .params({ - jwt: utils.jwt.admin, - data: {notification: NOTIFICATION} - }) - .send(); - }, 500); + req.create(path.NOTIFICATION.get(newDeviceId)) + .params({ + jwt: utils.jwt.admin, + data: {notification: NOTIFICATION} + }) + .send(); function cleanUp(err) { if (err) { @@ -1041,14 +1095,12 @@ describe('WebSocket API Notification', function () { subscriptionId: subscriptionId }); - setTimeout(function () { - req.create(path.NOTIFICATION.get(newDeviceId)) - .params({ - jwt: utils.jwt.admin, - data: {notification: NOTIFICATION} - }) - .send(); - }, 500); + req.create(path.NOTIFICATION.get(newDeviceId)) + .params({ + jwt: utils.jwt.admin, + data: {notification: NOTIFICATION} + }) + .send(); function cleanUp(err) { if (err) { @@ -1127,16 +1179,14 @@ describe('WebSocket API Notification', function () { cleanUp(); }); - setTimeout(function () { - req.create(path.NOTIFICATION.get(newDeviceId)) - .params({ - jwt: utils.jwt.admin, - data: {notification: NOTIFICATION} - }) - .send(); - }, 1000); - - function cleanUp(err) { + req.create(path.NOTIFICATION.get(newDeviceId)) + .params({ + jwt: utils.jwt.admin, + data: {notification: NOTIFICATION} + }) + .send(); + + function cleanUp(err) { if (err) { return done(err); } @@ -1220,16 +1270,12 @@ describe('WebSocket API Notification', function () { done(); }); - setTimeout(function () { - req.create(path.NOTIFICATION.get(deviceId)) - .params({ - jwt: utils.jwt.admin, - data: {notification: NOTIFICATION} - }) - .send(); - }, 1000); - - + req.create(path.NOTIFICATION.get(deviceId)) + .params({ + jwt: utils.jwt.admin, + data: {notification: NOTIFICATION} + }) + .send(); } } diff --git a/integration-tests/x-round-test-command.js b/integration-tests/x-round-test-command.js index 77bb6d1..10ed93e 100644 --- a/integration-tests/x-round-test-command.js +++ b/integration-tests/x-round-test-command.js @@ -7,10 +7,9 @@ var Websocket = require('./common/websocket'); var getRequestId = utils.core.getRequestId; describe('Round tests for command', function () { - this.timeout(60000); + this.timeout(90000); var url = null; - var INTERVAL = 100; var TOTAL_COMMANDS = 10; var COMMAND = utils.getName('round-command'); @@ -86,7 +85,7 @@ describe('Round tests for command', function () { req.get(path.get(path.DEVICE, deviceId)) .params({jwt: utils.jwt.admin}) - .send(function (err, result) { + .send(function (err) { if (err) { return callback(err); } @@ -174,27 +173,21 @@ describe('Round tests for command', function () { describe('#WS client -> WS device', function () { before(function (done) { + var requestId = getRequestId(); deviceConn.params({ + action: 'command/subscribe', + requestId: requestId + }).send(function () { + var requestId2 = getRequestId(); + clientConn.params({ action: 'command/subscribe', - requestId: getRequestId() - }) - .send(function () { - clientConn.params({ - action: 'command/subscribe', - returnUpdatedCommands: true, - requestId: getRequestId() - }) - .send(done); - }); + returnUpdatedCommands: true, + requestId: requestId2 + }).send(done); + }); }); - function runTestDelayed(command, done) { - setTimeout(function () { - runTest(command, done); - }, INTERVAL); - } - function runTest(command, done) { function sendCommand(callback) { @@ -206,12 +199,12 @@ describe('Round tests for command', function () { }); clientConn.params({ - action: 'command/insert', - requestId: getRequestId(), - deviceId: deviceId, - command: command - }) - .send(); + action: 'command/insert', + requestId: getRequestId(), + deviceId: deviceId, + command: command + }) + .send(); } function sendReply(cmnd, callback) { @@ -230,12 +223,12 @@ describe('Round tests for command', function () { }); deviceConn.params({ - action: 'command/update', - requestId: getRequestId(), - deviceId: deviceId, - commandId: cmnd.command.id, - command: update - }) + action: 'command/update', + requestId: getRequestId(), + deviceId: deviceId, + commandId: cmnd.command.id, + command: update + }) .send(); } @@ -246,15 +239,23 @@ describe('Round tests for command', function () { } it('WS client -> WS device', function (done) { - async.eachSeries(commands, runTestDelayed, done); + async.eachSeries(commands, runTest, done); }); after(function (done) { - deviceConn.params({ + var requestId = getRequestId(); + + clientConn.params({ + action: 'command/unsubscribe', + requestId: requestId + }).send(function() { + var requestId2 = getRequestId(); + + deviceConn.params({ action: 'command/unsubscribe', - requestId: getRequestId() - }) - .send(done); + requestId: requestId2 + }).send(done); + }); }); }); @@ -265,20 +266,16 @@ describe('Round tests for command', function () { before(function (done) { createPath = path.COMMAND.get(deviceId); - + var requestId = getRequestId(); deviceConn.params({ action: 'command/subscribe', - requestId: getRequestId() - }) - .send(done); + requestId: requestId + }).expect({ + action: 'command/subscribe', + requestId: requestId + }).send(done); }); - function runTestDelayed(command, done) { - setTimeout(function () { - runTest(command, done); - }, INTERVAL); - } - function runTest(command, done) { function sendCommand(callback) { @@ -315,15 +312,19 @@ describe('Round tests for command', function () { }); setTimeout(function () { + var requestId = getRequestId(); deviceConn.params({ - action: 'command/update', - requestId: getRequestId(), - deviceId: deviceId, - commandId: cmnd.command.id, - command: update - }) - .send(); - }, 500); + action: 'command/update', + requestId: requestId, + deviceId: deviceId, + commandId: cmnd.command.id, + command: update + }).expect({ + action: 'command/update', + requestId: requestId, + + }).send(); + }, 100); } async.waterfall([ @@ -333,7 +334,7 @@ describe('Round tests for command', function () { } it('REST client -> WS device', function (done) { - async.eachSeries(commands, runTestDelayed, done); + async.eachSeries(commands, runTest, done); }); after(function (done) { @@ -363,12 +364,6 @@ describe('Round tests for command', function () { }); - function runTestDelayed(command, done) { - setTimeout(function () { - runTest(command, done); - }, INTERVAL); - } - function runTest(command, done) { function sendCommand(callback) { @@ -383,12 +378,12 @@ describe('Round tests for command', function () { setTimeout(function () { clientConn.params({ - action: 'command/insert', - requestId: getRequestId(), - deviceId: deviceId, - command: command - }) - .send(); + action: 'command/insert', + requestId: getRequestId(), + deviceId: deviceId, + command: command + }) + .send(); }, 500); } @@ -401,20 +396,37 @@ describe('Round tests for command', function () { status: 'updated', result: {done: 'yes'} }; + + async.parallel({ + one: function (cb) { + clientConn.waitFor('command/update', cb) + .expect({ + action: 'command/update', + command: update + }); + }, + two: function (cb) { + setTimeout(function () { + var updatePath = path.get($path, cmnd.id); + req.update(updatePath) + .params({ + jwt: jwt, + data: update + }) + .send(cb); + }, 500); + } + }, function (err) { + if (err) { + callback(err); + } + + callback(); + }); - clientConn.waitFor('command/update', 4000, callback) - .expect({ - action: 'command/update', - command: update - }); + - var updatePath = path.get($path, cmnd.id); - req.update(updatePath) - .params({ - jwt: jwt, - data: update - }) - .send(); + } async.waterfall([ @@ -424,7 +436,7 @@ describe('Round tests for command', function () { } it('WS client -> REST device', function (done) { - async.eachSeries(commands, runTestDelayed, done); + async.eachSeries(commands, runTest, done); }); }); @@ -441,12 +453,6 @@ describe('Round tests for command', function () { pollPath = path.combine(createPath, path.POLL); }); - function runTestDelayed(command, done) { - setTimeout(function () { - runTest(command, done); - }, INTERVAL); - } - function runTest(command, done) { function sendCommand(callback) { @@ -463,7 +469,7 @@ describe('Round tests for command', function () { req.create(createPath) .params(params) .send(); - }, 1000); + }, 500); } function sendReply(commands, callback) { @@ -478,23 +484,34 @@ describe('Round tests for command', function () { result: {done: 'yes'} }; - utils.get(waitPath, utils.core.clone(clientAuth), function (err, result) { - assert.strictEqual(!(!err), false, 'No error'); - assert.strictEqual(result.command, update.command); - assert.strictEqual(result.lifetime, update.lifetime); - assert.strictEqual(result.status, update.status); - + async.parallel({ + one: function (cb) { + utils.get(waitPath, utils.core.clone(clientAuth), function (err, result) { + assert.strictEqual(!(!err), false, 'No error'); + assert.strictEqual(result.command, update.command); + assert.strictEqual(result.lifetime, update.lifetime); + assert.strictEqual(result.status, update.status); + + cb(); + }); + }, + two: function (cb) { + setTimeout(function () { + var updatePath = path.get(createPath, cmnd.id); + var params = utils.core.clone(deviceAuth); + params.data = update; + req.update(updatePath) + .params(params) + .send(cb); + }, 500); + } + }, function (err) { + if (err) { + callback(err); + } + callback(); }); - - setTimeout(function () { - var updatePath = path.get(createPath, cmnd.id); - var params = utils.core.clone(deviceAuth); - params.data = update; - req.update(updatePath) - .params(params) - .send(); - }, 1000); } async.waterfall([ @@ -506,7 +523,7 @@ describe('Round tests for command', function () { it('REST client -> REST device', function (done) { clientAuth = {jwt: jwt}; deviceAuth = {jwt: jwt}; - async.eachSeries(commands, runTestDelayed, done); + async.eachSeries(commands, runTest, done); }); }); diff --git a/integration-tests/x-round-test-notification.js b/integration-tests/x-round-test-notification.js index 42f22e7..e44818a 100644 --- a/integration-tests/x-round-test-notification.js +++ b/integration-tests/x-round-test-notification.js @@ -7,13 +7,9 @@ var Websocket = require('./common/websocket'); var getRequestId = utils.core.getRequestId; describe('Round tests for notification', function () { - this.timeout(60000); + this.timeout(90000); var url = null; - //var INTERVAL = 500; - //var TOTAL_NOTIFS = 20; - - var INTERVAL = 100; var TOTAL_NOTIFS = 10; var NOTIFICATION = utils.getName('round-notification'); @@ -89,7 +85,7 @@ describe('Round tests for notification', function () { req.get(path.get(path.DEVICE, deviceId)) .params({jwt: utils.jwt.admin}) - .send(function (err, result) { + .send(function (err) { if (err) { return callback(err); } @@ -194,12 +190,6 @@ describe('Round tests for notification', function () { }) }); - function runTestDelayed(notification, done) { - setTimeout(function () { - runTest(notification, done); - }, INTERVAL); - } - function runTest(notification, done) { clientConn.waitFor('notification/insert', done) @@ -218,16 +208,19 @@ describe('Round tests for notification', function () { } it('WS device -> WS client', function (done) { - async.eachSeries(notifications, runTestDelayed, done); + async.eachSeries(notifications, runTest, done); }); after(function (done) { + var requestId = getRequestId(); clientConn.params({ action: 'notification/unsubscribe', - requestId: getRequestId(), + requestId:requestId, subscriptionId: subscriptionId - }) - .send(done); + }).expect({ + action: 'notification/unsubscribe', + requestId:requestId + }).send(done); }); }); @@ -239,12 +232,6 @@ describe('Round tests for notification', function () { $path = path.combine(path.NOTIFICATION.get(deviceId), path.POLL); }); - function runTestDelayed(notification, done) { - setTimeout(function () { - runTest(notification, done); - }, INTERVAL); - } - function runTest(notification, done) { var expectedNotif = utils.core.clone(notification); @@ -257,18 +244,18 @@ describe('Round tests for notification', function () { .send(done); setTimeout(function () { + var requestId = getRequestId(); deviceConn.params({ - action: 'notification/insert', - requestId: getRequestId(), - deviceId: deviceId, - notification: notification - }) - .send(); + action: 'notification/insert', + requestId: requestId, + deviceId: deviceId, + notification: notification + }).send(); }, 500); } it('WS device -> REST client', function (done) { - async.eachSeries(notifications, runTestDelayed, done); + async.eachSeries(notifications, runTest, done); }); }); @@ -282,30 +269,23 @@ describe('Round tests for notification', function () { $path = path.NOTIFICATION.get(deviceId); clientConn.params({ - action: 'notification/subscribe', - requestId: getRequestId(), - deviceIds: [deviceId], - names: [NOTIFICATION] - }) - .send(function (err, result) { - if (err) { - return done(err); - } + action: 'notification/subscribe', + requestId: getRequestId(), + deviceIds: [deviceId], + names: [NOTIFICATION] + }).send(function (err, result) { + if (err) { + return done(err); + } - subscriptionId = result.subscriptionId; - done(); - }) + subscriptionId = result.subscriptionId; + done(); + }) }); - function runTestDelayed(notification, done) { - setTimeout(function () { - runTest(notification, done); - }, INTERVAL); - } - function runTest(notification, done) { - clientConn.waitFor('notification/insert', 4000, done) + clientConn.waitFor('notification/insert', done) .expect({ action: 'notification/insert', notification: notification @@ -320,16 +300,19 @@ describe('Round tests for notification', function () { } it('REST device -> WS client', function (done) { - async.eachSeries(notifications, runTestDelayed, done); + async.eachSeries(notifications, runTest, done); }); after(function (done) { + var requestId = getRequestId(); clientConn.params({ - action: 'notification/unsubscribe', - requestId: getRequestId(), - subscriptionId: subscriptionId - }) - .send(done); + action: 'notification/unsubscribe', + requestId: requestId, + subscriptionId: subscriptionId + }).expect({ + action: 'notification/unsubscribe', + requestId: requestId + }).send(done); }); }); @@ -341,41 +324,46 @@ describe('Round tests for notification', function () { var devicePath = null; var clientPath = null; - before(function () { + before(function (done) { devicePath = path.NOTIFICATION.get(deviceId); clientPath = path.combine(path.NOTIFICATION.get(deviceId), path.POLL); + done(); }); - function runTestDelayed(notification, done) { - setTimeout(function () { - runTest(notification, done); - }, INTERVAL); - } - function runTest(notification, done) { var expectedNotif = utils.core.clone(notification); expectedNotif.deviceId = deviceId; + expectedNotif.networkId = networkId; + + var deviceParams = utils.core.clone(deviceAuth); + var clientParams = utils.core.clone(clientAuth); req.get(clientPath) - .params(utils.core.clone(clientAuth)) + .params(clientParams) .query('names', NOTIFICATION) - .expect([expectedNotif]) - .send(done); - + .send(function(err, result) { + expectedNotif.id = result[0].id; + expectedNotif.timestamp = result[0].timestamp; + assert.deepEqual(result, [expectedNotif], "Not expected notification"); + done(); + }); + + setTimeout(function () { - var params = utils.core.clone(deviceAuth); - params.data = notification; + deviceParams.data = notification; req.create(devicePath) - .params(params) + .params(deviceParams) .send(); - }, 500); + }, 100); + + } it('REST device -> REST client', function (done) { - deviceAuth = {jwt: jwt}; + deviceAuth = {jwt: utils.jwt.admin}; clientAuth = {jwt: jwt}; - async.eachSeries(notifications, runTestDelayed, done); + async.eachSeries(notifications, runTest, done); }); });