/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.core.runtime.internal;
import junit.framework.TestCase;
import com.bc.ceres.core.CoreException;
import com.bc.ceres.core.ProgressMonitor;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.logging.Logger;
public class ModuleLifecycleTest extends TestCase {
private static final File MODULES_DIR = new File(Config.getDirForAppA(), "modules");
private ModuleRegistry moduleRegistry;
@Override
protected void setUp() throws Exception {
this.moduleRegistry = createModuleRegistry();
}
@Override
protected void tearDown() throws Exception {
moduleRegistry = null;
}
public void testNothing() {
}
public void testModuleLifecycle() throws CoreException {
TestHelpers.assertModuleIsInstalled(getModule("module-a"));
TestHelpers.assertModuleIsInstalled(getModule("module-b"));
TestHelpers.assertModuleIsInstalled(getModule("module-c"));
TestHelpers.assertModuleIsInstalled(getModule("module-d"));
TestHelpers.assertModuleIsInstalled(getModule("module-e"));
resolveModules();
TestHelpers.assertModuleIsResolved(getModule("module-a"), 6, new ModuleImpl[] {});
TestHelpers.assertModuleIsResolved(getModule("module-b"), 3, new ModuleImpl[] {getModule("module-a")});
TestHelpers.assertModuleIsResolved(getModule("module-c"), 1, new ModuleImpl[] {getModule("module-b")});
TestHelpers.assertModuleIsResolved(getModule("module-d"), 2, new ModuleImpl[] {getModule("module-a")});
TestHelpers.assertModuleIsResolved(getModule("module-e"), 1, new ModuleImpl[] {getModule("module-b"), getModule("module-d")});
startModules();
TestHelpers.assertModuleIsActive(getModule("module-a"));
TestHelpers.assertModuleIsActive(getModule("module-b"));
TestHelpers.assertModuleIsActive(getModule("module-c"));
TestHelpers.assertModuleIsActive(getModule("module-d"));
TestHelpers.assertModuleIsActive(getModule("module-e"));
stopModules();
TestHelpers.assertModuleIsResolved(getModule("module-a"), 6, new ModuleImpl[] {});
TestHelpers.assertModuleIsResolved(getModule("module-b"), 3, new ModuleImpl[] {getModule("module-a")});
TestHelpers.assertModuleIsResolved(getModule("module-c"), 1, new ModuleImpl[] {getModule("module-b")});
TestHelpers.assertModuleIsResolved(getModule("module-d"), 2, new ModuleImpl[] {getModule("module-a")});
TestHelpers.assertModuleIsResolved(getModule("module-e"), 1, new ModuleImpl[] {getModule("module-b"), getModule("module-d")});
}
private ModuleImpl getModule(String symbolicName) {
return TestHelpers.getSingleton(this.moduleRegistry, symbolicName);
}
private void resolveModules() throws CoreException {
ModuleImpl[] modules = moduleRegistry.getModules();
for (ModuleImpl module : modules) {
final ModuleResolver moduleResolver = new ModuleResolver(ModuleResolver.class.getClassLoader(), false);
moduleResolver.resolve(module);
}
}
private void startModules() throws CoreException {
ModuleImpl[] modules = moduleRegistry.getModules();
Arrays.sort(modules, new Comparator<ModuleImpl>() {
public int compare(ModuleImpl o1, ModuleImpl o2) {
return o1.getRefCount() - o2.getRefCount();
}
});
for (ModuleImpl module : modules) {
module.start();
}
}
private void stopModules() throws CoreException {
ModuleImpl[] modules = moduleRegistry.getModules();
for (ModuleImpl module : modules) {
module.stop();
}
}
private ModuleRegistry createModuleRegistry() throws CoreException, IOException {
ModuleImpl[] modules = new ModuleLoader(Logger.getLogger("")).loadModules(MODULES_DIR, ProgressMonitor.NULL);
ModuleRegistry moduleRegistry = new ModuleRegistry();
for (int i = 0; i < modules.length; i++) {
ModuleImpl module = modules[i];
module.setModuleId(i + 1);
moduleRegistry.registerModule(module);
}
return moduleRegistry;
}
}