Merge pull request #12 from bosschaert/SLING-9575

SLING-9575 Existing API Regions with factory Pids are not found
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
index b3a6701..7082979 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
@@ -278,7 +278,7 @@
             });
             final ServiceRegistration<?> reg = bundleContext.registerService(CFG_LISTENER_CLASS_NAME, msf, null);
             // get existing configurations
-            final Object result = caListConfigcMethod.invoke(cfgAdmin, "(service.factoryPid= " + FACTORY_PID + ")");
+            final Object result = caListConfigcMethod.invoke(cfgAdmin, "(service.factoryPid=" + FACTORY_PID + ")");
             if ( result != null ) {
                 for(int i=0; i<Array.getLength(result); i++) {
                     final Object cfg = Array.get(result, i);
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
index 6b0a984..c52b0ce 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
@@ -28,12 +28,14 @@
 import static org.junit.Assert.assertNull;
 
 import java.io.File;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import org.junit.After;
@@ -45,6 +47,7 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.hooks.resolver.ResolverHookFactory;
 import org.osgi.framework.namespace.PackageNamespace;
@@ -53,7 +56,11 @@
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.framework.wiring.FrameworkWiring;
 import org.osgi.resource.Requirement;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ManagedService;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 public class ActivatorTest {
     private Properties savedProps;
@@ -276,4 +283,64 @@
         assertEquals(0, req.getAttributes().size());
         assertNull(req.getResource());
     }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testConfigAdminListener() throws Exception {
+        String i = getClass().getResource("/idbsnver1.properties").toURI().toString();
+        String b = getClass().getResource("/bundles1.properties").toURI().toString();
+        String f = getClass().getResource("/features1.properties").toURI().toString();
+        String r = getClass().getResource("/regions1.properties").toURI().toString();
+
+        BundleContext bc = Mockito.mock(BundleContext.class);
+        Mockito.when(bc.getBundle()).thenReturn(Mockito.mock(Bundle.class));
+        Mockito.when(bc.getProperty(Activator.REGIONS_PROPERTY_NAME)).thenReturn("*");
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).
+            thenReturn(i);
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).
+            thenReturn(b);
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).
+            thenReturn(f);
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).
+            thenReturn(r);
+
+        ConfigurationAdmin cm = Mockito.mock(ConfigurationAdmin.class);
+        Mockito.when(cm.listConfigurations("(service.factoryPid=org.apache.sling.feature.apiregions.factory)")).
+            thenAnswer(new Answer<Configuration[]>() {
+                @Override
+                public Configuration[] answer(InvocationOnMock invocation) throws Throwable {
+                    Dictionary<String, Object> props = new Hashtable<>();
+                    props.put("foo", "bar");
+
+                    Configuration cfg = Mockito.mock(Configuration.class);
+                    Mockito.when(cfg.getPid()).thenReturn("org.apache.sling.feature.apiregions.factory~123");
+                    Mockito.when(cfg.getProperties()).thenReturn(props);
+
+                    return new Configuration[] {cfg};
+                }
+            });
+
+        ServiceReference<Object> caRef = Mockito.mock(ServiceReference.class);
+        Mockito.when(bc.getService(caRef)).thenReturn(cm);
+
+
+        Activator a = new Activator();
+        a.start(bc);
+        ServiceTracker<Object, Object> st = a.configAdminTracker;
+        Field custField = st.getClass().getDeclaredField("customizer");
+        custField.setAccessible(true);
+
+        @SuppressWarnings("rawtypes")
+        ServiceTrackerCustomizer customizer = (ServiceTrackerCustomizer) custField.get(st);
+
+        Field fcf = a.configuration.getClass().getDeclaredField("factoryConfigs");
+        fcf.setAccessible(true);
+        @SuppressWarnings("rawtypes")
+        Map<String, Dictionary<String, Object>> factoryConfigs = (Map) fcf.get(a.configuration);
+        assertEquals("Precondition", 0, factoryConfigs.size());
+
+        customizer.addingService(caRef);
+        Dictionary<String, Object> dict = factoryConfigs.get("org.apache.sling.feature.apiregions.factory~123");
+        assertEquals("bar", dict.get("foo"));
+    }
 }