Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions lib/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,20 @@ class BookkeepingApplication {
}
}

/**
* Connects to the database and applies pending migrations, then, and only then, starts the application.
* Servers, consumers and synchronizers must not access the database while migrations are being applied
*
* @returns {Promise<boolean>} resolves with true if the application has been started, false if the database could not be prepared
*/
async start() {
if (!await this.connectDatabase()) {
return false;
}
await this.run();
return true;
}

/**
* Causes the application to be scheduled for execution.
*
Expand Down
8 changes: 6 additions & 2 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@

const application = require('./application');

application.run();
application.connectDatabase();
application.start().then((started) => {
if (!started) {
// Nothing has been started yet (database unavailable or migration failed), there is nothing to stop gracefully
process.exit(1);
}
});

/*
* 'SIGTERM' and 'SIGINT' have default handlers on non-Windows platforms that reset the terminal mode before exiting
Expand Down
13 changes: 4 additions & 9 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
* or submit itself to any jurisdiction.
*/

const ApplicationSuite = require('./lib/application.test.js');
const DatabaseSuite = require('./lib/database');
const PresentationSuite = require('./presentation');
const PublicSuite = require('./lib/public');
Expand All @@ -22,19 +23,13 @@ const GrpcSuite = require('./gRPC');
const APISuite = require('./api');
const FrontendSuite = require('./public');

const application = require('../lib/application');
const { useApplication } = require('./utilities/useApplication.js');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('Unit Suite', () => {
describe('Application', ApplicationSuite);
describe('Database', DatabaseSuite);
describe('Presentation', PresentationSuite);
describe('Public', PublicSuite);
Expand Down
57 changes: 57 additions & 0 deletions test/lib/application.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/**
* @license
* Copyright CERN and copyright holders of ALICE O2. This software is
* distributed under the terms of the GNU General Public License v3 (GPL
* Version 3), copied verbatim in the file "COPYING".
*
* See http://alice-o2.web.cern.ch/license for full licensing information.
*
* In applying this license CERN does not waive the privileges and immunities
* granted to it by virtue of its status as an Intergovernmental Organization
* or submit itself to any jurisdiction.
*/

const sinon = require('sinon');
const { expect } = require('chai');
const application = require('../../lib/application');

module.exports = () => {
Comment thread
graduta marked this conversation as resolved.
describe('Application start-up', () => {
let connectDatabaseStub;
let runStub;
let resolveMigration;

beforeEach(() => {
runStub = sinon.stub(application, 'run').resolves();
connectDatabaseStub = sinon.stub(application, 'connectDatabase');
});

afterEach(() => {
sinon.restore();
});

it('should not start anything (servers, synchronizers...) while migrations are still running', async () => {
connectDatabaseStub.returns(new Promise((resolve) => {
resolveMigration = resolve;
}));

const startPromise = application.start();

// Let any (wrongly) scheduled work run
await new Promise((resolve) => setImmediate(resolve));
expect(runStub.called).to.be.false;

resolveMigration(true);
expect(await startPromise).to.be.true;
expect(runStub.calledOnce).to.be.true;
expect(runStub.calledAfter(connectDatabaseStub)).to.be.true;
});

it('should never start the application if the database could not be prepared', async () => {
connectDatabaseStub.resolves(false);

expect(await application.start()).to.be.false;
expect(runStub.called).to.be.false;
});
});
};
11 changes: 2 additions & 9 deletions test/scripts/test-about.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,11 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/about/overview.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('About', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,10 @@

const APISuite = require('../api');

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('API', APISuite);
});
11 changes: 2 additions & 9 deletions test/scripts/test-data-passes.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,12 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewPerLhcPeriodSuite = require('../public/dataPasses/overviewPerLhcPeriod.test');
const OverviewPerSimulationPassSuite = require('../public/dataPasses/overviewPerSimulationPass.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('DataPasses', () => {
describe('Overview Per LHC Period Page', OverviewPerLhcPeriodSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-envs.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,12 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/envs/overview.test');
const DetailsPageSuite = require('../public/envs/detailsPage.test.js');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('Envs', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-eos-report.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,15 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const DcsCreationSuite = require('../public/eosReport/dcs-creation.test.js');
const EcsCreationSuite = require('../public/eosReport/ecs-creation.test.js');
const QcPdpCreationSuite = require('../public/eosReport/qc-pdp-creation.test.js');
const ShiftLeaderCreationSuite = require('../public/eosReport/shift-leader-creation.test.js');
const SlimosCreationSuite = require('../public/eosReport/slimos-creation.test.js');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('EosReport', () => {
describe('DCS Creation Page', DcsCreationSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-flps.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,13 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/flps/overview.test');
// eslint-disable-next-line capitalized-comments
const DetailSuite = require('../public/flps/detail.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('Flps', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-header.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,11 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const HeaderSuite = require('../public/header');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('Header', HeaderSuite);
});
11 changes: 2 additions & 9 deletions test/scripts/test-home.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,11 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/home/overview.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('Home', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-lhc-fills.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,12 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/lhcFills/overview.test');
const DetailsSuite = require('../public/lhcFills/detail.test.js');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('LhcFills', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-lhc-periods.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,11 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/lhcPeriods/overview.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('lhcPeriods', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-logs.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,13 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const OverviewSuite = require('../public/logs/overview.test');
const CreateSuite = require('../public/logs/create.test');
const DetailSuite = require('../public/logs/detail.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('Logs', () => {
describe('Overview Page', OverviewSuite);
Expand Down
11 changes: 2 additions & 9 deletions test/scripts/test-qc-flag-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,12 @@
* or submit itself to any jurisdiction.
*/

const application = require('../../lib/application');
const { useApplication } = require('../utilities/useApplication.js');
const QcFlagTypesOverviewSuite = require('../public/qcFlagTypes/overview.test');
const QcFlagTypeCreationSuite = require('../public/qcFlagTypes/creation.test');

describe('Bookkeeping', () => {
before(async () => {
await application.run();
await application.connectDatabase();
});

after(async () => {
await application.stop(true);
});
useApplication();

describe('QcFlagTypes', () => {
describe('Overview Page', QcFlagTypesOverviewSuite);
Expand Down
Loading
Loading