Start implementing OSGi integration tests
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 4 Jun 2009 10:26:30 +0000 (10:26 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 4 Jun 2009 10:26:30 +0000 (10:26 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@2457 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

integration-tests/org.argeo.slc.it.webapp/pom.xml
integration-tests/org.argeo.slc.it.webapp/src/test/java/org/argeo/slc/it/webapp/AgentTest.java
integration-tests/org.argeo.slc.it.webapp/src/test/resources/org/argeo/slc/it/webapp/applicationContext.xml
org.argeo.slc/pom.xml
runtime/org.argeo.slc.server/pom.xml
runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/server/client/SlcServerHttpClient.java
runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/management/IsServerReady.java [new file with mode: 0644]
runtime/org.argeo.slc.server/src/main/resources/org/argeo/slc/server/client/spring.xml
runtime/org.argeo.slc.server/src/test/java/org/argeo/slc/server/unit/AbstractHttpClientTestCase.java [new file with mode: 0644]
runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/msg/ExecutionAnswer.java
server/org.argeo.slc.siteserver/bundles/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml

index 615e7247124c7f3a8bf9be9444979856acdcaeb4..42aacc2f878c9c71175fef15b5ada4ae657644a4 100644 (file)
@@ -35,7 +35,7 @@
                                                </goals>
                                                <configuration>
                                                        <wait>false</wait>
-                                                       <pause>30000</pause>
+                                                       <!--  <pause>30000</pause>-->
                                                        <argsToAppend>
                                                                <arg>-clean</arg>
                                                        </argsToAppend>
                <!-- TEST -->
                <dependency>
                        <groupId>org.argeo.slc.runtime</groupId>
-                       <artifactId>org.argeo.slc.support.equinox</artifactId>
+                       <artifactId>org.argeo.slc.server</artifactId>
                        <classifier>tests</classifier>
                        <scope>test</scope>
                </dependency>
-               <dependency>
-                       <groupId>org.springframework.osgi</groupId>
-                       <artifactId>org.springframework.osgi.test</artifactId>
-                       <scope>test</scope>
-               </dependency>
                <dependency>
                        <groupId>org.argeo.slc.runtime</groupId>
                        <artifactId>org.argeo.slc.osgiboot</artifactId>
                        <scope>test</scope>
                </dependency>
-
        </dependencies>
 </project>
\ No newline at end of file
index 09f368e4f49daeedcde3f104f0a4c7406aceb91e..e4515d27588ca918009f530f5e90091b5631e8d3 100644 (file)
@@ -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);
index 8c1dcb7f66279906b496d542c56987aa497c619c..3d7b057670506680cda150adc863c55bd6f33874 100644 (file)
@@ -1,17 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
        default-lazy-init="true">
 
-       <import resource="classpath:org/argeo/slc/castor/spring.xml" />
+       <import resource="classpath:org/argeo/slc/server/client/spring.xml" />
 
-       <!-- Http client -->
-       <bean id="slcDefault.serverHttpClient"
-               class="org.argeo.slc.server.client.SlcServerHttpClient" lazy-init="true">
-               <property name="unmarshaller" ref="slcDefault.castor.marshaller" />
-       </bean>
 </beans>
\ No newline at end of file
index 7a4b56f3f01e5f3a793380a6b4719e029db0f448..1d512ae78fe849a2b8e125ee90e5b3c599040a84 100644 (file)
@@ -20,7 +20,6 @@
                <version.equinox>3.4.2.R34x_v20080826-1230</version.equinox>
                <version.maven-bundle-plugin>2.0.0</version.maven-bundle-plugin>
                <version.activemq>5.2.0.0006</version.activemq>
-               <!-- <version.activemq-web>5.2.0.0005</version.activemq-web> -->
                <version.maven-argeo-osgi>0.1.10</version.maven-argeo-osgi>
        </properties>
        <scm>
@@ -253,6 +252,12 @@ limitations under the License.
                                <artifactId>org.argeo.slc.server</artifactId>
                                <version>${project.version}</version>
                        </dependency>
+                       <dependency>
+                               <groupId>org.argeo.slc.runtime</groupId>
+                               <artifactId>org.argeo.slc.server</artifactId>
+                               <version>${project.version}</version>
+                               <classifier>tests</classifier>
+                       </dependency>
                        <dependency>
                                <groupId>org.argeo.slc.runtime</groupId>
                                <artifactId>org.argeo.slc.osgiboot</artifactId>
index 782495b418a8801c73a3d390b4151a0eaebe6c71..a810403989773a4a30c4aa450b74cfc032fdab56 100644 (file)
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-jar-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       <goal>test-jar</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
                        </plugin>
                        <plugin>
                                <groupId>org.apache.felix</groupId>
                </dependency>
 
                <!-- Spring -->
-               <!-- 
-               <dependency>
-                       <groupId>org.springframework.ws</groupId>
-                       <artifactId>org.springframework.ws</artifactId>
-               </dependency>
-                -->
+               <!--
+                       <dependency> <groupId>org.springframework.ws</groupId>
+                       <artifactId>org.springframework.ws</artifactId> </dependency>
+               -->
                <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>org.springframework.web.servlet</artifactId>
index 7a77175cf4a6de3a5e236c7f3c3acc8af14070df..7102a749c014dc6d43a9d411416efe13bde6932b 100644 (file)
@@ -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> T callService(String path, Map<String, String> 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> T callServiceSafe(String path, Map<String, String> 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<String, String> 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 (file)
index 0000000..515b841
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.slc.web.mvc.management;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.argeo.slc.web.mvc.AbstractServiceController;\r
+import org.springframework.web.servlet.ModelAndView;\r
+\r
+/** . */\r
+public class IsServerReady extends AbstractServiceController {\r
+       @Override\r
+       protected void handleServiceRequest(HttpServletRequest request,\r
+                       HttpServletResponse response, ModelAndView modelAndView)\r
+                       throws Exception {\r
+               // Does nothing for now, it will return an OK answer.\r
+       }\r
+\r
+}\r
index 54080762ca715e03853f8ff85a50249fe694ed40..e67633eec48a25d589e190b58973d954c6a52a39 100644 (file)
@@ -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">
 
-       <import resource="classpath:org/argeo/slc/server/client/spring.xml" />
+       <import resource="classpath:org/argeo/slc/castor/spring.xml" />
+
+       <!-- Http client -->
+       <bean id="slcDefault.serverHttpClient" class="org.argeo.slc.server.client.SlcServerHttpClient"
+               lazy-init="true">
+               <property name="unmarshaller" ref="slcDefault.castor.marshaller" />
+               <property name="baseUrl" value="http://localhost:7070/org.argeo.slc.webapp/" />
+       </bean>
 </beans>
\ 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 (file)
index 0000000..5d5dcea
--- /dev/null
@@ -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;
+       }
+}
index 0ae20be70e495c6c434cbed6d7be8ed186e83260..d7047e953b6c03110671f739c03abf76d5728cb0 100644 (file)
@@ -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);
        }
index 217dd5f2a97e47a1643ced6f816c4a05f281c804..a3e22d1989b3be3c7c2711c0a88220b7c2b8817e 100644 (file)
@@ -7,6 +7,9 @@
 
        <import resource="classpath:/org/argeo/slc/castor/spring/applicationContext.xml" />
 
+       <bean name="/isServerReady.service" class="org.argeo.slc.web.mvc.management.IsServerReady">
+       </bean>
+
        <bean name="/getResult.service" class="org.argeo.slc.web.mvc.result.GetResultController">
                <constructor-arg ref="testResultDao" />
        </bean>