You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by da...@apache.org on 2018/11/07 11:45:24 UTC

[sling-org-apache-sling-feature-apiregions] 04/19: Unit tests for the apiregions runtime component.

This is an automated email from the ASF dual-hosted git repository.

davidb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-apiregions.git

commit 2835a4001cf84d53dc7f0dde041f58e34e615d96
Author: David Bosschaert <bo...@adobe.com>
AuthorDate: Sat Nov 3 11:59:12 2018 +0000

    Unit tests for the apiregions runtime component.
    
    Initial unit tests for the ResolverHookImpl.
---
 .../feature/apiregions/impl/RegionEnforcer.java    |  2 +
 .../feature/apiregions/impl/ResolverHookImpl.java  | 20 ++++---
 .../apiregions/impl/RegionEnforcerTest.java        | 25 +++++++++
 .../apiregions/impl/ResolverHookImplTest.java      | 62 +++++++++++++++++++++-
 4 files changed, 100 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
index ab56dd2..fe30277 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
@@ -40,6 +40,8 @@ import java.util.Properties;
 import java.util.Set;
 
 class RegionEnforcer implements ResolverHookFactory {
+    public static String GLOBAL_REGION = "global";
+
     static final String PROPERTIES_FILE_PREFIX = "whitelisting.";
     static final String IDBSNVER_FILENAME = "idbsnver.properties";
     static final String BUNDLE_FEATURE_FILENAME = "bundles.properties";
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
index 5642d47..3e8e9f2 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
@@ -41,10 +41,10 @@ import java.util.logging.Logger;
 class ResolverHookImpl implements ResolverHook {
     private static final Logger LOG = Logger.getLogger(ResolverHookImpl.class.getName());
 
-    private final Map<Map.Entry<String, Version>, List<String>> bsnVerMap;
-    private final Map<String, Set<String>> bundleFeatureMap;
-    private final Map<String, Set<String>> featureRegionMap;
-    private final Map<String, Set<String>> regionPackageMap;
+    final Map<Map.Entry<String, Version>, List<String>> bsnVerMap;
+    final Map<String, Set<String>> bundleFeatureMap;
+    final Map<String, Set<String>> featureRegionMap;
+    final Map<String, Set<String>> regionPackageMap;
 
     public ResolverHookImpl(Map<Entry<String, Version>, List<String>> bsnVerMap, Map<String, Set<String>> bundleFeatureMap,
             Map<String, Set<String>> featureRegionMap, Map<String, Set<String>> regionPackageMap) {
@@ -86,11 +86,11 @@ class ResolverHookImpl implements ResolverHook {
                 reqFeatures.addAll(fid);
         }
 
-        Set<String> regions = new HashSet<>();
+        Set<String> reqRegions = new HashSet<>();
         for (String feature : reqFeatures) {
             Set<String> fr = featureRegionMap.get(feature);
             if (fr != null) {
-                regions.addAll(fr);
+                reqRegions.addAll(fr);
             }
         }
 
@@ -143,12 +143,16 @@ class ResolverHookImpl implements ResolverHook {
                     continue nextCapability;
                 }
 
-                if (featureRegionMap.get(capFeat) == null) {
+                Set<String> capRegions = featureRegionMap.get(capFeat);
+                if (capRegions == null) {
                     // If the feature hosting the capability has no regions defined, everyone can access
                     coveredCaps.add(bc);
                     continue nextCapability;
                 }
 
+                HashSet<String> sharedRegions = new HashSet<String>(reqRegions);
+                sharedRegions.retainAll(capRegions);
+
                 Object pkg = bc.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE);
                 if (pkg instanceof String) {
                     String packageName = (String) pkg;
@@ -160,7 +164,7 @@ class ResolverHookImpl implements ResolverHook {
                         continue nextCapability;
                     }
 
-                    for (String region : regions) {
+                    for (String region : sharedRegions) {
                         Set<String> regionPackages = regionPackageMap.get(region);
                         if (regionPackages != null && regionPackages.contains(packageName)) {
                             // If the export is in a region that the feature is also in, then allow
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java
index 2225bab..3e33075 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java
@@ -35,6 +35,7 @@ import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.IDBSNVER_F
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.PROPERTIES_FILE_PREFIX;
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.REGION_PACKAGE_FILENAME;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class RegionEnforcerTest {
     private Properties savedProps;
@@ -113,4 +114,28 @@ public class RegionEnforcerTest {
         assertEquals(new HashSet<>(Arrays.asList("a.b.c", "d.e.f", "test")),
                 re.regionPackageMap.get("global"));
     }
+
+    @Test
+    public void testBegin() throws Exception {
+        System.setProperty(PROPERTIES_FILE_PREFIX + IDBSNVER_FILENAME,
+                getClass().getResource("/idbsnver1.properties").getFile());
+        System.setProperty(PROPERTIES_FILE_PREFIX + BUNDLE_FEATURE_FILENAME,
+                getClass().getResource("/bundles1.properties").getFile());
+        System.setProperty(PROPERTIES_FILE_PREFIX + FEATURE_REGION_FILENAME,
+                getClass().getResource("/features1.properties").getFile());
+        System.setProperty(PROPERTIES_FILE_PREFIX + REGION_PACKAGE_FILENAME,
+                getClass().getResource("/regions1.properties").getFile());
+
+        RegionEnforcer re = new RegionEnforcer();
+        assertTrue(re.bsnVerMap.size() > 0);
+        assertTrue(re.bundleFeatureMap.size() > 0);
+        assertTrue(re.featureRegionMap.size() > 0);
+        assertTrue(re.regionPackageMap.size() > 0);
+
+        ResolverHookImpl hook = (ResolverHookImpl) re.begin(null);
+        assertEquals(re.bsnVerMap, hook.bsnVerMap);
+        assertEquals(re.bundleFeatureMap, hook.bundleFeatureMap);
+        assertEquals(re.featureRegionMap, hook.featureRegionMap);
+        assertEquals(re.regionPackageMap, hook.regionPackageMap);
+    }
 }
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
index 5bc60a1..c5d8ef8 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
@@ -28,13 +28,23 @@ import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleRequirement;
 import org.osgi.framework.wiring.BundleRevision;
 
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
 
 public class ResolverHookImplTest {
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Test @Ignore
-    public void testFilterMatches() throws Exception {
+    public void xxtestFilterMatches() throws Exception {
         String f = "gid:aid:0.0.9";
         String f2 = "gid2:aid2:1.0.0-SNAPSHOT";
         String f3 = "gid3:aid3:1.2.3";
@@ -172,6 +182,56 @@ public class ResolverHookImplTest {
         */
     }
 
+    @Test
+    public void testFilterMatches() {
+        Map<Entry<String, Version>, List<String>> bsnvermap = new HashMap<>();
+        bsnvermap.put(new AbstractMap.SimpleEntry<String,Version>("a.b.c", new Version(0,0,0)),
+                Collections.singletonList("b7"));
+        bsnvermap.put(new AbstractMap.SimpleEntry<String,Version>("a.bundle", new Version(1,0,0)),
+                Collections.singletonList("b8"));
+        bsnvermap.put(new AbstractMap.SimpleEntry<String,Version>("some.other.bundle", new Version(9,9,9,"suffix")),
+                Collections.singletonList("b9"));
+
+        Map<String, Set<String>> bfmap = new HashMap<>();
+        bfmap.put("b7", Collections.singleton("f"));
+        bfmap.put("b8", Collections.singleton("f1"));
+        bfmap.put("b9", Collections.singleton("f2"));
+
+        Map<String, Set<String>> frmap = new HashMap<>();
+        frmap.put("f", new HashSet<>(Arrays.asList("r1", "r2")));
+        frmap.put("f1", Collections.singleton("r1"));
+        frmap.put("f2", Collections.singleton("r2"));
+
+        Map<String, Set<String>> rpmap = new HashMap<>();
+        rpmap.put("r0", Collections.singleton("org.bar"));
+        rpmap.put("r1", new HashSet<>(Arrays.asList("org.blah", "org.foo")));
+        rpmap.put(RegionEnforcer.GLOBAL_REGION, Collections.singleton("org.bar.tar"));
+        rpmap.put("r3", Collections.singleton("xyz"));
+
+        ResolverHookImpl rh = new ResolverHookImpl(bsnvermap, bfmap, frmap, rpmap);
+
+        // Check that we cann get the capability from another bundle in the same region
+        // where that region exports the package
+        // Bundle 7 is in feature f with regions r1, r2. Bundle 8 is in feature f1 with regions r1
+        // r1 exports the org.foo package
+        BundleRequirement req0 = mockRequirement(7, "a.b.c", new Version(0,0,0));
+        BundleCapability bc0 = mockCapability("org.foo", 8, "a.bundle", new Version(1,0,0));
+        List<BundleCapability> candidates0 = new ArrayList<>(Arrays.asList(bc0));
+        rh.filterMatches(req0, candidates0);
+        assertEquals(Collections.singletonList(bc0), candidates0);
+
+        // Check that we cannot get the capability from another bundle in the same region
+        // but that region doesn't export the pacakge.
+        // Bundle 7 is in feature f with regions r1, r2. Bundle 9 is in feature f2 with regions r2
+        // r2 does not export any packages
+        BundleRequirement req1 = mockRequirement(7, "a.b.c", new Version(0,0,0));
+        BundleCapability bc1 = mockCapability("org.foo", 9, "some.other.bundle", new Version(9,9,9,"suffix"));
+        List<BundleCapability> candidates1 = new ArrayList<>(Arrays.asList(bc1));
+        rh.filterMatches(req1, candidates1);
+        assertEquals(Collections.emptyList(), candidates1);
+
+    }
+
     private BundleCapability mockCapability(String pkg, long bundleID, String bsn, Version version) {
         Map<String, Object> attrs =
                 Collections.singletonMap(PackageNamespace.PACKAGE_NAMESPACE, pkg);