Package org.apache.felix.deploymentadmin.itest

Source Code of org.apache.felix.deploymentadmin.itest.DeploymentPackageBuilderTest

/*
* 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;
    }
}
TOP

Related Classes of org.apache.felix.deploymentadmin.itest.DeploymentPackageBuilderTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.