/* * 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.swing.update; import com.bc.ceres.core.CoreException; import com.bc.ceres.core.ProgressMonitor; import com.bc.ceres.core.runtime.Dependency; import com.bc.ceres.core.runtime.Module; import com.bc.ceres.core.runtime.Version; import junit.framework.TestCase; import java.text.MessageFormat; public class ConsistencyCheckerTest extends TestCase { public void testAGoodSetup() throws CoreException { String[] installedModuleFileNames = { "xml/consistency/module-a-1.1.xml", "xml/consistency/module-b-2.3.1.xml", }; String[] repositoryModuleFileNames = { "xml/consistency/module-a-1.0.1-SNAPSHOT.xml", "xml/consistency/module-b-2.3.2-needs-a-1.1.xml", "xml/consistency/module-c-1.0-needs-b-2.3.2.xml", }; ModuleManager moduleManager = TestHelpers.createModuleManager(installedModuleFileNames, repositoryModuleFileNames); moduleManager.synchronizeWithRepository(ProgressMonitor.NULL); assertEquals(2, moduleManager.getInstalledModuleItems().length); assertEquals(1, moduleManager.getUpdatableModuleItems().length); assertEquals(1, moduleManager.getAvailableModuleItems().length); ConsistencyChecker checker = new ConsistencyChecker(moduleManager); findModuleItem(moduleManager.getAvailableModuleItems(), "module-c").setAction(ModuleItem.Action.INSTALL); findModuleItem(moduleManager.getUpdatableModuleItems(), "module-b").setAction(ModuleItem.Action.UPDATE); assertTrue(checker.check()); } public void testWithDependencyToLowerVersionAsPresent() throws CoreException { String[] installedModuleFileNames = { "xml/consistency/module-a-1.0.xml", "xml/consistency/module-b-2.4.xml", }; String[] repositoryModuleFileNames = { "xml/consistency/module-a-1.2-needs-b-2.3.2.xml", "xml/consistency/module-c-1.0-needs-b-2.3.2.xml", }; ModuleManager moduleManager = TestHelpers.createModuleManager(installedModuleFileNames, repositoryModuleFileNames); moduleManager.synchronizeWithRepository(ProgressMonitor.NULL); assertEquals(2, moduleManager.getInstalledModuleItems().length); assertEquals(1, moduleManager.getUpdatableModuleItems().length); assertEquals(1, moduleManager.getAvailableModuleItems().length); ConsistencyChecker checker = new ConsistencyChecker(moduleManager); findModuleItem(moduleManager.getAvailableModuleItems(), "module-c").setAction(ModuleItem.Action.INSTALL); findModuleItem(moduleManager.getUpdatableModuleItems(), "module-a").setAction(ModuleItem.Action.UPDATE); assertTrue(checker.check()); } public void testWithMissingOptionalDependencies() throws CoreException { String[] installedModuleFileNames = { "xml/consistency/module-a-1.0.xml", "xml/consistency/module-b-2.3.1.xml", }; String[] repositoryModuleFileNames = { "xml/consistency/module-b-2.3.2-needs-a-1.1-optional.xml", "xml/consistency/module-c-1.0-needs-b-2.3.2.xml", }; ModuleManager moduleManager = TestHelpers.createModuleManager(installedModuleFileNames, repositoryModuleFileNames); moduleManager.synchronizeWithRepository(ProgressMonitor.NULL); assertEquals(2, moduleManager.getInstalledModuleItems().length); assertEquals(1, moduleManager.getUpdatableModuleItems().length); assertEquals(1, moduleManager.getAvailableModuleItems().length); ConsistencyChecker checker = new ConsistencyChecker(moduleManager); findModuleItem(moduleManager.getUpdatableModuleItems(), "module-b").setAction(ModuleItem.Action.UPDATE); assertTrue(checker.check()); findModuleItem(moduleManager.getAvailableModuleItems(), "module-c").setAction(ModuleItem.Action.INSTALL); assertTrue(checker.check()); } public void testUninstall() throws CoreException { String[] installedModuleFileNames = { "xml/consistency/module-a-1.2-needs-b-2.3.2.xml", "xml/consistency/module-c-1.0-needs-b-2.3.2.xml", "xml/consistency/module-b-2.3.2.xml", }; ModuleManager moduleManager = TestHelpers.createModuleManager(installedModuleFileNames, new String[0]); moduleManager.synchronizeWithRepository(ProgressMonitor.NULL); assertEquals(3, moduleManager.getInstalledModuleItems().length); assertEquals(0, moduleManager.getUpdatableModuleItems().length); assertEquals(0, moduleManager.getAvailableModuleItems().length); ConsistencyChecker checker = new ConsistencyChecker(moduleManager); findModuleItem(moduleManager.getInstalledModuleItems(), "module-b").setAction(ModuleItem.Action.UNINSTALL); assertFalse(checker.check()); findModuleItem(moduleManager.getInstalledModuleItems(), "module-a").setAction(ModuleItem.Action.UNINSTALL); findModuleItem(moduleManager.getInstalledModuleItems(), "module-c").setAction(ModuleItem.Action.UNINSTALL); assertTrue(checker.check()); } public void testWithMissingDependencies() throws CoreException { String[] installedModuleFileNames = { "xml/consistency/module-a-1.0.xml", "xml/consistency/module-b-2.3.1.xml", }; String[] repositoryModuleFileNames = { "xml/consistency/module-a-1.0.1-SNAPSHOT.xml", "xml/consistency/module-b-2.3.2-needs-a-1.1.xml", "xml/consistency/module-c-1.0-needs-b-2.3.2.xml", }; ModuleManager moduleManager = TestHelpers.createModuleManager(installedModuleFileNames, repositoryModuleFileNames); moduleManager.synchronizeWithRepository(ProgressMonitor.NULL); assertEquals(2, moduleManager.getInstalledModuleItems().length); assertEquals(2, moduleManager.getUpdatableModuleItems().length); assertEquals(1, moduleManager.getAvailableModuleItems().length); ConsistencyChecker checker = new ConsistencyChecker(moduleManager); findModuleItem(moduleManager.getAvailableModuleItems(), "module-c").setAction(ModuleItem.Action.INSTALL); assertFalse(checker.check()); assertMissingDependency(checker, "module-b", "2.3.2", "module-c","1.0"); findModuleItem(moduleManager.getUpdatableModuleItems(), "module-b").setAction(ModuleItem.Action.UPDATE); assertFalse(checker.check()); assertMissingDependency(checker, "module-a", "1.1", "module-b","2.3.2"); } private void assertMissingDependency(ConsistencyChecker checker, String dependencyName, String dependencyVersion, String declaredByName, String declaredByVersion) { MissingDependencyInfo dependencyInfo = findDependency(checker.getMissingDependencies(), dependencyName, dependencyVersion); if (dependencyInfo == null) { String message = MessageFormat.format("Missing dependency to {0}-{1} by {2}-{3} not detected", dependencyName, dependencyVersion, declaredByName, declaredByVersion); fail(message); } Module[] neededbyModules = dependencyInfo.getDependentModules(); if(findModule(neededbyModules, declaredByName, declaredByVersion) == null) { String message = MessageFormat.format("Missing dependency to {0}-{1} is not declared by {2}-{3}", dependencyName, dependencyVersion, declaredByName, declaredByVersion); fail(message); } } private MissingDependencyInfo findDependency( MissingDependencyInfo[] missingDependencies, String moduleName, String version) { for (MissingDependencyInfo missingDependency : missingDependencies) { Dependency dependency = missingDependency.getDependency(); if (dependency.getModuleSymbolicName().equals(moduleName) && dependency.getVersion().equals(version)) { return missingDependency; } } return null; } private ModuleItem findModuleItem(ModuleItem[] items, String symbolicName) { for (ModuleItem item : items) { if (item.getModule().getSymbolicName().equals(symbolicName)) { return item; } } return null; } private Module findModule(Module[] modules, String symbolicName, String version) { for (Module module : modules) { if (module.getSymbolicName().equals(symbolicName) && module.getVersion().equals(Version.parseVersion(version))) { return module; } } return null; } }