public void testBundleCollisionConnectedRegions() throws BundleException, InvalidSyntaxException { // get the system region Region systemRegion = digraph.getRegion(0); // create 3 connected test regions and install each bundle into each region int numRegions = 4; String regionName = "ConnectedRegion_"; for (int i = 0; i < numRegions; i++) { Region region = digraph.createRegion(regionName + i); // Import the system bundle from the systemRegion digraph.connect(region, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)").build(), systemRegion); // must import Boolean services into systemRegion to test digraph.connect(systemRegion, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(objectClass=java.lang.Boolean)").build(), region); } Region region0 = digraph.getRegion(regionName + 0); Region region1 = digraph.getRegion(regionName + 1); Region region2 = digraph.getRegion(regionName + 2); // create connections that share the bundles we want RegionFilterBuilder filterBuilder = digraph.createRegionFilterBuilder(); filterBuilder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(bundle-symbolic-name=" + PP1 + ")"); filterBuilder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(bundle-symbolic-name=" + SP1 + ")"); filterBuilder.allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(bundle-symbolic-name=" + CP1 + ")"); region1.connectRegion(region0, filterBuilder.build()); region2.connectRegion(region1, filterBuilder.build()); // install a bundle in each region bundleInstaller.installBundle(PP1, region0); bundleInstaller.installBundle(SP1, region1); bundleInstaller.installBundle(CP1, region2); // Should not be able to install SP1 into region0 because that would collide with SP1->region1->region0 assertInstallFail(SP1, region0); // Should not be able to install PP1 into region1 because that would collide with region1->region0->PP1 assertInstallFail(PP1, region1); // Should not be able to install PP1 into region2 because that would collide with region2->region1->region0->PP1 assertInstallFail(PP1, region2); // Should not be able to install CP1 into region0 because that would collide with CP1->region2->region1->region0 assertInstallFail(CP1, region0); }
public void testSingletons() throws BundleException { Region region1 = digraph.createRegion(getName() + "_1"); Region region2 = digraph.createRegion(getName() + "_2"); // first install into the same region; higher version 2 should resolve Bundle singleton1 = bundleInstaller.installBundle(SINGLETON1, region1); Bundle singleton2 = bundleInstaller.installBundle(SINGLETON2, region1); assertFalse(bundleInstaller.resolveBundles(new Bundle[] {singleton1, singleton2})); assertEquals("singleton1", Bundle.INSTALLED, singleton1.getState()); assertEquals("singleton2", Bundle.RESOLVED, singleton2.getState()); // now install into different regions; both 1 and 2 should resolve singleton2.uninstall(); singleton2 = bundleInstaller.installBundle(SINGLETON2, region2); assertTrue(bundleInstaller.resolveBundles(new Bundle[] {singleton1, singleton2})); assertEquals("singleton1", Bundle.RESOLVED, singleton1.getState()); assertEquals("singleton2", Bundle.RESOLVED, singleton2.getState()); ServiceRegistration<ResolverHookFactory> disableHook = disableAllResolves(); try { // now refresh to get us to an unresolved state again bundleInstaller.refreshPackages(new Bundle[] {singleton1, singleton2}); // connect region2 -> region1 region2.connectRegion(region1, digraph.createRegionFilterBuilder().allowAll(RegionFilter.VISIBLE_BUNDLE_NAMESPACE).build()); // enable resolving again disableHook.unregister(); disableHook = null; assertFalse(bundleInstaller.resolveBundles(new Bundle[] {singleton1, singleton2})); assertTrue("One and only singleton bundle should be resolved", (singleton1.getState() == Bundle.RESOLVED) ^ (singleton2.getState() == Bundle.RESOLVED)); singleton2.uninstall(); disableHook = disableAllResolves(); // now refresh to get us to an unresolved state again bundleInstaller.refreshPackages(new Bundle[] {singleton1, singleton2}); // enable resolving again disableHook.unregister(); disableHook = null; // make sure singleton1 is resolved first assertTrue(bundleInstaller.resolveBundles(new Bundle[] {singleton1})); assertEquals("singleton1", Bundle.RESOLVED, singleton1.getState()); singleton2 = bundleInstaller.installBundle(SINGLETON2, region2); assertFalse(bundleInstaller.resolveBundles(new Bundle[] {singleton2})); assertEquals("singleton2", Bundle.INSTALLED, singleton2.getState()); singleton1.uninstall(); disableHook = disableAllResolves(); // now refresh to get us to an unresolved state again bundleInstaller.refreshPackages(new Bundle[] {singleton1, singleton2}); // enable resolving again disableHook.unregister(); disableHook = null; // make sure singleton2 is resolved first assertTrue(bundleInstaller.resolveBundles(new Bundle[] {singleton2})); assertEquals("singleton2", Bundle.RESOLVED, singleton2.getState()); singleton1 = bundleInstaller.installBundle(SINGLETON1, region1); assertFalse(bundleInstaller.resolveBundles(new Bundle[] {singleton1})); assertEquals("singleton1", Bundle.INSTALLED, singleton1.getState()); } finally { if (disableHook != null) disableHook.unregister(); } }
private void doCyclicRegions(int numLevels) throws BundleException, InvalidSyntaxException, InterruptedException { String regionName1 = getName() + "_1"; String regionName2 = getName() + "_2"; // get the system region Region systemRegion = digraph.getRegion(0); // create two regions to hold the bundles Region testRegion1 = digraph.createRegion(regionName1); Region testRegion2 = digraph.createRegion(regionName2); // connect to the system bundle testRegion1.connectRegion(systemRegion, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)").build()); testRegion2.connectRegion(systemRegion, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_BUNDLE_NAMESPACE, "(id=0)").build()); // must import Boolean services into systemRegion to test systemRegion.connectRegion(testRegion1, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(objectClass=java.lang.Boolean)").build()); systemRegion.connectRegion(testRegion2, digraph.createRegionFilterBuilder().allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(objectClass=java.lang.Boolean)").build()); Map<String, Bundle> bundles = new HashMap<String, Bundle>(); // add bundles to region1 bundles.put(PP1, bundleInstaller.installBundle(PP1, testRegion1)); bundles.put(SP2, bundleInstaller.installBundle(SP2, testRegion1)); bundles.put(CP2, bundleInstaller.installBundle(CP2, testRegion1)); bundles.put(PC1, bundleInstaller.installBundle(PC1, testRegion1)); bundles.put(BC1, bundleInstaller.installBundle(BC1, testRegion1)); // add bundles to region2 bundles.put(SP1, bundleInstaller.installBundle(SP1, testRegion2)); bundles.put(CP1, bundleInstaller.installBundle(CP1, testRegion2)); bundles.put(PP2, bundleInstaller.installBundle(PP2, testRegion2)); bundles.put(SC1, bundleInstaller.installBundle(SC1, testRegion2)); bundles.put(CC1, bundleInstaller.installBundle(CC1, testRegion2)); RegionFilterBuilder testRegionFilter1 = digraph.createRegionFilterBuilder(); // SP2 -> PP2 testRegionFilter1.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg2.*)"); // CP2 -> SP1 testRegionFilter1.allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(" + Constants.OBJECTCLASS + "=pkg1.*)"); // PC1 -> PP2 // this is not needed because we already import pkg2.* above //testRegionFilter1.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg2.*)"); // BC1 -> PP2 testRegionFilter1.allow(RegionFilter.VISIBLE_REQUIRE_NAMESPACE, "(" + RegionFilter.VISIBLE_REQUIRE_NAMESPACE + "=" + PP2 + ")"); RegionFilterBuilder testRegionFilter2 = digraph.createRegionFilterBuilder(); //SP1 -> PP1 testRegionFilter2.allow(RegionFilter.VISIBLE_PACKAGE_NAMESPACE, "(" + RegionFilter.VISIBLE_PACKAGE_NAMESPACE + "=pkg1.*)"); //SC1 -> SP2 testRegionFilter2.allow(RegionFilter.VISIBLE_SERVICE_NAMESPACE, "(" + Constants.OBJECTCLASS + "=pkg2.*)"); //CC1 -> CP2 testRegionFilter2.allow(CP2, "(name=" + CP2 + ")"); Region r1, r2 = null; for (int i = 0; i <= numLevels; i++) { r1 = (i > 0) ? r2 : testRegion1; r2 = (i < numLevels) ? digraph.createRegion(getName() + "_level_" + i) : testRegion2; r1.connectRegion(r2, testRegionFilter1.build()); r2.connectRegion(r1, testRegionFilter2.build()); } bundleInstaller.resolveBundles(bundles.values().toArray(new Bundle[bundles.size()])); for (Bundle bundle : bundles.values()) { assertEquals("Bundle did not resolve: " + bundle.getSymbolicName(), Bundle.RESOLVED, bundle.getState()); bundle.start(); } BundleContext context = getContext(); ServiceTracker<Boolean, Boolean> cp2Tracker = new ServiceTracker<Boolean, Boolean>(context, context.createFilter("(&(objectClass=java.lang.Boolean)(bundle.id=" + bundles.get(CP2).getBundleId() + "))"), null); ServiceTracker<Boolean, Boolean> sc1Tracker = new ServiceTracker<Boolean, Boolean>(context, context.createFilter("(&(objectClass=java.lang.Boolean)(bundle.id=" + bundles.get(SC1).getBundleId() + "))"), null); cp2Tracker.open(); sc1Tracker.open(); assertNotNull("The cp2 bundle never found the service.", cp2Tracker.waitForService(2000)); assertNotNull("The sc1 bundle never found the service.", sc1Tracker.waitForService(2000)); cp2Tracker.close(); sc1Tracker.close(); }