From 3e1feafae6dee22c13272e992fc967cc42776f15 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 4 Jun 2009 10:26:30 +0000 Subject: [PATCH] Start implementing OSGi integration tests git-svn-id: https://svn.argeo.org/slc/trunk@2457 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org.argeo.slc.it.webapp/pom.xml | 10 +-- .../org/argeo/slc/it/webapp/AgentTest.java | 8 +- .../slc/it/webapp/applicationContext.xml | 10 +-- org.argeo.slc/pom.xml | 7 +- runtime/org.argeo.slc.server/pom.xml | 17 ++-- .../server/client/SlcServerHttpClient.java | 77 +++++++++++++++++-- .../slc/web/mvc/management/IsServerReady.java | 18 +++++ .../org/argeo/slc/server/client/spring.xml | 9 ++- .../unit/AbstractHttpClientTestCase.java | 38 +++++++++ .../org/argeo/slc/msg/ExecutionAnswer.java | 8 ++ .../WEB-INF/slc-service-servlet.xml | 3 + 11 files changed, 171 insertions(+), 34 deletions(-) create mode 100644 runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/IsServerReady.java create mode 100644 runtime/org.argeo.slc.server/src/test/java/org/argeo/slc/server/unit/AbstractHttpClientTestCase.java diff --git a/integration-tests/org.argeo.slc.it.webapp/pom.xml b/integration-tests/org.argeo.slc.it.webapp/pom.xml index 615e72471..42aacc2f8 100644 --- a/integration-tests/org.argeo.slc.it.webapp/pom.xml +++ b/integration-tests/org.argeo.slc.it.webapp/pom.xml @@ -35,7 +35,7 @@ false - 30000 + -clean @@ -104,20 +104,14 @@ org.argeo.slc.runtime - org.argeo.slc.support.equinox + org.argeo.slc.server tests test - - org.springframework.osgi - org.springframework.osgi.test - test - org.argeo.slc.runtime org.argeo.slc.osgiboot test - \ No newline at end of file diff --git a/integration-tests/org.argeo.slc.it.webapp/src/test/java/org/argeo/slc/it/webapp/AgentTest.java b/integration-tests/org.argeo.slc.it.webapp/src/test/java/org/argeo/slc/it/webapp/AgentTest.java index 09f368e4f..e4515d275 100644 --- a/integration-tests/org.argeo.slc.it.webapp/src/test/java/org/argeo/slc/it/webapp/AgentTest.java +++ b/integration-tests/org.argeo.slc.it.webapp/src/test/java/org/argeo/slc/it/webapp/AgentTest.java @@ -1,14 +1,12 @@ package org.argeo.slc.it.webapp; -import java.net.InetAddress; - import org.argeo.slc.msg.ObjectList; -import org.argeo.slc.runtime.SlcAgentDescriptor; import org.argeo.slc.server.client.SlcServerHttpClient; -import org.argeo.slc.unit.AbstractSpringTestCase; +import org.argeo.slc.server.unit.AbstractHttpClientTestCase; -public class AgentTest extends AbstractSpringTestCase { +public class AgentTest extends AbstractHttpClientTestCase{ public void testListAgents() throws Exception { + waitForServerToBeReady(); SlcServerHttpClient httpClient = getBean(SlcServerHttpClient.class); ObjectList objectList = httpClient.callService("listAgents.service", null); diff --git a/integration-tests/org.argeo.slc.it.webapp/src/test/resources/org/argeo/slc/it/webapp/applicationContext.xml b/integration-tests/org.argeo.slc.it.webapp/src/test/resources/org/argeo/slc/it/webapp/applicationContext.xml index 8c1dcb7f6..3d7b05767 100644 --- a/integration-tests/org.argeo.slc.it.webapp/src/test/resources/org/argeo/slc/it/webapp/applicationContext.xml +++ b/integration-tests/org.argeo.slc.it.webapp/src/test/resources/org/argeo/slc/it/webapp/applicationContext.xml @@ -1,17 +1,11 @@ - + - - - - \ No newline at end of file diff --git a/org.argeo.slc/pom.xml b/org.argeo.slc/pom.xml index 7a4b56f3f..1d512ae78 100644 --- a/org.argeo.slc/pom.xml +++ b/org.argeo.slc/pom.xml @@ -20,7 +20,6 @@ 3.4.2.R34x_v20080826-1230 2.0.0 5.2.0.0006 - 0.1.10 @@ -253,6 +252,12 @@ limitations under the License. org.argeo.slc.server ${project.version} + + org.argeo.slc.runtime + org.argeo.slc.server + ${project.version} + tests + org.argeo.slc.runtime org.argeo.slc.osgiboot diff --git a/runtime/org.argeo.slc.server/pom.xml b/runtime/org.argeo.slc.server/pom.xml index 782495b41..a81040398 100644 --- a/runtime/org.argeo.slc.server/pom.xml +++ b/runtime/org.argeo.slc.server/pom.xml @@ -24,6 +24,13 @@ org.apache.maven.plugins maven-jar-plugin + + + + test-jar + + + org.apache.felix @@ -75,12 +82,10 @@ - + org.springframework org.springframework.web.servlet diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/SlcServerHttpClient.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/SlcServerHttpClient.java index 7a77175cf..7102a749c 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/SlcServerHttpClient.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/SlcServerHttpClient.java @@ -1,5 +1,6 @@ package org.argeo.slc.server.client; +import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; @@ -8,16 +9,76 @@ import java.util.Map; import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.slc.SlcException; import org.springframework.oxm.Unmarshaller; +import org.springframework.util.Assert; public class SlcServerHttpClient { + private final static Log log = LogFactory.getLog(SlcServerHttpClient.class); + private Unmarshaller unmarshaller; - private String baseUrl = "http://localhost:7070/org.argeo.slc.webapp/"; + private String baseUrl; + + private Long retryPeriod = 1000l; @SuppressWarnings(value = { "unchecked" }) public T callService(String path, Map parameters) { + try { + return (T) callServiceLowLevel(path, parameters); + } catch (Exception e) { + throw new SlcException("Cannot call service " + path + " on " + + baseUrl, e); + } + } + @SuppressWarnings(value = { "unchecked" }) + public T callServiceSafe(String path, Map parameters, + long timeout) { + long begin = System.currentTimeMillis(); + try { + Object obj = null; + long duration = System.currentTimeMillis() - begin; + while (duration < timeout) { + try { + obj = callServiceLowLevel(path, parameters); + } catch (IOException e) { + if (log.isTraceEnabled()) + log.trace("Exception when calling service " + path + + " on " + baseUrl, e); + } + + if (obj != null) + break; + + // wait a bit + try { + Thread.sleep(retryPeriod); + } catch (InterruptedException e) { + // silent + } + } + + if (obj == null) + throw new SlcException( + "Service " + + path + + " on " + + baseUrl + + " did not return an answer after calling it safely for " + + duration + " ms."); + return (T) obj; + } catch (Exception e) { + throw new SlcException( + "Unexpected exception when safely calling service " + path + + " on " + baseUrl, e); + } + } + + protected Object callServiceLowLevel(String path, + Map parameters) throws IOException { + Assert.notNull(baseUrl, "base url"); InputStream in = null; try { URL url = new URL(baseUrl + path); @@ -34,10 +95,7 @@ public class SlcServerHttpClient { in = connection.getInputStream(); StreamSource source = new StreamSource(in); Object obj = unmarshaller.unmarshal(source); - return (T) obj; - } catch (Exception e) { - throw new SlcException("Cannot call service " + path + " on " - + baseUrl, e); + return obj; } finally { IOUtils.closeQuietly(in); } @@ -51,4 +109,13 @@ public class SlcServerHttpClient { this.baseUrl = baseUrl; } + public Long getRetryPeriod() { + return retryPeriod; + } + + /** Retry period in ms when accessing service safely. Default is 1000 ms. */ + public void setRetryPeriod(Long retryPeriod) { + this.retryPeriod = retryPeriod; + } + } diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/IsServerReady.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/IsServerReady.java new file mode 100644 index 000000000..515b841ea --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/IsServerReady.java @@ -0,0 +1,18 @@ +package org.argeo.slc.web.mvc.management; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.argeo.slc.web.mvc.AbstractServiceController; +import org.springframework.web.servlet.ModelAndView; + +/** . */ +public class IsServerReady extends AbstractServiceController { + @Override + protected void handleServiceRequest(HttpServletRequest request, + HttpServletResponse response, ModelAndView modelAndView) + throws Exception { + // Does nothing for now, it will return an OK answer. + } + +} diff --git a/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/client/spring.xml b/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/client/spring.xml index 54080762c..e67633eec 100644 --- a/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/client/spring.xml +++ b/runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/client/spring.xml @@ -7,5 +7,12 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" default-lazy-init="true"> - + + + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.server/src/test/java/org/argeo/slc/server/unit/AbstractHttpClientTestCase.java b/runtime/org.argeo.slc.server/src/test/java/org/argeo/slc/server/unit/AbstractHttpClientTestCase.java new file mode 100644 index 000000000..5d5dcea5e --- /dev/null +++ b/runtime/org.argeo.slc.server/src/test/java/org/argeo/slc/server/unit/AbstractHttpClientTestCase.java @@ -0,0 +1,38 @@ +package org.argeo.slc.server.unit; + +import org.argeo.slc.SlcException; +import org.argeo.slc.msg.ExecutionAnswer; +import org.argeo.slc.server.client.SlcServerHttpClient; +import org.argeo.slc.unit.AbstractSpringTestCase; + +public abstract class AbstractHttpClientTestCase extends AbstractSpringTestCase { + private SlcServerHttpClient httpClient = null; + + private String isServerReadyService = "isServerReady.service"; + + protected void setUp() throws Exception { + super.setUp(); + httpClient = createHttpClient(); + } + + protected void waitForServerToBeReady() { + ExecutionAnswer answer = httpClient.callServiceSafe( + isServerReadyService, null, getServerReadyTimeout()); + if (!answer.isOk()) + throw new SlcException("Server is not ready: " + answer); + } + + protected SlcServerHttpClient createHttpClient() { + SlcServerHttpClient httpClient = getBean(SlcServerHttpClient.class); + return httpClient; + } + + protected SlcServerHttpClient getHttpClient() { + return httpClient; + } + + /** Default is 120s */ + protected Long getServerReadyTimeout() { + return 120 * 1000l; + } +} diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java index 0ae20be70..d7047e953 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java @@ -44,6 +44,14 @@ public class ExecutionAnswer { this.message = message; } + public Boolean isOk() { + return status.equals(OK); + } + + public Boolean isError() { + return status.equals(ERROR); + } + public static ExecutionAnswer error(String message) { return new ExecutionAnswer(ERROR, message); } diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml index 217dd5f2a..a3e22d198 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml @@ -7,6 +7,9 @@ + + + -- 2.39.2