Add test case to show volatile list reference having incorrect order
diff --git a/core/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java b/core/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java
index d639f66..42d9c97 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/osgi/MockServiceReferencesSortTest.java
@@ -88,6 +88,46 @@
assertEquals("D", bundleContext.getService(bundleContext.getServiceReference(String.class)));
}
+ @Test
+ public void testVolatileCollectionReference() {
+ OsgiServiceUtilTest.RankedService rankedServiceTen = new OsgiServiceUtilTest.RankedServiceTen();
+ bundleContext.registerService(OsgiServiceUtilTest.RankedService.class.getName(), rankedServiceTen , null);
+ MockOsgi.activate(rankedServiceTen, bundleContext);
+
+ OsgiServiceUtilTest.RankedService rankedServiceFive = new OsgiServiceUtilTest.RankedServiceFive();
+ bundleContext.registerService(OsgiServiceUtilTest.RankedService.class.getName(), rankedServiceFive, null);
+ MockOsgi.activate(rankedServiceFive, bundleContext);
+
+ OsgiServiceUtilTest.Service6VolatileMultipleReferences service6VolatileMultipleReferences = new OsgiServiceUtilTest.Service6VolatileMultipleReferences();
+ bundleContext.registerService(OsgiServiceUtilTest.Service6VolatileMultipleReferences.class.getName(), service6VolatileMultipleReferences, null);
+ MockOsgi.injectServices(service6VolatileMultipleReferences, bundleContext);
+
+ assertEquals("Should get highest when getting one service", rankedServiceTen, bundleContext.getService(bundleContext.getServiceReference(OsgiServiceUtilTest.RankedService.class)));
+ assertEquals("Should have order from lowest to highest on sorted ranked services", "RankedServiceFive=5RankedServiceTen=10", getSortedRankedServices());
+ assertEquals("Should have order from lowest to highest on volatile reference list", "RankedServiceFive=5RankedServiceTen=10", service6VolatileMultipleReferences.getRanks());
+ }
+
+ private String getSortedRankedServices() {
+ ServiceReference<?>[] refs = null;
+ try {
+ refs = bundleContext.getServiceReferences(OsgiServiceUtilTest.RankedService.class.getName(), null);
+ }
+ catch (InvalidSyntaxException ise) {
+ fail("Unexpected InvalidSyntaxException");
+ }
+ assertNotNull("Expecting our service references", refs);
+ Arrays.sort(refs);
+
+ final StringBuilder sb = new StringBuilder();
+ for(ServiceReference<?> ref : refs) {
+ OsgiServiceUtilTest.RankedService rankedService = (OsgiServiceUtilTest.RankedService)bundleContext.getService(ref);
+ sb.append(rankedService.getClass().getSimpleName()).append("=").append(rankedService.getRanking());
+ bundleContext.ungetService(ref);
+ }
+
+ return sb.toString();
+ }
+
private ServiceRegistration<?> registerStringServiceWithoutRanking(String serviceValue) {
return bundleContext.registerService(String.class, serviceValue, new Hashtable<String, Object>());
}
diff --git a/core/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java b/core/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
index e5939b3..d25a6db 100644
--- a/core/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
+++ b/core/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
@@ -624,5 +624,64 @@
public static class ServiceFactory1 {
}
-
+
+ public interface RankedService {
+ int getRanking();
+ }
+
+ @Component(
+ properties = {
+ "service.ranking:Integer=5"
+ }
+ )
+ public static class RankedServiceFive implements RankedService {
+
+ private int ranking;
+
+ @Activate
+ public void activate(Map<String, Object> properties) {
+ this.ranking = (Integer) properties.get("service.ranking");
+ }
+
+ @Override
+ public int getRanking() {
+ return ranking;
+ }
+ }
+
+ @Component(
+ properties = {
+ "service.ranking:Integer=10"
+ }
+ )
+ public static class RankedServiceTen implements RankedService {
+
+ private int ranking;
+
+ @Activate
+ public void activate(Map<String, Object> properties) {
+ this.ranking = (Integer) properties.get("service.ranking");
+ }
+
+ @Override
+ public int getRanking() {
+ return ranking;
+ }
+ }
+
+ @Component(service = Service6VolatileMultipleReferences.class)
+ public static class Service6VolatileMultipleReferences {
+
+ @Reference
+ private volatile List<RankedService> rankedServices;
+
+ public String getRanks() {
+ StringBuilder builder = new StringBuilder();
+ for(RankedService rankedService : rankedServices) {
+ builder.append(rankedService.getClass().getSimpleName()).append("=").append(rankedService.getRanking());
+ }
+ return builder.toString();
+ }
+ }
+
}
diff --git a/core/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml b/core/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
index 751c55f..c8e44f1 100644
--- a/core/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
+++ b/core/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
@@ -83,4 +83,25 @@
</service>
<property name="service.pid" value="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceFactory1"/>
</scr:component>
+ <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedServiceFive" activate="activate">
+ <property name="service.ranking" type="Integer" value="5"/>
+ <service>
+ <provide interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedService"/>
+ </service>
+ <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedServiceFive"/>
+ </scr:component>
+ <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedServiceTen" activate="activate">
+ <property name="service.ranking" type="Integer" value="10"/>
+ <service>
+ <provide interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedService"/>
+ </service>
+ <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedServiceTen"/>
+ </scr:component>
+ <scr:component name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service6VolatileMultipleReferences">
+ <service>
+ <provide interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service6VolatileMultipleReferences"/>
+ </service>
+ <reference name="rankedServices" cardinality="0..n" policy="dynamic" interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$RankedService" field="rankedServices" field-collection-type="service"/>
+ <implementation class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service6VolatileMultipleReferences"/>
+ </scr:component>
</components>