SLING-2419 - support non-default credential in test utilities - patch contributed by Mark Adamcin, thanks!

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1446510 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/junit/remote/httpclient/RemoteTestHttpClient.java b/src/main/java/org/apache/sling/junit/remote/httpclient/RemoteTestHttpClient.java
index d23c851..2091236 100644
--- a/src/main/java/org/apache/sling/junit/remote/httpclient/RemoteTestHttpClient.java
+++ b/src/main/java/org/apache/sling/junit/remote/httpclient/RemoteTestHttpClient.java
@@ -34,18 +34,36 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     
     private final String junitServletUrl;
+    private final String username;
+    private final String password;
     private StringBuilder subpath;
     private boolean consumeContent;
     private RequestCustomizer requestCustomizer;
     private static final String SLASH = "/";
     private static final String DOT = ".";
-    
+
     public RemoteTestHttpClient(String junitServletUrl, boolean consumeContent) {
+        this(junitServletUrl, null, null, consumeContent);
+    }
+    
+    public RemoteTestHttpClient(String junitServletUrl, String username, String password, boolean consumeContent) {
         if(junitServletUrl == null) {
             throw new IllegalArgumentException("JUnit servlet URL is null, cannot run tests");
         }
         this.junitServletUrl = junitServletUrl;
         this.consumeContent = consumeContent;
+
+        if (username != null) {
+            this.username = username;
+        } else {
+            this.username = SlingTestBase.ADMIN;
+        }
+
+        if (password != null) {
+            this.password = password;
+        } else {
+            this.password = SlingTestBase.ADMIN;
+        }
     }
     
     public void setRequestCustomizer(RequestCustomizer c) {
@@ -87,11 +105,11 @@
         }
         subpath.append(extension);
         
-        log.info("Executing test remotely, path={} JUnit servlet URL={}", 
+        log.info("Executing test remotely, path={} JUnit servlet URL={}",
                 subpath, junitServletUrl);
         final Request r = builder
         .buildPostRequest(subpath.toString())
-        .withCredentials(SlingTestBase.ADMIN, SlingTestBase.ADMIN)
+        .withCredentials(username, password)
         .withCustomizer(requestCustomizer);
         executor.execute(r).assertStatus(200);
 
diff --git a/src/main/java/org/apache/sling/junit/remote/ide/SlingRemoteExecutionRule.java b/src/main/java/org/apache/sling/junit/remote/ide/SlingRemoteExecutionRule.java
index e6551de..590ebd2 100644
--- a/src/main/java/org/apache/sling/junit/remote/ide/SlingRemoteExecutionRule.java
+++ b/src/main/java/org/apache/sling/junit/remote/ide/SlingRemoteExecutionRule.java
@@ -40,6 +40,8 @@
 
    /** Name of the system property that activates remote test execution */
    public static final String SLING_REMOTE_TEST_URL = "sling.remote.test.url";
+   public static final String SLING_REMOTE_TEST_USERNAME = "sling.remote.test.username";
+   public static final String SLING_REMOTE_TEST_PASSWORD = "sling.remote.test.password";
    
    public Statement apply(final Statement base, final FrameworkMethod method, Object target) {
        return new Statement() {
@@ -63,21 +65,24 @@
     */
    private boolean tryRemoteEvaluation(FrameworkMethod method) throws Throwable {
        String remoteUrl = System.getProperty(SLING_REMOTE_TEST_URL);
+       String remoteUsername = System.getProperty(SLING_REMOTE_TEST_USERNAME);
+       String remotePassword = System.getProperty(SLING_REMOTE_TEST_PASSWORD);
+
        if(remoteUrl != null) {
            remoteUrl = remoteUrl.trim();
            if(remoteUrl.length() > 0) {
-               invokeRemote(remoteUrl, method);
+               invokeRemote(remoteUrl, remoteUsername, remotePassword, method);
                return true;
            }
        }
        return false;
    }
 
-   private void invokeRemote(String remoteUrl, FrameworkMethod method) throws Throwable {
+   private void invokeRemote(String remoteUrl, String remoteUsername, String remotePassword, FrameworkMethod method) throws Throwable {
        final String testClassesSelector = method.getMethod().getDeclaringClass().getName();
        final String methodName = method.getMethod().getName();
        
-       final RemoteTestHttpClient testHttpClient = new RemoteTestHttpClient(remoteUrl, false);
+       final RemoteTestHttpClient testHttpClient = new RemoteTestHttpClient(remoteUrl, remoteUsername, remotePassword, false);
        testHttpClient.setRequestCustomizer(this);
        final RequestExecutor executor = testHttpClient.runTests(
                testClassesSelector, methodName, "serialized"
diff --git a/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestRunner.java b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestRunner.java
index 3f6e28a..a352436 100644
--- a/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestRunner.java
+++ b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestRunner.java
@@ -25,6 +25,7 @@
 import org.apache.sling.junit.remote.httpclient.RemoteTestHttpClient;
 import org.apache.sling.testing.tools.http.RequestCustomizer;
 import org.apache.sling.testing.tools.http.RequestExecutor;
+import org.apache.sling.testing.tools.sling.SlingTestBase;
 import org.junit.internal.AssumptionViolatedException;
 import org.junit.internal.runners.model.EachTestNotifier;
 import org.junit.runner.Description;
@@ -45,6 +46,8 @@
     private static final Logger log = LoggerFactory.getLogger(SlingRemoteTestRunner.class);
     private final SlingRemoteTestParameters testParameters;
     private RemoteTestHttpClient testHttpClient;
+    private final String username;
+    private final String password;
     private final Class<?> testClass;
     
     private final List<SlingRemoteTest> children = new LinkedList<SlingRemoteTest>();
@@ -64,6 +67,22 @@
             throw new InitializationError(e);
         }
         
+        // Set configured username using "admin" as default credential
+        final String configuredUsername = System.getProperty(SlingTestBase.TEST_SERVER_USERNAME);
+        if (configuredUsername != null && configuredUsername.trim().length() > 0) {
+            username = configuredUsername;
+        } else {
+            username = SlingTestBase.ADMIN;
+        }
+
+        // Set configured password using "admin" as default credential
+        final String configuredPassword = System.getProperty(SlingTestBase.TEST_SERVER_PASSWORD);
+        if (configuredPassword != null && configuredPassword.trim().length() > 0) {
+            password = configuredPassword;
+        } else {
+            password = SlingTestBase.ADMIN;
+        }
+        
         testParameters = (SlingRemoteTestParameters)o;
     }
     
@@ -73,7 +92,7 @@
             return;
         }
         
-        testHttpClient = new RemoteTestHttpClient(testParameters.getJunitServletUrl(), true);
+        testHttpClient = new RemoteTestHttpClient(testParameters.getJunitServletUrl(), this.username, this.password, true);
 
         // Let the parameters class customize the request if desired 
         if(testParameters instanceof RequestCustomizer) {
@@ -99,8 +118,8 @@
             }
         }
         
-        log.info("Server-side tests executed at {} with path {}", 
-                testParameters.getJunitServletUrl(), testHttpClient.getTestExecutionPath());
+        log.info("Server-side tests executed as {} at {} with path {}",
+                new Object[]{this.username, testParameters.getJunitServletUrl(), testHttpClient.getTestExecutionPath()});
         
         // Optionally check that number of tests is as expected
         if(testParameters instanceof SlingTestsCountChecker) {
@@ -144,4 +163,4 @@
             eachNotifier.fireTestFinished();
         }
     }
-}
\ No newline at end of file
+}