blob: e38d53898b49ecdc1ec76dc210d79a0d2be47a49 [file] [log] [blame]
/*
* 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;
}
}