/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.module; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import org.junit.AfterClass; import org.junit.Test; /** * Tests methods of the module activator that do not require refreshing of the spring application * context. For those that require refreshing, see WebModuleActivatorTest */ public class ModuleActivatorTest extends BaseModuleActivatorTest { @Test public void shouldCallWillStartOnStartup() { assertTrue(moduleTestData.getWillStartCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getWillStartCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getWillStartCallCount(MODULE3_ID) == 1); } @Test public void shouldNotCallStartedOnStartup() { assertTrue(moduleTestData.getStartedCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getStartedCallCount(MODULE2_ID) == 0); assertTrue(moduleTestData.getStartedCallCount(MODULE3_ID) == 0); } @Test public void shouldNotCallWillStopOnStartup() { assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 0); assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 0); } @Test public void shouldNotCallStoppedOnStartup() { assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 0); } @Test public void shouldStartModulesInOrder() { //module2 depends on module1 while module3 depends on module2 //so startup order should be module1, module2, module3 assertTrue(moduleTestData.getWillStartCallTime(MODULE1_ID) <= moduleTestData.getWillStartCallTime(MODULE2_ID)); assertTrue(moduleTestData.getWillStartCallTime(MODULE2_ID) <= moduleTestData.getWillStartCallTime(MODULE3_ID)); assertTrue(moduleTestData.getStartedCallTime(MODULE1_ID) <= moduleTestData.getStartedCallTime(MODULE2_ID)); assertTrue(moduleTestData.getStartedCallTime(MODULE2_ID) <= moduleTestData.getStartedCallTime(MODULE3_ID)); } @Test public void shouldCallWillStopAndStoppedOnlyForStoppedModule() { ModuleFactory.stopModule(ModuleFactory.getModuleById(MODULE3_ID)); //should have called willStop() for only module3 assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 0); //should have called stopped() for only module3 assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 0); } @Test public void shouldStopDependantModulesOnStopModule() { //since module2 depends on module1, and module3 depends on module2 //stopping module1 should also stop both module2 and module3 ModuleFactory.stopModule(ModuleFactory.getModuleById(MODULE1_ID)); //should have called willStop() for all module1, module2 and module3 assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 1); //should have called stopped() for all module1, module2 and module3 assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 1); //willStop() should have been called in the order module1, module2, module3 assertThat(moduleTestData.getWillStopCallTime(MODULE1_ID), lessThanOrEqualTo(moduleTestData .getWillStopCallTime(MODULE2_ID))); assertThat(moduleTestData.getWillStopCallTime(MODULE2_ID), lessThanOrEqualTo(moduleTestData .getWillStopCallTime(MODULE3_ID))); //stopped() should have been called in the order module3, module2, module1 assertThat(moduleTestData.getStoppedCallTime(MODULE3_ID), lessThanOrEqualTo(moduleTestData .getStoppedCallTime(MODULE2_ID))); assertThat(moduleTestData.getStoppedCallTime(MODULE2_ID), lessThanOrEqualTo(moduleTestData .getStoppedCallTime(MODULE1_ID))); } @Test public void shouldCallWillStopAndStoppedOnShutdown() { ModuleUtil.shutdown(); //should have called willStop() for module1, module2, and module3 assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 1); //should have called stopped() for module1, module2, and module3 assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 1); //willStop() should have been called before stopped() for module1, module2, and module3 assertTrue(moduleTestData.getWillStopCallTime(MODULE1_ID) <= moduleTestData.getStoppedCallTime(MODULE1_ID)); assertTrue(moduleTestData.getWillStopCallTime(MODULE2_ID) <= moduleTestData.getStoppedCallTime(MODULE2_ID)); assertTrue(moduleTestData.getWillStopCallTime(MODULE3_ID) <= moduleTestData.getStoppedCallTime(MODULE3_ID)); } @Test public void shouldExcludePreviouslyStoppedModulesOnShutdown() { //At OpenMRS shutdown, willStop() and stopped() methods get called for all //started module's activator EXCLUDING any module(s) that were previously stopped. //now let us make module3 be the previously stopped module ModuleFactory.stopModule(ModuleFactory.getModuleById(MODULE3_ID)); //should have called willStop() and stopped() for only module3 assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 0); assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 1); //now shutdown ModuleUtil.shutdown(); //should have called willStop() and stopped() for module1 and module2 //while willStop() and stopped() should not be called again for module3 assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 1); } @Test public void shouldCallWillStopAndStoppedOnUnloadModule() { ModuleFactory.unloadModule(ModuleFactory.getModuleById(MODULE3_ID)); //should have called willStop() and stopped() for module3 assertTrue(moduleTestData.getWillStopCallCount(MODULE3_ID) == 1); assertTrue(moduleTestData.getStoppedCallCount(MODULE3_ID) == 1); //should not call willStop() and stopped() for module1 and module2 assertTrue(moduleTestData.getWillStopCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getWillStopCallCount(MODULE2_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE1_ID) == 0); assertTrue(moduleTestData.getStoppedCallCount(MODULE2_ID) == 0); } @Test public void shouldStartBeforeAnotherModule() { //module 1 should start before module 5 //module 5 should start before module 4 assertTrue(moduleTestData.getWillStartCallTime(MODULE5_ID) <= moduleTestData.getWillStartCallTime(MODULE4_ID)); assertTrue(moduleTestData.getWillStartCallTime(MODULE1_ID) <= moduleTestData.getWillStartCallTime(MODULE5_ID)); assertTrue(moduleTestData.getStartedCallTime(MODULE5_ID) <= moduleTestData.getStartedCallTime(MODULE4_ID)); assertTrue(moduleTestData.getStartedCallTime(MODULE1_ID) <= moduleTestData.getStartedCallTime(MODULE5_ID)); } @AfterClass public static void cleanUp() { //ensure that we do not have any left overs to interfere with other tests ModuleUtil.shutdown(); } }