blob: bc295baee91c58cd5ad6d212e8cff1c5db427b1f [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.framework;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import junit.framework.TestCase;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.service.packageadmin.ExportedPackage;
public class PackageAdminImplTest extends TestCase
{
private File tempDir;
private Felix felix;
private File cacheDir;
@Override
protected void setUp() throws Exception
{
super.setUp();
tempDir = File.createTempFile("felix-temp", ".dir");
assertTrue("precondition", tempDir.delete());
assertTrue("precondition", tempDir.mkdirs());
cacheDir = new File(tempDir, "felix-cache");
assertTrue("precondition", cacheDir.mkdir());
String cache = cacheDir.getPath();
Map<String,String> params = new HashMap<String, String>();
params.put("felix.cache.profiledir", cache);
params.put("felix.cache.dir", cache);
params.put(Constants.FRAMEWORK_STORAGE, cache);
felix = new Felix(params);
felix.init();
felix.start();
}
@Override
protected void tearDown() throws Exception
{
super.tearDown();
felix.stop(); // Note that this method is async
felix = null;
deleteDir(tempDir);
tempDir = null;
cacheDir = null;
}
public void testExportedPackages() throws Exception
{
String bmf = "Bundle-SymbolicName: pkg.bundle\n"
+ "Bundle-Version: 1\n"
+ "Bundle-ManifestVersion: 2\n"
+ "Export-Package: org.foo.bundle\n";
File bundleFile = createBundle(bmf);
String fmf = "Bundle-SymbolicName: pkg.frag\n"
+ "Bundle-Version: 1\n"
+ "Fragment-Host: pkg.bundle\n"
+ "Bundle-ManifestVersion: 2\n"
+ "Export-Package: org.foo.fragment;version=\"2.0.0\"\n";
File fragFile = createBundle(fmf);
Bundle b = felix.getBundleContext().installBundle(bundleFile.toURI().toASCIIString());
Bundle f = felix.getBundleContext().installBundle(fragFile.toURI().toASCIIString());
b.start();
try
{
PackageAdminImpl pa = new PackageAdminImpl(felix);
assertEquals(b, pa.getExportedPackage("org.foo.bundle").getExportingBundle());
assertEquals(b, pa.getExportedPackage("org.foo.fragment").getExportingBundle());
Set<String> expected = new HashSet<String>();
expected.addAll(Arrays.asList("org.foo.bundle", "org.foo.fragment"));
Set<String> actual = new HashSet<String>();
for (ExportedPackage ep : pa.getExportedPackages(b))
{
actual.add(ep.getName());
assertEquals(b, ep.getExportingBundle());
}
assertEquals(expected, actual);
ExportedPackage[] bundlePkgs = pa.getExportedPackages("org.foo.bundle");
assertEquals(1, bundlePkgs.length);
assertEquals(b, bundlePkgs[0].getExportingBundle());
assertEquals(new Version("0"), bundlePkgs[0].getVersion());
ExportedPackage[] fragPkgs = pa.getExportedPackages("org.foo.fragment");
assertEquals(1, fragPkgs.length);
assertEquals("The fragment package should be exposed through the bundle",
b, fragPkgs[0].getExportingBundle());
assertEquals(new Version("2"), fragPkgs[0].getVersion());
}
finally
{
b.stop();
b.uninstall();
f.uninstall();
}
}
private File createBundle(String manifest) throws IOException
{
File f = File.createTempFile("felix-bundle", ".jar", tempDir);
Manifest mf = new Manifest(new ByteArrayInputStream(manifest.getBytes("UTF-8")));
mf.getMainAttributes().putValue("Manifest-Version", "1.0");
JarOutputStream os = new JarOutputStream(new FileOutputStream(f), mf);
os.close();
return f;
}
private static void deleteDir(File root) throws IOException
{
if (root.isDirectory())
{
File[] files = root.listFiles();
if (files != null)
{
for (File file : files)
{
deleteDir(file);
}
}
}
root.delete();
}
}