You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jo...@apache.org on 2011/01/19 06:50:20 UTC

svn commit: r1060687 - in /tapestry/tapestry5/trunk/tapestry-test: ./ src/main/java/org/apache/tapestry5/test/

Author: joshcanfield
Date: Wed Jan 19 05:50:19 2011
New Revision: 1060687

URL: http://svn.apache.org/viewvc?rev=1060687&view=rev
Log:
Fixed TAP5-1419: Created Tomcat6Runner and added servlet-container test parameter.

Added:
    tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/ServletContainerRunner.java
    tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Tomcat6Runner.java
Modified:
    tapestry/tapestry5/trunk/tapestry-test/pom.xml
    tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Jetty7Runner.java
    tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java
    tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/TapestryTestConstants.java

Modified: tapestry/tapestry5/trunk/tapestry-test/pom.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-test/pom.xml?rev=1060687&r1=1060686&r2=1060687&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-test/pom.xml (original)
+++ tapestry/tapestry5/trunk/tapestry-test/pom.xml Wed Jan 19 05:50:19 2011
@@ -56,6 +56,20 @@
       <version>5.1.12</version>
       <scope>compile</scope>
     </dependency>
+
+    <dependency>
+        <groupId>org.apache.tomcat</groupId>
+        <artifactId>catalina</artifactId>
+        <version>6.0.30</version>
+        <scope>compile</scope>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.tomcat</groupId>
+        <artifactId>coyote</artifactId>
+        <version>6.0.30</version>
+        <scope>compile</scope>
+    </dependency>
+
   </dependencies>
   <build>
     <plugins>

Modified: tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Jetty7Runner.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Jetty7Runner.java?rev=1060687&r1=1060686&r2=1060687&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Jetty7Runner.java (original)
+++ tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Jetty7Runner.java Wed Jan 19 05:50:19 2011
@@ -23,7 +23,7 @@ import org.eclipse.jetty.webapp.WebAppCo
 /**
  * Launches an instance of Jetty7.
  */
