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 {}