blob: 43658354b565dbab72fc81532c1e80329d00bcb0 [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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
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.Map;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.dto.ServiceReferenceDTO;
import org.osgi.framework.launch.Framework;
import org.osgi.framework.namespace.BundleNamespace;
import org.osgi.framework.namespace.HostNamespace;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.framework.startlevel.BundleStartLevel;
import org.osgi.framework.startlevel.dto.BundleStartLevelDTO;
import org.osgi.framework.wiring.dto.BundleRevisionDTO;
import org.osgi.framework.wiring.dto.BundleWiringDTO;
import org.osgi.resource.dto.CapabilityDTO;
public class DTOFactoryTest
{
private int counter;
private Framework framework;
private File testDir;
@Before
public void setUp() throws Exception
{
String path = "/" + getClass().getName().replace('.', '/') + ".class";
String url = getClass().getResource(path).getFile();
String baseDir = url.substring(0, url.length() - path.length());
String rndStr = Long.toString(System.nanoTime(), Character.MAX_RADIX);
rndStr = rndStr.substring(rndStr.length() - 6, rndStr.length() - 1);
testDir = new File(baseDir, getClass().getSimpleName() + "_" + rndStr);
File cacheDir = new File(testDir, "cache");
cacheDir.mkdirs();
String cache = cacheDir.getAbsolutePath();
Map<String, Object> params = new HashMap<String, Object>();
params.put("felix.cache.profiledir", cache);
params.put("felix.cache.dir", cache);
params.put(Constants.FRAMEWORK_STORAGE, cache);
framework = new Felix(params);
framework.init();
framework.start();
}
@After
public void tearDown() throws Exception
{
framework.stop();
}
@Test
public void testBundleStartLevelDTO() throws Exception
{
String mf = "Bundle-SymbolicName: tb1\n"
+ "Bundle-Version: 1.0.0\n"
+ "Bundle-ManifestVersion: 2\n";
File bf = createBundle(mf);
Bundle bundle = framework.getBundleContext().installBundle(bf.toURI().toURL().toExternalForm());
BundleStartLevel sl = bundle.adapt(BundleStartLevel.class);
sl.setStartLevel(7);
BundleStartLevelDTO dto = bundle.adapt(BundleStartLevelDTO.class);
assertEquals(bundle.getBundleId(), dto.bundle);
assertEquals(7, dto.startLevel);
}
@Test
public void testServiceReferenceDTOArray() throws Exception
{
ServiceRegistration<String> reg = framework.getBundleContext().registerService(String.class, "hi", null);
Long sid = (Long) reg.getReference().getProperty(Constants.SERVICE_ID);
ServiceReferenceDTO[] dtos = framework.adapt(ServiceReferenceDTO[].class);
assertTrue(dtos.length > 0);
boolean found = false;
for (ServiceReferenceDTO dto : dtos)
{
if (dto.id == sid)
{
found = true;
assertEquals(0L, dto.bundle);
assertEquals(sid, dto.properties.get(Constants.SERVICE_ID));
assertTrue(Arrays.equals(new String [] {String.class.getName()},
(String []) dto.properties.get(Constants.OBJECTCLASS)));
assertEquals(0L, dto.properties.get(Constants.SERVICE_BUNDLEID));
assertEquals(Constants.SCOPE_SINGLETON, dto.properties.get(Constants.SERVICE_SCOPE));
assertEquals(0, dto.usingBundles.length);
}
}
assertTrue(found);
}
@Test
public void testServiceReferenceDTOArrayStoppedBundle() throws Exception
{
String mf = "Bundle-SymbolicName: tb2\n"
+ "Bundle-Version: 1.2.3\n"
+ "Bundle-ManifestVersion: 2\n"
+ "Import-Package: org.osgi.framework;version=\"[1.1,2)\"";
File bf = createBundle(mf);
Bundle bundle = framework.getBundleContext().installBundle(bf.toURI().toURL().toExternalForm());
assertNull("Precondition", bundle.getBundleContext());
ServiceReferenceDTO[] dtos = bundle.adapt(ServiceReferenceDTO[].class);
// Note this is incorrectly tested by the Core Framework R6 CT, which expects an
// empty array. However this is not correct and recorded as a deviation.
assertNull("As the bundle is not started, the dtos should be null", dtos);
}
@Test
public void testBundleRevisionDTO() throws Exception
{
String mf = "Bundle-SymbolicName: tb2\n"
+ "Bundle-Version: 1.2.3\n"
+ "Bundle-ManifestVersion: 2\n"
+ "Import-Package: org.osgi.framework;version=\"[1.1,2)\"";
File bf = createBundle(mf);
Bundle bundle = framework.getBundleContext().installBundle(bf.toURI().toURL().toExternalForm());
bundle.start();
assertEquals("Precondition", Bundle.ACTIVE, bundle.getState());
BundleRevisionDTO dto = bundle.adapt(BundleRevisionDTO.class);
assertEquals(bundle.getBundleId(), dto.bundle);
assertTrue(dto.id != 0);
assertEquals("tb2", dto.symbolicName);
assertEquals("1.2.3", dto.version);
assertEquals(0, dto.type);
boolean foundBundle = false;
boolean foundHost = false;
boolean foundIdentity = false;
int resource = 0;
for (CapabilityDTO cap : dto.capabilities)
{
assertTrue(cap.id != 0);
if (resource == 0)
resource = cap.resource;
else
assertEquals(resource, cap.resource);
if (BundleNamespace.BUNDLE_NAMESPACE.equals(cap.namespace))
{
foundBundle = true;
assertEquals("tb2", cap.attributes.get(BundleNamespace.BUNDLE_NAMESPACE));
assertEquals("1.2.3", cap.attributes.get(BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
}
else if (HostNamespace.HOST_NAMESPACE.equals(cap.namespace))
{
foundHost = true;
assertEquals("tb2", cap.attributes.get(HostNamespace.HOST_NAMESPACE));
assertEquals("1.2.3", cap.attributes.get(HostNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
}
else if (IdentityNamespace.IDENTITY_NAMESPACE.equals(cap.namespace))
{
foundIdentity = true;
assertEquals("tb2", cap.attributes.get(IdentityNamespace.IDENTITY_NAMESPACE));
assertEquals("1.2.3", cap.attributes.get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE));
assertEquals(IdentityNamespace.TYPE_BUNDLE, cap.attributes.get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE));
}
}
assertTrue(foundBundle);
assertTrue(foundHost);
assertTrue(foundIdentity);
}
@Test
public void testBundleRevisionDTOArray() throws Exception {
String mf = "Bundle-SymbolicName: tb2\n"
+ "Bundle-Version: 1.2.3\n"
+ "Bundle-ManifestVersion: 2\n"
+ "Import-Package: org.osgi.framework;version=\"[1.1,2)\"";
File bf = createBundle(mf);
Bundle bundle = framework.getBundleContext().installBundle(bf.toURI().toURL().toExternalForm());
bundle.start();
assertEquals("Precondition", Bundle.ACTIVE, bundle.getState());
BundleRevisionDTO[] dtos = bundle.adapt(BundleRevisionDTO[].class);
assertEquals(1, dtos.length);
BundleRevisionDTO dto = dtos[0];
assertEquals(bundle.getBundleId(), dto.bundle);
assertTrue(dto.id != 0);
assertEquals("tb2", dto.symbolicName);
assertEquals("1.2.3", dto.version);
assertEquals(0, dto.type);
boolean foundBundle = false;
boolean foundHost = false;
boolean foundIdentity = false;
int resource = 0;
for (CapabilityDTO cap : dto.capabilities)
{
assertTrue(cap.id != 0);
if (resource == 0)
resource = cap.resource;
else
assertEquals(resource, cap.resource);
if (BundleNamespace.BUNDLE_NAMESPACE.equals(cap.namespace))
{
foundBundle = true;
assertEquals("tb2", cap.attributes.get(BundleNamespace.BUNDLE_NAMESPACE));
assertEquals("1.2.3", cap.attributes.get(BundleNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
}
else if (HostNamespace.HOST_NAMESPACE.equals(cap.namespace))
{
foundHost = true;
assertEquals("tb2", cap.attributes.get(HostNamespace.HOST_NAMESPACE));
assertEquals("1.2.3", cap.attributes.get(HostNamespace.CAPABILITY_BUNDLE_VERSION_ATTRIBUTE));
}
else if (IdentityNamespace.IDENTITY_NAMESPACE.equals(cap.namespace))
{
foundIdentity = true;
assertEquals("tb2", cap.attributes.get(IdentityNamespace.IDENTITY_NAMESPACE));
assertEquals("1.2.3", cap.attributes.get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE));
assertEquals(IdentityNamespace.TYPE_BUNDLE, cap.attributes.get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE));
}
}
assertTrue(foundBundle);
assertTrue(foundHost);
assertTrue(foundIdentity);
}
@Test
public void testBundleWiringDTO() throws Exception {
String mf = "Bundle-SymbolicName: tb2\n"
+ "Bundle-Version: 1.2.3\n"
+ "Bundle-ManifestVersion: 2\n"
+ "Import-Package: org.osgi.framework;version=\"[1.1,2)\"";
File bf = createBundle(mf);
Bundle bundle = framework.getBundleContext().installBundle(bf.toURI().toURL().toExternalForm());
bundle.start();
assertEquals("Precondition", Bundle.ACTIVE, bundle.getState());
BundleWiringDTO dto = bundle.adapt(BundleWiringDTO.class);
assertEquals(bundle.getBundleId(), dto.bundle);
}
private File createBundle(String manifest) throws IOException
{
File f = File.createTempFile("felix-bundle" + counter++, ".jar", testDir);
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;
}
}