/** * Copyright (C) 2013 Colorado School of Mines * * This file is part of the Interface Software Development Kit (SDK). * * The InterfaceSDK 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. * * The InterfaceSDK 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 the InterfaceSDK. If not, see <http://www.gnu.org/licenses/>. */ package edu.mines.acmX.exhibit.module_management; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import javax.print.DocFlavor.URL; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import edu.mines.acmX.exhibit.input_services.hardware.BadDeviceFunctionalityRequestException; import edu.mines.acmX.exhibit.input_services.hardware.BadFunctionalityRequestException; import edu.mines.acmX.exhibit.input_services.hardware.HardwareManager; import edu.mines.acmX.exhibit.input_services.hardware.HardwareManagerManifestException; import edu.mines.acmX.exhibit.input_services.hardware.UnknownDriverRequest; import edu.mines.acmX.exhibit.input_services.hardware.drivers.InvalidConfigurationFileException; import edu.mines.acmX.exhibit.module_management.loaders.ManifestLoadException; import edu.mines.acmX.exhibit.module_management.loaders.ModuleLoadException; import edu.mines.acmX.exhibit.module_management.metas.DependencyType; import edu.mines.acmX.exhibit.module_management.metas.ModuleManagerMetaData; import edu.mines.acmX.exhibit.module_management.metas.ModuleMetaData; import edu.mines.acmX.exhibit.module_management.metas.ModuleMetaDataBuilder; import edu.mines.acmX.exhibit.module_management.modules.CommandlineModule; import edu.mines.acmX.exhibit.module_management.modules.ModuleInterface; /** * Unit test for ModuleManager */ public class ModuleManagerTest { private class TestModule extends CommandlineModule { public TestModule() { } @Override public void run() { } } @Before public void resetModuleManager() { ModuleManager.removeInstance(); ModuleManager.createEmptyInstance(); } @Test public void testLoadModuleInModuleManager() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { Map<String, DependencyType> desiredInputs = new HashMap<String, DependencyType>(); Map<String, DependencyType> desiredModules = new HashMap<String, DependencyType>(); ModuleMetaData moduleToLoadData = new ModuleMetaData( "com.andrew.random", "Horses", "0.0.0", "0.0.0", "horse.jpg", "i_love_horseys", "andrew demaria", "0.1", desiredInputs, desiredModules, false); moduleToLoadData.setJarFileName("HorseSimpleGood.jar"); // the third argument is null because we dont need to interact with the // hw manager at this point ModuleManagerMetaData metaNeeded = new ModuleManagerMetaData("", "src/test/resources/modules/", null); ModuleManager m = ModuleManager.getInstance(); m.setMetaData(metaNeeded); ModuleInterface module = m.loadModuleFromMetaData(moduleToLoadData); assertTrue(module != null); } @Test public void testGetInstance() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager m = ModuleManager.getInstance(); assertTrue(m instanceof ModuleManager); ModuleManager other = ModuleManager.getInstance(); assertTrue(m == other); } // expect a throw when the xml is baddly formed @Test(expected = Exception.class) public void testBadXMLModuleManagerConfig() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { String xmlPath = "src/test/resources/module_manager/testBadXMLModuleManagerManifest.xml"; ModuleManager m = ModuleManager.getInstance(); m.loadModuleManagerConfig(xmlPath); } // expect a throw when an xml attribute is missing. @Test(expected = Exception.class) public void testBadDataModuleManagerConfig() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { String xmlPath = "src/test/resources/module_manager/testBadDataModuleManagerManifest.xml"; ModuleManager m = ModuleManager.getInstance(); m.loadModuleManagerConfig(xmlPath); } // This should go through the test/resources/modules directory and get the // appropriate ModuleMetaData structures from jar files. @Test public void testLoadAllModuleConfigs() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> metas = m .loadAllModuleConfigs("src/test/resources/test_load_modules"); assertEquals(2, metas.size()); } /** * This test should ensure that only jar files get loaded and everything * else is skipped. * * @throws BadDeviceFunctionalityRequestException * @throws HardwareManagerManifestException */ @Test public void testLoadAllModuleConfigsWhenOtherStuffInDirectory() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager manager = ModuleManager.getInstance(); Map<String, ModuleMetaData> map = manager .loadAllModuleConfigs("src/test/resources/test_load_modules"); assertTrue(map.size() == 2); } /** * This test should ensure that the module loading is not recursive and wont * load in jar files in subdirectories of the main module directory * * @throws BadDeviceFunctionalityRequestException * @throws HardwareManagerManifestException */ @Test public void testLoadAllModuleConfigsIsNotRecursive() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager manager = ModuleManager.getInstance(); Map<String, ModuleMetaData> map = manager .loadAllModuleConfigs("src/test/resources/test_load_modules"); assertTrue(map.containsKey("com.should.nothave") == false); } /** * Most of this functionality will be tested in the ModuleLoader, however * this just ensures that ModuleManager gets what it needs. * * @throws BadDeviceFunctionalityRequestException * @throws HardwareManagerManifestException */ @Test public void testLoadModuleFromMetaData() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { // not sure if we need this since it will be calling another tested // function. // TODO Map<String, DependencyType> desiredInputs = new HashMap<String, DependencyType>(); Map<String, DependencyType> desiredModules = new HashMap<String, DependencyType>(); Map<String, ModuleMetaData> moduleMetas = new HashMap<String, ModuleMetaData>(); String jarName = "HorseSimpleGood.jar"; ModuleMetaData moduleToLoadData = new ModuleMetaData( "com.andrew.random", "Horses", "0.0.0", "0.0.0", "horse.jpg", "i_love_horseys", "andrew demaria", "0.1", desiredInputs, desiredModules, false); moduleToLoadData.setJarFileName(jarName); moduleMetas.put("com.andrew.random", moduleToLoadData); // again we do not need the third argument because hw manager will not be needed ModuleManagerMetaData data = new ModuleManagerMetaData( "com.andrew.random", "src/test/resources/modules", null); ModuleManager manager = ModuleManager.getInstance(); manager.setModuleMetaDataMap(moduleMetas); manager.setMetaData(data); manager.setCurrentModuleMetaData("com.andrew.random"); assertTrue(manager.loadModuleFromMetaData(moduleToLoadData) instanceof ModuleInterface); } private ModuleMetaData createEmptyModuleMetaData(String packageName, String className) { Map<String, DependencyType> inputTypes = new HashMap<String, DependencyType>(); Map<String, DependencyType> moduleDepA = new HashMap<String, DependencyType>(); ModuleMetaData a = new ModuleMetaData(packageName, className, "2.3", "2.3", "icon.png", "Title" + className, "Andrew", "0.1", inputTypes, moduleDepA, false); return a; } @Test public void testCheckModuleDependencies() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.REQUIRED); a.setModuleDependencies(alist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.checkDependencies(); assertTrue(m.getModuleMetaDataMap().size() == 2); assertTrue(m.getModuleMetaDataMap().get(a.getPackageName()) == a); assertTrue(m.getModuleMetaDataMap().get(b.getPackageName()) == b); } @Test public void testCheckModuleDependencyMissing() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.REQUIRED); a.setModuleDependencies(alist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); m.setModuleMetaDataMap(modConfigs); m.checkDependencies(); assertTrue(m.getModuleMetaDataMap().size() == 0); } @Test public void testCheckModuleDependencyMissingWhenOptional() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.OPTIONAL); a.setModuleDependencies(alist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); m.setModuleMetaDataMap(modConfigs); m.checkDependencies(); assertTrue(m.getModuleMetaDataMap().size() == 1); assertTrue(m.getModuleMetaDataMap().get(a.getPackageName()) == a); } @Test public void testCheckCircularModuleDependencies() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.REQUIRED); a.setModuleDependencies(alist); Map<String, DependencyType> blist = new HashMap<String, DependencyType>(); blist.put("com.test.A", DependencyType.REQUIRED); b.setModuleDependencies(blist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.checkDependencies(); assertTrue(m.getModuleMetaDataMap().size() == 2); assertTrue(m.getModuleMetaDataMap().get(a.getPackageName()) == a); assertTrue(m.getModuleMetaDataMap().get(b.getPackageName()) == b); } @Test public void testCheckRecursiveMissingModuleDependcies() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.REQUIRED); a.setModuleDependencies(alist); Map<String, DependencyType> blist = new HashMap<String, DependencyType>(); blist.put("com.test.C", DependencyType.REQUIRED); b.setModuleDependencies(blist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.checkDependencies(); assertTrue(m.getModuleMetaDataMap().size() == 0); } @Test public void testSetDefaultModuleValid() throws Exception { ModuleManager.removeInstance(); ModuleManager.createEmptyInstance(); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modMetas = new HashMap<String, ModuleMetaData>(); String jarPath = "HorseSimpleGood.jar"; ModuleMetaData defaultModMeta = new ModuleMetaData("com.andrew.random", "Horses", null, null, null, null, null, null, new HashMap<String, DependencyType>(), new HashMap<String, DependencyType>(), false); defaultModMeta.setJarFileName(jarPath); modMetas.put("com.andrew.random", defaultModMeta); // TODO m.setMetaData(new ModuleManagerMetaData("com.andrew.random", "src/test/resources/modules", null)); m.setModuleMetaDataMap(modMetas); Method setDefault = ModuleManager.class.getDeclaredMethod( "setDefaultModule", String.class); setDefault.setAccessible(true); setDefault.invoke(m, "com.andrew.random"); assertEquals("com.andrew.random", m.getMetaData() .getDefaultModuleName()); } // default case @Test public void testSetNextModuleRequired() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); TestModule aModule = new TestModule(); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.REQUIRED); a.setModuleDependencies(alist); // also need to set mm meta data. ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); //m.createHardwareInstance(); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); m.setCurrentModule(aModule); assertTrue(m.setNextModule("com.test.B") == true); } // fails because current module tries to open module it didn't // specify in its manifest @Test public void testSetNextModuleIllegal() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); TestModule aModule = new TestModule(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); ModuleManager m = ModuleManager.getInstance(); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); m.setCurrentModule(aModule); assertTrue(m.setNextModule("com.test.B") == false); } // passes because optional module is preset @Test public void testSetNextModuleOptionalWorks() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); TestModule aModule = new TestModule(); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.OPTIONAL); a.setModuleDependencies(alist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); m.setCurrentModule(aModule); assertTrue(m.setNextModule("com.test.B") == true); } // fails because optional module isn't present @Test public void testSetNextModuleOptionalFails() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); TestModule aModule = new TestModule(); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.OPTIONAL); a.setModuleDependencies(alist); ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); m.setCurrentModule(aModule); assertTrue(m.setNextModule("com.test.B") == false); } /** * This test ensures that we can load resources as InputStreams from the * jars the Modules came from * * @throws ModuleLoadException * @throws ManifestLoadException * @throws BadDeviceFunctionalityRequestException * @throws HardwareManagerManifestException */ /*@Test @Ignore public void testLoadingResourcesFromDifferentModules() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { // remove the instance so we can actually call the constructor ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ModuleManagerManifestWithoutDevices.xml"); ModuleManager m = ModuleManager.getInstance(); // InputStream test = m.loadResourceFromModule( // "resources/images/horse.jpg", "com.andrew.random"); // assertTrue(test != null); }*/ /** * This test ensures that the ModuleManager uses the current module for * loading resources from if it is not specified * * @throws ModuleLoadException * @throws ManifestLoadException * @throws BadDeviceFunctionalityRequestException * @throws HardwareManagerManifestException */ /*@Test @Ignore public void testLoadingResourcesFromCurrentModule() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ModuleManagerManifestWithoutDevices.xml"); ModuleManager m = ModuleManager.getInstance(); ModuleMetaData current = m.getModuleMetaDataMap().get( "com.andrew.random"); m.setCurrentModuleMetaData(current); // InputStream test = m // .loadResourceFromModule("resources/images/horse.jpg"); // // assertTrue(test != null); }*/ // /** // * Test that module manager loads the default if the next module to run does // * not have its hardware requirements met // * @throws SecurityException // * @throws NoSuchMethodException // * @throws BadDeviceFunctionalityRequestException // * @throws HardwareManagerManifestException // * @throws ModuleLoadException // * @throws ManifestLoadException // * @throws InvocationTargetException // * @throws IllegalArgumentException // * @throws IllegalAccessException // * @throws NoSuchFieldException // */ // @Test // public void testManagerRevertToDefaultOnModuleBadHardwareRequest() throws NoSuchMethodException, SecurityException, ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException { // ModuleManager.removeInstance(); // ModuleManager.configure("src/test/resources/module_manager/BadHardwareRequestModuleManagerManifest.xml"); // ModuleManager m = ModuleManager.getInstance(); // // //set the next module to load as the module with the bad hardware requests // assertTrue(m.setNextModule("edu.mines.ademaria.badmodules.badrequired")); // // Method setupDefaultRuntime = ModuleManager.class.getDeclaredMethod("setupDefaultRuntime"); // setupDefaultRuntime.setAccessible(true); // setupDefaultRuntime.invoke(m); // // // now check that the default module is the current module // // Field getCurrentModule = ModuleManager.class.getDeclaredField("currentModuleMetaData"); // getCurrentModule.setAccessible(true); // ModuleMetaData current = (ModuleMetaData) getCurrentModule.get(m); // //assertTrue(current.getPackageName(), "") // // } /** * Tests that the setNextModule gives proper feedback when a module cannot be set * @throws ManifestLoadException * @throws ModuleLoadException * @throws HardwareManagerManifestException * @throws BadDeviceFunctionalityRequestException */ /*@Test public void testCannotSetModuleWithoutNeededDriver() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/BadHardwareRequestModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setCurrentModuleMetaData("com.austindiviness.cltest"); assertFalse(m.setNextModule("edu.mines.ademaria.badmodules.badrequired")); }*/ /** * Tests that the setNextModule gives proper feedback when a module can be set * * @throws ManifestLoadException * @throws ModuleLoadException * @throws HardwareManagerManifestException * @throws BadDeviceFunctionalityRequestException */ @Test public void testCanSetModuleWhenDriverPresent() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setCurrentModuleMetaData("com.austindiviness.cltest"); assertTrue(m.setNextModule("edu.mines.ademaria.goodmodules.goodrequireddriver")); } /** * Test that module manager loads when hardware is there and setup correctly * @throws ManifestLoadException * @throws BadDeviceFunctionalityRequestException * @throws HardwareManagerManifestException * @throws ModuleLoadException * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws NoSuchMethodException * @throws InvocationTargetException */ /*@Test public void testRevertToDefaultOnBadDriverRequest() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/BadHardwareRequestModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); // pretend the next module was set (to skip that logic) // default = false Field loadDefault = ModuleManager.class.getDeclaredField("loadDefault"); loadDefault.setAccessible(true); loadDefault.set(m, false); // set the nextModuleMetaData // TODO change this to instead use a generated ModuleMetaData so we can skip some of the logic for ModuleManager ModuleMetaData badMetaData = m.getModuleMetaDataMap().get("edu.mines.ademaria.badmodules.badrequired"); Field nextModuleMeta = ModuleManager.class.getDeclaredField("nextModuleMetaData"); nextModuleMeta.setAccessible(true); nextModuleMeta.set(m, badMetaData); // call the setup function Method setupDefaultRuntime = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); setupDefaultRuntime.setAccessible(true); setupDefaultRuntime.invoke(m); // check that the module was reverted to default Field currentMeta = ModuleManager.class.getDeclaredField("currentModuleMetaData"); currentMeta.setAccessible(true); ModuleMetaData actual = (ModuleMetaData) currentMeta.get(m); assertEquals(actual.getPackageName(), "com.austindiviness.cltest"); }*/ @Test public void testDefaultIsLoadedAfterModuleMgrConstructor() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); ModuleMetaData defaultModuleMetaData = m.getDefaultModuleMetaData(); assertTrue(defaultModuleMetaData.getPackageName().equals("com.austindiviness.cltest")); } /** * Here we check to ensure the default module, during the main run loop, * will throw an exception should it's input types be invalid. * * Since we use inflection to call the private method, we have to cast the * exception so that we don't expect an invocation exception. */ /*@Test(expected=BadDeviceFunctionalityRequestException.class) public void testDefaultCheckPermissionsFailForRuntime() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setDefault(true); Map<String, DependencyType> inputTypes = new HashMap<String, DependencyType>(); ModuleMetaDataBuilder builder = new ModuleMetaDataBuilder(); builder.addInputType("some_func", DependencyType.REQUIRED); builder.setPackageName("com.austindiviness.cltest"); builder.setClassName("Launch"); ModuleMetaData mmd = builder.build(); mmd.setJarFileName("cltest.jar"); m.setDefaultModuleMetaData(mmd); try { Method preDefaultRT = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); preDefaultRT.setAccessible(true); preDefaultRT.invoke(m); } catch (InvocationTargetException e) { if (e.getCause() instanceof BadDeviceFunctionalityRequestException) { throw (BadDeviceFunctionalityRequestException) e.getCause(); } else { throw e; } } }*/ /*@Test public void testFailingFuncCurrentModuleCheckPermissionsRevertsToDefault() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setDefault(false); ModuleMetaDataBuilder builder = new ModuleMetaDataBuilder(); builder.addInputType("some_func", DependencyType.REQUIRED); builder.setPackageName("BAD_PACKAGE_NAME"); builder.setClassName("BAD_CLASS_NAME"); ModuleMetaData mmd = builder.build(); mmd.setJarFileName("HelloWorld.jar"); m.setNextModuleMetaData(mmd); Method setupPreRT = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); setupPreRT.setAccessible(true); setupPreRT.invoke(m); ModuleMetaData currMMD = m.getCurrentModuleMetaData(); assertTrue(currMMD.getPackageName().equals("com.austindiviness.cltest")); }*/ /*@Test public void testFailingLoadCurrentModuleCheckPermissionsThrowsRevertsToDefault() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setDefault(false); ModuleMetaDataBuilder builder = new ModuleMetaDataBuilder(); builder.addInputType("some_func", DependencyType.REQUIRED); builder.setPackageName("edu.mines.andrew.games"); builder.setClassName("Hello"); ModuleMetaData mmd = builder.build(); mmd.setJarFileName("HelloWorld.jar"); m.setNextModuleMetaData(mmd); Method setupPreRT = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); setupPreRT.setAccessible(true); setupPreRT.invoke(m); ModuleMetaData currMMD = m.getCurrentModuleMetaData(); assertTrue(currMMD.getPackageName().equals("com.austindiviness.cltest")); }*/ /*@Test(expected=BadFunctionalityRequestException.class) public void testResetDriversFailsForDefault() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InvalidConfigurationFileException, BadFunctionalityRequestException, UnknownDriverRequest { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); HardwareManager.setManifestFilepath("hardware_manager_manifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setDefault(true); ModuleMetaDataBuilder builder = new ModuleMetaDataBuilder(); builder.addInputType("rgbimage", DependencyType.REQUIRED); builder.setPackageName("edu.mines.andrew.games"); builder.setClassName("Hello"); ModuleMetaData mmd = builder.build(); mmd.setJarFileName("HelloWorld.jar"); m.setDefaultModuleMetaData(mmd); Map<String, String> configStore = new HashMap<String, String>(); HardwareManager hm = HardwareManager.getInstance(); hm.setConfigurationFileStore(configStore); try { Method setupPreRT = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); setupPreRT.setAccessible(true); setupPreRT.invoke(m); } catch (InvocationTargetException e) { if (e.getCause() instanceof BadFunctionalityRequestException) { throw (BadFunctionalityRequestException) e.getCause(); } else { throw e; } } }*/ /*@Test public void testResetDriversRevertsToDefaultDuringSetupPreRuntime() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); HardwareManager.setManifestFilepath("hardware_manager_manifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setDefault(false); ModuleMetaDataBuilder builder = new ModuleMetaDataBuilder(); // Valid functionalities so it passes checkPermissions builder.addInputType("rgbimage", DependencyType.REQUIRED); // Valid module so it passes loadModule builder.setPackageName("edu.mines.andrew.games"); builder.setClassName("Hello"); ModuleMetaData mmd = builder.build(); mmd.setJarFileName("HelloWorld.jar"); // Emulate changing the next module to run m.setNextModuleMetaData(mmd); // Have a failing config store for the kinect driver Map<String, String> configStore = new HashMap<String, String>(); HardwareManager.getInstance().setConfigurationFileStore(configStore); Method setupPreRT = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); setupPreRT.setAccessible(true); setupPreRT.invoke(m); ModuleMetaData currMMD = m.getCurrentModuleMetaData(); assertTrue(currMMD.getPackageName().equals("com.austindiviness.cltest")); }*/ /*@Test(expected=ModuleLoadException.class) public void testThatAModuleLoadExceptionOccursFromABadDefaultModuleDuringPreRuntime() throws ManifestLoadException, HardwareManagerManifestException, ModuleLoadException, BadDeviceFunctionalityRequestException, IllegalAccessException, IllegalArgumentException, NoSuchMethodException, SecurityException, InvocationTargetException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); HardwareManager.setManifestFilepath("hardware_manager_manifest.xml"); ModuleManager m = ModuleManager.getInstance(); ModuleMetaDataBuilder builder = new ModuleMetaDataBuilder(); // Valid module so it passes loadModule builder.setPackageName("edu.mines.andrew.games"); builder.setClassName("Hello"); ModuleMetaData mmd = builder.build(); mmd.setJarFileName("BADJARNAME.jar"); // Emulate changing the next module to run m.setDefaultModuleMetaData(mmd); m.setDefault(true); try { Method setupPreRT = ModuleManager.class.getDeclaredMethod("setupPreRuntime"); setupPreRT.setAccessible(true); setupPreRT.invoke(m); } catch (InvocationTargetException e) { if (e.getCause() instanceof ModuleLoadException) { throw (ModuleLoadException) e.getCause(); } else { throw e; } } }*/ @Test public void testThatAModuleCanGetItsOwnMetaData() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleManager.removeInstance(); ModuleManager.configure("src/test/resources/module_manager/ExampleModuleManagerManifest.xml"); HardwareManager.setManifestFilepath("hardware_manager_manifest.xml"); ModuleManager m = ModuleManager.getInstance(); m.setCurrentModuleMetaData("com.austindiviness.cltest"); ModuleMetaData mmd = m.getModuleMetaData("com.austindiviness.cltest"); assertTrue(mmd != null); } @Test public void testThatAModuleCanGetAnotherModuleMetaDataWhenItRequires() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.REQUIRED); a.setModuleDependencies(alist); // also need to set mm meta data. ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); ModuleMetaData mmd = m.getModuleMetaData(b.getPackageName()); assertTrue(mmd != null); } @Test public void testThatAModuleCannotGetAnotherModuleMetaDataThatItDoesNotRequire() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); a.setModuleDependencies(alist); // also need to set mm meta data. ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); ModuleMetaData mmd = m.getModuleMetaData(b.getPackageName()); assertTrue(mmd == null); } @Test public void testThatAModuleCanGetAnotherModuleMetaDataWhenItOptional() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); Map<String, DependencyType> alist = new HashMap<String, DependencyType>(); alist.put("com.test.B", DependencyType.OPTIONAL); a.setModuleDependencies(alist); // also need to set mm meta data. ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); ModuleMetaData mmd = m.getModuleMetaData(b.getPackageName()); assertTrue(mmd != null); } @Test public void testThatAModuleCanGetAnotherModuleMetaDataWhenOptionalAll() throws ManifestLoadException, ModuleLoadException, HardwareManagerManifestException, BadDeviceFunctionalityRequestException { ModuleMetaData a = createEmptyModuleMetaData("com.test.A", "A"); ModuleMetaData b = createEmptyModuleMetaData("com.test.B", "B"); a.setOptionalAll(true); // also need to set mm meta data. ModuleManager m = ModuleManager.getInstance(); Map<String, ModuleMetaData> modConfigs = new HashMap<String, ModuleMetaData>(); modConfigs.put(a.getPackageName(), a); modConfigs.put(b.getPackageName(), b); m.setModuleMetaDataMap(modConfigs); m.setCurrentModuleMetaData(a.getPackageName()); ModuleMetaData mmd = m.getModuleMetaData(b.getPackageName()); assertTrue(mmd != null); } }