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