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 2016/09/06 19:58:29 UTC

svn commit: r1759492 - in /sling/trunk/testing/junit: core/src/main/java/org/apache/sling/junit/rules/ServerSideTeleporter.java teleporter/src/main/java/org/apache/sling/testing/teleporter/client/ClientSideTeleporter.java

Author: sseifert
Date: Tue Sep  6 19:58:29 2016
New Revision: 1759492

URL: http://svn.apache.org/viewvc?rev=1759492&view=rev
Log:
SLING-6031 Teleporter.getService() should wait for required services

Modified:
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/rules/ServerSideTeleporter.java
    sling/trunk/testing/junit/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/ClientSideTeleporter.java

Modified: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/rules/ServerSideTeleporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/rules/ServerSideTeleporter.java?rev=1759492&r1=1759491&r2=1759492&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/rules/ServerSideTeleporter.java (original)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/rules/ServerSideTeleporter.java Tue Sep  6 19:58:29 2016
@@ -31,6 +31,8 @@ class ServerSideTeleporter extends Telep
     private final List<ServiceReference> toUnget = new ArrayList<ServiceReference>();
     private final BundleContext bundleContext;
     
+    private static final int WAITFOR_SERVICE_TIMEOUT_DEFAULT_SECONDS = 10;
+    
     ServerSideTeleporter() {
         bundleContext = Activator.getBundleContext();
         if(bundleContext == null) {
@@ -48,9 +50,41 @@ class ServerSideTeleporter extends Telep
         }
     }
 
+    /**
+     * Get OSGi service - if it is not available (yet?) try again and again until the configured timeout is reached.
+     */
     public <T> T getService (Class<T> serviceClass, String ldapFilter) {
+        String configuredTimeout = (String)bundleContext.getBundle().getHeaders().get("Sling-Test-WaitForService-Timeout");
+        if (configuredTimeout == null) {
+            configuredTimeout = Integer.toString(WAITFOR_SERVICE_TIMEOUT_DEFAULT_SECONDS);
+        }
+        final long timeout = System.currentTimeMillis() + Integer.parseInt(configuredTimeout) * 1000;
+        
+        while (System.currentTimeMillis() < timeout) {
+            try {
+                T service = getServiceInternal(serviceClass, ldapFilter);
+                if (service != null) {
+                    return service;
+                }
+            }
+            catch (IllegalStateException ex) {
+                // ignore, try again
+            }
+            try {
+                Thread.sleep(50L);
+            }
+            catch (InterruptedException ex) {
+                // ignore
+            }
+        }
+        throw new IllegalStateException(
+                "unable to get a service reference, class=" + serviceClass.getName() + ", filter='" + ldapFilter + "'");
+    }
+
+    private <T> T getServiceInternal (Class<T> serviceClass, String ldapFilter) {
         final ServiceGetter sg = new ServiceGetter(bundleContext, serviceClass, ldapFilter);
         toUnget.add(sg.serviceReference);
         return serviceClass.cast(sg.service);
     }
+
 }

Modified: sling/trunk/testing/junit/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/ClientSideTeleporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/ClientSideTeleporter.java?rev=1759492&r1=1759491&r2=1759492&view=diff
==============================================================================
--- sling/trunk/testing/junit/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/ClientSideTeleporter.java (original)
+++ sling/trunk/testing/junit/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/ClientSideTeleporter.java Tue Sep  6 19:58:29 2016
@@ -48,6 +48,7 @@ public class ClientSideTeleporter extend
     private DependencyAnalyzer dependencyAnalyzer;
     private int testReadyTimeoutSeconds = 20;
     private int webConsoleReadyTimeoutSeconds = 30;
+    private int waitForServiceTimout = 10;
     private String baseUrl;
     private String serverCredentials;
     private String testServletPath = DEFAULT_TEST_SERVLET_PATH;
@@ -58,6 +59,7 @@ public class ClientSideTeleporter extend
         final TinyBundle b = TinyBundles.bundle()
             .set(Constants.BUNDLE_SYMBOLICNAME, bundleSymbolicName)
             .set("Sling-Test-Regexp", c.getName() + ".*")
+            .set("Sling-Test-WaitForService-Timeout", Integer.toString(waitForServiceTimout))
             .add(c);
 
         for(Map.Entry<String, String> header : additionalBundleHeaders.entrySet()) {
@@ -110,6 +112,14 @@ public class ClientSideTeleporter extend
         webConsoleReadyTimeoutSeconds = tm;
     }
     
+    /**
+     * Define how long to wait to get a service reference.
+     * This applies only on the server-side when using the {@link #getService(Class)} or {@link #getService(Class, String)} methods.
+     */
+    public void setWaitForServiceTimoutSeconds (int tm) {
+        waitForServiceTimout = tm;
+    }
+    
     /** Set the credentials to use to install our test bundle on the server */
     public void setServerCredentials(String username, String password) {
         serverCredentials = username + ":" + password;