Merge branch 'SLING-7233'
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
index d690752..d2f71d5 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/MapMergeUtil.java
@@ -78,14 +78,15 @@
 
                 // merge with configuration from config admin
                 if (configAdmin != null) {
-                    Object pid = metadata.getPID();
-                    if (pid != null) {
-                        try {
-                            Configuration config = configAdmin.getConfiguration(pid.toString());
-                            mergedProperties.putAll(toMap(config.getProperties()));
-                        }
-                        catch (IOException ex) {
-                            throw new RuntimeException("Unable to read config for pid " + pid, ex);
+                    for (String pid : metadata.getConfigurationPID()) {
+                        if (pid != null) {
+                            try {
+                                Configuration config = configAdmin.getConfiguration(pid);
+                                mergedProperties.putAll(toMap(config.getProperties()));
+                            }
+                            catch (IOException ex) {
+                                throw new RuntimeException("Unable to read config for pid " + pid, ex);
+                            }
                         }
                     }
                 }
diff --git a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
index a4c5a4b..1fca7a5 100644
--- a/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
+++ b/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
@@ -263,7 +263,20 @@
         if (nodes != null && nodes.getLength() > 0) {
             return getAttributeValue(nodes.item(0), "name");
         }
-        return null;
+        return clazz.getName();
+    }
+
+    private static String[] getConfigurationPID(Class clazz, Document metadata) {
+        String value = null;
+        String query = getComponentXPathQuery(clazz);
+        NodeList nodes = queryNodes(metadata, query);
+        if (nodes != null && nodes.getLength() > 0) {
+            value = getAttributeValue(nodes.item(0), "configuration-pid");
+        }
+        if (value == null) {
+            value = getComponentName(clazz, metadata);
+        }
+        return StringUtils.split(value);
     }
 
     private static Set<String> getServiceInterfaces(Class clazz, Document metadata) {
@@ -377,6 +390,7 @@
 
         private final Class<?> clazz;
         private final String name;
+        private final String[] configurationPID;
         private final Set<String> serviceInterfaces;
         private final Map<String, Object> properties;
         private final List<Reference> references;
@@ -387,6 +401,7 @@
         private OsgiMetadata(Class<?> clazz, Document metadataDocument) {
             this.clazz = clazz;
             this.name = OsgiMetadataUtil.getComponentName(clazz, metadataDocument);
+            this.configurationPID = OsgiMetadataUtil.getConfigurationPID(clazz, metadataDocument);
             this.serviceInterfaces = OsgiMetadataUtil.getServiceInterfaces(clazz, metadataDocument);
             this.properties = OsgiMetadataUtil.getProperties(clazz, metadataDocument);
             this.references = OsgiMetadataUtil.getReferences(clazz, metadataDocument);
@@ -398,6 +413,7 @@
         private OsgiMetadata() {
             this.clazz = null;
             this.name = null;
+            this.configurationPID = null;
             this.serviceInterfaces = null;
             this.properties = null;
             this.references = null;
@@ -422,6 +438,10 @@
             return StringUtils.defaultString(pid, name);
         }
 
+        public String[] getConfigurationPID() {
+            return configurationPID;
+        }
+
         public Set<String> getServiceInterfaces() {
             return serviceInterfaces;
         }
diff --git a/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java b/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
index 857ebb7..187efbd 100644
--- a/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
@@ -69,4 +69,39 @@
         assertEquals("org.apache.sling.testing.mock.osgi.OsgiMetadataUtilTest$ServiceWithMetadata", reference.getProperty(Constants.SERVICE_PID));
     }
 
+    @Test
+    public void testConfigurationPID() throws IOException {
+        MockOsgi.setConfigForPid(context.bundleContext(), ServiceWithConfigurationPID.class.getSimpleName(),
+                "prop1", 1);
+
+        context.registerInjectActivateService(new ServiceWithConfigurationPID(), ImmutableMap.<String, Object>builder()
+                .put("prop2", 2)
+                .build());
+
+        ServiceReference reference = context.bundleContext().getServiceReference(Comparable.class.getName());
+
+        assertEquals(1, reference.getProperty("prop1"));
+        assertEquals(2, reference.getProperty("prop2"));
+    }
+
+    @Test
+    public void testMultipleConfigurationPID() throws IOException {
+        MockOsgi.setConfigForPid(context.bundleContext(), "Configuration1",
+                "prop1", 1);
+        MockOsgi.setConfigForPid(context.bundleContext(), "Configuration2",
+                "prop1", 2);
+
+        context.registerInjectActivateService(new ServiceWithMultipleConfigurationPID(), ImmutableMap.<String, Object>builder()
+                .put("prop2", 2)
+                .build());
+
+        ServiceReference reference = context.bundleContext().getServiceReference(Comparable.class.getName());
+
+        assertEquals(2, reference.getProperty("prop1"));
+        assertEquals(2, reference.getProperty("prop2"));
+    }
+
+    static class ServiceWithConfigurationPID {}
+
+    static class ServiceWithMultipleConfigurationPID {}
 }
diff --git a/src/test/resources/OSGI-INF/serviceComponents.xml b/src/test/resources/OSGI-INF/serviceComponents.xml
index f173b6b..db1c94a 100644
--- a/src/test/resources/OSGI-INF/serviceComponents.xml
+++ b/src/test/resources/OSGI-INF/serviceComponents.xml
@@ -18,10 +18,10 @@
   under the License.
 -->
 <!-- This file follows the old SCR convention using a fixed name "serviceComponents.xml" -->
-<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0">
   <scr:component name="org.apache.sling.testing.mock.osgi.OsgiMetadataUtilTest$ServiceWithMetadata">
     <implementation class="org.apache.sling.testing.mock.osgi.OsgiMetadataUtilTest$ServiceWithMetadata"/>
-    <service servicefactory="false">
+    <service>
       <provide interface="org.apache.sling.models.spi.Injector"/>
       <provide interface="org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory"/>
       <provide interface="java.lang.Comparable"/>
@@ -33,4 +33,18 @@
        org.apache.sling.api.resource.ResourceResolver
     </property>
   </scr:component>
+  <scr:component name="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithConfigurationPID"
+                 configuration-pid="ServiceWithConfigurationPID">
+    <implementation class="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithConfigurationPID"/>
+    <service>
+      <provide interface="java.lang.Comparable"/>
+    </service>
+  </scr:component>
+  <scr:component name="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithMultipleConfigurationPID"
+                 configuration-pid="Configuration1 Configuration2">
+    <implementation class="org.apache.sling.testing.mock.osgi.MockConfigurationAdminTest$ServiceWithMultipleConfigurationPID"/>
+    <service>
+      <provide interface="java.lang.Comparable"/>
+    </service>
+  </scr:component>
 </components>