| /* |
| * 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 WARRANTIES OR 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.felix.deploymentadmin.itest; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.Arrays; |
| import java.util.jar.Attributes; |
| import java.util.jar.JarEntry; |
| import java.util.jar.JarInputStream; |
| import java.util.jar.Manifest; |
| |
| import junit.framework.TestCase; |
| |
| import org.apache.felix.deploymentadmin.itest.util.DeploymentPackageBuilder; |
| import org.apache.felix.deploymentadmin.itest.util.DeploymentPackageBuilder.JarManifestManipulatingFilter; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| /** |
| * Test cases for {@link DeploymentPackageBuilder}. |
| */ |
| public class DeploymentPackageBuilderTest extends TestCase { |
| |
| private String m_testBundleBasePath; |
| |
| @Before |
| public void setUp() throws Exception { |
| File f = new File("../testbundles").getAbsoluteFile(); |
| assertTrue("Failed to find test bundles directory?!", f.exists() && f.isDirectory()); |
| |
| m_testBundleBasePath = f.getAbsolutePath(); |
| } |
| |
| /** |
| * Tests that we can build a deployment package with a bundle resource. |
| */ |
| @Test |
| public void testCreateMissingBundleResourceOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = DeploymentPackageBuilder.create("dp-test", "1.0.0"); |
| dpBuilder |
| .setFixPackage() |
| .add(dpBuilder.createBundleResource() |
| .setUrl(getTestBundle("bundle1")).setMissing() |
| ); |
| |
| JarInputStream jis = new JarInputStream(dpBuilder.generate()); |
| assertNotNull(jis); |
| |
| Manifest manifest = jis.getManifest(); |
| assertManifestHeader(manifest, "DeploymentPackage-SymbolicName", "dp-test"); |
| assertManifestHeader(manifest, "DeploymentPackage-Version", "1.0.0"); |
| |
| String filename = getBundleName("bundle1"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.bundle1"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.0.0"); |
| assertManifestEntry(manifest, filename, "DeploymentPackage-Missing", "true"); |
| |
| int count = countJarEntries(jis); |
| |
| assertEquals("Expected two entries in the JAR!", 0, count); |
| } |
| |
| /** |
| * Tests that we can build a deployment package with a bundle resource. |
| */ |
| @Test |
| public void testCreateMinimalSingleBundleResourceOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = DeploymentPackageBuilder.create("dp-test", "1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource() |
| .setUrl(getTestBundle("bundle1")) |
| ); |
| |
| JarInputStream jis = new JarInputStream(dpBuilder.generate()); |
| assertNotNull(jis); |
| |
| Manifest manifest = jis.getManifest(); |
| assertManifestHeader(manifest, "DeploymentPackage-SymbolicName", "dp-test"); |
| assertManifestHeader(manifest, "DeploymentPackage-Version", "1.0.0"); |
| |
| String filename = getBundleName("bundle1"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.bundle1"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.0.0"); |
| |
| int count = countJarEntries(jis); |
| |
| assertEquals("Expected two entries in the JAR!", 1, count); |
| } |
| |
| /** |
| * Tests that we can filter a resource. |
| */ |
| @Test |
| public void testResourceFilterOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = DeploymentPackageBuilder.create("dp-test", "1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource() |
| .setUrl(getTestBundle("bundle2"))) |
| .add(dpBuilder.createBundleResource() |
| .setVersion("1.1.0") |
| .setFilter(new JarManifestManipulatingFilter("Bundle-Version", "1.1.0", "Foo", "bar")) |
| .setUrl(getTestBundle("bundle1"))); |
| |
| JarInputStream jis = new JarInputStream(dpBuilder.generate()); |
| assertNotNull(jis); |
| |
| Manifest manifest = jis.getManifest(); |
| assertManifestHeader(manifest, "DeploymentPackage-SymbolicName", "dp-test"); |
| assertManifestHeader(manifest, "DeploymentPackage-Version", "1.0.0"); |
| |
| String filename = getBundleName("bundle1"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.bundle1"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.1.0"); |
| |
| filename = getBundleName("bundle2"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.bundle2"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.0.0"); |
| |
| try { |
| byte[] buf = new byte[32 * 1024]; |
| |
| JarEntry entry; |
| while ((entry = jis.getNextJarEntry()) != null) { |
| if (entry.getName().endsWith("valid-bundle1.jar")) { |
| int read = jis.read(buf); |
| |
| JarInputStream jis2 = new JarInputStream(new ByteArrayInputStream(Arrays.copyOf(buf, read))); |
| Manifest manifest2 = jis2.getManifest(); |
| |
| Attributes mainAttributes = manifest2.getMainAttributes(); |
| assertEquals("1.1.0", mainAttributes.getValue("Bundle-Version")); |
| assertEquals("bar", mainAttributes.getValue("Foo")); |
| |
| jis2.close(); |
| } |
| jis.closeEntry(); |
| } |
| } |
| finally { |
| jis.close(); |
| } |
| } |
| |
| /** |
| * Tests that we can build a deployment package with a "plain" resource and resource processor. |
| */ |
| @Test |
| public void testCreateMinimalSingleResourceAndProcessorOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = DeploymentPackageBuilder.create("dp-test", "1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createResourceProcessorResource() |
| .setUrl(getTestBundle("rp1"))) |
| .add(dpBuilder.createResource() |
| .setResourceProcessorPID("org.apache.felix.deploymentadmin.test.rp1") |
| .setUrl(getTestResource("test-config1.xml")) |
| ); |
| |
| JarInputStream jis = new JarInputStream(dpBuilder.generate()); |
| assertNotNull(jis); |
| |
| Manifest manifest = jis.getManifest(); |
| assertManifestHeader(manifest, "DeploymentPackage-SymbolicName", "dp-test"); |
| assertManifestHeader(manifest, "DeploymentPackage-Version", "1.0.0"); |
| |
| String filename = getBundleName("rp1"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.rp1"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.0.0"); |
| |
| filename = "test-config1.xml"; |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Resource-Processor", "org.apache.felix.deploymentadmin.test.rp1"); |
| |
| int count = countJarEntries(jis); |
| |
| assertEquals("Expected two entries in the JAR!", 2, count); |
| } |
| |
| /** |
| * Tests that we can build a deployment package with two bundle resources. |
| */ |
| @Test |
| public void testCreateMinimalTwoBundleResourcesOk() throws Exception { |
| DeploymentPackageBuilder dpBuilder = DeploymentPackageBuilder.create("dp-test", "1.0.0"); |
| dpBuilder |
| .add(dpBuilder.createBundleResource() |
| .setUrl(getTestBundle("bundle1")) |
| ) |
| .add(dpBuilder.createBundleResource() |
| .setUrl(getTestBundle("bundle2")) |
| ); |
| |
| JarInputStream jis = new JarInputStream(dpBuilder.generate()); |
| assertNotNull(jis); |
| |
| Manifest manifest = jis.getManifest(); |
| assertManifestHeader(manifest, "DeploymentPackage-SymbolicName", "dp-test"); |
| assertManifestHeader(manifest, "DeploymentPackage-Version", "1.0.0"); |
| |
| String filename = getBundleName("bundle1"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.bundle1"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.0.0"); |
| |
| filename = getBundleName("bundle2"); |
| |
| assertManifestEntry(manifest, filename, "Name", filename); |
| assertManifestEntry(manifest, filename, "Bundle-SymbolicName", "testbundles.bundle2"); |
| assertManifestEntry(manifest, filename, "Bundle-Version", "1.0.0"); |
| |
| int count = countJarEntries(jis); |
| |
| assertEquals("Expected two entries in the JAR!", 2, count); |
| } |
| |
| private void assertAttributes(Attributes attributes, String headerName, String expectedValue) |
| throws RuntimeException { |
| assertNotNull("No attributes given!", attributes); |
| assertEquals(headerName, expectedValue, attributes.getValue(headerName)); |
| } |
| |
| private void assertManifestEntry(Manifest manifest, String key, String headerName, String expectedValue) |
| throws RuntimeException { |
| Attributes attributes = manifest.getEntries().get(key); |
| assertNotNull("No attributes found for: " + key, attributes); |
| assertAttributes(attributes, headerName, expectedValue); |
| } |
| |
| private void assertManifestHeader(Manifest manifest, String headerName, String expectedValue) |
| throws RuntimeException { |
| assertAttributes(manifest.getMainAttributes(), headerName, expectedValue); |
| } |
| |
| private int countJarEntries(JarInputStream jis) throws IOException { |
| int count = 0; |
| try { |
| while (jis.getNextJarEntry() != null) { |
| count++; |
| jis.closeEntry(); |
| } |
| } |
| finally { |
| jis.close(); |
| } |
| return count; |
| } |
| |
| private String getBundleName(String baseName) { |
| return String.format("org.apache.felix.deploymentadmin.test.%1$s-1.0.0.jar", baseName); |
| } |
| |
| private String getBundleFilename(String baseName) { |
| return String.format("%1$s/target/org.apache.felix.deploymentadmin.test.%1$s-1.0.0.jar", baseName); |
| } |
| |
| private URL getTestBundle(String baseName) throws MalformedURLException { |
| File f = new File(m_testBundleBasePath, getBundleFilename(baseName)); |
| assertTrue("No such bundle: " + f, f.exists() && f.isFile()); |
| return f.toURI().toURL(); |
| } |
| |
| private URL getTestResource(String resourceName) { |
| if (!resourceName.startsWith("/")) { |
| resourceName = "/".concat(resourceName); |
| } |
| URL resource = getClass().getResource(resourceName); |
| assertNotNull("No such resource: " + resourceName, resource); |
| return resource; |
| } |
| } |