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);