You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2014/11/26 23:17:39 UTC

svn commit: r1641954 - in /sling/trunk/testing/mocks/osgi-mock/src: main/java/org/apache/sling/testing/mock/osgi/ test/java/org/apache/sling/testing/mock/osgi/context/

Author: sseifert
Date: Wed Nov 26 22:17:39 2014
New Revision: 1641954

URL: http://svn.apache.org/r1641954
Log:
SLING-4202 OSGi Mock: Fail-fast when mandatory references cannot be injected

Modified:
    sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
    sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java
    sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java

Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java?rev=1641954&r1=1641953&r2=1641954&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/MockOsgi.java Wed Nov 26 22:17:39 2014
@@ -108,7 +108,7 @@ public final class MockOsgi {
      * is thrown.
      * @param target Service instance
      * @param bundleContext Bundle context from which services are fetched to inject.
-     * @return true if all dependencies could be injected
+     * @return true if all dependencies could be injected, false if the service has no dependencies.
      */
     public static boolean injectServices(Object target, BundleContext bundleContext) {
         return ReflectionServiceUtil.injectServices(target, bundleContext);

Modified: sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java?rev=1641954&r1=1641953&r2=1641954&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/ReflectionServiceUtil.java Wed Nov 26 22:17:39 2014
@@ -34,8 +34,6 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 
 /**
@@ -43,8 +41,6 @@ import org.w3c.dom.Document;
  */
 final class ReflectionServiceUtil {
 
-    private static final Logger log = LoggerFactory.getLogger(ReflectionServiceUtil.class);
-
     private ReflectionServiceUtil() {
         // static methods only
     }
@@ -261,7 +257,7 @@ final class ReflectionServiceUtil {
      * multiple references.
      * @param target Service instance
      * @param bundleContext Bundle context from which services are fetched to inject.
-     * @return true if all dependencies could be injected
+     * @return true if all dependencies could be injected, false if the service has no dependencies.
      */
     public static boolean injectServices(Object target, BundleContext bundleContext) {
 
@@ -273,17 +269,18 @@ final class ReflectionServiceUtil {
             throw new NoScrMetadataException(targetClass);
         }
         List<Reference> references = OsgiMetadataUtil.getReferences(targetClass, metadata);
+        if (references.isEmpty()) {
+            return false;
+        }
 
         // try to inject services
-        boolean allInjected = true;
         for (Reference reference : references) {
-            boolean injectSuccess = injectServiceReference(reference, target, bundleContext);
-            allInjected = allInjected && injectSuccess;
+            injectServiceReference(reference, target, bundleContext);
         }
-        return allInjected;
+        return true;
     }
 
-    private static boolean injectServiceReference(Reference reference, Object target, BundleContext bundleContext) {
+    private static void injectServiceReference(Reference reference, Object target, BundleContext bundleContext) {
         Class<?> targetClass = target.getClass();
 
         // get reference type
@@ -302,18 +299,14 @@ final class ReflectionServiceUtil {
             boolean isOptional = (reference.getCardinality() == ReferenceCardinality.OPTIONAL_UNARY || reference
                     .getCardinality() == ReferenceCardinality.OPTIONAL_MULTIPLE);
             if (!isOptional) {
-                log.warn("Unable to inject mandatory reference '{}' for class {}", reference.getName(),
-                        targetClass.getName());
+                throw new RuntimeException("Unable to inject mandatory reference '" + reference.getName() + "' for class " + targetClass.getName());
             }
-            return isOptional;
         }
 
         // multiple references found? check if reference is not multiple
         if (matchingServices.size() > 1
                 && (reference.getCardinality() == ReferenceCardinality.MANDATORY_UNARY || reference.getCardinality() == ReferenceCardinality.OPTIONAL_UNARY)) {
-            log.warn("Multiple matches found for unary reference '{}' for class {}", reference.getName(),
-                    targetClass.getName());
-            return false;
+            throw new RuntimeException("Multiple matches found for unary reference '" + reference.getName() + "' for class "+ targetClass.getName());
         }
 
         // try to invoke bind method
@@ -326,7 +319,7 @@ final class ReflectionServiceUtil {
                 for (ServiceInfo matchingService : matchingServices) {
                     invokeMethod(target, bindMethod, new Object[] { matchingService.getServiceReference() });
                 }
-                return true;
+                return;
             }
             
             // 2. assignable from service instance
@@ -341,7 +334,7 @@ final class ReflectionServiceUtil {
                 for (ServiceInfo matchingService : matchingServices) {
                     invokeMethod(target, bindMethod, new Object[] { matchingService.getServiceInstance() });
                 }
-                return true;
+                return;
             }
             
             // 3. assignable from service instance plus map
@@ -350,12 +343,12 @@ final class ReflectionServiceUtil {
                 for (ServiceInfo matchingService : matchingServices) {
                     invokeMethod(target, bindMethod, new Object[] { matchingService.getServiceInstance(), matchingService.getServiceConfig() });
                 }
-                return true;
+                return;
             }
         }
 
-        log.warn("Bind method not found for reference '{}' for class {}", reference.getName(), targetClass.getName());
-        return false;
+        throw new RuntimeException("Bind method with name " + bindMethodName + " not found "
+                + "for reference '" + reference.getName() + "' for class {}" +  targetClass.getName());
     }
 
     private static List<ServiceInfo> getMatchingServices(Class<?> type, BundleContext bundleContext) {

Modified: sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java?rev=1641954&r1=1641953&r2=1641954&view=diff
==============================================================================
--- sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java (original)
+++ sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/context/OsgiContextImplTest.java Wed Nov 26 22:17:39 2014
@@ -21,6 +21,7 @@ package org.apache.sling.testing.mock.os
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -29,6 +30,8 @@ import java.util.Set;
 
 import org.apache.sling.testing.mock.osgi.NoScrMetadataException;
 import org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest;
+import org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.ServiceInterface1;
+import org.apache.sling.testing.mock.osgi.ReflectionServiceUtilTest.ServiceInterface2;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -92,6 +95,13 @@ public class OsgiContextImplTest {
 
     @Test
     public void testRegisterInjectActivate() {
+        context.registerService(ServiceInterface1.class, mock(ServiceInterface1.class));
+        context.registerService(ServiceInterface2.class, mock(ServiceInterface2.class));
+        context.registerInjectActivateService(new ReflectionServiceUtilTest.Service3());
+    }
+
+    @Test(expected=RuntimeException.class)
+    public void testRegisterInjectActivate_RefrenceMissing() {
         context.registerInjectActivateService(new ReflectionServiceUtilTest.Service3());
     }