You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-scm@portals.apache.org by ms...@apache.org on 2014/07/27 09:05:38 UTC

[02/24] Added the JSR 362 TCK to the Pluto project.

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestCaseDetails.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestCaseDetails.java b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestCaseDetails.java
new file mode 100644
index 0000000..16c1a00
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestCaseDetails.java
@@ -0,0 +1,127 @@
+/*  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 javax.portlet.tck.beans;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Contains all test case names and detail strings used by a
+ * portlet. Provides helper methods for dealing with test
+ * case results.
+ * 
+ * The goal is to allow additional test cases to be added by adding 
+ * new test modules without having all test cases defined in a
+ * central location, otherwise we could just define all test case
+ * names / details here.
+ *  
+ * @author nick
+ */
+public class TestCaseDetails implements Map<String, String> {
+   
+   private final Map<String, String> detailsMap = new HashMap<String, String>();
+
+   @Override
+   public void clear() {
+      detailsMap.clear();
+   }
+
+   @Override
+   public boolean containsKey(Object key) {
+      return detailsMap.containsKey(key);
+   }
+
+   @Override
+   public boolean containsValue(Object value) {
+      return detailsMap.containsValue(value);
+   }
+
+   @Override
+   public Set<java.util.Map.Entry<String, String>> entrySet() {
+      return detailsMap.entrySet();
+   }
+
+   @Override
+   public String get(Object key) {
+      return detailsMap.get(key);
+   }
+
+   @Override
+   public boolean isEmpty() {
+      return detailsMap.isEmpty();
+   }
+
+   @Override
+   public Set<String> keySet() {
+      return detailsMap.keySet();
+   }
+
+   @Override
+   public String put(String key, String value) {
+      return detailsMap.put(key, value);
+   }
+
+   @Override
+   public void putAll(Map<? extends String, ? extends String> map) {
+      detailsMap.putAll(map);
+   }
+
+   @Override
+   public String remove(Object key) {
+      return detailsMap.remove(key);
+   }
+
+   @Override
+   public int size() {
+      return detailsMap.size();
+   }
+
+   @Override
+   public Collection<String> values() {
+      return detailsMap.values();
+   }
+   
+   /**
+    * Gets a test result initialied with the test case name, the
+    * test case detail string, and the results set to 
+    * <code>false</code> (test failed).
+    * 
+    * @param tcName  test case name
+    * @return
+    */
+   public TestResult getTestResultFailed(String tcName) {
+      return new TestResult(tcName, false, detailsMap.get(tcName));
+   }
+   
+   /**
+    * Gets a test result initialied with the test case name, the
+    * test case detail string, and the results set to 
+    * <code>true</code> (test succeeded).
+    * 
+    * @param tcName  test case name
+    * @return
+    */
+   public TestResult getTestResultSucceeded(String tcName) {
+      return new TestResult(tcName, true, detailsMap.get(tcName));
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestLink.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestLink.java b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestLink.java
new file mode 100644
index 0000000..15248ae
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestLink.java
@@ -0,0 +1,114 @@
+/*  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.
+ */
+
+/**
+ * This bean encapsulates a single test result. When converted to a string or 
+ * written to a writer, it generates HTML markup containing elements and IDs
+ * that can be read by the TCK test driver. 
+ * 
+ * The TCK test driver works by accessing the page containing the test portlet,
+ * clicking a link for the test if one is present, and reading the test output.
+ * 
+ * The test case is identified by a unique name string that contains no blanks. 
+ * The test case name is used to generate ID's for the HTML result elements.
+ * The following IDs are generated by this bean:
+ * 
+ * (TestCaseName)-success     - indicates general test case success or failure
+ * (TestCaseName)-detail      - a detailed message about the test     
+ * 
+ */
+package javax.portlet.tck.beans;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.portlet.PortletURL;
+import javax.portlet.tck.constants.Constants;
+
+/**
+ * Formats a link for a test case.
+ * 
+ * @author nick
+ */
+public class TestLink {
+   
+   private String tcName;
+   private PortletURL purl;
+   
+   /**
+    * Creates an empty test result.
+    */
+   public TestLink() {
+      tcName = "";
+      purl = null;
+   }
+
+   /**
+    * Creates a test link initialized according to the parameters.
+    * 
+    * @param tcName     test case name
+    * @param url        url for the test case
+    */
+   public TestLink(String tcName, PortletURL purl) {
+      this.tcName = tcName;
+      this.purl = purl;
+   }
+
+   /**
+    * Generates HTML markup representing the test link. 
+    * 
+    * Note that the div element containing the item that is to be acted upon
+    * by the client must have an id equal to the test case name.
+    * 
+    * @return  HTML markup representing the test link
+    */
+   @Override
+   public String toString() {
+      final String actId = tcName + Constants.CLICK_ID;
+      
+      StringBuilder sb = new StringBuilder();
+      sb.append("<div class='portletTCKTestcase' id='");
+      sb.append(tcName);
+      sb.append("'>");
+      sb.append("<h4>");
+      sb.append(tcName);
+      sb.append(" link:");
+      sb.append("</h4>");
+      sb.append("<a class='portletTCKLink' id='");
+      sb.append(actId);
+      sb.append("' href='");
+      sb.append(purl.toString());
+      sb.append("'>");
+      sb.append(tcName);
+      sb.append("</a>");
+      sb.append("</div>");
+
+      return sb.toString();
+   }
+   
+   /**
+    * Generates HTML markup representing the test link and
+    * writes them to the writer provided.
+    * 
+    * @param writer  Writer to which the string is written
+    */
+   public void writeTo(Writer writer)throws IOException {
+      writer.write(this.toString());
+   }
+   
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestMessage.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestMessage.java b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestMessage.java
new file mode 100644
index 0000000..98e6833
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestMessage.java
@@ -0,0 +1,101 @@
+/*  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.
+ */
+
+/**
+ * This bean encapsulates a single test result. When converted to a string or 
+ * written to a writer, it generates HTML markup containing elements and IDs
+ * that can be read by the TCK test driver. 
+ * 
+ * The TCK test driver works by accessing the page containing the test portlet,
+ * clicking a link for the test if one is present, and reading the test output.
+ * 
+ * The test case is identified by a unique name string that contains no blanks. 
+ * The test case name is used to generate ID's for the HTML result elements.
+ * The following IDs are generated by this bean:
+ * 
+ * (TestCaseName)-success     - indicates general test case success or failure
+ * (TestCaseName)-detail      - a detailed message about the test     
+ * 
+ */
+package javax.portlet.tck.beans;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Displays a message for a test case, for example when waiting for results.
+ * 
+ * @author nick
+ */
+public class TestMessage {
+   
+   private String tcName;
+   private String msg;
+   
+   /**
+    * Creates an empty test result.
+    */
+   public TestMessage() {
+      tcName = "";
+      msg = "";
+   }
+
+   /**
+    * Creates a test message initialized according to the parameters.
+    * 
+    * @param tcName     test case name
+    * @param msg        message to be displayed
+    */
+   public TestMessage(String tcName, String msg) {
+      this.tcName = tcName;
+      this.msg = msg;
+   }
+
+   /**
+    * Generates HTML markup representing the test message.
+    * 
+    * @return  HTML markup representing the test message
+    */
+   @Override
+   public String toString() {
+      
+      StringBuilder sb = new StringBuilder();
+      sb.append("<div class='portletTCKTestcase'>");
+      sb.append("<h4>");
+      sb.append(tcName);
+      sb.append(" message:");
+      sb.append("</h4>");
+      sb.append("<p>");
+      sb.append(msg);
+      sb.append("</p>");
+      sb.append("</div>");
+
+      return sb.toString();
+   }
+   
+   /**
+    * Generates HTML markup representing the test link and
+    * writes them to the writer provided.
+    * 
+    * @param writer  Writer to which the string is written
+    */
+   public void writeTo(Writer writer)throws IOException {
+      writer.write(this.toString());
+   }
+   
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestResult.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestResult.java b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestResult.java
new file mode 100644
index 0000000..606a20f
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/beans/TestResult.java
@@ -0,0 +1,157 @@
+/*  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.
+ */
+
+/**
+ * This bean encapsulates a single test result. When converted to a string or 
+ * written to a writer, it generates HTML markup containing elements and IDs
+ * that can be read by the TCK test driver. 
+ * 
+ * The TCK test driver works by accessing the page containing the test portlet,
+ * clicking a link for the test if one is present, and reading the test output.
+ * 
+ * The test case is identified by a unique name string that contains no blanks. 
+ * The test case name is used to generate ID's for the HTML result elements.
+ * The following IDs are generated by this bean:
+ * 
+ * (TestCaseName)-success     - indicates general test case success or failure
+ * (TestCaseName)-detail      - a detailed message about the test     
+ * 
+ */
+package javax.portlet.tck.beans;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.portlet.tck.constants.Constants;
+
+/**
+ * Encapsulates test results containint the test case name, the test case 
+ * detail description, and the test case result (<code>true</code> = success, 
+ * <code>false</code> = failure). 
+ * @author nick
+ */
+public class TestResult {
+   
+   private String tcName;
+   private String tcDetail;
+   private boolean tcSuccess;
+   
+   /**
+    * Creates an empty test result.
+    */
+   public TestResult() {
+      this.tcName = "";
+      this.tcDetail = "";
+      this.tcSuccess = false;
+   }
+
+   /**
+    * Creates a test result initialized according to the parameters.
+    * 
+    * @param tcName     test case name
+    * @param tcSuccess  test case result
+    * @param tcDetail   test case detail description
+    */
+   public TestResult(String tcName, boolean tcSuccess, String tcDetail) {
+      this.tcName = tcName;
+      this.tcDetail = tcDetail;
+      this.tcSuccess = tcSuccess;
+   }
+   
+   public String getTcName() {
+      return tcName;
+   }
+   
+   public void setTcName(String tcName) {
+      this.tcName = tcName;
+   }
+   
+   public String getTcDetail() {
+      return tcDetail;
+   }
+   
+   public void setTcDetail(String tcDetail) {
+      this.tcDetail = tcDetail;
+   }
+   
+   public boolean isTcSuccess() {
+      return tcSuccess;
+   }
+   
+   public void setTcSuccess(boolean tcSuccess) {
+      this.tcSuccess = tcSuccess;
+   }
+   
+   /**
+    * Appends error message to the test case deail string to indicate
+    * what went wrong when a test fails.
+    * 
+    * @param tcDetail   String containing detailed error message
+    */
+   public void appendTcDetail(String tcDetail) {
+      this.tcDetail += " " + tcDetail;
+   }
+
+   /**
+    * Generates HTML markup representing the test result.
+    * 
+    * Note that the div element containing the item that is to be acted upon
+    * by the client must have an id equal to the test case name.
+    * 
+    * @return  HTML markup representing the test result
+    */
+   @Override
+   public String toString() {
+      final String resId = tcName + Constants.RESULT_ID;
+      final String detId = tcName + Constants.DETAIL_ID;
+      final String resStr = tcSuccess?Constants.SUCCESS:Constants.FAILURE;
+      
+      StringBuilder sb = new StringBuilder();
+      sb.append("<div class='portletTCKTestcase' id='");
+      sb.append(tcName);
+      sb.append("'>");
+      sb.append("<h4>");
+      sb.append(tcName);
+      sb.append(" results:");
+      sb.append("</h4>");
+      sb.append("<p class='portletTCKResult' id='");
+      sb.append(resId);
+      sb.append("'>Test ");
+      sb.append(resStr);
+      sb.append("</p>");
+      sb.append("<p class='portletTCKDetail' id='");
+      sb.append(detId);
+      sb.append("'>Details: ");
+      sb.append(tcDetail);
+      sb.append("</p>");
+      sb.append("</div>");
+
+      return sb.toString();
+   }
+   
+   /**
+    * Generates HTML markup representing the test results and
+    * writes them to the writer provided.
+    * 
+    * @param writer  Writer to which the string is written
+    */
+   public void writeTo(Writer writer)throws IOException {
+      writer.write(this.toString());
+   }
+   
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/constants/Constants.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/constants/Constants.java b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/constants/Constants.java
new file mode 100644
index 0000000..2cfa8ad
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/constants/Constants.java
@@ -0,0 +1,32 @@
+/*  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.
+ */
+
+/**
+ * Defines constants used by portlets, test beans, and the test driver. 
+ */
+package javax.portlet.tck.constants;
+
+public class Constants {
+   public static final String BR = "<br/>";
+   public static final String HR = "<hr/>";
+   public static final String RESULT_ID = "-result";
+   public static final String DETAIL_ID = "-detail";
+   public static final String CLICK_ID = "-clickme";
+   public static final String SUCCESS = "Succeeded";
+   public static final String FAILURE = "Failed";
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/portlets/TestPortlet.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/portlets/TestPortlet.java b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/portlets/TestPortlet.java
new file mode 100644
index 0000000..d66aaeb
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/java/javax/portlet/tck/portlets/TestPortlet.java
@@ -0,0 +1,86 @@
+/*  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 javax.portlet.tck.portlets;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.Portlet;
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletException;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+
+/**
+ * Simplest possible portlet for testing the portlet container implementation
+ */
+public class TestPortlet implements Portlet {
+   private static final String LOG_CLASS = TestPortlet.class.getName();
+   private final Logger LOGGER = Logger.getLogger(LOG_CLASS);
+   
+   public TestPortlet() {
+   }
+
+   @Override
+   public void init(PortletConfig config) throws PortletException {
+      if (LOGGER.isLoggable(Level.FINE)) {
+         LOGGER.logp(Level.FINE, LOG_CLASS, "init", "Entry");
+      }
+
+   }
+
+   @Override
+   public void processAction(ActionRequest request, ActionResponse response)
+         throws PortletException, IOException {
+
+      if (LOGGER.isLoggable(Level.FINE)) {
+         LOGGER.logp(Level.FINE, LOG_CLASS, "processAction", "Entry");
+      }
+
+      
+   }
+
+   @Override
+   public void render(RenderRequest request, RenderResponse response)
+         throws PortletException, IOException {
+      
+      if (LOGGER.isLoggable(Level.FINE)) {
+         LOGGER.logp(Level.FINE, LOG_CLASS, "render", "Entry");
+      }
+
+      PrintWriter writer = response.getWriter();
+      writer.write("I am here!");
+
+   }
+
+   @Override
+   public void destroy() {
+      
+      if (LOGGER.isLoggable(Level.FINE)) {
+         LOGGER.logp(Level.FINE, LOG_CLASS, "destroy", "Entry");
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoMultiPortletPage.xsl
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoMultiPortletPage.xsl b/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoMultiPortletPage.xsl
new file mode 100644
index 0000000..9364e2e
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoMultiPortletPage.xsl
@@ -0,0 +1,85 @@
+<!--
+    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.	   
+-->
+
+<!--
+   This stylesheet generates a valid page configuration file for pluto by
+   transforming the portlet.xml file. The servlet context is provided through
+   a parameter. The page name is set to the portlet name, which is also a
+   test case name.
+   
+   It places all portlets from the portlet application on the same page.
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pa="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
+  <xsl:strip-space elements="pa:portlet-app"/>
+  <xsl:output method="xml" indent="yes"/>
+  <xsl:param name="portlet-app-context"/>
+  <xsl:variable name="pageName" select="pa:portlet-app/@id"/>
+  <xsl:template match="/">
+  <pluto-portal-driver
+    xmlns="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd
+                        http://portals.apache.org/pluto/pluto-portal/1.1/pluto-portal-driver-config.xsd"
+    version="1.1">
+
+
+    <portal-name>pluto-portal-driver</portal-name>
+    <portal-version>2.1.0-SNAPSHOT</portal-version>
+    <container-name>Pluto Portal Driver</container-name>
+
+    <supports>
+      <portlet-mode>view</portlet-mode>
+      <portlet-mode>edit</portlet-mode>
+      <portlet-mode>help</portlet-mode>
+      <portlet-mode>config</portlet-mode>
+
+      <window-state>normal</window-state>
+      <window-state>maximized</window-state>
+      <window-state>minimized</window-state>
+    </supports>
+    <xsl:element name="render-config">
+      <xsl:attribute name="default">About Apache Pluto</xsl:attribute>
+    <page name="About Apache Pluto" uri="/WEB-INF/themes/pluto-default-theme.jsp">
+      <portlet context="/pluto" name="AboutPortlet"/>
+    </page>
+         <xsl:apply-templates/>
+    </xsl:element>
+    </pluto-portal-driver>
+  </xsl:template>
+
+  <xsl:template match="pa:portlet-app">
+      <xsl:element name="page">
+        <xsl:attribute name="name"><xsl:value-of select="$pageName"/></xsl:attribute>
+        <xsl:attribute name="uri">/WEB-INF/themes/pluto-default-theme.jsp</xsl:attribute>
+         <xsl:apply-templates/>
+      </xsl:element>    
+  </xsl:template>
+
+  <xsl:template match="pa:portlet">
+          <xsl:element name="portlet">
+            <xsl:attribute name="context">/<xsl:value-of select='$portlet-app-context'/></xsl:attribute>
+            <xsl:attribute name="name"><xsl:value-of select="pa:portlet-name"/></xsl:attribute>
+          </xsl:element>
+  </xsl:template>
+  
+  <!-- ignore all other children of pa:portlet-app -->
+  <xsl:template match="pa:portlet-app/*[not(pa:portlet-name)]"/>
+
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoSinglePortletPage.xsl
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoSinglePortletPage.xsl b/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoSinglePortletPage.xsl
new file mode 100644
index 0000000..6e5610f
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/resources/xml-resources/plutoSinglePortletPage.xsl
@@ -0,0 +1,80 @@
+<!--
+    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.	   
+-->
+
+<!--
+   This stylesheet generates a valid page configuration file for pluto by
+   transforming the portlet.xml file. The servlet context is provided through
+   a parameter. The page name is set to the portlet name, which is also a
+   test case name.
+   
+   It places each portlet from the portlet application on a separate page.
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pa="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
+  <xsl:strip-space elements="pa:portlet-app"/>
+  <xsl:output method="xml" indent="yes"/>
+  <xsl:param name="portlet-app-context"/>
+  <xsl:template match="/">
+  <pluto-portal-driver
+    xmlns="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd
+                        http://portals.apache.org/pluto/pluto-portal/1.1/pluto-portal-driver-config.xsd"
+    version="1.1">
+
+
+    <portal-name>pluto-portal-driver</portal-name>
+    <portal-version>2.1.0-SNAPSHOT</portal-version>
+    <container-name>Pluto Portal Driver</container-name>
+
+    <supports>
+      <portlet-mode>view</portlet-mode>
+      <portlet-mode>edit</portlet-mode>
+      <portlet-mode>help</portlet-mode>
+      <portlet-mode>config</portlet-mode>
+
+      <window-state>normal</window-state>
+      <window-state>maximized</window-state>
+      <window-state>minimized</window-state>
+    </supports>
+    <xsl:element name="render-config">
+      <xsl:attribute name="default">About Apache Pluto</xsl:attribute>
+    <page name="About Apache Pluto" uri="/WEB-INF/themes/pluto-default-theme.jsp">
+      <portlet context="/pluto" name="AboutPortlet"/>
+    </page>
+      <xsl:apply-templates/>
+    </xsl:element>
+    </pluto-portal-driver>
+  </xsl:template>
+
+  <xsl:template match="pa:portlet-app/pa:portlet">
+      <xsl:element name="page">
+        <xsl:attribute name="name"><xsl:value-of select="pa:portlet-name"/></xsl:attribute>
+        <xsl:attribute name="uri">/WEB-INF/themes/pluto-default-theme.jsp</xsl:attribute>
+          <xsl:element name="portlet">
+            <xsl:attribute name="context">/<xsl:value-of select='$portlet-app-context'/></xsl:attribute>
+            <xsl:attribute name="name"><xsl:value-of select="pa:portlet-name"/></xsl:attribute>
+          </xsl:element>
+      </xsl:element>    
+  </xsl:template>
+  
+  <!-- ignore all other children of pa:portlet-app -->
+  <xsl:template match="pa:portlet-app/*[not(pa:portlet-name)]"/>
+
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/common/src/main/resources/xml-resources/test.xsl
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/common/src/main/resources/xml-resources/test.xsl b/portlet-tck_3.0/common/src/main/resources/xml-resources/test.xsl
new file mode 100644
index 0000000..63d45d3
--- /dev/null
+++ b/portlet-tck_3.0/common/src/main/resources/xml-resources/test.xsl
@@ -0,0 +1,78 @@
+<!--
+    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.	   
+-->
+
+<!--
+   This stylesheet creates a list of test cases from the portlet.xml file.
+   
+   A naming convention is used in order to be able to automatically create a
+   properties file containing test case names mapping to the page to be accessed
+   to execute the test. The test case name is used as the portlet name and as 
+   the page name for the test.
+   
+   Note that the test case name must be unique within the TCK.
+   
+   In addition, an additional file containing test case name - page name mappings
+   can be provided. This allows a page and portlet to contain multiple test cases
+   that the test driver will execute sequentially. The parameter "additionalTCs"
+   must be set in the project pom with an absolute URI to the file. If the 
+   parameter is not set, no additional test cases will be added.
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pa="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
+  <xsl:output method="xml" indent="yes" doctype-system="http://java.sun.com/dtd/properties.dtd"/> 
+  <xsl:strip-space elements="pa:portlet-app"/>
+  <xsl:param name="additionalTCs"/>
+  <xsl:param name="copyOnly"/>
+  <xsl:template match="/">
+    <xsl:element name="properties">
+      <xsl:if test="$copyOnly!='true'">
+         <xsl:apply-templates/>
+      </xsl:if>
+      <xsl:if test="$additionalTCs!='false'">
+         <xsl:variable name="addi" select="document($additionalTCs)"/>
+         <xsl:for-each select="$addi//entry">
+            <xsl:element name="entry">
+               <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
+               <xsl:value-of select="."/>
+            </xsl:element>
+         </xsl:for-each>
+      </xsl:if>
+    </xsl:element>
+  </xsl:template>
+ 
+  <!-- Create entry element for every portlet. For each entry: 
+       key attribute    = test case name                                
+       value            = page to be addressed to execute the TC
+       
+       The test driver will use the name / value pairs along with the context
+       base to construct URLs of the following form for test case execution:
+       
+       http://<test.server.host>:<test.server.port>/<test.context.base><value>
+  -->
+  <xsl:template match="pa:portlet-app/pa:portlet">
+    <xsl:element name="entry">
+      <xsl:attribute name="key"><xsl:value-of select="pa:portlet-name"/></xsl:attribute>
+      <xsl:value-of select="pa:portlet-name"/>
+    </xsl:element>
+  </xsl:template>
+  
+  <!-- ignore all other children of pa:portlet-app -->
+  <xsl:template match="pa:portlet-app/*[not(pa:portlet-name)]"/>
+
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/deploy/pom.xml
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/deploy/pom.xml b/portlet-tck_3.0/deploy/pom.xml
new file mode 100644
index 0000000..24b738b
--- /dev/null
+++ b/portlet-tck_3.0/deploy/pom.xml
@@ -0,0 +1,177 @@
+<!--
+    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>javax.portlet</groupId>
+		<artifactId>tck</artifactId>
+		<version>3.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>tck-deploy</artifactId>
+	<packaging>jar</packaging>
+
+	<description>
+  Each test module produces a war file containing test portlets. This project
+  aggregates all test portlet war files into a single directory under 
+  target/deploy-files.
+  </description>
+
+
+	<dependencies>
+
+		<!-- List the modules containing test cases in order to aggregate the output -->
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>tck-TestModule1</artifactId>
+			<version>${project.version}</version>
+			<type>war</type>
+		</dependency>
+		<dependency>
+			<groupId>${project.groupId}</groupId>
+			<artifactId>tck-TestModule2</artifactId>
+			<version>${project.version}</version>
+			<type>war</type>
+		</dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-TestModule3-Portlet1</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-TestModule3-Portlet2</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2AnnotationTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2EnvironmentTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2ExceptionTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2FilterTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2PortletTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2RequestTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2ResponseTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2URLTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2WrapperTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-driver</artifactId>
+         <version>${project.version}</version>
+         <type>jar</type>
+      </dependency>
+	</dependencies>
+
+	<build>
+		<finalName>${project.artifactId}</finalName>
+
+      <resources>
+         <resource>
+            <directory>${project.build.directory}/generated-resources/xml/final</directory>
+            <targetPath>${project.build.directory}/deploy-files</targetPath>
+            <includes>
+               <include>*.xml</include>
+            </includes>
+         </resource>
+      </resources>
+
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-wars</id>
+						<phase>package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+						   <excludeArtifactIds>tck-driver</excludeArtifactIds>
+							<outputDirectory>${project.build.directory}/deploy-files</outputDirectory>
+							<excludeTransitive>true</excludeTransitive>
+						</configuration>
+					</execution>
+
+					<!-- For extracting the page file from the driver -->
+					<execution>
+						<id>extract-xml-resource</id>
+						<phase>generate-sources</phase>
+						<goals>
+							<goal>unpack-dependencies</goal>
+						</goals>
+						<configuration>
+							<includeArtifactIds>tck-driver</includeArtifactIds>
+							<includes>generated-resources/xml/final/${page.file.final.name}</includes>
+							<outputDirectory>${project.build.directory}</outputDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/driver/pom.xml
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/driver/pom.xml b/portlet-tck_3.0/driver/pom.xml
new file mode 100644
index 0000000..d952dee
--- /dev/null
+++ b/portlet-tck_3.0/driver/pom.xml
@@ -0,0 +1,339 @@
+<!--
+    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>javax.portlet</groupId>
+      <artifactId>tck</artifactId>
+      <version>3.0-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>tck-driver</artifactId>
+   <packaging>jar</packaging>
+
+   <description>
+   This project builds the Junit / Selenium driver for the portlet API tck.
+   </description>
+
+   <dependencies>
+      <dependency>
+         <groupId>junit</groupId>
+         <artifactId>junit</artifactId>
+         <scope>compile</scope>
+      </dependency>
+      <dependency>
+         <groupId>org.seleniumhq.selenium</groupId>
+         <artifactId>selenium-java</artifactId>
+         <scope>compile</scope>
+      </dependency>
+
+      <!-- Dependency on common module for element ID suffixes -->
+      <dependency>
+         <groupId>javax.portlet</groupId>
+         <artifactId>tck-common</artifactId>
+         <version>${project.version}</version>
+         <scope>compile</scope>
+      </dependency>
+
+
+      <!-- List the modules containing test cases in order to aggregate the output -->
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-TestModule1</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-TestModule2</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-TestModule3</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2AnnotationTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2EnvironmentTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2ExceptionTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2FilterTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2PortletTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2RequestTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2ResponseTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2URLTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+      <dependency>
+         <groupId>${project.groupId}</groupId>
+         <artifactId>tck-V2WrapperTests</artifactId>
+         <version>${project.version}</version>
+         <type>war</type>
+      </dependency>
+   </dependencies>
+
+   <build>
+      <finalName>${project.artifactId}</finalName>
+
+      <resources>
+         <resource>
+            <directory>src/main/resources/xml-resources</directory>
+            <targetPath>${project.build.directory}/${test.file.dir}</targetPath>
+            <includes>
+               <include>*</include>
+            </includes>
+         </resource>
+      </resources>
+
+      <plugins>
+
+         <!-- For extracting the XML transformation stylesheets from common module -->
+         <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <executions>
+               <execution>
+                  <id>xml-resource-dependencies</id>
+                  <phase>generate-sources</phase>
+                  <goals>
+                     <goal>unpack-dependencies</goal>
+                  </goals>
+                  <configuration>
+                     <includeArtifactIds>
+                        tck-TestModule1,
+                        tck-TestModule2,
+                        tck-TestModule3,
+                        tck-V2AnnotationTests,
+                        tck-V2EnvironmentTests,
+                        tck-V2ExceptionTests,
+                        tck-V2FilterTests,
+                        tck-V2PortletTests,
+                        tck-V2RequestTests,
+                        tck-V2ResponseTests,
+                        tck-V2URLTests,
+                        tck-V2WrapperTests
+                     </includeArtifactIds>
+                     <includes>${test.file.dir}/*.xml</includes>
+                     <outputDirectory>${project.build.directory}</outputDirectory>
+                  </configuration>
+               </execution>
+            </executions>
+         </plugin>
+
+         <!-- For Performing xml translations to create test.xml files -->
+         <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>xml-maven-plugin</artifactId>
+            <version>1.0</version>
+            <executions>
+               <execution>
+                  <phase>process-resources</phase>
+                  <goals>
+                     <goal>transform</goal>
+                  </goals>
+               </execution>
+            </executions>
+            <configuration>
+               <transformationSets>
+
+                  <!-- Combine several test list files into a single module -->
+                  <transformationSet>
+                     <dir>${project.build.directory}/${test.file.dir}</dir>
+                     <includes>
+                        <include>testFiles.xml</include>
+                     </includes>
+                     <outputDir>${project.build.directory}/classes/${test.list.dir}</outputDir>
+                     <fileMappers>
+                        <fileMapper
+                           implementation="org.codehaus.plexus.components.io.filemappers.MergeFileMapper">
+                           <targetName>${test.list.name}</targetName>
+                        </fileMapper>
+                     </fileMappers>
+                     <stylesheet>${project.build.directory}/${test.file.dir}/${test.list.xsl}</stylesheet>
+                  </transformationSet>
+
+                  <!-- Combine several page files into a single page file containing 
+                     all test portal pages -->
+                  <transformationSet>
+                     <dir>${project.build.directory}/${test.file.dir}</dir>
+                     <includes>
+                        <include>pageFiles.xml</include>
+                     </includes>
+                     <outputDir>${project.build.directory}/classes/${test.list.dir}</outputDir>
+                     <fileMappers>
+                        <fileMapper
+                           implementation="org.codehaus.plexus.components.io.filemappers.MergeFileMapper">
+                           <targetName>${page.file.final.name}</targetName>
+                        </fileMapper>
+                     </fileMappers>
+                     <stylesheet>${project.build.directory}/${test.file.dir}/${page.file.final.xsl}</stylesheet>
+                  </transformationSet>
+
+               </transformationSets>
+            </configuration>
+         </plugin>
+
+         <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-compiler-plugin</artifactId>
+         </plugin>
+         <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-jar-plugin</artifactId>
+            <configuration>
+               <archive>
+                  <manifest>
+                     <mainClass>example.Selenium2Example</mainClass>
+                  </manifest>
+               </archive>
+            </configuration>
+         </plugin>
+      </plugins>
+   </build>
+
+
+   <!-- To build the tests, use "mvn clean install" from the parent directory. -->
+   <!-- To run all of the tests, use "mvn test -Prun-tck" from the driver directory. -->
+   
+   <!-- To a subset of the tests, use "mvn test -Prun-tck -Dtest.module=<match string>" from the driver directory. -->
+   <!-- the driver will then execute all tests whose test case name contains the specified string. -->
+   <!-- Example: "mvn test -Prun-tck -Dtest.module=PortletRequest" will execute all PortletRequest TCs. -->
+   
+   <profiles>
+      <profile>
+         <id>run-tck</id>
+         <build>
+            <plugins>
+
+               <!-- For running the test driver -->
+               <plugin>
+                  <groupId>org.apache.maven.plugins</groupId>
+                  <artifactId>maven-surefire-plugin</artifactId>
+                  <version>2.17</version>
+                  <configuration>
+                     <testClassesDirectory>${project.build.directory}/classes</testClassesDirectory>
+                     <includes>
+                        <include>**/javax/**</include>
+                     </includes>
+                     <useFile>false</useFile>
+                     <systemProperties>
+                        <property>
+                           <name>test.server.login.url</name>
+                           <value>${test.server.login.url}</value>
+                        </property>
+                        <property>
+                           <name>test.context.base</name>
+                           <value>${test.context.base}</value>
+                        </property>
+                        <property>
+                           <name>test.url.strategy</name>
+                           <value>${test.url.strategy}</value>
+                        </property>
+                        <property>
+                           <name>test.server.host</name>
+                           <value>${test.server.host}</value>
+                        </property>
+                        <property>
+                           <name>test.server.port</name>
+                           <value>${test.server.port}</value>
+                        </property>
+                        <property>
+                           <name>test.server.username.id</name>
+                           <value>${test.server.username.id}</value>
+                        </property>
+                        <property>
+                           <name>test.server.username</name>
+                           <value>${test.server.username}</value>
+                        </property>
+                        <property>
+                           <name>test.server.password.id</name>
+                           <value>${test.server.password.id}</value>
+                        </property>
+                        <property>
+                           <name>test.server.password</name>
+                           <value>${test.server.password}</value>
+                        </property>
+                        <property>
+                           <name>test.list.file</name>
+                           <value>${project.build.directory}/classes/${test.list.dir}/${test.list.name}</value>
+                        </property>
+                        <property>
+                           <name>test.browser</name>
+                           <value>${test.browser}</value>
+                        </property>
+                        <property>
+                           <name>test.browser.webDriver</name>
+                           <value>${test.browser.webDriver}</value>
+                        </property>
+                        <property>
+                           <name>test.module</name>
+                           <value>${test.module}</value>
+                        </property>
+                     </systemProperties>
+                  </configuration>
+               </plugin>
+
+            </plugins>
+         </build>
+      </profile>
+   </profiles>
+
+
+</project>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/driver/src/main/java/javax/portlet/tck/driver/TCKSimpleTestDriver.java
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/driver/src/main/java/javax/portlet/tck/driver/TCKSimpleTestDriver.java b/portlet-tck_3.0/driver/src/main/java/javax/portlet/tck/driver/TCKSimpleTestDriver.java
new file mode 100644
index 0000000..68f5c0d
--- /dev/null
+++ b/portlet-tck_3.0/driver/src/main/java/javax/portlet/tck/driver/TCKSimpleTestDriver.java
@@ -0,0 +1,345 @@
+/*  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 javax.portlet.tck.driver;
+
+import static org.junit.Assert.*;
+
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.htmlunit.HtmlUnitDriver;
+import org.openqa.selenium.ie.InternetExplorerDriver;
+import org.openqa.selenium.safari.SafariDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import javax.portlet.tck.constants.Constants;
+
+
+/**
+ * @author nick
+ *
+ */
+@RunWith(value = Parameterized.class)
+public class TCKSimpleTestDriver {
+
+   private static String loginUrl, host, port, testFile, browser, 
+   username, usernameId, password, passwordId, testContextBase, module;
+   
+   // used to optimize access for tests on the same page
+   private static String lastPage = "";
+
+   private static boolean useGeneratedUrl = true;
+
+   private static WebDriver driver;
+   private String page, tcName, testUrl;
+
+   /**
+    * Reads the consolidated list of test cases and provides the list to Junit
+    * for parameterized testing.
+    * @return  a Collection of test cases to run
+    */
+   @Parameters
+   public static Collection getTestList () {
+      System.out.println("getTestList");
+      testFile = System.getProperty("test.list.file");
+      System.out.println("   TestFile=" + testFile);
+      module = System.getProperty("test.module");
+      System.out.println("   Module       =" + module);
+
+      Properties tprops = new Properties();
+      try {
+         FileInputStream fis = new FileInputStream(testFile);
+         tprops.loadFromXML(fis);
+      } catch (Exception e) {
+         System.out.println("Could not read test cases file. Attempted to read file " + testFile);
+         e.printStackTrace();
+         return null;
+      }
+      
+      // See if performance can be improved by sorting the test cases by
+      // the page to be accessed. The map uses the page as key and has a 
+      // set of test cases for that page as value.
+      
+      TreeMap<String, Set<String>> pages = new TreeMap<String, Set<String>>();
+      Set<Object> tcs = tprops.keySet();
+      for (Object o : tcs) {
+         String tcase = (String) o ;
+         if (module == null || module.length() <= 0 || tcase.contains(module)) {
+            String tpage = tprops.getProperty(tcase);
+            if (!pages.containsKey(tpage)) {
+               pages.put(tpage, new TreeSet<String>());
+            }
+            pages.get(tpage).add(tcase);
+         }
+      }
+
+      // now pass TCs, sorted by page, to the driver
+      
+      List<String[]> tests = new ArrayList<String[]>();
+      for (String tpage : pages.keySet()) {
+         for (String  tcase: pages.get(tpage)) {
+            String[] parms = {tpage, tcase};
+            tests.add(parms);
+         }
+      }
+      
+      int numP = pages.size();
+      int numTC = tests.size();
+      System.out.println("Executing " + numTC + " tests on " + numP + "pages.");
+
+      return tests;
+   }
+
+   public TCKSimpleTestDriver(String p, String t) {
+      page = p;
+      tcName = t;
+      StringBuilder sb = new StringBuilder();
+      sb.append("http://");
+      sb.append(host);
+      if (port != null && !port.isEmpty()) {
+         sb.append(":");
+         sb.append(port);
+      }
+      sb.append("/");
+      sb.append(testContextBase);
+      sb.append(page);
+      testUrl = sb.toString();
+      System.out.println("Constructor - Navigating to page: " + testUrl + ", test: " + tcName);
+   }
+
+   /**
+    * @throws java.lang.Exception
+    */
+   @BeforeClass
+   public static void setUpBeforeClass() throws Exception {
+      
+      loginUrl = System.getProperty("test.server.login.url");
+      host = System.getProperty("test.server.host");
+      port = System.getProperty("test.server.port");
+      username = System.getProperty("test.server.username");
+      usernameId = System.getProperty("test.server.username.id");
+      password = System.getProperty("test.server.password");
+      passwordId = System.getProperty("test.server.password.id");
+      browser = System.getProperty("test.browser");
+      testContextBase = System.getProperty("test.context.base");
+      String str = System.getProperty("test.url.strategy");
+      useGeneratedUrl = str.equalsIgnoreCase("generateURLs");
+      String wd = System.getProperty("test.browser.webDriver");
+
+      System.out.println("before class.");
+      System.out.println("   Login URL    =" + loginUrl);
+      System.out.println("   Host         =" + host);
+      System.out.println("   Port         =" + port);
+      System.out.println("   Context      =" + testContextBase);
+      System.out.println("   Generate URL =" + useGeneratedUrl);
+      System.out.println("   Username     =" + username);
+      System.out.println("   UsernameId   =" + usernameId);
+      System.out.println("   Password     =" + password);
+      System.out.println("   PasswordId   =" + passwordId);
+      System.out.println("   Browser      =" + browser);
+      System.out.println("   Driver       =" + wd);
+
+      if (browser.equalsIgnoreCase("firefox")) {
+         driver = new FirefoxDriver();
+      } else if (browser.equalsIgnoreCase("internetExplorer")) {
+         System.setProperty("webdriver.ie.driver", wd);
+         driver = new InternetExplorerDriver();
+      } else if (browser.equalsIgnoreCase("chrome")) {
+         System.setProperty("webdriver.chrome.driver", wd);
+         driver = new ChromeDriver();
+      } else if (browser.equalsIgnoreCase("htmlUnit")) {
+         driver = new HtmlUnitDriver();
+      } else if (browser.equalsIgnoreCase("safari")) {
+         driver = new SafariDriver();
+      } else {
+         throw new Exception("Unsupported browser: " + browser);
+      }
+      
+      lastPage = "";
+      login();
+
+   }
+
+   /**
+    * @throws java.lang.Exception
+    */
+   @AfterClass
+   public static void tearDownAfterClass() throws Exception {
+      if (driver != null) {
+         driver.quit();
+      }
+      System.out.println("after class.");
+   }
+
+   /**
+    * @throws java.lang.Exception
+    */
+   @Before
+   public void setUp() throws Exception {
+      System.out.println("before test.");
+   }
+
+   /**
+    * @throws java.lang.Exception
+    */
+   @After
+   public void tearDown() throws Exception {
+      System.out.println("after test.");
+   }
+
+   @Test
+   public void test() {
+      System.out.println("execute test.");
+      
+      if (!lastPage.equals(page)) { 
+         lastPage = page;
+
+         // depending on configuration, either follow links on the portal page
+         // or access the test page using the generated URL
+         if (useGeneratedUrl) {
+            driver.get(testUrl);
+         } else {
+            try {
+               WebElement wel = driver.findElement(By.ByLinkText.linkText(page));
+               System.out.println("Found link: " + wel.getText());
+               wel.click();
+               WebDriverWait wdw = new WebDriverWait(driver, 3);
+               wdw.until(ExpectedConditions.visibilityOfElementLocated(By.ById.id(tcName)));
+            } catch (Exception e) {
+               assertTrue("Test case " + tcName + " failed. Page " + page 
+                     + " could not be accessed.", false);
+            }
+         }
+         
+      }
+      
+      processClickable();
+      checkResults();
+   }
+
+   /**
+    * Called to login to the portal if necessary. 
+    */
+   private static void login() {
+
+      driver.get(loginUrl);
+
+      // If there is no login or password fields, don't need to login.
+      // find element will throw an exception if element can't be found.
+      try {
+
+         WebElement userEl = driver.findElement(By.ById.id(usernameId));
+         WebElement pwEl = driver.findElement(By.ById.id(passwordId));
+
+         // perform login
+         userEl.sendKeys(username);
+         pwEl.sendKeys(password);
+         pwEl.submit();
+
+      } catch(Exception e) {
+      }
+   }
+
+   /**
+    * Analyzes the page based on the test case name and records success or failure.
+    */
+   private void checkResults() {
+      String resultId = tcName + Constants.RESULT_ID;
+      String detailId = tcName + Constants.DETAIL_ID;
+
+      try {
+
+         System.out.println("resultId=" + resultId);
+         System.out.println("detailId=" + detailId);
+
+         WebElement resEl = driver.findElement(By.ById.id(resultId));
+         WebElement detEl = driver.findElement(By.ById.id(detailId));
+
+         String res = resEl.getText();
+         String det = "Test case " + tcName + " failed. " + detEl.getText();
+
+         boolean ok = res.contains(Constants.SUCCESS);
+         assertTrue(det, ok);
+
+      } catch(Exception e) {
+         assertTrue("Test case " + tcName + " failed. Results could not be found.", false);
+      }
+
+   }
+
+   /**
+    * Looks for a link or button that can be clicked for the TC and clicks it if found.
+    */
+   @SuppressWarnings("unused")
+   private void processClickable() {
+      String actionId = tcName + Constants.CLICK_ID;
+      String resultId = tcName + Constants.RESULT_ID;
+      String detailId = tcName + Constants.DETAIL_ID;
+      
+      // after test case click, need to access page again
+      lastPage = "";    
+
+      try {
+
+
+         // find element throws if ID not found.
+         WebElement actEl = driver.findElement(By.ById.id(actionId));
+         System.out.println("Clicking link. Id=" + actionId);
+         actEl.click();
+
+         try {
+
+            // click() doesn't necessarily block until page loads
+            WebDriverWait wdw = new WebDriverWait(driver, 3);
+            wdw.until(
+                  ExpectedConditions.visibilityOfElementLocated(By.id(resultId)));
+
+         } catch(Exception e) {
+            System.out.println("Exception getting result.");
+            System.out.println(e.getMessage());
+         }
+
+      } catch(Exception e) {
+         System.out.println("no clickable element.");
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/driver/src/main/resources/xml-resources/pageFiles.xml
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/driver/src/main/resources/xml-resources/pageFiles.xml b/portlet-tck_3.0/driver/src/main/resources/xml-resources/pageFiles.xml
new file mode 100644
index 0000000..64abcbb
--- /dev/null
+++ b/portlet-tck_3.0/driver/src/main/resources/xml-resources/pageFiles.xml
@@ -0,0 +1,37 @@
+<?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.     
+-->
+<!--
+   Lists the page files from the individual modules that will be combined
+   together to form the final page file with all pages for the TCK. 
+ -->
+<fl:filelist xmlns:fl="http://www.apache.org/2014/javax/portlet/tck/filelist">
+   <fl:file>tck-TestModule1-pages.xml</fl:file>
+   <fl:file>tck-TestModule2-pages.xml</fl:file>
+   <fl:file>tck-TestModule3-pages.xml</fl:file>
+   <fl:file>tck-V2AnnotationTests-pages.xml</fl:file>
+   <fl:file>tck-V2EnvironmentTests-pages.xml</fl:file>
+   <fl:file>tck-V2ExceptionTests-pages.xml</fl:file>
+   <fl:file>tck-V2FilterTests-pages.xml</fl:file>
+   <fl:file>tck-V2PortletTests-pages.xml</fl:file>
+   <fl:file>tck-V2RequestTests-pages.xml</fl:file>
+   <fl:file>tck-V2ResponseTests-pages.xml</fl:file>
+   <fl:file>tck-V2URLTests-pages.xml</fl:file>
+   <fl:file>tck-V2WrapperTests-pages.xml</fl:file>
+</fl:filelist>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/driver/src/main/resources/xml-resources/plutoPageCombiner.xsl
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/driver/src/main/resources/xml-resources/plutoPageCombiner.xsl b/portlet-tck_3.0/driver/src/main/resources/xml-resources/plutoPageCombiner.xsl
new file mode 100644
index 0000000..1b2cf7d
--- /dev/null
+++ b/portlet-tck_3.0/driver/src/main/resources/xml-resources/plutoPageCombiner.xsl
@@ -0,0 +1,66 @@
+<!-- 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. -->
+
+<!--
+   Each test case module produces as output an xml file containing a list of portal pages
+   to be accessed for the test cases defined in that module. This stylesheet combines the 
+   page files listed in the input file into a single output page file.
+   
+   When a new test case module is added, the filelist XML file must be updated in order
+   to add the new pages to the complete list of portal pages.
+   
+   This stylesheet produces a pluto-portal-driver-config.xml file containing all of the 
+   test pages.
+-->
+
+<xsl:stylesheet version="1.0"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fl="http://www.apache.org/2014/javax/portlet/tck/filelist">
+	<xsl:output method="xml" indent="yes" />
+   <xsl:strip-space elements="*" />
+
+  <xsl:template match="/">
+  <pluto-portal-driver
+    xmlns="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd
+                        http://portals.apache.org/pluto/pluto-portal/1.1/pluto-portal-driver-config.xsd"
+    version="1.1">
+
+
+    <portal-name>pluto-portal-driver</portal-name>
+    <portal-version>2.1.0-SNAPSHOT</portal-version>
+    <container-name>Pluto Portal Driver</container-name>
+
+    <supports>
+      <portlet-mode>view</portlet-mode>
+      <portlet-mode>edit</portlet-mode>
+      <portlet-mode>help</portlet-mode>
+      <portlet-mode>config</portlet-mode>
+
+      <window-state>normal</window-state>
+      <window-state>maximized</window-state>
+      <window-state>minimized</window-state>
+    </supports>
+    <xsl:element name="render-config">
+      <xsl:attribute name="default">About Apache Pluto</xsl:attribute>
+    <page name="About Apache Pluto" uri="/WEB-INF/themes/pluto-default-theme.jsp">
+      <portlet context="/pluto" name="AboutPortlet"/>
+    </page>
+      <xsl:apply-templates/>
+    </xsl:element>
+    </pluto-portal-driver>
+  </xsl:template>
+
+   <xsl:template match="fl:filelist/fl:file">
+      <xsl:copy-of select="document(.)//page"/>
+   </xsl:template>
+
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/driver/src/main/resources/xml-resources/testCombiner.xsl
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/driver/src/main/resources/xml-resources/testCombiner.xsl b/portlet-tck_3.0/driver/src/main/resources/xml-resources/testCombiner.xsl
new file mode 100644
index 0000000..4d4cddb
--- /dev/null
+++ b/portlet-tck_3.0/driver/src/main/resources/xml-resources/testCombiner.xsl
@@ -0,0 +1,36 @@
+<!-- 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. -->
+
+<!--
+   Each test case module produces as output an xml file containing a list of test cases
+   defined in that module. This stylesheet combines the test case files listed in the input 
+   file into a single output test list.
+   
+   When a new test case module is added, the filelist XML file must be updated in order
+   to add the new test cases to the complete list of test cases.
+-->
+
+<xsl:stylesheet version="1.0"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fl="http://www.apache.org/2014/javax/portlet/tck/filelist">
+	<xsl:output method="xml" indent="yes" doctype-system="http://java.sun.com/dtd/properties.dtd" />
+   <xsl:strip-space elements="*" />
+   
+	<xsl:template match="/">
+      <xsl:element name="properties">
+			<xsl:apply-templates />
+		</xsl:element>
+	</xsl:template>
+
+   <xsl:template match="fl:filelist/fl:file">
+      <xsl:copy-of select="document(.)/properties/entry"/>
+   </xsl:template>
+
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/bd830576/portlet-tck_3.0/driver/src/main/resources/xml-resources/testFiles.xml
----------------------------------------------------------------------
diff --git a/portlet-tck_3.0/driver/src/main/resources/xml-resources/testFiles.xml b/portlet-tck_3.0/driver/src/main/resources/xml-resources/testFiles.xml
new file mode 100644
index 0000000..a524494
--- /dev/null
+++ b/portlet-tck_3.0/driver/src/main/resources/xml-resources/testFiles.xml
@@ -0,0 +1,37 @@
+<?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.     
+-->
+<!--
+   Lists the test files from the individual modules that will be combined
+   together to form the final list file containing all test cases for the TCK. 
+ -->
+<fl:filelist xmlns:fl="http://www.apache.org/2014/javax/portlet/tck/filelist">
+   <fl:file>tck-TestModule1-tests.xml</fl:file>
+   <fl:file>tck-TestModule2-tests.xml</fl:file>
+   <fl:file>tck-TestModule3-tests.xml</fl:file>
+   <fl:file>tck-V2AnnotationTests-tests.xml</fl:file>
+   <fl:file>tck-V2EnvironmentTests-tests.xml</fl:file>
+   <fl:file>tck-V2ExceptionTests-tests.xml</fl:file>
+   <fl:file>tck-V2FilterTests-tests.xml</fl:file>
+   <fl:file>tck-V2PortletTests-tests.xml</fl:file>
+   <fl:file>tck-V2RequestTests-tests.xml</fl:file>
+   <fl:file>tck-V2ResponseTests-tests.xml</fl:file>
+   <fl:file>tck-V2URLTests-tests.xml</fl:file>
+   <fl:file>tck-V2WrapperTests-tests.xml</fl:file>
+</fl:filelist>