UNPKG

nitrogen-core

Version:

Core services used across ingestion, registry, and consumption servers.

284 lines (224 loc) 11.8 kB
var assert = require('assert') , async = require('async') , core = require('../../lib') , lib = require('../../lib') , moment = require('moment'); describe('subscriptions service', function() { it('creating a subscription should create row', function(done) { core.services.subscriptions.findByPrincipalCached(core.fixtures.models.principals.device, core.fixtures.models.principals.device.id, {}, function(err, subscriptions) { assert(!err); var cachedCount = subscriptions.length; core.models.Subscription.count({}, function(err, startingCount) { assert(!err); var subscription = new core.models.Subscription({ filter: {}, name: 'named', principal: core.fixtures.models.principals.device.id, type: 'message', permanent: false, name: core.utils.uuid() }); core.services.subscriptions.findOrCreate(subscription, function(err, subscription) { assert(!err); core.config.cache_provider.get('subscriptions', "subscriptions.principal." + core.fixtures.models.principals.device.id.toString(), function(err, subscriptionObjs) { assert(!err); assert(!subscriptionObjs); }); core.models.Subscription.count({}, function(err, endingCount) { assert(!err); assert.equal(startingCount + 1, endingCount); core.services.subscriptions.findByPrincipalCached(core.fixtures.models.principals.device, core.fixtures.models.principals.device.id, {}, function(err, subscriptions) { assert(!err); assert.equal(cachedCount + 1, subscriptions.length); core.config.cache_provider.get('subscriptions', "subscriptions.principal." + core.fixtures.models.principals.device.id.toString(), function(err, subscriptionObjs) { assert(!err); assert(subscriptionObjs.length); core.log.info('removing subscription: ' + subscription.id); core.services.subscriptions.remove(subscription, function(err) { assert(!err); core.config.cache_provider.get('subscriptions', "subscriptions.principal." + core.fixtures.models.principals.device.id.toString(), function(err, subscriptionObjs) { assert(!err); assert(!subscriptionObjs); core.services.subscriptions.findByPrincipalCached(core.fixtures.models.principals.device, core.fixtures.models.principals.device.id, {}, function(err, subscriptions) { assert(!err); assert.equal(cachedCount, subscriptions.length); done(); }); }); }) }); }); }); }); }); }); }); it('can correctly create and then find by principal with cache', function(done) { var subscription = new core.models.Subscription({ clientId: "fakeclientid", filter: { type: 'ip' }, principal: core.services.principals.servicePrincipal.id, type: 'message', permanent: false, name: core.utils.uuid() }); // cache no subscriptions core.services.subscriptions.findByPrincipal(core.services.principals.servicePrincipal, core.services.principals.servicePrincipal.id, {}, function(err, subscriptions) { assert(!err); // add a subscription, which should invalidate cache entry core.services.subscriptions.findOrCreate(subscription, function(err, createdSubscription) { assert(!err); core.services.subscriptions.findByPrincipal(core.services.principals.servicePrincipal, core.services.principals.servicePrincipal.id, {}, function(err, subscriptions) { assert(!err); subscriptions.forEach(function(subscription) { if (subscription.id === createdSubscription.id) done(); }); }); }); }); }); it('can create a session subscription and receive messages from it', function(done) { var subscription = new core.models.Subscription({ clientId: "fakeclientid", filter: { type: 'ip' }, principal: core.services.principals.servicePrincipal.id, type: 'message', permanent: false, name: core.utils.uuid() }); var publishFinished; core.services.subscriptions.findOrCreate(subscription, function(err, subscription) { assert(!err); async.whilst( function () { return true; }, function (callback) { core.config.pubsub_provider.receive(subscription, function(err, message) { assert(!err); if (!message) return callback(); assert.notEqual(message, undefined); assert.equal(message.type, 'ip'); done(); }); }, function (err) { assert(!err); } ); var message = new core.models.Message({ from: core.services.principals.servicePrincipal, type: "_test", body: { reading: 5.1 } }); var startPublish = new Date(); core.services.messages.create(core.services.principals.servicePrincipal, message, function(err) { assert(!err); publishFinished = new Date(); //var totalTime = publishFinished.getTime() - startPublish.getTime(); //assert(totalTime < 800); var message = new core.models.Message({ from: core.services.principals.servicePrincipal, type: "ip", body: { ip_address: "127.0.0.1" } }); core.services.messages.create(core.services.principals.servicePrincipal, message, function(err) { publishFinished = new Date(); assert(!err); }); }); }); }); if (core.config.pubsub_provider.SUPPORTS_PERMANENT_SUBSCRIPTIONS) { it('permanent subscriptions should queue messages for later', function(done) { var subscription = new core.models.Subscription({ filter: { type: '_permanentQueueTest' }, name: 'permanent', permanent: true, principal: core.services.principals.servicePrincipal.id, type: 'message' }); core.services.subscriptions.findOrCreate(subscription, function(err, subscription) { assert(!err); assert(subscription.permanent); var msg = new core.models.Message({ type: '_permanentQueueTest', from: core.services.principals.servicePrincipal.id, body: { seq: 1 } }); // create a message core.services.messages.create(core.services.principals.servicePrincipal, msg, function(err) { assert(!err); // create an irrelevant message msg.type = '_anotherType'; core.services.messages.create(core.services.principals.servicePrincipal, msg, function(err) { assert(!err); setTimeout(function() { // create a 2nd message msg.body.seq = 2; msg.type = '_permanentQueueTest'; core.services.messages.create(core.services.principals.servicePrincipal, msg, function(err) { assert(!err); setTimeout(function() { // receive messages and make sure we get both and in order and they are relevant. core.services.subscriptions.receive(subscription, function(err, message, ref) { assert(!err); assert.equal(message.type, '_permanentQueueTest'); assert.equal(message.body.seq, 1); core.config.pubsub_provider.ackReceive(ref, true); core.services.subscriptions.receive(subscription, function(err, message, ref) { assert(!err); assert.equal(message.type, '_permanentQueueTest'); assert.equal(message.body.seq, 2); core.config.pubsub_provider.ackReceive(ref, true); done(); }); }); }, 100); }); }, 100); }); }); }); }); } it('running the janitor should remove abandoned session subscriptions', function(done) { var permSub = new core.models.Subscription({ assignment: 'localhost', clientId: "5", filter: {}, name: "janitorTest", permanent: true, principal: core.services.principals.servicePrincipal, type: "message", last_receive: moment().add(-5, 'days').toDate() }); core.services.subscriptions.findOrCreate(permSub, function(err, permSub) { assert(!err); var sessionSub = new core.models.Subscription({ clientId: "5", filter: {}, principal: core.services.principals.servicePrincipal, type: "message", permanent: false, name: core.utils.uuid(), last_receive: moment().add(-5, 'days').toDate() }); core.services.subscriptions.findOrCreate(sessionSub, function(err, sessionSub) { assert(!err); core.models.Subscription.find({}, function(err, subscriptionsStart) { assert(!err); core.services.subscriptions.janitor(function(err) { assert(!err); core.models.Subscription.find({}, function(err, subscriptionsFinish) { assert(!err); assert.equal(subscriptionsStart.length, subscriptionsFinish.length + 3); done(); }); }); }); }); }); }); });