/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.aries.application.modelling; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.jar.Manifest; import org.apache.aries.application.modelling.ExportedPackage; import org.apache.aries.application.modelling.ImportedPackage; import org.apache.aries.application.modelling.ImportedService; import org.apache.aries.application.modelling.ModelledResource; import org.apache.aries.application.modelling.ModelledResourceManager; import org.apache.aries.application.modelling.impl.ModelledResourceManagerImpl; import org.apache.aries.application.modelling.impl.ModellingManagerImpl; import org.apache.aries.application.modelling.impl.ParserProxyTest; import org.apache.aries.application.modelling.standalone.OfflineModellingFactory; import org.apache.aries.mocks.BundleContextMock; import org.apache.aries.util.filesystem.FileSystem; import org.apache.aries.util.io.IOUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import static org.junit.Assert.*; @RunWith(Parameterized.class) public class ModellerTest { @Parameters public static List<Object[]> getDifferentModelledResourceManagers() { ModelledResourceManagerImpl manager = new ModelledResourceManagerImpl(); manager.setModellingManager(new ModellingManagerImpl()); manager.setParserProxy(ParserProxyTest.getMockParserServiceProxy()); manager.setModellingPlugins(Collections.<ServiceModeller>emptyList()); return Arrays.asList(new Object[][] { {OfflineModellingFactory.getModelledResourceManager()}, {manager} }); } @BeforeClass public static void setup() throws Exception { URL pathToTestBundle = ModellerTest.class.getClassLoader().getResource("test.bundle"); File testBundleDir = new File(pathToTestBundle.toURI()); File outputArchive = new File(testBundleDir.getParentFile(), "test.bundle.jar"); FileInputStream fis = new FileInputStream(new File(testBundleDir, "META-INF/MANIFEST.MF")); Manifest manifest = new Manifest(fis); fis.close(); IOUtils.jarUp(testBundleDir, outputArchive, manifest); } @AfterClass public static void cleanup() { BundleContextMock.clear(); } private final ModelledResourceManager sut; public ModellerTest(ModelledResourceManager sut) { this.sut = sut; } @Test public void testParsingByInputStreamProvider() throws Exception { final URL pathToTestBundle = getClass().getClassLoader().getResource("test.bundle.jar"); ModelledResource resource = sut.getModelledResource("file:///test.bundle.uri", new ModelledResourceManager.InputStreamProvider() { public InputStream open() throws IOException { return pathToTestBundle.openStream(); } } ); checkTestBundleResource(resource); } @Test public void testParsingOfBundle() throws Exception { URL pathToTestBundle = getClass().getClassLoader().getResource("test.bundle"); ModelledResource resource = sut.getModelledResource( "file:///test.bundle.uri", FileSystem.getFSRoot(new File(pathToTestBundle.toURI()))); checkTestBundleResource(resource); } private void checkTestBundleResource(ModelledResource resource) { assertNotNull(resource); assertEquals("file:///test.bundle.uri", resource.getLocation()); // sanity check that we have parsed the manifest and package imports / exports assertEquals("test.bundle", resource.getSymbolicName()); assertEquals("1.0.0", resource.getVersion()); assertEquals(1, resource.getExportedPackages().size()); assertEquals(3, resource.getImportedPackages().size()); boolean foundFirstPackage = false; for (ImportedPackage pack : resource.getImportedPackages()) { if ("javax.jms".equals(pack.getPackageName()) && "1.1.0".equals(pack.getVersionRange())) foundFirstPackage = true; } assertTrue(foundFirstPackage); ExportedPackage epack = resource.getExportedPackages().iterator().next(); assertEquals("wibble", epack.getPackageName()); assertEquals("1.0.0", epack.getVersion()); assertEquals("true", epack.getAttributes().get("directive:")); // sanity check that we have parsed the services assertEquals(4, resource.getExportedServices().size()); assertEquals(4, resource.getImportedServices().size()); boolean foundFirst = false; for (ImportedService service : resource.getImportedServices()) { if ("foo.bar.MyInjectedService".equals(service.getInterface())) { foundFirst = true; assertTrue(service.isOptional()); assertFalse(service.isList()); assertEquals("anOptionalReference", service.getId()); } } assertTrue(foundFirst); } }