blob: c784f90f1045a8fc3a8b16392951463d141858f5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.services.resolver;
import java.util.Hashtable;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.service.resolver.*;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
public class StateCycleTest extends AbstractStateTest {
public static Test suite() {
return new TestSuite(StateCycleTest.class);
}
public StateCycleTest(String testName) {
super(testName);
}
public void testCycle1() throws BundleException {
State state1 = buildEmptyState();
String A_MANIFEST = "Bundle-SymbolicName: org.eclipse.a\nBundle-Version: 1.0\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(A_MANIFEST), "org.eclipse.a", 1));
String B_MANIFEST = "Bundle-SymbolicName: org.eclipse.b\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.c\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(B_MANIFEST), "org.eclipse.b", 2));
String C_MANIFEST = "Bundle-SymbolicName: org.eclipse.c\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.b\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(C_MANIFEST), "org.eclipse.c", 3));
String D_MANIFEST = "Bundle-SymbolicName: org.eclipse.d\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.c\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(D_MANIFEST), "org.eclipse.d", 4));
String E_MANIFEST = "Bundle-SymbolicName: org.eclipse.e\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.b; optional=true\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(E_MANIFEST), "org.eclipse.e", 5));
String F_MANIFEST = "Bundle-SymbolicName: org.eclipse.f\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.f\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(F_MANIFEST), "org.eclipse.f", 6));
State state = state1;
state.resolve();
BundleDescription bundleA = state.getBundleByLocation("org.eclipse.a");
BundleDescription bundleB = state.getBundleByLocation("org.eclipse.b");
BundleDescription bundleC = state.getBundleByLocation("org.eclipse.c");
BundleDescription bundleD = state.getBundleByLocation("org.eclipse.d");
BundleDescription bundleE = state.getBundleByLocation("org.eclipse.e");
BundleDescription bundleF = state.getBundleByLocation("org.eclipse.f");
BundleDescription[] allBundles = state.getBundles();
assertContains("0.5", allBundles, bundleA);
assertContains("0.6", allBundles, bundleB);
assertContains("0.7", allBundles, bundleC);
assertContains("0.8", allBundles, bundleD);
assertContains("0.9", allBundles, bundleE);
assertContains("0.10", allBundles, bundleF);
// cycles must resolve now
assertTrue("1.0", bundleA.isResolved());
assertTrue("2.0", bundleB.isResolved());
assertTrue("3.0", bundleC.isResolved());
assertTrue("4.0", bundleD.isResolved());
assertTrue("5.0", bundleE.isResolved());
assertTrue("6.0", bundleF.isResolved());
}
public void testCycle2() throws BundleException {
State state1 = buildEmptyState();
String A_MANIFEST = "Bundle-SymbolicName: org.eclipse.a\nBundle-Version: 1.0\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(A_MANIFEST), "org.eclipse.a", 1));
String B_MANIFEST = "Bundle-SymbolicName: org.eclipse.b\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.c\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(B_MANIFEST), "org.eclipse.b", 2));
String C_MANIFEST = "Bundle-SymbolicName: org.eclipse.c\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.d\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(C_MANIFEST), "org.eclipse.c", 3));
String D_MANIFEST = "Bundle-SymbolicName: org.eclipse.d\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.b\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(D_MANIFEST), "org.eclipse.d", 4));
String E_MANIFEST = "Bundle-SymbolicName: org.eclipse.e\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.a,org.eclipse.b; optional=true\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(E_MANIFEST), "org.eclipse.e", 5));
String F_MANIFEST = "Bundle-SymbolicName: org.eclipse.f\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.f\n";
state1.addBundle(state1.getFactory().createBundleDescription(parseManifest(F_MANIFEST), "org.eclipse.f", 6));
State state = state1;
state.resolve();
BundleDescription bundleA = state.getBundleByLocation("org.eclipse.a");
BundleDescription bundleB = state.getBundleByLocation("org.eclipse.b");
BundleDescription bundleC = state.getBundleByLocation("org.eclipse.c");
BundleDescription bundleD = state.getBundleByLocation("org.eclipse.d");
BundleDescription bundleE = state.getBundleByLocation("org.eclipse.e");
BundleDescription bundleF = state.getBundleByLocation("org.eclipse.f");
BundleDescription[] allBundles = state.getBundles();
assertContains("0.5", allBundles, bundleA);
assertContains("0.6", allBundles, bundleB);
assertContains("0.7", allBundles, bundleC);
assertContains("0.8", allBundles, bundleD);
assertContains("0.9", allBundles, bundleE);
assertContains("0.10", allBundles, bundleF);
// cycles must resolve now
assertTrue("1.0", bundleA.isResolved());
assertTrue("2.0", bundleB.isResolved());
assertTrue("3.0", bundleC.isResolved());
assertTrue("4.0", bundleD.isResolved());
assertTrue("5.0", bundleE.isResolved());
assertTrue("6.0", bundleF.isResolved());
}
public void testCycle3() throws BundleException {
State state = buildEmptyState();
String A_MANIFEST = "Bundle-SymbolicName: org.eclipse.a\nBundle-Version: 1.0\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(A_MANIFEST), "org.eclipse.a", 1));
String B_MANIFEST = "Bundle-SymbolicName: org.eclipse.b\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.c\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(B_MANIFEST), "org.eclipse.b", 2));
String C_MANIFEST = "Bundle-SymbolicName: org.eclipse.c\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.d\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(C_MANIFEST), "org.eclipse.c", 3));
String D_MANIFEST = "Bundle-SymbolicName: org.eclipse.d\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.b\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(D_MANIFEST), "org.eclipse.d", 4));
state.resolve();
BundleDescription bundleC = state.getBundleByLocation("org.eclipse.c");
BundleDescription bundleB = state.getBundleByLocation("org.eclipse.b");
BundleDescription bundleA = state.getBundleByLocation("org.eclipse.a");
BundleDescription bundleD = state.getBundleByLocation("org.eclipse.d");
BundleDescription[] allBundles = state.getBundles();
assertContains("0.5", allBundles, bundleC);
assertContains("0.6", allBundles, bundleB);
assertContains("0.7", allBundles, bundleA);
assertContains("0.8", allBundles, bundleD);
// cycles must resolve now
assertTrue("0.9", bundleA.isResolved());
assertTrue("1.0", bundleC.isResolved());
assertTrue("2.0", bundleB.isResolved());
assertTrue("3.0", bundleD.isResolved());
}
public void testCycle4() throws BundleException {
State state = buildEmptyState();
String A_MANIFEST = "Bundle-SymbolicName: org.eclipse.a\nBundle-Version: 1.0\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(A_MANIFEST), "org.eclipse.a", 1));
String B_MANIFEST = "Bundle-SymbolicName: org.eclipse.b\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.c\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(B_MANIFEST), "org.eclipse.b", 2));
String C_MANIFEST = "Bundle-SymbolicName: org.eclipse.c\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.d\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(C_MANIFEST), "org.eclipse.c", 3));
String D_MANIFEST = "Bundle-SymbolicName: org.eclipse.d\nBundle-Version: 1.0\nRequire-Bundle: org.eclipse.b; optional=true\n";
state.addBundle(state.getFactory().createBundleDescription(parseManifest(D_MANIFEST), "org.eclipse.d", 4));
state.resolve();
BundleDescription bundleC = state.getBundleByLocation("org.eclipse.c");
BundleDescription bundleB = state.getBundleByLocation("org.eclipse.b");
BundleDescription bundleA = state.getBundleByLocation("org.eclipse.a");
BundleDescription bundleD = state.getBundleByLocation("org.eclipse.d");
BundleDescription[] allBundles = state.getBundles();
assertContains("0.5", allBundles, bundleC);
assertContains("0.6", allBundles, bundleB);
assertContains("0.7", allBundles, bundleA);
assertContains("0.8", allBundles, bundleD);
// cycles must resolve now
assertTrue("0.9", bundleA.isResolved());
assertTrue("1.0", bundleC.isResolved());
assertTrue("2.0", bundleB.isResolved());
assertTrue("3.0", bundleD.isResolved());
}
public void test185285() throws BundleException {
// if two versions of the same bundle export and import two different packages at the same version
// then we should resolve both sets of imports to the first bundle installed.
State state = buildEmptyState();
Hashtable manifest = new Hashtable();
long bundleID = 0;
manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
manifest.put(Constants.BUNDLE_SYMBOLICNAME, "X");
manifest.put(Constants.BUNDLE_VERSION, "1.0.0");
manifest.put(Constants.EXPORT_PACKAGE, "foo; version=\"1.0.0\", bar; version=\"1.0.0\"");
manifest.put(Constants.IMPORT_PACKAGE, "foo, bar");
BundleDescription a_100 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
manifest = new Hashtable();
manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
manifest.put(Constants.BUNDLE_SYMBOLICNAME, "X");
manifest.put(Constants.BUNDLE_VERSION, "1.0.1");
manifest.put(Constants.EXPORT_PACKAGE, "foo; version=\"1.0.0\", bar; version=\"1.0.0\"");
manifest.put(Constants.IMPORT_PACKAGE, "foo, bar");
BundleDescription a_101 = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME), bundleID++);
state.addBundle(a_100);
state.addBundle(a_101);
state.resolve();
assertTrue("1.0", a_100.isResolved());
assertTrue("1.1", a_101.isResolved());
ExportPackageDescription[] selectedExportsA100 = a_100.getSelectedExports();
ExportPackageDescription[] selectedExportsA101 = a_101.getSelectedExports();
assertTrue("2.0", selectedExportsA100.length == 2);
assertTrue("2.1", selectedExportsA101.length == 0);
ExportPackageDescription[] resolvedImportsA100 = a_100.getResolvedImports();
ExportPackageDescription[] resolvedImportsA101 = a_100.getResolvedImports();
assertTrue("3.0", resolvedImportsA100.length == 2);
assertTrue("3.1", resolvedImportsA101.length == 2);
for (int i = 0; i < resolvedImportsA100.length; i++) {
assertTrue("3.2.1." + i, selectedExportsA100[i] == resolvedImportsA100[i]);
assertTrue("3.2.1." + i, selectedExportsA100[i] == resolvedImportsA101[i]);
}
}
}