/* * 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 com.bc.ceres.core.CoreException; import com.bc.ceres.core.runtime.*; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.XppDomReader; import com.thoughtworks.xstream.io.xml.XppDomWriter; import com.thoughtworks.xstream.io.xml.xppdom.XppDom; import junit.framework.TestCase; import java.io.IOException; import java.io.InputStream; import java.io.Reader; /** * Unit test for simple ModuleReader. */ public class ModuleManifestParserTest extends TestCase { private static class Foo { String name; int age; } public void testXStreamUnmarshal() { XppDom fooElem = new XppDom(Foo.class.getName()); XppDom nameElem = new XppDom("name"); nameElem.setValue("Bibo"); fooElem.addChild(nameElem); XppDom ageElem = new XppDom("age"); ageElem.setValue("41"); fooElem.addChild(ageElem); XppDomReader domReader = new XppDomReader(fooElem); Foo foo = new Foo(); new XStream().unmarshal(domReader, foo); assertEquals("Bibo", foo.name); assertEquals(41, foo.age); } public void testXStreamMarshal() { Foo foo = new Foo(); foo.name = "Bert"; foo.age = 63; XppDomWriter domWriter = new XppDomWriter(); new XStream().marshal(foo, domWriter); XppDom fooElem = domWriter.getConfiguration(); assertNotNull(fooElem); assertNotNull(fooElem.getChild("name")); assertNotNull(fooElem.getChild("age")); assertEquals("Bert", fooElem.getChild("name").getValue()); assertEquals("63", fooElem.getChild("age").getValue()); } public void testNullArgConvention() throws CoreException { try { new ModuleManifestParser().parse((String) null); fail(); } catch (NullPointerException e) { } try { new ModuleManifestParser().parse((InputStream) null); fail(); } catch (NullPointerException e) { } try { new ModuleManifestParser().parse((Reader) null); fail(); } catch (NullPointerException e) { } } public void testAllParseMethodsProduceSameResults() throws CoreException { Module ma = new ModuleManifestParser().parse(Resources.loadText("xml/module-a.xml")); Module mb = new ModuleManifestParser().parse(Resources.openStream("xml/module-a.xml")); Module mc = new ModuleManifestParser().parse(Resources.openReader("xml/module-a.xml")); assertEquals(mb.getSymbolicName(), ma.getSymbolicName()); assertEquals(mc.getSymbolicName(), mb.getSymbolicName()); } public void testModuleA() throws IOException, CoreException { ModuleImpl module_a = TestHelpers.parseModuleManifest("xml/module-a.xml"); testModule(module_a, "module-a", "1.0", "jar", "Module A", "This is Module A", DefaultActivator.class.getName(), 2, 0, 0); testDependency(module_a, 0, null, "xstream", null); testDependency(module_a, 1, null, "xpp3", null); String[] categories = module_a.getCategories(); assertNotNull(categories); assertEquals(5, categories.length); assertEquals("CHRIS", categories[0]); assertEquals("MERIS", categories[1]); assertEquals("Processor", categories[2]); assertEquals("Reader", categories[3]); assertEquals("Writer", categories[4]); } public void testModuleB() throws IOException, CoreException { ModuleImpl module_b = TestHelpers.parseModuleManifest("xml/module-b.xml"); testModule(module_b, "module-b", "2.4.2-SNAPSHOT", "jar", "Module B", "This is Module B", "com.bc.modules.ModuleBActivator", 1, 3, 2); testDependency(module_b, 0, "module-a", null, null); testExtensionPoint(module_b.getExtensionPoints()[0], module_b, "ep-1"); testExtensionPoint(module_b.getExtensionPoints()[1], module_b, "ep-2"); testExtensionPoint(module_b.getExtensionPoints()[2], module_b, "ep-3"); String[] categories = module_b.getCategories(); assertNotNull(categories); assertEquals(0, categories.length); } public void testModuleC() throws IOException, CoreException { ModuleImpl module_c = TestHelpers.parseModuleManifest("xml/module-c.xml"); testModule(module_c, "module-c", "1.0", "jar", null, "This is Module C", DefaultActivator.class.getName(), 1, 0, 6); testDependency(module_c, 0, "module-b", null, null); testExtension(module_c.getExtensions()[0], module_c, "e-cb11", "module-b:ep-1"); testExtension(module_c.getExtensions()[1], module_c, "e-cb12", "module-b:ep-1"); testExtension(module_c.getExtensions()[2], module_c, "e-cb21", "module-b:ep-2"); testExtension(module_c.getExtensions()[3], module_c, "e-cb31", "module-b:ep-3"); testExtension(module_c.getExtensions()[4], module_c, "e-cb32", "module-b:ep-3"); testExtension(module_c.getExtensions()[5], module_c, "e-cb33", "module-b:ep-3"); Extension extension_32 = module_c.getExtensions()[1]; assertNotNull(extension_32.getConfigurationElement()); assertEquals("extension", extension_32.getConfigurationElement().getName()); assertNotNull(extension_32.getConfigurationElement().getChildren()); assertEquals(0, extension_32.getConfigurationElement().getChildren().length); Extension extension_31 = module_c.getExtensions()[0]; ConfigurationElement configurationElement31 = extension_31.getConfigurationElement(); assertNotNull(configurationElement31); assertEquals("extension", configurationElement31.getName()); assertNull(configurationElement31.getParent()); ConfigurationElement[] children = configurationElement31.getChildren(); assertEquals(2, children.length); assertEquals("source", children[0].getName()); assertEquals("A", children[0].getValue()); assertSame(configurationElement31, children[0].getParent()); assertEquals("target", children[1].getName()); assertEquals("B", children[1].getValue()); assertSame(configurationElement31, children[1].getParent()); } public void testModuleD() throws IOException, CoreException { ModuleImpl module_d = TestHelpers.parseModuleManifest("xml/module-d.xml"); testModule(module_d, "module-d", "3", "jar", null, "This is Module D", "com.bc.modules.ModuleDActivator", 1, 2, 0); testDependency(module_d, 0, "module-a", null, null); testExtensionPoint(module_d.getExtensionPoints()[0], module_d, "ep-1"); testExtensionPoint(module_d.getExtensionPoints()[1], module_d, "ep-2"); } public void testModuleE() throws IOException, CoreException { ModuleImpl module_e = TestHelpers.parseModuleManifest("xml/module-e.xml"); testModule(module_e, "module-e", "1.0", "jar", null, "This is Module E", DefaultActivator.class.getName(), 3, 0, 7); testDependency(module_e, 0, "module-b", null, "2.4.2-SNAPSHOT"); testDependency(module_e, 1, "module-d", null, "3"); testDependency(module_e, 2, null, "netcdf", "1.2.4"); testExtension(module_e.getExtensions()[0], module_e, "e-eb11", "module-b:ep-1"); testExtension(module_e.getExtensions()[1], module_e, "e-eb21", "module-b:ep-2"); testExtension(module_e.getExtensions()[2], module_e, "e-eb31", "module-b:ep-3"); testExtension(module_e.getExtensions()[3], module_e, "e-eb32", "module-b:ep-3"); testExtension(module_e.getExtensions()[4], module_e, "e-ed21", "module-d:ep-2"); testExtension(module_e.getExtensions()[5], module_e, "e-ed22", "module-d:ep-2"); testExtension(module_e.getExtensions()[6], module_e, "e-ed33", "module-d:ep-3"); } public void testModuleMinimum() throws IOException, CoreException { ModuleImpl module_min = TestHelpers.parseModuleManifest("xml/module-minimum.xml"); assertNotNull(module_min); assertNull(module_min.getRegistry()); testModule(module_min, "minimal-module", "1.0", "jar", null, null, DefaultActivator.class.getName(), 0, 0, 0); } public void testModuleDetails() throws IOException, CoreException { ModuleImpl module_details = TestHelpers.parseModuleManifest("xml/module-details.xml"); assertNotNull(module_details); testModule(module_details, "module-details", "9.9.9", "jar", "Module Details", "Lorem ipsum ex sint omnes intellegebat vis, mucius nostrum usu id. No probo probatus qui, has ceteros " + "nostrum dissentias an, affert torquatos vim ut. In eos nulla quaerendum, est labore appareat ea. Admodum " + "assueverit constituam ut vis, oratio fabulas nostrum te vel. Id eam utamur deleniti consulatu. Quo utinam graeco " + "consetetur at. Nam nullam nominati interpretaris ei.", DefaultActivator.class.getName(), 0, 0, 0); assertEquals("ACME Inc.", module_details.getVendor()); } public void testModuleNoManifestVersion() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-no-manifest-version.xml"); fail("error expected"); } catch (CoreException e) { assertTrue(e.getMessage().startsWith("Missing manifest version")); } } public void testModuleNoId() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-no-id.xml"); fail("error expected"); } catch (CoreException e) { assertTrue(e.getMessage().startsWith("Missing module identifier")); } } public void testModuleWithLinebreakInElement() throws IOException, CoreException { ModuleImpl module = TestHelpers.parseModuleManifest("xml/module-element-linebreak.xml"); assertNotNull(module); assertEquals("element-linebreak-module", module.getSymbolicName()); assertEquals("Ju faka fojo pasko cia, obl subjunkcio solstariva supersigno er, onia kontra?a cis fi. Tek he metr kien. Mis co " + "havi alta negativa. End nf pero ioma. De meze tuje tempolongo des. " + "Sola seksa geinstruisto sur fi, mf vole estiel eksterna sia. Ato semajntago substantiva ed, ge volu kvanto " + "anta?parto ili, pov em super jugoslavo. Ne cent intera vir, nea video matematika rolvorta?o am. Eksa sekvanta " + "deksesuma sep ej, kv nen amen lingvonomo, eg jen stif kelka rekta. Je tuja samo aha, ko hoj pako kasedo.", module.getDescription()); } public void testModuleEmptyId() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-empty-id.xml"); fail("error expected"); } catch (CoreException e) { assertTrue(e.getMessage().startsWith("Empty module identifier")); } } public void testModuleEmptyVersion() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-empty-version.xml"); fail("error expected"); } catch (CoreException e) { assertTrue(e.getMessage().contains("version")); } } public void testModuleInvalidVersion() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-invalid-version.xml"); fail("error expected"); } catch (CoreException e) { assertTrue(e.getMessage().contains("version")); } } public void testEmptyFile() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-empty.xml"); fail("error expected"); } catch (CoreException e) { assertNotNull(e.getCause()); } } public void testModuleNoXml() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-no-xml.xml"); fail("error expected"); } catch (CoreException e) { assertNotNull(e.getCause()); } } public void testModuleMalformedXml() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-malformed-xml.xml"); fail("error expected"); } catch (CoreException e) { assertNotNull(e.getCause()); } } public void testModuleUnknownElement() throws IOException { try { TestHelpers.parseModuleManifest("xml/module-unknown-element.xml"); fail("error expected"); } catch (CoreException e) { assertNotNull(e.getCause()); } } private static void testModule(ModuleImpl module, String symbolicName, String version, String packaging, String name, String description, String activatorClassName, int declaredDependencyCount, int extensionPointCount, int extensionCount) { assertNotNull(module); assertEquals(-1, module.getModuleId()); assertEquals(symbolicName, module.getSymbolicName()); assertEquals(Version.parseVersion(version), module.getVersion()); assertEquals(packaging, module.getPackaging()); assertEquals(name, module.getName()); assertEquals(description, module.getDescription()); assertEquals(activatorClassName, module.getActivatorClassName()); assertNotNull(module.getDeclaredDependencies()); assertEquals(declaredDependencyCount, module.getDeclaredDependencies().length); assertNotNull(module.getExtensionPoints()); assertEquals(extensionPointCount, module.getExtensionPoints().length); assertNotNull(module.getExtensions()); assertEquals(extensionCount, module.getExtensions().length); assertEquals(null, module.getActivator()); assertEquals(null, module.getRegistry()); assertEquals(null, module.getContext()); assertEquals(ModuleState.NULL, module.getState()); assertNull(module.getImpliciteLibs()); assertNull(module.getImpliciteNativeLibs()); assertNull(module.getDeclaredLibs()); assertNull(module.getModuleDependencies()); assertNull(module.getClassLoader()); assertNull(module.getLocation()); assertNull(module.getContext()); assertNull(module.getActivator()); } private static void testDependency(Module module, int index, String moduleId, String jarName, String version) { Dependency dependency = module.getDeclaredDependencies()[index]; assertNotNull(dependency); assertSame(module, dependency.getDeclaringModule()); assertEquals(moduleId, dependency.getModuleSymbolicName()); assertEquals(jarName, dependency.getLibName()); assertEquals(version, dependency.getVersion()); } private static void testExtensionPoint(ExtensionPoint extensionPoint, Module declaringModule, String id) { assertNotNull(extensionPoint); assertSame(declaringModule, extensionPoint.getDeclaringModule()); assertNull(extensionPoint.getExtensions()); assertEquals(id, extensionPoint.getId()); } private static void testExtension(Extension extension, Module declaringModule, String id, String point) { assertNotNull(extension); assertSame(declaringModule, extension.getDeclaringModule()); assertNull(extension.getExtensionPoint()); assertEquals(id, extension.getId()); assertEquals(point, extension.getPoint()); } }