You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:51:17 UTC
[sling-org-apache-sling-junit-healthcheck] 01/45: SLING-1963 -
remote tests runner, work in progress
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.junit.healthcheck-1.0.4
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-junit-healthcheck.git
commit 226355ade941f9cd5d52be89939cc2359dab815b
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Tue Feb 22 16:56:19 2011 +0000
SLING-1963 - remote tests runner, work in progress
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/testing/junit/remote@1073404 13f79535-47bb-0310-9956-ffa450edef68
---
pom.xml | 70 ++++++++++
.../junit/remote/testrunner/SlingRemoteTest.java | 47 +++++++
.../testrunner/SlingRemoteTestParameters.java | 26 ++++
.../remote/testrunner/SlingRemoteTestRunner.java | 152 +++++++++++++++++++++
4 files changed, 295 insertions(+)
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..78a3a3a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>sling</artifactId>
+ <version>10</version>
+ </parent>
+
+ <artifactId>org.apache.sling.junit.remote</artifactId>
+ <version>0.1.1-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>Apache Sling JUnit Remote Extension</name>
+ <description>Runs JUnit tests remotely</description>
+
+ <scm>
+ <connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/testing/junit/remote</connection>
+ <developerConnection> scm:svn:https://svn.apache.org/repos/asf/sling/trunk/testing/junit/remote</developerConnection>
+ <url>http://svn.apache.org/viewvc/sling/trunk/testing/junit/remote</url>
+ </scm>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.junit.core</artifactId>
+ <version>0.1.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.2</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.5.11</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.stanbol</groupId>
+ <artifactId>org.apache.stanbol.commons.testing.http</artifactId>
+ <version>0.9-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.json</artifactId>
+ <version>2.0.6</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTest.java b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTest.java
new file mode 100644
index 0000000..5171474
--- /dev/null
+++ b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.junit.remote.testrunner;
+
+import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.json.JSONObject;
+import org.junit.runner.Description;
+
+/** Info about a remote tests, as provided by the Sling JUnit servlet */
+class SlingRemoteTest {
+ private final Class<?> testClass;
+ private final String description;
+ private final String failure;
+
+ public static final String DESCRIPTION = "description";
+ public static final String FAILURE = "failure";
+
+ SlingRemoteTest(Class<?> testClass, JSONObject json) throws JSONException {
+ this.testClass = testClass;
+ description = json.getString(DESCRIPTION);
+ failure = json.has(FAILURE) ? json.getString(FAILURE) : null;
+ }
+
+ Description describe() {
+ return Description.createTestDescription(testClass, description);
+ }
+
+ void run() {
+ if(failure != null && failure.trim().length() > 0) {
+ throw new AssertionError(failure);
+ }
+ }
+}
diff --git a/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestParameters.java b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestParameters.java
new file mode 100644
index 0000000..84e32af
--- /dev/null
+++ b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestParameters.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.junit.remote.testrunner;
+
+/** Test class "proxies" implement this to indicate where to
+ * run the tests.
+ */
+public interface SlingRemoteTestParameters {
+ int getExpectedNumberOfTests();
+ String getServerBaseUrl();
+ String getJunitServletPath();
+}
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
new file mode 100644
index 0000000..6d5010b
--- /dev/null
+++ b/src/main/java/org/apache/sling/junit/remote/testrunner/SlingRemoteTestRunner.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.junit.remote.testrunner;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.sling.commons.json.JSONArray;
+import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.commons.json.JSONTokener;
+import org.apache.stanbol.commons.testing.http.Request;
+import org.apache.stanbol.commons.testing.http.RequestBuilder;
+import org.apache.stanbol.commons.testing.http.RequestExecutor;
+import org.junit.internal.AssumptionViolatedException;
+import org.junit.internal.runners.model.EachTestNotifier;
+import org.junit.runner.Description;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.ParentRunner;
+import org.junit.runners.model.InitializationError;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** JUnit TestRunner that talks to a remote
+ * Sling JUnit test servlet. Using this test
+ * runner lets a test class discover tests
+ * that the JUnit servlet can execute, execute
+ * them and report results exactly as if the tests
+ * ran locally.
+ */
+public class SlingRemoteTestRunner extends ParentRunner<SlingRemoteTest> {
+ private static final Logger log = LoggerFactory.getLogger(SlingRemoteTestRunner.class);
+ private final SlingRemoteTestParameters testParameters;
+ private RequestExecutor executor;
+ private RequestBuilder builder;
+ private final Class<?> testClass;
+
+ private final List<SlingRemoteTest> children = new LinkedList<SlingRemoteTest>();
+
+ public SlingRemoteTestRunner(Class<?> testClass) throws InitializationError {
+ super(testClass);
+ this.testClass = testClass;
+
+ Object o = null;
+ try {
+ o = testClass.newInstance();
+ if( !(o instanceof SlingRemoteTestParameters)) {
+ throw new IllegalArgumentException(o.getClass().getName()
+ + " is not a " + SlingRemoteTestParameters.class.getSimpleName());
+ }
+ } catch(Exception e) {
+ throw new InitializationError(e);
+ }
+
+ testParameters = (SlingRemoteTestParameters)o;
+ }
+
+ private void maybeExecuteTests() throws Exception {
+ if(executor != null) {
+ return;
+ }
+
+ // Setup request execution
+ executor = new RequestExecutor(new DefaultHttpClient());
+ if(testParameters.getServerBaseUrl() == null) {
+ throw new IllegalStateException("Server base URL is null, cannot run tests");
+ }
+ builder = new RequestBuilder(testParameters.getServerBaseUrl());
+
+ // TODO for now we run tests at the same time as we count them,
+ // as the junit servlet uses only GET - need to change that to GET and POST
+ final Request r = builder.buildGetRequest(testParameters.getJunitServletPath() + "/.json");
+
+ // Get list of tests in JSON format
+ executor.execute(r)
+ .assertStatus(200)
+ .assertContentType("application/json");
+
+ final JSONArray json = new JSONArray(new JSONTokener((executor.getContent())));
+
+ // Response contains an array of objects identified by
+ // their INFO_TYPE, extract the tests
+ // based on this vlaue
+ for(int i = 0 ; i < json.length(); i++) {
+ final JSONObject obj = json.getJSONObject(i);
+ if("test".equals(obj.getString("INFO_TYPE"))) {
+ children.add(new SlingRemoteTest(testClass, obj));
+ }
+ }
+
+ log.info("{} server-side tests executed at {}",
+ children.size(), testParameters.getJunitServletPath());
+
+ // Check that number of tests is as expected
+ assertEquals("Expecting " + testParameters.getExpectedNumberOfTests() + " tests",
+ testParameters.getExpectedNumberOfTests(),
+ children.size());
+ }
+
+ @Override
+ protected Description describeChild(SlingRemoteTest t) {
+ return t.describe();
+ }
+
+ @Override
+ protected List<SlingRemoteTest> getChildren() {
+ try {
+ maybeExecuteTests();
+ } catch(Exception e) {
+ throw new Error(e);
+ }
+ return children;
+ }
+
+ @Override
+ protected void runChild(SlingRemoteTest t, RunNotifier notifier) {
+ try {
+ maybeExecuteTests();
+ } catch(Exception e) {
+ throw new Error(e);
+ }
+
+ EachTestNotifier eachNotifier= new EachTestNotifier(notifier, t.describe());
+ eachNotifier.fireTestStarted();
+ try {
+ log.debug("Running test {}", t.describe());
+ t.run();
+ } catch (AssumptionViolatedException e) {
+ eachNotifier.addFailedAssumption(e);
+ } catch (Throwable e) {
+ eachNotifier.addFailure(e);
+ } finally {
+ eachNotifier.fireTestFinished();
+ }
+ }
+}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.