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

enorman pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-osgi-mock.git


The following commit(s) were added to refs/heads/master by this push:
     new c450c5c  SLING-12995 impls for MockConfigurationAdmin 
getFactoryConfiguration (#49)
c450c5c is described below

commit c450c5cd67adb17e447a9b51b95056278d66f3e3
Author: Eric Norman <[email protected]>
AuthorDate: Wed Nov 12 15:02:59 2025 -0800

    SLING-12995 impls for MockConfigurationAdmin getFactoryConfiguration (#49)
---
 .../sling/testing/mock/osgi/MockConfiguration.java | 34 ++++++++----
 .../testing/mock/osgi/MockConfigurationAdmin.java  | 20 +++----
 .../apache/sling/testing/mock/osgi/MockOsgi.java   | 49 +++++++++++++++++
 .../sling/testing/mock/osgi/package-info.java      |  2 +-
 .../mock/osgi/MockConfigurationAdminTest.java      | 61 ++++++++++++++++++++++
 5 files changed, 147 insertions(+), 19 deletions(-)

diff --git 
a/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java 
b/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java
index ca09cd2..bac4f3a 100644
--- 
a/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java
+++ 
b/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfiguration.java
@@ -36,6 +36,7 @@ import org.osgi.service.cm.ConfigurationAdmin;
 class MockConfiguration implements Configuration {
 
     private final String pid;
+    private final String factoryPid;
     private Dictionary<String, Object> props;
 
     /**
@@ -43,6 +44,16 @@ class MockConfiguration implements Configuration {
      */
     public MockConfiguration(String pid) {
         this.pid = pid;
+        this.factoryPid = null;
+    }
+
+    /**
+     * @param pid PID
+     * @param factoryPid factory PID
+     */
+    public MockConfiguration(String pid, String factoryPid) {
+        this.pid = pid;
+        this.factoryPid = factoryPid;
     }
 
     @Override
@@ -50,6 +61,11 @@ class MockConfiguration implements Configuration {
         return pid;
     }
 
+    @Override
+    public String getFactoryPid() {
+        return factoryPid;
+    }
+
     @Override
     public Dictionary<String, Object> getProperties() {
         if (props == null) {
@@ -64,13 +80,16 @@ class MockConfiguration implements Configuration {
         // the updating of services already registered in mock-osgi is 
currently not supported.
         // still allow calling this method to allow usage of {@link 
update(Dictionary)}, but it works
         // only if applied before registering a service in mock-osgi.
-        props = newConfig(pid);
+        props = newConfig(pid, factoryPid);
     }
 
     @Override
     public void update(Dictionary<String, ?> properties) {
         this.props = new Hashtable<>(MapUtil.toMap(properties));
         this.props.put(Constants.SERVICE_PID, pid);
+        if (factoryPid != null) {
+            this.props.put(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+        }
     }
 
     @SuppressWarnings("unchecked")
@@ -93,9 +112,11 @@ class MockConfiguration implements Configuration {
         return props.toString();
     }
 
-    private static Dictionary<String, Object> newConfig(String pid) {
-        Dictionary<String, Object> config = new Hashtable<String, Object>();
-        config.put(Constants.SERVICE_PID, pid);
+    private static Dictionary<String, Object> newConfig(String pid, String 
factoryPid) {
+        Dictionary<String, Object> config = 
MapUtil.toDictionary(Constants.SERVICE_PID, pid);
+        if (factoryPid != null) {
+            config.put(ConfigurationAdmin.SERVICE_FACTORYPID, factoryPid);
+        }
         return config;
     }
 
@@ -111,11 +132,6 @@ class MockConfiguration implements Configuration {
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    public String getFactoryPid() {
-        throw new UnsupportedOperationException();
-    }
-
     @Override
     public long getChangeCount() {
         throw new UnsupportedOperationException();
diff --git 
a/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdmin.java
 
b/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdmin.java
index cee26f1..33da14d 100644
--- 
a/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdmin.java
+++ 
b/core/src/main/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdmin.java
@@ -64,26 +64,28 @@ class MockConfigurationAdmin implements ConfigurationAdmin {
         return null;
     }
 
-    // --- unsupported operations ---
-
     @Override
-    public Configuration createFactoryConfiguration(final String factoryPid) 
throws IOException {
-        throw new UnsupportedOperationException();
+    public Configuration getFactoryConfiguration(final String factoryPid, 
final String name, final String location)
+            throws IOException {
+        return getFactoryConfiguration(factoryPid, name);
     }
 
     @Override
-    public Configuration createFactoryConfiguration(final String factoryPid, 
final String location) throws IOException {
-        throw new UnsupportedOperationException();
+    public Configuration getFactoryConfiguration(final String factoryPid, 
final String name) throws IOException {
+        String pid = String.format("%s~%s", factoryPid, name);
+        configs.putIfAbsent(pid, new MockConfiguration(pid, factoryPid));
+        return configs.get(pid);
     }
 
+    // --- unsupported operations ---
+
     @Override
-    public Configuration getFactoryConfiguration(final String factoryPid, 
final String name, final String location)
-            throws IOException {
+    public Configuration createFactoryConfiguration(final String factoryPid) 
throws IOException {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public Configuration getFactoryConfiguration(final String factoryPid, 
final String name) throws IOException {
+    public Configuration createFactoryConfiguration(final String factoryPid, 
final String location) throws IOException {
         throw new UnsupportedOperationException();
     }
 }
diff --git 
a/core/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java 
b/core/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
index 62b2f89..066d7d8 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
@@ -514,6 +514,55 @@ public final class MockOsgi {
         }
     }
 
+    /**
+     * Set factory configuration via ConfigurationAdmin service in bundle 
context for component with given pid.
+     * @param bundleContext Bundle context
+     * @param factoryPid factory PID
+     * @param name the name for Configuration
+     * @param properties Configuration properties
+     */
+    public static void setFactoryConfigForPid(
+            @NotNull BundleContext bundleContext,
+            @NotNull String factoryPid,
+            @NotNull String name,
+            @Nullable Map<String, Object> properties) {
+        setFactoryConfigForPid(bundleContext, factoryPid, name, 
toDictionary(properties));
+    }
+
+    /**
+     * Set factory configuration via ConfigurationAdmin service in bundle 
context for component with given pid.
+     * @param bundleContext Bundle context
+     * @param factoryPid factory PID
+     * @param name the name for Configuration
+     * @param properties Configuration properties
+     */
+    public static void setFactoryConfigForPid(
+            @NotNull BundleContext bundleContext,
+            @NotNull String factoryPid,
+            @NotNull String name,
+            @NotNull Object @NotNull ... properties) {
+        setFactoryConfigForPid(bundleContext, factoryPid, name, 
toDictionary(properties));
+    }
+
+    private static void setFactoryConfigForPid(
+            @NotNull BundleContext bundleContext,
+            @NotNull String factoryPid,
+            @NotNull String name,
+            @Nullable Dictionary<String, Object> properties) {
+        ConfigurationAdmin configAdmin = getConfigAdmin(bundleContext);
+        if (configAdmin == null) {
+            throw new RuntimeException("ConfigurationAdmin service is not 
registered in bundle context.");
+        }
+        try {
+            Configuration config = 
configAdmin.getFactoryConfiguration(factoryPid, name);
+            config.update(properties);
+        } catch (IOException ex) {
+            throw new RuntimeException(
+                    "Unable to update factory configuration for factoryPid '" 
+ factoryPid + " and name " + name + "'.",
+                    ex);
+        }
+    }
+
     /**
      * Deactivates all bundles registered in the mocked bundle context.
      * @param bundleContext Bundle context
diff --git 
a/core/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java 
b/core/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java
index cd480aa..e6208a1 100644
--- a/core/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java
+++ b/core/src/main/java/org/apache/sling/testing/mock/osgi/package-info.java
@@ -19,5 +19,5 @@
 /**
  * Mock implementation of selected OSGi APIs.
  */
[email protected]("3.7.0")
[email protected]("3.8.0")
 package org.apache.sling.testing.mock.osgi;
diff --git 
a/core/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
 
b/core/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
index 35f4b97..e974c99 100644
--- 
a/core/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
+++ 
b/core/src/test/java/org/apache/sling/testing/mock/osgi/MockConfigurationAdminTest.java
@@ -169,6 +169,7 @@ public class MockConfigurationAdminTest {
         Configuration configurationExisting = 
underTest.getConfiguration("new-pid");
         assertEquals("value", configurationNew.getProperties().get("key"));
         
assertNotNull(configurationExisting.getProperties().get(Constants.SERVICE_PID));
+        
assertNull(configurationExisting.getProperties().get(ConfigurationAdmin.SERVICE_FACTORYPID));
         configurationExisting.delete();
 
         Configuration configurationDeleted = 
underTest.getConfiguration("new-pid");
@@ -196,6 +197,66 @@ public class MockConfigurationAdminTest {
         assertTrue(configurationNew.updateIfDifferent(propertiesNew));
     }
 
+    @Test
+    public void testNoArgUpdateAfterGetFactoryConfiguration() throws 
IOException {
+        Configuration configurationNew = 
underTest.getFactoryConfiguration("my.factory1", "name1");
+        assertNull(configurationNew.getProperties());
+        configurationNew.update();
+
+        Configuration configurationExisting = 
underTest.getFactoryConfiguration("my.factory1", "name1");
+        
assertNotNull(configurationExisting.getProperties().get(Constants.SERVICE_PID));
+        
assertNotNull(configurationExisting.getProperties().get(ConfigurationAdmin.SERVICE_FACTORYPID));
+    }
+
+    @Test
+    public void testGetUpdateDeleteGetFactoryConfiguration() throws 
IOException {
+        Configuration configurationNew = 
underTest.getFactoryConfiguration("my.factory1", "name1");
+        assertNull(configurationNew.getProperties());
+        Dictionary<String, Object> properties = new Hashtable<>();
+        properties.put("key", "value");
+        configurationNew.update(properties);
+
+        Configuration configurationExisting = 
underTest.getFactoryConfiguration("my.factory1", "name1");
+        assertEquals("value", configurationNew.getProperties().get("key"));
+        
assertNotNull(configurationExisting.getProperties().get(Constants.SERVICE_PID));
+        
assertNotNull(configurationExisting.getProperties().get(ConfigurationAdmin.SERVICE_FACTORYPID));
+        configurationExisting.delete();
+
+        Configuration configurationDeleted = 
underTest.getFactoryConfiguration("my.factory1", "name1");
+        assertNull(configurationDeleted.getProperties());
+    }
+
+    @Test
+    public void testGetFactoryConfigurationViaConfigAdmin_NonExisting() throws 
IOException {
+        Configuration config = 
underTest.getFactoryConfiguration("my.factory1", "name1");
+        assertNotNull(config);
+        assertEquals("my.factory1~name1", config.getPid());
+        assertEquals("my.factory1", config.getFactoryPid());
+
+        config = underTest.getFactoryConfiguration("my.factory2", "name2", 
"location1");
+        assertNotNull(config);
+        assertEquals("my.factory2~name2", config.getPid());
+        assertEquals("my.factory2", config.getFactoryPid());
+    }
+
+    @Test
+    public void testGetFactoryConfigurationViaConfigAdmin_Existing() throws 
IOException {
+        MockOsgi.setFactoryConfigForPid(context.bundleContext(), 
"my.factory3", "name3", "prop1", 1);
+
+        Configuration config = 
underTest.getFactoryConfiguration("my.factory3", "name3");
+        assertNotNull(config);
+        assertEquals("my.factory3~name3", config.getPid());
+        assertEquals("my.factory3", config.getFactoryPid());
+        assertEquals(1, config.getProperties().get("prop1"));
+
+        MockOsgi.setFactoryConfigForPid(context.bundleContext(), 
"my.factory4", "name4", Map.of("prop1", 2));
+        config = underTest.getFactoryConfiguration("my.factory4", "name4", 
"location1");
+        assertNotNull(config);
+        assertEquals("my.factory4~name4", config.getPid());
+        assertEquals("my.factory4", config.getFactoryPid());
+        assertEquals(2, config.getProperties().get("prop1"));
+    }
+
     static class ServiceWithConfigurationPID {}
 
     static class ServiceWithMultipleConfigurationPID {}

Reply via email to