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 <[email protected]> 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);
