blob: c584387670acdd7e79ed0b61d5830b9d70150691 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.services.resolver;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.framework.util.CaseInsensitiveDictionaryMap;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.ExportPackageDescription;
import org.eclipse.osgi.service.resolver.GenericDescription;
import org.eclipse.osgi.service.resolver.State;
import org.eclipse.osgi.util.ManifestElement;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.namespace.IdentityNamespace;
import org.osgi.framework.wiring.BundleWire;
import org.osgi.framework.wiring.BundleWiring;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
public class OSGiCapabilityTest extends AbstractStateTest {
private static final String MANIFEST_ROOT = "test_files/genericCapability/";
public static Test suite() {
return new TestSuite(OSGiCapabilityTest.class);
}
public OSGiCapabilityTest(String name) {
super(name);
}
private Dictionary loadManifest(String manifest) {
URL url = getContext().getBundle().getEntry(MANIFEST_ROOT + manifest);
try {
CaseInsensitiveDictionaryMap<String, String> headers = new CaseInsensitiveDictionaryMap<>();
ManifestElement.parseBundleManifest(url.openStream(), headers);
return headers.asUnmodifiableDictionary();
} catch (IOException e) {
fail("Unexpected error loading manifest: " + manifest, e);
} catch (BundleException e) {
fail("Unexpected error loading manifest: " + manifest, e);
}
return null;
}
public void testGenericsOSGiOSGi() throws BundleException {
doGenericBasicsTest("p1.osgi.MF", "p2.osgi.MF", "p3.osgi.MF", "c1.osgi.MF", "c2.osgi.MF", "c3.osgi.MF");
}
public void testGenericsOSGiEquinox() throws BundleException {
doGenericBasicsTest("p1.osgi.MF", "p2.osgi.MF", "p3.osgi.MF", "c1.equinox.MF", "c2.equinox.MF", "c3.equinox.MF");
}
public void testGenericsOSGiNameEquinox() throws BundleException {
doGenericBasicsTest("p1.osgi.name.MF", "p2.osgi.name.MF", "p3.osgi.name.MF", "c1.equinox.MF", "c2.equinox.MF", "c3.equinox.MF");
}
public void testGenericsOSGiNameOSGi() throws BundleException {
doGenericBasicsTest("p1.osgi.name.MF", "p2.osgi.name.MF", "p3.osgi.name.MF", "c1.osgi.MF", "c2.osgi.MF", "c3.osgi.MF");
}
public void testGenericsOSGiNameEquinoxName() throws BundleException {
doGenericBasicsTest("p1.osgi.name.MF", "p2.osgi.name.MF", "p3.osgi.name.MF", "c1.equinox.name.MF", "c2.equinox.name.MF", "c3.equinox.name.MF");
}
public void testGenericsEquinoxOSGi() throws BundleException {
doGenericBasicsTest("p1.equinox.MF", "p2.equinox.MF", "p3.equinox.MF", "c1.osgi.MF", "c2.osgi.MF", "c3.osgi.MF");
}
public void testGenericsEquinoxEquinox() throws BundleException {
doGenericBasicsTest("p1.equinox.MF", "p2.equinox.MF", "p3.equinox.MF", "c1.equinox.MF", "c2.equinox.MF", "c3.equinox.MF");
}
private void doGenericBasicsTest(String p1Manifest, String p2Manifest, String p3Manifest, String c1Manifest, String c2Manifest, String c3Manifest) throws BundleException {
State state = buildEmptyState();
long bundleID = 0;
Dictionary manifest;
manifest = loadManifest(p1Manifest);
BundleDescription p1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest(p2Manifest);
BundleDescription p2 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest(p3Manifest);
BundleDescription p3 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest(c1Manifest);
BundleDescription c1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest(c2Manifest);
BundleDescription c2 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest(c3Manifest);
BundleDescription c3 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p3);
state.addBundle(p2);
state.addBundle(p1);
state.addBundle(c1);
state.addBundle(c2);
state.addBundle(c3);
state.resolve();
assertTrue("p1", p1.isResolved());
assertTrue("p2", p2.isResolved());
assertTrue("p3", p3.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c2", c2.isResolved());
assertTrue("c3", c3.isResolved());
checkGenericBasics(4, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities());
checkGenericBasics(4, c2.getResolvedGenericRequires(), p2.getSelectedGenericCapabilities());
checkGenericBasics(4, c3.getResolvedGenericRequires(), p3.getSelectedGenericCapabilities());
if (p1Manifest.indexOf(".osgi.") != -1) {
checkForNonEffectiveCapability(p1);
checkForNonEffectiveCapability(p2);
checkForNonEffectiveCapability(p3);
}
if (c1Manifest.indexOf(".osgi.") != -1) {
checkForNonEffectiveRequirement(c1);
checkForNonEffectiveRequirement(c2);
checkForNonEffectiveRequirement(c3);
}
File stateDir = getContext().getDataFile(getName()); //$NON-NLS-1$
stateDir.mkdirs();
try {
state.getFactory().writeState(state, stateDir);
state = state.getFactory().readState(stateDir);
} catch (IOException e) {
fail("Error writing/reading state.", e);
}
p1 = state.getBundle(p1.getBundleId());
p2 = state.getBundle(p2.getBundleId());
p3 = state.getBundle(p3.getBundleId());
c1 = state.getBundle(c1.getBundleId());
c2 = state.getBundle(c2.getBundleId());
c3 = state.getBundle(c3.getBundleId());
assertTrue("p1", p1.isResolved());
assertTrue("p2", p2.isResolved());
assertTrue("p3", p3.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c2", c2.isResolved());
assertTrue("c3", c3.isResolved());
checkGenericBasics(4, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities());
checkGenericBasics(4, c2.getResolvedGenericRequires(), p2.getSelectedGenericCapabilities());
checkGenericBasics(4, c3.getResolvedGenericRequires(), p3.getSelectedGenericCapabilities());
if (p1Manifest.indexOf(".osgi.") != -1) {
checkForNonEffectiveCapability(p1);
checkForNonEffectiveCapability(p2);
checkForNonEffectiveCapability(p3);
}
if (c1Manifest.indexOf(".osgi.") != -1) {
checkForNonEffectiveRequirement(c1);
checkForNonEffectiveRequirement(c2);
checkForNonEffectiveRequirement(c3);
}
}
private static final String notEffective = "not.effective";
private void checkForNonEffectiveCapability(BundleDescription p1) {
List nonEffectiveCaps = p1.getCapabilities(notEffective);
assertNotNull(nonEffectiveCaps);
assertEquals("Wrong number of not.effective", 1, nonEffectiveCaps.size());
Capability c = (Capability) nonEffectiveCaps.get(0);
assertEquals("Wrong effective value", Constants.EFFECTIVE_ACTIVE, c.getDirectives().get(Constants.EFFECTIVE_DIRECTIVE));
}
private void checkForNonEffectiveRequirement(BundleDescription c1) {
List nonEffectiveReqs = c1.getRequirements(notEffective);
assertNotNull(nonEffectiveReqs);
assertEquals("Wrong number of not.effective", 1, nonEffectiveReqs.size());
Requirement r = (Requirement) nonEffectiveReqs.get(0);
assertEquals("Wrong effective value", Constants.EFFECTIVE_ACTIVE, r.getDirectives().get(Constants.EFFECTIVE_DIRECTIVE));
}
private void checkGenericBasics(int expectedCnt, GenericDescription[] genRequired, GenericDescription[] genProvided) {
checkGenericBasics(expectedCnt, genRequired, genProvided, null);
}
private void checkGenericBasics(int expectedCnt, GenericDescription[] genRequired, GenericDescription[] genProvided, GenericDescription fragIdentity) {
assertEquals("Expected number of capabilities do not match", expectedCnt, genRequired.length);
assertEquals("Specs do not match Descs", genRequired.length, genProvided.length + (fragIdentity == null ? 0 : 1));
Collection providedCollection = new ArrayList(Arrays.asList(genProvided));
for (GenericDescription requiredDescription : genRequired) {
if (IdentityNamespace.IDENTITY_NAMESPACE.equals(requiredDescription.getType()) && requiredDescription.getSupplier().getHost() != null) {
assertEquals("Wrong fragment provider: " + requiredDescription, fragIdentity, requiredDescription);
} else {
assertTrue("Wrong provider for requirement: " + requiredDescription, providedCollection.remove(requiredDescription));
}
}
}
public void testGenericFragments01() throws BundleException {
State state = buildEmptyState();
long bundleID = 0;
Dictionary manifest;
manifest = loadManifest("p1.osgi.MF");
BundleDescription p1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p1.osgi.frag.MF");
BundleDescription p1Frag = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c1.osgi.MF");
BundleDescription c1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c1.osgi.frag.MF");
BundleDescription c1Frag = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p4.osgi.MF");
BundleDescription p4 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p1);
state.addBundle(p1Frag);
state.addBundle(c1);
state.addBundle(c1Frag);
state.addBundle(p4);
state.resolve();
assertTrue("p1", p1.isResolved());
assertTrue("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c1Frag", c1Frag.isResolved());
assertTrue("p4", p4.isResolved());
checkGenericBasics(6, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities(), p1Frag.getSelectedGenericCapabilities()[0]);
File stateDir = getContext().getDataFile(getName()); //$NON-NLS-1$
stateDir.mkdirs();
try {
state.getFactory().writeState(state, stateDir);
state = state.getFactory().readState(stateDir);
} catch (IOException e) {
fail("Error writing/reading state.", e);
}
p1 = state.getBundle(p1.getBundleId());
p1Frag = state.getBundle(p1Frag.getBundleId());
c1 = state.getBundle(c1.getBundleId());
c1Frag = state.getBundle(c1Frag.getBundleId());
p4 = state.getBundle(p4.getBundleId());
assertTrue("p1", p1.isResolved());
assertTrue("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c1Frag", c1Frag.isResolved());
assertTrue("p4", p4.isResolved());
checkGenericBasics(6, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities(), p1Frag.getSelectedGenericCapabilities()[0]);
state.setResolver(platformAdminService.createResolver());
state.resolve(new BundleDescription[] {p1});
assertTrue("p1", p1.isResolved());
assertTrue("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c1Frag", c1Frag.isResolved());
assertTrue("p4", p4.isResolved());
checkGenericBasics(6, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities(), p1Frag.getSelectedGenericCapabilities()[0]);
}
public void testGenericFragments02() throws BundleException {
State state = buildEmptyState();
long bundleID = 0;
Dictionary manifest;
manifest = loadManifest("p1.osgi.MF");
BundleDescription p1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p1.osgi.frag.MF");
BundleDescription p1Frag = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c1.osgi.MF");
BundleDescription c1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c1.osgi.frag.MF");
BundleDescription c1Frag = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p1);
state.addBundle(p1Frag);
state.addBundle(c1);
state.addBundle(c1Frag);
state.resolve();
assertTrue("p1", p1.isResolved());
assertFalse("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertFalse("c1Frag", c1Frag.isResolved());
checkGenericBasics(4, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities());
File stateDir = getContext().getDataFile(getName() + 1); //$NON-NLS-1$
stateDir.mkdirs();
try {
state.getFactory().writeState(state, stateDir);
state = state.getFactory().readState(stateDir);
state.setResolver(platformAdminService.createResolver());
} catch (IOException e) {
fail("Error writing/reading state.", e);
}
p1 = state.getBundle(p1.getBundleId());
p1Frag = state.getBundle(p1Frag.getBundleId());
c1 = state.getBundle(c1.getBundleId());
c1Frag = state.getBundle(c1Frag.getBundleId());
assertTrue("p1", p1.isResolved());
assertFalse("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertFalse("c1Frag", c1Frag.isResolved());
checkGenericBasics(4, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities());
manifest = loadManifest("p4.osgi.MF");
BundleDescription p4 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p4);
// have to force host to re-resolve because we are adding new constraints
state.resolve(new BundleDescription[] {p1});
assertTrue("p1", p1.isResolved());
assertTrue("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c1Frag", c1Frag.isResolved());
assertTrue("p4", p4.isResolved());
checkGenericBasics(6, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities(), p1Frag.getSelectedGenericCapabilities()[0]);
stateDir = getContext().getDataFile(getName() + 2); //$NON-NLS-1$
stateDir.mkdirs();
try {
state.getFactory().writeState(state, stateDir);
state = state.getFactory().readState(stateDir);
} catch (IOException e) {
fail("Error writing/reading state.", e);
}
p1 = state.getBundle(p1.getBundleId());
p1Frag = state.getBundle(p1Frag.getBundleId());
c1 = state.getBundle(c1.getBundleId());
c1Frag = state.getBundle(c1Frag.getBundleId());
p4 = state.getBundle(p4.getBundleId());
assertTrue("p1", p1.isResolved());
assertTrue("p1Frag", p1Frag.isResolved());
assertTrue("c1", c1.isResolved());
assertTrue("c1Frag", c1Frag.isResolved());
assertTrue("p4", p4.isResolved());
checkGenericBasics(6, c1.getResolvedGenericRequires(), p1.getSelectedGenericCapabilities(), p1Frag.getSelectedGenericCapabilities()[0]);
}
public void testGenericUses() throws BundleException {
State state = buildEmptyState();
long bundleID = 0;
Dictionary manifest;
manifest = loadManifest("p5.v100.osgi.MF");
BundleDescription p5v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p5.v110.osgi.MF");
BundleDescription p5v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p6.v100.osgi.MF");
BundleDescription p6v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p6.v110.osgi.MF");
BundleDescription p6v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p7.v100.osgi.MF");
BundleDescription p7v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p7.v110.osgi.MF");
BundleDescription p7v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c4.v100.osgi.MF");
BundleDescription c4v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c4.v110.osgi.MF");
BundleDescription c4v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c4.v120.osgi.MF");
BundleDescription c4v120 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c4.v130.osgi.MF");
BundleDescription c4v130 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p5v100);
state.addBundle(p5v110);
state.addBundle(p6v100);
state.addBundle(p6v110);
state.addBundle(p7v100);
state.addBundle(p7v110);
state.addBundle(c4v100);
state.addBundle(c4v110);
state.addBundle(c4v120);
state.addBundle(c4v130);
state.resolve();
assertTrue("p5v100", p5v100.isResolved());
assertTrue("p5v110", p5v110.isResolved());
assertTrue("p6v100", p6v100.isResolved());
assertTrue("p6v110", p6v110.isResolved());
assertTrue("p7v100", p7v100.isResolved());
assertTrue("p7v110", p7v110.isResolved());
assertTrue("c4v100", c4v100.isResolved());
assertTrue("c4v110", c4v110.isResolved());
assertTrue("c4v120", c4v120.isResolved());
assertTrue("c4v130", c4v130.isResolved());
state.linkDynamicImport(c4v120, "p6");
state.linkDynamicImport(c4v120, "p7");
GenericDescription[] p5v100Capability = p5v100.getSelectedGenericCapabilities();
ExportPackageDescription[] p6v100Exports = p6v100.getSelectedExports();
ExportPackageDescription[] p7v100Exports = p7v100.getSelectedExports();
ExportPackageDescription[] expectedPackages = new ExportPackageDescription[] {p6v100Exports[0], p7v100Exports[0]};
checkUsedImports(c4v100, expectedPackages);
checkUsedImports(c4v110, expectedPackages);
checkUsedImports(c4v120, expectedPackages);
BundleDescription[] expectedRequired = new BundleDescription[] {p6v100, p7v100};
checkUsedRequires(c4v130, expectedRequired);
checkUsedCapability(c4v100, p5v100Capability);
checkUsedCapability(c4v110, p5v100Capability);
checkUsedCapability(c4v120, p5v100Capability);
checkUsedCapability(c4v130, p5v100Capability);
}
public void testOSGiCardinalityUses() throws BundleException {
State state = buildEmptyState();
long bundleID = 0;
Dictionary manifest;
manifest = loadManifest("p5.v100.osgi.MF");
BundleDescription p5v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p5.v101.osgi.MF");
BundleDescription p5v101 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p5.v110.osgi.MF");
BundleDescription p5v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p6.v100.osgi.MF");
BundleDescription p6v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p6.v110.osgi.MF");
BundleDescription p6v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p7.v100.osgi.MF");
BundleDescription p7v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p7.v110.osgi.MF");
BundleDescription p7v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c6.v100.osgi.MF");
BundleDescription c6v100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c6.v110.osgi.MF");
BundleDescription c6v110 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c6.v120.osgi.MF");
BundleDescription c6v120 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c6.v130.osgi.MF");
BundleDescription c6v130 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c6.v140.osgi.MF");
BundleDescription c6v140 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p5v100);
state.addBundle(p5v101);
state.addBundle(p5v110);
state.addBundle(p6v100);
state.addBundle(p6v110);
state.addBundle(p7v100);
state.addBundle(p7v110);
state.addBundle(c6v100);
state.addBundle(c6v110);
state.addBundle(c6v120);
state.addBundle(c6v130);
state.addBundle(c6v140);
state.resolve();
assertTrue("p5v100", p5v100.isResolved());
assertTrue("p5v100", p5v101.isResolved());
assertTrue("p5v110", p5v110.isResolved());
assertTrue("p6v100", p6v100.isResolved());
assertTrue("p6v110", p6v110.isResolved());
assertTrue("p7v100", p7v100.isResolved());
assertTrue("p7v110", p7v110.isResolved());
assertTrue("c6v100", c6v100.isResolved());
assertTrue("c6v110", c6v110.isResolved());
assertTrue("c6v120", c6v120.isResolved());
assertTrue("c6v130", c6v130.isResolved());
assertTrue("c6v140", c6v140.isResolved());
state.linkDynamicImport(c6v120, "p6");
state.linkDynamicImport(c6v120, "p7");
GenericDescription[] p5v100Capability = p5v100.getSelectedGenericCapabilities();
GenericDescription[] p5v101Capability = p5v101.getSelectedGenericCapabilities();
List expectedCapabilityList = new ArrayList();
expectedCapabilityList.addAll(Arrays.asList(p5v100Capability));
expectedCapabilityList.addAll(Arrays.asList(p5v101Capability));
for (Iterator iCapabilities = expectedCapabilityList.iterator(); iCapabilities.hasNext();) {
if (!"namespace.5".equals(((GenericDescription) iCapabilities.next()).getType())) {
iCapabilities.remove();
}
}
ExportPackageDescription[] p6v100Exports = p6v100.getSelectedExports();
ExportPackageDescription[] p7v100Exports = p7v100.getSelectedExports();
ExportPackageDescription[] expectedPackages = new ExportPackageDescription[] {p6v100Exports[0], p7v100Exports[0]};
checkUsedImports(c6v100, expectedPackages);
checkUsedImports(c6v110, expectedPackages);
checkUsedImports(c6v120, expectedPackages);
BundleDescription[] expectedRequired = new BundleDescription[] {p6v100, p7v100};
checkUsedRequires(c6v130, expectedRequired);
checkUsedRequires(c6v140, expectedRequired);
GenericDescription[] expectedCapabilities = (GenericDescription[]) expectedCapabilityList.toArray(new GenericDescription[expectedCapabilityList.size()]);
checkUsedCapability(c6v100, expectedCapabilities);
checkUsedCapability(c6v110, expectedCapabilities);
checkUsedCapability(c6v120, expectedCapabilities);
checkUsedCapability(c6v130, expectedCapabilities);
checkUsedCapability(c6v140, expectedCapabilities);
manifest = loadManifest("c6.v150.osgi.MF");
BundleDescription c6v150 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c6.v160.osgi.MF");
BundleDescription c6v160 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(c6v150);
state.addBundle(c6v160);
state.resolve();
assertFalse("c6v150", c6v150.isResolved());
assertFalse("c6v160", c6v160.isResolved());
}
public void testDeclaringIdentityCapability() {
State state = buildEmptyState();
Hashtable manifest = new Hashtable();
long bundleID = 0;
manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
manifest.put(Constants.BUNDLE_SYMBOLICNAME, "genericCapability");
manifest.put(Constants.BUNDLE_VERSION, "1.0.0");
StringBuilder capabililty = new StringBuilder();
capabililty.append("testFailure:osgi.identity; test=failure");
manifest.put(GenericCapabilityTest.GENERIC_CAPABILITY, capabililty.toString());
try {
state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
fail("Expected failure to create description that specifies osgi.identity capability");
} catch (BundleException e) {
// expected
}
manifest.remove(GenericCapabilityTest.GENERIC_CAPABILITY);
manifest.put(Constants.PROVIDE_CAPABILITY, "osgi.identity; osgi.identity=testFailure; test=failure");
try {
state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
fail("Expected failure to create description that specifies osgi.identity capability");
} catch (BundleException e) {
// expected
}
}
public void testOSGiCardinality() throws BundleException {
State state = buildEmptyState();
long bundleID = 0;
Dictionary manifest;
manifest = loadManifest("p1.osgi.MF");
BundleDescription p1 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p2.osgi.MF");
BundleDescription p2 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("p3.osgi.MF");
BundleDescription p3 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = loadManifest("c5.osgi.MF");
BundleDescription c5 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(p1);
state.addBundle(p2);
state.addBundle(p3);
state.addBundle(c5);
state.resolve();
assertTrue("p1", p1.isResolved());
assertTrue("p2", p2.isResolved());
assertTrue("p3", p3.isResolved());
assertTrue("c5", c5.isResolved());
BundleWiring c5Wiring = c5.getWiring();
List requiredWires = c5Wiring.getRequiredWires(null);
assertEquals("Wrong number of required wires.", 3, requiredWires.size());
List expectedCapabilities = new ArrayList();
expectedCapabilities.addAll(p1.getCapabilities("namespace.1"));
expectedCapabilities.addAll(p2.getCapabilities("namespace.1"));
expectedCapabilities.addAll(p3.getCapabilities("namespace.1"));
for (Iterator iWires = requiredWires.iterator(); iWires.hasNext();) {
BundleWire wire = (BundleWire) iWires.next();
expectedCapabilities.remove(wire.getCapability());
}
assertTrue("Unexpected capability wire: " + requiredWires, expectedCapabilities.isEmpty());
}
private void checkUsedImports(BundleDescription importer, ExportPackageDescription[] expectedPackages) {
ExportPackageDescription[] imported = importer.getResolvedImports();
assertEquals("Wrong number of imports for bundle: " + importer, expectedPackages.length, imported.length);
for (int i = 0; i < imported.length; i++) {
assertEquals("Wrong imported package from bundle: " + importer, expectedPackages[i], imported[i]);
}
}
private void checkUsedRequires(BundleDescription requirer, BundleDescription[] expectedRequired) {
BundleDescription[] required = requirer.getResolvedRequires();
assertEquals("Wrong number of imports for bundle: " + requirer, expectedRequired.length, required.length);
for (int i = 0; i < required.length; i++) {
assertEquals("Wrong required bundle from bundle: " + requirer, expectedRequired[i], required[i]);
}
}
private void checkUsedCapability(BundleDescription requirer, GenericDescription[] expectedCapabilities) {
GenericDescription[] required = requirer.getResolvedGenericRequires();
assertEquals("Wrong number of capabilities for bundle: " + requirer, expectedCapabilities.length, required.length);
Collection providedCollection = new ArrayList(Arrays.asList(expectedCapabilities));
for (GenericDescription requiredDescription : required) {
assertTrue("Wrong provider for requirement: " + requiredDescription, providedCollection.remove(requiredDescription));
}
}
}