-public class Jetty7Runner
+public class Jetty7Runner implements ServletContainerRunner
 {
     private final Server jettyServer;
 

Modified: tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java?rev=1060687&r1=1060686&r2=1060687&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java (original)
+++ tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java Wed Jan 19 05:50:19 2011
@@ -37,7 +37,7 @@ import com.thoughtworks.selenium.Seleniu
 /**
  * Base class for creating Selenium-based integration test cases. This class implements all the
  * methods of {@link Selenium} and delegates to an instance (setup once per test by
- * {@link #testStartup(String, String, int, int, String, ITestContext, XmlTest)}.
+ * {@link #testStartup(org.testng.ITestContext, org.testng.xml.XmlTest)}.
  * 
  * @since 5.2.0
  */
@@ -47,6 +47,8 @@ public class SeleniumTestCase extends As
      * 15 seconds
      */
     public static final String PAGE_LOAD_TIMEOUT = "15000";
+    public static final String TOMCAT_6 = "tomcat6";
+    public static final String JETTY_7 = "jetty7";
 
     private Selenium delegate;
 
@@ -70,6 +72,12 @@ public class SeleniumTestCase extends As
      * <th>Description</th>
      * </tr>
      * <tr>
+     * <td>container</td>
+     * <td>tapestry.servlet-container</td>
+     * <td>JETTY_7</td>
+     * <td>The Servlet container to use for the tests. Currently {@link #JETTY_7} or {@link #TOMCAT_6}</td>
+     * </tr>
+     * <tr>
      * <td>webAppFolder</td>
      * <td>tapestry.web-app-folder</td>
      * <td>src/main/webapp</td>
@@ -131,13 +139,14 @@ public class SeleniumTestCase extends As
         // Map<String, String> testParameters = xmlTest.getParameters();
 
         String webAppFolder = getParameter(xmlTest, TapestryTestConstants.WEB_APP_FOLDER_PARAMETER, "src/main/webapp");
+        String container = getParameter(xmlTest, TapestryTestConstants.SERVLET_CONTAINER_PARAMETER, JETTY_7);
         String contextPath = getParameter(xmlTest, TapestryTestConstants.CONTEXT_PATH_PARAMETER, "");
         int port = Integer.parseInt(getParameter(xmlTest, TapestryTestConstants.PORT_PARAMETER, "9090"));
         int sslPort = Integer.parseInt(getParameter(xmlTest, TapestryTestConstants.SSL_PORT_PARAMETER, "8443"));
         String browserStartCommand = getParameter(xmlTest, TapestryTestConstants.BROWSER_START_COMMAND_PARAMETER,
                 "*firefox");
 
-        final Runnable stopWebServer = launchWebServer(webAppFolder, contextPath, port, sslPort);
+        final Runnable stopWebServer = launchWebServer(container, webAppFolder, contextPath, port, sslPort);
 
         final SeleniumServer seleniumServer = new SeleniumServer();
 
@@ -197,7 +206,7 @@ public class SeleniumTestCase extends As
     }
 
     /**
-     * Like {@link #testStartup(String, String, int, int, String, ITestContext, XmlTest)}, this may
+     * Like {@link #testStartup(org.testng.ITestContext, org.testng.xml.XmlTest)} , this may
      * be called multiple times against multiple instances, but only does work the first time.
      */
     @AfterTest
@@ -214,7 +223,7 @@ public class SeleniumTestCase extends As
     }
 
     /**
-     * Invoked from {@link #testStartup(String, String, int, String, ITestContext)} to launch the web
+     * Invoked from {@link #testStartup(org.testng.ITestContext, org.testng.xml.XmlTest)} to launch the web
      * server to be
      * tested. The return value is a Runnable that will shut down the launched server at the end of
      * the test (it is coded this way so that the default Jetty web server can be more easily
@@ -233,7 +242,18 @@ public class SeleniumTestCase extends As
      */
     protected Runnable launchWebServer(String webAppFolder, String contextPath, int port, int sslPort) throws Exception
     {
-        final Jetty7Runner runner = new Jetty7Runner(webAppFolder, contextPath, port, sslPort);
+        return launchWebServer(TOMCAT_6, webAppFolder, contextPath, port, sslPort);
+    }
+
+    protected Runnable launchWebServer(String container, String webAppFolder, String contextPath, int port, int sslPort) throws Exception
+    {
+        final ServletContainerRunner runner;
+        if ( TOMCAT_6.equals(container) )
+            runner = new Tomcat6Runner(webAppFolder, contextPath, port, sslPort);
+        else if (JETTY_7.equals(container) )
+            runner = new Jetty7Runner(webAppFolder, contextPath, port, sslPort);
+        else
+            throw new RuntimeException("Unknown servlet container: " + container);
 
         return new Runnable()
         {

Added: tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/ServletContainerRunner.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/ServletContainerRunner.java?rev=1060687&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/ServletContainerRunner.java (added)
+++ tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/ServletContainerRunner.java Wed Jan 19 05:50:19 2011
@@ -0,0 +1,9 @@
+package org.apache.tapestry5.test;
+
+public interface ServletContainerRunner
+{
+    /**
+     * Stop the container immediately
+     */
+    public void stop();
+}

Modified: tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/TapestryTestConstants.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/TapestryTestConstants.java?rev=1060687&r1=1060686&r2=1060687&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/TapestryTestConstants.java (original)
+++ tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/TapestryTestConstants.java Wed Jan 19 05:50:19 2011
@@ -29,6 +29,7 @@ public class TapestryTestConstants
      * The current working directory (i.e., property "user.dir").
      */
     public static final String CURRENT_DIR_PATH = System.getProperty("user.dir");
+
     /**
      * The Surefire plugin sets basedir but DOES NOT change the current working directory. When
      * building across modules, basedir changes for each module, but user.dir does not. This value should be used when
@@ -45,7 +46,7 @@ public class TapestryTestConstants
     /**
      * {@link ITestContext} attribute holding an instance of {@link Selenium}.
      * 
-     * @see SeleniumLauncher#startup(String, String, int, String, ITestContext)
+     * @see SeleniumTestCase#testStartup(org.testng.ITestContext, org.testng.xml.XmlTest)
      * @since 5.2.0
      */
     public static final String SELENIUM_ATTRIBUTE = "tapestry.selenium";
@@ -53,7 +54,7 @@ public class TapestryTestConstants
     /**
      * {@link ITestContext} attribute holding an instance of {@link ErrorReporter}.
      * 
-     * @see SeleniumLauncher#startup(String, String, int, String, ITestContext)
+     * @see SeleniumTestCase#testStartup(org.testng.ITestContext, org.testng.xml.XmlTest)
      * @since 5.2.0
      */
     public static final String ERROR_REPORTER_ATTRIBUTE = "tapestry.error-reporter";
@@ -77,8 +78,6 @@ public class TapestryTestConstants
 
     /**
      * {@link ITestContext} attribute holding the application's base URL.
-     * 
-     * @see SeleniumLauncher#startup(String, String, int, String, ITestContext)
      * @since 5.2.0
      */
     public static final String BASE_URL_ATTRIBUTE = "tapestry.base-url";
@@ -114,4 +113,10 @@ public class TapestryTestConstants
      * {@link XmlTest} parameter holding the browser command to pass to Selenium.
      */
     public static final String BROWSER_START_COMMAND_PARAMETER = "tapestry.browser-start-command";
+
+    /**
+     * {@link XmlTest} parameter holding the servlet container to run for the integration tests.
+     * @since 5.3.0
+     */
+    public static final String SERVLET_CONTAINER_PARAMETER = "tapestry.servlet-container";
 }

Added: tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Tomcat6Runner.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Tomcat6Runner.java?rev=1060687&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Tomcat6Runner.java (added)
+++ tapestry/tapestry5/trunk/tapestry-test/src/main/java/org/apache/tapestry5/test/Tomcat6Runner.java Wed Jan 19 05:50:19 2011
@@ -0,0 +1,143 @@
+// Copyright 2009, 2010 The Apache Software Foundation
+//
+// Licensed 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.tapestry5.test;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Engine;
+import org.apache.catalina.Host;
+import org.apache.catalina.Wrapper;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.loader.WebappLoader;
+import org.apache.catalina.servlets.DefaultServlet;
+import org.apache.catalina.startup.Embedded;
+
+import java.io.File;
+
+/**
+ * Launches an instance of Tomcat 6.
+ * @since 5.3.0
+ */
+public class Tomcat6Runner implements ServletContainerRunner
+{
+    private final String description;
+    private final int port;
+    private final int sslPort;
+    private Embedded tomcatServer;
+
+    public Tomcat6Runner(String webappFolder, String contextPath, int port, int sslPort) throws Exception
+    {
+        this.port = port;
+
+        this.sslPort = sslPort;
+
+        final String expandedPath = expand(webappFolder);
+
+        description = String.format("<Tomcat6Runner:%s:%s/%s (%s)", contextPath, port, sslPort, expandedPath);
+
+        tomcatServer = new Embedded();
+
+        // Tomcat creates a folder, try to put it in an OS agnostic tmp dir
+        String tmpDir = System.getProperty("java.io.tmpdir");
+        String fileSeparator = System.getProperty("file.separator");
+        if (!tmpDir.endsWith(fileSeparator)) tmpDir = tmpDir + fileSeparator;
+        tomcatServer.setCatalinaHome(tmpDir + "tomcat");
+
+        final Engine engine = tomcatServer.createEngine();
+        engine.setDefaultHost("localhost");
+
+        final Host host = tomcatServer.createHost("localhost", expandedPath);
+        engine.addChild(host);
+
+        final Context context = tomcatServer.createContext(contextPath, expandedPath);
+
+        // Without a servlet the filter will not get run.
+        final Wrapper wrapper = context.createWrapper();
+        final String name = "DefaultServlet";
+        wrapper.setName(name);
+        wrapper.setServletClass(DefaultServlet.class.getName());
+        context.addChild(wrapper);
+        context.addServletMapping("/", name);
+
+        context.setLoader(new WebappLoader(this.getClass().getClassLoader()));
+
+        host.addChild(context);
+
+        tomcatServer.addEngine(engine);
+
+        Connector http = tomcatServer.createConnector("localhost", port, false);
+        http.setAllowTrace(true);
+        tomcatServer.addConnector(http);
+
+        // SSL support
+        final File keystoreFile = new File(TapestryTestConstants.MODULE_BASE_DIR, "src/test/conf/keystore");
+
+        if (keystoreFile.exists())
+        {
+            final Connector https = tomcatServer.createConnector("localhost", sslPort, true);
+            https.setProperty("keystore", keystoreFile.getPath());
+            https.setProperty("keypass", "tapestry");
+            tomcatServer.addConnector(https);
+        }
+
+        tomcatServer.start();
+    }
+
+    /**
+     * Immediately shuts down the server instance.
+     */
+    public void stop()
+    {
+        System.out.printf("Stopping Tomcat instance on port %d/%d\n", port, sslPort);
+
+        try
+        {
+            // Stop immediately and not gracefully.
+            tomcatServer.stop();
+        } catch (Exception ex)
+        {
+            throw new RuntimeException("Error stopping Tomcat6 instance: " + ex.toString(), ex);
+        }
+
+        System.out.println("Tomcat instance has stopped.");
+    }
+
+    @Override
+    public String toString()
+    {
+        return description;
+    }
+
+    /**
+     * Needed inside Maven multi-projects to expand a path relative to the module to a complete
+     * path. If the path already is absolute and points to an existing directory, it will be used
+     * unchanged.
+     *
+     * @param moduleLocalPath
+     * @return expanded path
+     * @see TapestryTestConstants#MODULE_BASE_DIR
+     */
+    protected String expand(String moduleLocalPath)
+    {
+        File path = new File(moduleLocalPath);
+
+        // Don't expand if the path provided already exists.
+        if (path.isAbsolute() && path.isDirectory())
+            return moduleLocalPath;
+
+        return new File(TapestryTestConstants.MODULE_BASE_DIR, moduleLocalPath).getPath();
+    }
+
+
+}