diff --git a/src/certificates.js b/src/certificates.js index cae058fa9..41669f188 100644 --- a/src/certificates.js +++ b/src/certificates.js @@ -14,7 +14,11 @@ exports = module.exports = { renewAll: renewAll, - events: new (require('events').EventEmitter)(), + initialize: initialize, + uninitialize: uninitialize, + + events: null, + EVENT_CERT_CHANGED: 'cert_changed', // exported for testing @@ -65,6 +69,20 @@ CertificatesError.INTERNAL_ERROR = 'Internal Error'; CertificatesError.INVALID_CERT = 'Invalid certificate'; CertificatesError.NOT_FOUND = 'Not Found'; +function initialize(callback) { + assert.strictEqual(typeof callback, 'function'); + + exports.events = new (require('events').EventEmitter)(); + callback(); +} + +function uninitialize(callback) { + assert.strictEqual(typeof callback, 'function'); + + exports.events = null; + callback(); +} + function getApi(app, callback) { assert.strictEqual(typeof app, 'object'); assert.strictEqual(typeof callback, 'function'); diff --git a/src/cloudron.js b/src/cloudron.js index c1a3c3a4d..dd04b4862 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -25,7 +25,8 @@ exports = module.exports = { readDkimPublicKeySync: readDkimPublicKeySync, refreshDNS: refreshDNS, - events: new (require('events').EventEmitter)(), + events: null, + EVENT_ACTIVATED: 'activated' }; @@ -122,11 +123,16 @@ CloudronError.SELF_UPGRADE_NOT_SUPPORTED = 'Self upgrade not supported'; function initialize(callback) { assert.strictEqual(typeof callback, 'function'); + exports.events = new (require('events').EventEmitter)(); + gConfigState = { dns: false, tls: false, configured: false }; gUpdatingDns = false; gBoxAndUserDetails = null; async.series([ + certificates.initialize, + settings.initialize, + platform.initialize, installAppBundle, checkConfigState, configureDefaultServer @@ -136,13 +142,17 @@ function initialize(callback) { function uninitialize(callback) { assert.strictEqual(typeof callback, 'function'); + exports.events = null; + platform.events.removeListener(platform.EVENT_READY, onPlatformReady); async.series([ cron.uninitialize, taskmanager.pauseTasks, mailer.stop, - platform.uninitialize + platform.uninitialize, + certificates.uninitialize, + settings.uninitialize ], callback); } @@ -165,7 +175,7 @@ function onConfigured(callback) { clients.addDefaultClients, cron.initialize, certificates.ensureFallbackCertificate, - platform.initialize, // requires fallback certs for mail container + platform.start, // requires fallback certs for mail container ensureDkimKey, addDnsRecords, configureAdmin, diff --git a/src/platform.js b/src/platform.js index 3f637fff8..c12f0c8aa 100644 --- a/src/platform.js +++ b/src/platform.js @@ -4,7 +4,10 @@ exports = module.exports = { initialize: initialize, uninitialize: uninitialize, - events: new (require('events').EventEmitter)(), + start: start, + + events: null, + EVENT_READY: 'ready' }; @@ -34,6 +37,15 @@ var gPlatformReadyTimer = null; var NOOP_CALLBACK = function (error) { if (error) debug(error); }; function initialize(callback) { + assert.strictEqual(typeof callback, 'function'); + + exports.events = new (require('events').EventEmitter)(); + return callback(); +} + +function start(callback) { + assert.strictEqual(typeof callback, 'function'); + if (process.env.BOX_ENV === 'test' && !process.env.TEST_CREATE_INFRA) return callback(); debug('initializing addon infrastructure'); @@ -87,7 +99,7 @@ function uninitialize(callback) { clearTimeout(gPlatformReadyTimer); gPlatformReadyTimer = null; - // TODO: unregister event listeners + exports.events = null; callback(); } diff --git a/src/settings.js b/src/settings.js index 630fba9ad..9cc1275f6 100644 --- a/src/settings.js +++ b/src/settings.js @@ -3,6 +3,9 @@ exports = module.exports = { SettingsError: SettingsError, + initialize: initialize, + uninitialize: uninitialize, + getEmailDnsRecords: getEmailDnsRecords, getAutoupdatePattern: getAutoupdatePattern, @@ -56,7 +59,7 @@ exports = module.exports = { APPSTORE_CONFIG_KEY: 'appstore_config', MAIL_CONFIG_KEY: 'mail_config', - events: new (require('events').EventEmitter)() + events: null }; var assert = require('assert'), @@ -102,11 +105,6 @@ var gDefaults = (function () { return result; })(); -if (config.TEST) { - // avoid noisy warnings during npm test - exports.events.setMaxListeners(100); -} - function SettingsError(reason, errorOrMessage) { assert.strictEqual(typeof reason, 'string'); assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined'); @@ -131,6 +129,20 @@ SettingsError.EXTERNAL_ERROR = 'External Error'; SettingsError.NOT_FOUND = 'Not Found'; SettingsError.BAD_FIELD = 'Bad Field'; +function initialize(callback) { + assert.strictEqual(typeof callback, 'function'); + + exports.events = new (require('events').EventEmitter)(); + callback(); +} + +function uninitialize(callback) { + assert.strictEqual(typeof callback, 'function'); + + exports.events = null; + callback(); +} + function getEmailDnsRecords(callback) { assert.strictEqual(typeof callback, 'function'); diff --git a/src/test/apptask-test.js b/src/test/apptask-test.js index e58fc3858..56ae9fa32 100644 --- a/src/test/apptask-test.js +++ b/src/test/apptask-test.js @@ -88,6 +88,7 @@ describe('apptask', function () { async.series([ database.initialize, appdb.add.bind(null, APP.id, APP.appStoreId, APP.manifest, APP.location, APP.portBindings, APP), + settings.initialize, settings.setDnsConfig.bind(null, { provider: 'route53', accessKeyId: 'accessKeyId', secretAccessKey: 'secretAccessKey', endpoint: 'http://localhost:5353' }, config.fqdn()), settings.setTlsConfig.bind(null, { provider: 'caas' }) ], done); diff --git a/src/test/settings-test.js b/src/test/settings-test.js index 1c0f4db22..f00839b48 100644 --- a/src/test/settings-test.js +++ b/src/test/settings-test.js @@ -5,26 +5,31 @@ 'use strict'; -var config = require('../config.js'), +var async = require('async'), + config = require('../config.js'), database = require('../database.js'), expect = require('expect.js'), settings = require('../settings.js'); function setup(done) { - // ensure data/config/mount paths - database.initialize(function (error) { - expect(error).to.be(null); - - // a cloudron must have a backup config to startup - settings.setBackupConfig({ provider: 'caas', token: 'foo', key: 'key'}, function (error) { - expect(error).to.be(null); - done(); - }); - }); + async.series([ + database.initialize, + settings.initialize, + function (callback) { + // a cloudron must have a backup config to startup + settings.setBackupConfig({ provider: 'caas', token: 'foo', key: 'key'}, function (error) { + expect(error).to.be(null); + callback(); + }); + } + ], done); } function cleanup(done) { - database._clear(done); + async.series([ + settings.uninitialize, + database._clear + ], done); } describe('Settings', function () { diff --git a/src/test/updatechecker-test.js b/src/test/updatechecker-test.js index d94c42083..0c19c82b1 100644 --- a/src/test/updatechecker-test.js +++ b/src/test/updatechecker-test.js @@ -1,4 +1,3 @@ -/* jslint node:true */ /* global it:false */ /* global describe:false */ /* global before:false */ @@ -82,6 +81,15 @@ function checkMails(number, done) { }, 500); } +function cleanup(done) { + mailer._clearMailQueue(); + + async.series([ + settings.uninitialize, + database._clear + ], done); +} + describe('updatechecker - box - manual', function () { before(function (done) { config.set('version', '1.0.0'); @@ -90,17 +98,14 @@ describe('updatechecker - box - manual', function () { async.series([ database.initialize, + settings.initialize, user.createOwner.bind(null, USER_0.username, USER_0.password, USER_0.email, USER_0.displayName, AUDIT_SOURCE), settings.setAutoupdatePattern.bind(null, constants.AUTOUPDATE_PATTERN_NEVER), mailer._clearMailQueue ], done); }); - after(function (done) { - mailer._clearMailQueue(); - - database._clear(done); - }); + after(cleanup); it('no updates', function (done) { nock.cleanAll(); @@ -242,16 +247,13 @@ describe('updatechecker - box - automatic', function () { config.set('boxVersionsUrl', 'http://localhost:4444/release.json'); async.series([ database.initialize, + settings.initialize, mailer._clearMailQueue, user.createOwner.bind(null, USER_0.username, USER_0.password, USER_0.email, USER_0.displayName, AUDIT_SOURCE) ], done); }); - after(function (done) { - mailer._clearMailQueue(); - - database._clear(done); - }); + after(cleanup); it('new version', function (done) { nock.cleanAll(); @@ -305,6 +307,7 @@ describe('updatechecker - app - manual', function () { async.series([ database.initialize, database._clear, + settings.initialize, mailer._clearMailQueue, appdb.add.bind(null, APP_0.id, APP_0.appStoreId, APP_0.manifest, APP_0.location, APP_0.portBindings, APP_0), user.createOwner.bind(null, USER_0.username, USER_0.password, USER_0.email, USER_0.displayName, AUDIT_SOURCE), @@ -312,9 +315,7 @@ describe('updatechecker - app - manual', function () { ], done); }); - after(function (done) { - database._clear(done); - }); + after(cleanup); it('no updates', function (done) { nock.cleanAll(); @@ -426,15 +427,14 @@ describe('updatechecker - app - automatic', function () { async.series([ database.initialize, database._clear, + settings.initialize, mailer._clearMailQueue, appdb.add.bind(null, APP_0.id, APP_0.appStoreId, APP_0.manifest, APP_0.location, APP_0.portBindings, APP_0), user.createOwner.bind(null, USER_0.username, USER_0.password, USER_0.email, USER_0.displayName, AUDIT_SOURCE) ], done); }); - after(function (done) { - database._clear(done); - }); + after(cleanup); it('offers new version', function (done) { nock.cleanAll();