harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From smish...@apache.org
Subject svn commit: r543102 [32/32] - in /harmony/enhanced/buildtest/branches/2.0: adaptors/struts_test/ tests/struts_test/ tests/struts_test/resources/ tests/struts_test/resources/showcase/ tests/struts_test/src/ tests/struts_test/src/org/ tests/struts_test/s...
Date Thu, 31 May 2007 09:56:07 GMT
Added: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-e-pressed.html
URL: http://svn.apache.org/viewvc/harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-e-pressed.html?view=auto&rev=543102
==============================================================================
--- harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-e-pressed.html (added)
+++ harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-e-pressed.html Thu May 31 02:55:56 2007
@@ -0,0 +1,348 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <title>Showcase - Hangman</title>
+    <link href="/struts2-showcase-2.0.6/styles/main.css" rel="stylesheet" type="text/css" media="all"/>
+    <link href="/struts2-showcase-2.0.6/struts/niftycorners/niftyCorners.css" rel="stylesheet" type="text/css"/>
+    <link href="/struts2-showcase-2.0.6/struts/niftycorners/niftyPrint.css" rel="stylesheet" type="text/css" media="print"/>
+
+    <script language="JavaScript" type="text/javascript" src="/struts2-showcase-2.0.6/struts/niftycorners/nifty.js"></script>
+
+    <script language="JavaScript" type="text/javascript">
+
+        window.onload=function(){
+            if(!NiftyCheck())
+                return;
+            Rounded("blockquote","tr bl","#ECF1F9","#CDFFAA","smooth border #88D84F");
+            Rounded("div#outer-header", "all", "white", "#818EBD", "smooth border #434F7C");
+            Rounded("div#footer", "all", "white", "#818EBD", "smooth border #434F7C");
+        }
+
+    </script>
+
+    <link rel="stylesheet" href="/struts2-showcase-2.0.6/struts/xhtml/styles.css" type="text/css"/>
+<script language="JavaScript" type="text/javascript">
+    // Dojo configuration
+    djConfig = {
+        baseRelativePath: "/struts2-showcase-2.0.6/struts/dojo",
+        isDebug: false,
+        bindEncoding: "UTF-8",
+        debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes
+    };
+</script>
+<script language="JavaScript" type="text/javascript"
+        src="/struts2-showcase-2.0.6/struts/dojo/dojo.js"></script>
+<script language="JavaScript" type="text/javascript"
+        src="/struts2-showcase-2.0.6/struts/simple/dojoRequire.js"></script>
+</head>
+
+<body id="page-home">
+
+
+<div id="page">
+    <div id="outer-header">
+        <div id="header" class="clearfix">
+            <div id="branding">
+                <h1 class="title">Struts Showcase</h1>
+                
+2007/04/06 04:08:28
+
+            </div><!-- end branding -->
+
+            <div id="search">
+                <img src="/struts2-showcase-2.0.6/images/struts-power.gif" alt="Powered by Struts"/>
+            </div><!-- end search -->
+
+            <hr/>
+        </div>
+    </div><!-- end header -->
+
+    <div id="content" class="clearfix">
+
+        <table bgcolor="green"> 
+  <tr> 
+    <td>
+    <img alt="Hangman" src="/struts2-showcase-2.0.6/hangman/images/hangman.png?character=E"
+           width="197" height="50" border="0"/> 
+    </td> 
+    <td width="70" align="right">
+      <div id="updateGuessLeftDiv">
+      <img alt="No. Guesses Left"
+      	   src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_1.png?character=E" width="20" height="20" border="0" />
+      </div>
+    </td>
+    <td>
+    	<img alt="Guesses Left"
+            src="/struts2-showcase-2.0.6/hangman/images/guesses-left.png?character=E" width="164" height="11" border="0"/>
+    </td>
+  </tr> 
+  <tr> 
+  	<td></td>
+    <td align="left">
+  	<div id="updateScaffoldDiv">
+    	<img src="/struts2-showcase-2.0.6/hangman/images/scaffold_1.png?character=E" border="0"/>
+    </div>
+    </td>
+    <td></td>
+    </tr> 
+  <tr>
+    <td width="160"> 
+      <p align="right">
+        <img alt="Current Guess" src="/struts2-showcase-2.0.6/hangman/images/guess.png?character=E"
+           align="MIDDLE" width="127" height="20" border="0"/></p> 
+    </td> 
+    <td>
+    <div id="updateVocabDiv">
+    		<img height="36" alt="_"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_underscroll.png?character=E" width="36" border="0"/>
+    		<img height="36" alt="A"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_A.png?character=E" width="36" border="0"/>
+    		<img height="36" alt="_"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_underscroll.png?character=E" width="36" border="0"/>
+    		<img height="36" alt="A"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_A.png?character=E" width="36" border="0"/>
+	</div>
+    </td> 
+  </tr>
+  <tr> 
+    <td valign="top"> 
+      <p align="right">
+        <img alt="Choose" src="/struts2-showcase-2.0.6/hangman/images/choose.png?character=E"
+             height="20" width="151" border="0"/>
+      </p> 
+    </td> 
+    <td width="330">
+    
+    <div id="updateCharacterAvailableDiv">
+      
+<a
+	id="F"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=F"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_F.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="G"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=G"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_G.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="H"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=H"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_H.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="I"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=I"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_I.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="J"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=J"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_J.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="K"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=K"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_K.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="L"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=L"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_L.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="M"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=M"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_M.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="N"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=N"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_N.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="O"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=O"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_O.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="P"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=P"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_P.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="Q"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=Q"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_Q.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="R"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=R"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_R.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="S"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=S"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_S.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="T"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=T"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_T.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="U"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=U"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_U.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="V"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=V"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_V.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="W"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=W"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_W.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="X"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=X"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_X.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="Y"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=Y"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_Y.png?character=E" width="36" border="0" />
+</a>
+      
+<a
+	id="Z"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=Z"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_Z.png?character=E" width="36" border="0" />
+</a>
+	</div>
+ 
+   
+   </td>
+  </tr> 
+  <tr>
+  	<td>
+  		
+  	</td>
+  </tr>
+</table>
+
+        <div id="nav">
+            <div class="wrapper">
+                <h2 class="accessibility">Navigation</h2>
+                <ul class="clearfix">
+        <li><a href="/struts2-showcase-2.0.6/showcase.jsp?character=E">Home</a></li>
+        <li><a href="/struts2-showcase-2.0.6/ajax/index.jsp?character=E">Ajax</a></li>
+        <li><a href="/struts2-showcase-2.0.6/chat/index.jsp?character=E">Ajax Chat</a></li>
+        <li><a href="/struts2-showcase-2.0.6/actionchaining/actionChain1!input.action">Action Chaining</a></li>
+        <li><a href="/struts2-showcase-2.0.6/config-browser/index.action">Config Browser</a></li>
+        <li><a href="/struts2-showcase-2.0.6/conversion/index.jsp?character=E">Conversion</a></li>
+        <li><a href="/struts2-showcase-2.0.6/empmanager/index.jsp?character=E">CRUD</a></li>
+        <li><a href="/struts2-showcase-2.0.6/wait/index.jsp?character=E">Execute & Wait</a></li>
+        <li><a href="/struts2-showcase-2.0.6/filedownload/index.jsp?character=E">File Download</a></li>
+        <li><a href="/struts2-showcase-2.0.6/fileupload?character=E">File Upload</a></li>
+        <li><a href="/struts2-showcase-2.0.6/freemarker/index.jsp?character=E">Freemarker</a>
+        <li><a href="/struts2-showcase-2.0.6/hangman/hangmanMenu.action?character=E">Hangman</a></li>
+        <li><a href="/struts2-showcase-2.0.6/jsf/index.jsp?character=E">JavaServer Faces</a></li>
+        <li><a href="/struts2-showcase-2.0.6/person/index.jsp?character=E">Person Manager</a></li>
+        <li><a href="/struts2-showcase-2.0.6/tags/index.jsp?character=E">Tags</a></li>
+        <li><a href="/struts2-showcase-2.0.6/tiles/index.action?character=E">Tiles</a></li>
+        <li><a href="/struts2-showcase-2.0.6/token/index.jsp?character=E">Token</a></li>
+        <li><a href="/struts2-showcase-2.0.6/validation/index.jsp?character=E">Validation</a></li>
+        <li class="last"><a href="/struts2-showcase-2.0.6/help.jsp?character=E">Help</a></li>
+                </ul>
+            </div>
+            <hr/>
+
+        </div><!-- end nav -->
+
+    </div><!-- end content -->
+
+  <div>
+      <p>
+        <a href="/struts2-showcase-2.0.6/viewSource.action?config=file:/C:/mol/tools/jakarta-tomcat-5.0.30/webapps/struts2-showcase-2.0.6/WEB-INF/classes/struts-hangman.xml:24&className=guessCharacterAction&page=/hangman//hangman/hangmanNonAjax.ftl">View Sources</a>
+      </p>
+  </div>
+    <div id="footer" class="clearfix">
+        <p>Copyright &copy; 2003-2007 The Apache Software Foundation.</p>
+    </div><!-- end footer -->
+    <p/>
+
+</div><!-- end page -->
+
+</body>
+</html>

Propchange: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-e-pressed.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-f-pressed.html
URL: http://svn.apache.org/viewvc/harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-f-pressed.html?view=auto&rev=543102
==============================================================================
--- harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-f-pressed.html (added)
+++ harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-f-pressed.html Thu May 31 02:55:56 2007
@@ -0,0 +1,340 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <title>Showcase - Hangman</title>
+    <link href="/struts2-showcase-2.0.6/styles/main.css" rel="stylesheet" type="text/css" media="all"/>
+    <link href="/struts2-showcase-2.0.6/struts/niftycorners/niftyCorners.css" rel="stylesheet" type="text/css"/>
+    <link href="/struts2-showcase-2.0.6/struts/niftycorners/niftyPrint.css" rel="stylesheet" type="text/css" media="print"/>
+
+    <script language="JavaScript" type="text/javascript" src="/struts2-showcase-2.0.6/struts/niftycorners/nifty.js"></script>
+
+    <script language="JavaScript" type="text/javascript">
+
+        window.onload=function(){
+            if(!NiftyCheck())
+                return;
+            Rounded("blockquote","tr bl","#ECF1F9","#CDFFAA","smooth border #88D84F");
+            Rounded("div#outer-header", "all", "white", "#818EBD", "smooth border #434F7C");
+            Rounded("div#footer", "all", "white", "#818EBD", "smooth border #434F7C");
+        }
+
+    </script>
+
+    <link rel="stylesheet" href="/struts2-showcase-2.0.6/struts/xhtml/styles.css" type="text/css"/>
+<script language="JavaScript" type="text/javascript">
+    // Dojo configuration
+    djConfig = {
+        baseRelativePath: "/struts2-showcase-2.0.6/struts/dojo",
+        isDebug: false,
+        bindEncoding: "UTF-8",
+        debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes
+    };
+</script>
+<script language="JavaScript" type="text/javascript"
+        src="/struts2-showcase-2.0.6/struts/dojo/dojo.js"></script>
+<script language="JavaScript" type="text/javascript"
+        src="/struts2-showcase-2.0.6/struts/simple/dojoRequire.js"></script>
+</head>
+
+<body id="page-home">
+
+
+<div id="page">
+    <div id="outer-header">
+        <div id="header" class="clearfix">
+            <div id="branding">
+                <h1 class="title">Struts Showcase</h1>
+                
+2007/04/06 04:09:03
+
+            </div><!-- end branding -->
+
+            <div id="search">
+                <img src="/struts2-showcase-2.0.6/images/struts-power.gif" alt="Powered by Struts"/>
+            </div><!-- end search -->
+
+            <hr/>
+        </div>
+    </div><!-- end header -->
+
+    <div id="content" class="clearfix">
+
+        <table bgcolor="green"> 
+  <tr> 
+    <td>
+    <img alt="Hangman" src="/struts2-showcase-2.0.6/hangman/images/hangman.png?character=F"
+           width="197" height="50" border="0"/> 
+    </td> 
+    <td width="70" align="right">
+      <div id="updateGuessLeftDiv">
+      <img alt="No. Guesses Left"
+      	   src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_0.png?character=F" width="20" height="20" border="0" />
+      </div>
+    </td>
+    <td>
+    	<img alt="Guesses Left"
+            src="/struts2-showcase-2.0.6/hangman/images/guesses-left.png?character=F" width="164" height="11" border="0"/>
+    </td>
+  </tr> 
+  <tr> 
+  	<td></td>
+    <td align="left">
+  	<div id="updateScaffoldDiv">
+    	<img src="/struts2-showcase-2.0.6/hangman/images/scaffold_0.png?character=F" border="0"/>
+    </div>
+    </td>
+    <td></td>
+    </tr> 
+  <tr>
+    <td width="160"> 
+      <p align="right">
+        <img alt="Current Guess" src="/struts2-showcase-2.0.6/hangman/images/guess.png?character=F"
+           align="MIDDLE" width="127" height="20" border="0"/></p> 
+    </td> 
+    <td>
+    <div id="updateVocabDiv">
+    		<img height="36" alt="_"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_underscroll.png?character=F" width="36" border="0"/>
+    		<img height="36" alt="A"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_A.png?character=F" width="36" border="0"/>
+    		<img height="36" alt="_"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_underscroll.png?character=F" width="36" border="0"/>
+    		<img height="36" alt="A"
+        		src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_A.png?character=F" width="36" border="0"/>
+	</div>
+    </td> 
+  </tr>
+  <tr> 
+    <td valign="top"> 
+      <p align="right">
+        <img alt="Choose" src="/struts2-showcase-2.0.6/hangman/images/choose.png?character=F"
+             height="20" width="151" border="0"/>
+      </p> 
+    </td> 
+    <td width="330">
+    
+    <div id="updateCharacterAvailableDiv">
+      
+<a
+	id="G"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=G"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_G.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="H"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=H"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_H.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="I"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=I"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_I.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="J"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=J"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_J.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="K"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=K"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_K.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="L"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=L"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_L.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="M"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=M"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_M.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="N"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=N"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_N.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="O"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=O"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_O.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="P"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=P"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_P.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="Q"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=Q"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_Q.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="R"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=R"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_R.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="S"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=S"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_S.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="T"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=T"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_T.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="U"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=U"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_U.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="V"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=V"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_V.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="W"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=W"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_W.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="X"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=X"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_X.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="Y"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=Y"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_Y.png?character=F" width="36" border="0" />
+</a>
+      
+<a
+	id="Z"
+	href="/struts2-showcase-2.0.6/hangman/guessCharacterNonAjax.action?character=Z"
+
+>
+      	<img height="36" alt="" src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_Z.png?character=F" width="36" border="0" />
+</a>
+	</div>
+ 
+   
+   </td>
+  </tr> 
+  <tr>
+  	<td>
+  		
+  	</td>
+  </tr>
+</table>
+
+        <div id="nav">
+            <div class="wrapper">
+                <h2 class="accessibility">Navigation</h2>
+                <ul class="clearfix">
+        <li><a href="/struts2-showcase-2.0.6/showcase.jsp?character=F">Home</a></li>
+        <li><a href="/struts2-showcase-2.0.6/ajax/index.jsp?character=F">Ajax</a></li>
+        <li><a href="/struts2-showcase-2.0.6/chat/index.jsp?character=F">Ajax Chat</a></li>
+        <li><a href="/struts2-showcase-2.0.6/actionchaining/actionChain1!input.action">Action Chaining</a></li>
+        <li><a href="/struts2-showcase-2.0.6/config-browser/index.action">Config Browser</a></li>
+        <li><a href="/struts2-showcase-2.0.6/conversion/index.jsp?character=F">Conversion</a></li>
+        <li><a href="/struts2-showcase-2.0.6/empmanager/index.jsp?character=F">CRUD</a></li>
+        <li><a href="/struts2-showcase-2.0.6/wait/index.jsp?character=F">Execute & Wait</a></li>
+        <li><a href="/struts2-showcase-2.0.6/filedownload/index.jsp?character=F">File Download</a></li>
+        <li><a href="/struts2-showcase-2.0.6/fileupload?character=F">File Upload</a></li>
+        <li><a href="/struts2-showcase-2.0.6/freemarker/index.jsp?character=F">Freemarker</a>
+        <li><a href="/struts2-showcase-2.0.6/hangman/hangmanMenu.action?character=F">Hangman</a></li>
+        <li><a href="/struts2-showcase-2.0.6/jsf/index.jsp?character=F">JavaServer Faces</a></li>
+        <li><a href="/struts2-showcase-2.0.6/person/index.jsp?character=F">Person Manager</a></li>
+        <li><a href="/struts2-showcase-2.0.6/tags/index.jsp?character=F">Tags</a></li>
+        <li><a href="/struts2-showcase-2.0.6/tiles/index.action?character=F">Tiles</a></li>
+        <li><a href="/struts2-showcase-2.0.6/token/index.jsp?character=F">Token</a></li>
+        <li><a href="/struts2-showcase-2.0.6/validation/index.jsp?character=F">Validation</a></li>
+        <li class="last"><a href="/struts2-showcase-2.0.6/help.jsp?character=F">Help</a></li>
+                </ul>
+            </div>
+            <hr/>
+
+        </div><!-- end nav -->
+
+    </div><!-- end content -->
+
+  <div>
+      <p>
+        <a href="/struts2-showcase-2.0.6/viewSource.action?config=file:/C:/mol/tools/jakarta-tomcat-5.0.30/webapps/struts2-showcase-2.0.6/WEB-INF/classes/struts-hangman.xml:24&className=guessCharacterAction&page=/hangman//hangman/hangmanNonAjax.ftl">View Sources</a>
+      </p>
+  </div>
+    <div id="footer" class="clearfix">
+        <p>Copyright &copy; 2003-2007 The Apache Software Foundation.</p>
+    </div><!-- end footer -->
+    <p/>
+
+</div><!-- end page -->
+
+</body>
+</html>

Propchange: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-f-pressed.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-g-pressed-lost.html
URL: http://svn.apache.org/viewvc/harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-g-pressed-lost.html?view=auto&rev=543102
==============================================================================
--- harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-g-pressed-lost.html (added)
+++ harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-g-pressed-lost.html Thu May 31 02:55:56 2007
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+    <title>Showcase - Hangman</title>
+    <link href="/struts2-showcase-2.0.6/styles/main.css" rel="stylesheet" type="text/css" media="all"/>
+    <link href="/struts2-showcase-2.0.6/struts/niftycorners/niftyCorners.css" rel="stylesheet" type="text/css"/>
+    <link href="/struts2-showcase-2.0.6/struts/niftycorners/niftyPrint.css" rel="stylesheet" type="text/css" media="print"/>
+
+    <script language="JavaScript" type="text/javascript" src="/struts2-showcase-2.0.6/struts/niftycorners/nifty.js"></script>
+
+    <script language="JavaScript" type="text/javascript">
+
+        window.onload=function(){
+            if(!NiftyCheck())
+                return;
+            Rounded("blockquote","tr bl","#ECF1F9","#CDFFAA","smooth border #88D84F");
+            Rounded("div#outer-header", "all", "white", "#818EBD", "smooth border #434F7C");
+            Rounded("div#footer", "all", "white", "#818EBD", "smooth border #434F7C");
+        }
+
+    </script>
+
+    <link rel="stylesheet" href="/struts2-showcase-2.0.6/struts/xhtml/styles.css" type="text/css"/>
+<script language="JavaScript" type="text/javascript">
+    // Dojo configuration
+    djConfig = {
+        baseRelativePath: "/struts2-showcase-2.0.6/struts/dojo",
+        isDebug: false,
+        bindEncoding: "UTF-8",
+        debugAtAllCosts: true // not needed, but allows the Venkman debugger to work with the includes
+    };
+</script>
+<script language="JavaScript" type="text/javascript"
+        src="/struts2-showcase-2.0.6/struts/dojo/dojo.js"></script>
+<script language="JavaScript" type="text/javascript"
+        src="/struts2-showcase-2.0.6/struts/simple/dojoRequire.js"></script>
+</head>
+
+<body id="page-home">
+
+
+<div id="page">
+    <div id="outer-header">
+        <div id="header" class="clearfix">
+            <div id="branding">
+                <h1 class="title">Struts Showcase</h1>
+                
+2007/04/06 04:09:29
+
+            </div><!-- end branding -->
+
+            <div id="search">
+                <img src="/struts2-showcase-2.0.6/images/struts-power.gif" alt="Powered by Struts"/>
+            </div><!-- end search -->
+
+            <hr/>
+        </div>
+    </div><!-- end header -->
+
+    <div id="content" class="clearfix">
+
+        <table bgcolor="green"> 
+  <tr> 
+    <td>
+    <img alt="Hangman" src="/struts2-showcase-2.0.6/hangman/images/hangman.png?character=G"
+           width="197" height="50" border="0"/> 
+    </td> 
+    <td width="70" align="right">
+      <div id="updateGuessLeftDiv">
+      </div>
+    </td>
+    <td>
+    	<img alt="Guesses Left"
+            src="/struts2-showcase-2.0.6/hangman/images/guesses-left.png?character=G" width="164" height="11" border="0"/>
+    </td>
+  </tr> 
+  <tr> 
+  	<td></td>
+    <td align="left">
+  	<div id="updateScaffoldDiv">
+    	<img src="/struts2-showcase-2.0.6/hangman/images/scaffold_-1.png?character=G" border="0"/>
+    </div>
+    </td>
+    <td></td>
+    </tr> 
+  <tr>
+    <td width="160"> 
+      <p align="right">
+        <img alt="Current Guess" src="/struts2-showcase-2.0.6/hangman/images/guess.png?character=G"
+           align="MIDDLE" width="127" height="20" border="0"/></p> 
+    </td> 
+    <td>
+    <div id="updateVocabDiv">
+			<img height="36" alt="J"
+		 			src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_J.png?character=G" width="36" border="0" />
+			<img height="36" alt="A"
+		 			src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_A.png?character=G" width="36" border="0" />
+			<img height="36" alt="V"
+		 			src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_V.png?character=G" width="36" border="0" />
+			<img height="36" alt="A"
+		 			src="/struts2-showcase-2.0.6/hangman/images/Chalkboard_A.png?character=G" width="36" border="0" />
+	</div>
+    </td> 
+  </tr>
+  <tr> 
+    <td valign="top"> 
+      <p align="right">
+        <img alt="Choose" src="/struts2-showcase-2.0.6/hangman/images/choose.png?character=G"
+             height="20" width="151" border="0"/>
+      </p> 
+    </td> 
+    <td width="330">
+    
+    <div id="updateCharacterAvailableDiv">
+	
+	<img src="/struts2-showcase-2.0.6/hangman/images/you-lose.png?character=G" width="381" height="44" />
+<a
+	
+	href="/struts2-showcase-2.0.6/hangman/hangmanNonAjax.action?character=G"
+
+>
+		<img src="/struts2-showcase-2.0.6/hangman/images/start.png?character=G" width="250" height="43" />
+</a>
+	</div>
+ 
+   
+   </td>
+  </tr> 
+  <tr>
+  	<td>
+  		
+  	</td>
+  </tr>
+</table>
+
+        <div id="nav">
+            <div class="wrapper">
+                <h2 class="accessibility">Navigation</h2>
+                <ul class="clearfix">
+        <li><a href="/struts2-showcase-2.0.6/showcase.jsp?character=G">Home</a></li>
+        <li><a href="/struts2-showcase-2.0.6/ajax/index.jsp?character=G">Ajax</a></li>
+        <li><a href="/struts2-showcase-2.0.6/chat/index.jsp?character=G">Ajax Chat</a></li>
+        <li><a href="/struts2-showcase-2.0.6/actionchaining/actionChain1!input.action">Action Chaining</a></li>
+        <li><a href="/struts2-showcase-2.0.6/config-browser/index.action">Config Browser</a></li>
+        <li><a href="/struts2-showcase-2.0.6/conversion/index.jsp?character=G">Conversion</a></li>
+        <li><a href="/struts2-showcase-2.0.6/empmanager/index.jsp?character=G">CRUD</a></li>
+        <li><a href="/struts2-showcase-2.0.6/wait/index.jsp?character=G">Execute & Wait</a></li>
+        <li><a href="/struts2-showcase-2.0.6/filedownload/index.jsp?character=G">File Download</a></li>
+        <li><a href="/struts2-showcase-2.0.6/fileupload?character=G">File Upload</a></li>
+        <li><a href="/struts2-showcase-2.0.6/freemarker/index.jsp?character=G">Freemarker</a>
+        <li><a href="/struts2-showcase-2.0.6/hangman/hangmanMenu.action?character=G">Hangman</a></li>
+        <li><a href="/struts2-showcase-2.0.6/jsf/index.jsp?character=G">JavaServer Faces</a></li>
+        <li><a href="/struts2-showcase-2.0.6/person/index.jsp?character=G">Person Manager</a></li>
+        <li><a href="/struts2-showcase-2.0.6/tags/index.jsp?character=G">Tags</a></li>
+        <li><a href="/struts2-showcase-2.0.6/tiles/index.action?character=G">Tiles</a></li>
+        <li><a href="/struts2-showcase-2.0.6/token/index.jsp?character=G">Token</a></li>
+        <li><a href="/struts2-showcase-2.0.6/validation/index.jsp?character=G">Validation</a></li>
+        <li class="last"><a href="/struts2-showcase-2.0.6/help.jsp?character=G">Help</a></li>
+                </ul>
+            </div>
+            <hr/>
+
+        </div><!-- end nav -->
+
+    </div><!-- end content -->
+
+  <div>
+      <p>
+        <a href="/struts2-showcase-2.0.6/viewSource.action?config=file:/C:/mol/tools/jakarta-tomcat-5.0.30/webapps/struts2-showcase-2.0.6/WEB-INF/classes/struts-hangman.xml:24&className=guessCharacterAction&page=/hangman//hangman/hangmanNonAjax.ftl">View Sources</a>
+      </p>
+  </div>
+    <div id="footer" class="clearfix">
+        <p>Copyright &copy; 2003-2007 The Apache Software Foundation.</p>
+    </div><!-- end footer -->
+    <p/>
+
+</div><!-- end page -->
+
+</body>
+</html>

Propchange: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/hangman-g-pressed-lost.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/scenario.properties
URL: http://svn.apache.org/viewvc/harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/scenario.properties?view=auto&rev=543102
==============================================================================
--- harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/scenario.properties (added)
+++ harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/scenario.properties Thu May 31 02:55:56 2007
@@ -0,0 +1,466 @@
+# 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.
+#
+10000.URL./struts2-showcase-2.0.6/showcase.jsp :file520468537.html
+10010.ANCHOR.3 :file1722219095.html
+10020.ANCHOR.0 :file-1080589601.html
+10030.ANCHOR.20 :file857505531.html
+10040.ANCHOR.19 :file1376914575.html
+10050.BREAK_LEVEL :4
+10060.BREAK_LEVEL :3
+10070.BREAK_LEVEL :2
+10080.ANCHOR.1 :file-2140644304.html
+10085.FORM.0.data.test.Update\ Content  :update_content.html
+10086.BREAK_LEVEL :3
+10090.ANCHOR.20 :file-263602398.html
+10100.BREAK_LEVEL :3
+10110.BREAK_LEVEL :2
+10120.ANCHOR.2 :file-543438523.html
+10130.ANCHOR.0 :file-399770823.html
+10140.ANCHOR.20 :file-1214667119.html
+10150.BREAK_LEVEL :4
+10160.BREAK_LEVEL :3
+10170.ANCHOR.1 :file-2133221427.html
+10180.ANCHOR.20 :file599293166.html
+10190.BREAK_LEVEL :4
+10200.BREAK_LEVEL :3
+10210.ANCHOR.2 :file1929853595.html
+10220.ANCHOR.20 :file1410748179.html
+10230.BREAK_LEVEL :4
+10240.BREAK_LEVEL :3
+10250.ANCHOR.3 :file-1561725553.html
+10260.ANCHOR.20 :file-1192328387.html
+10270.BREAK_LEVEL :4
+10280.BREAK_LEVEL :3
+10290.ANCHOR.4 :file-220233869.html
+10300.ANCHOR.20 :file-981166308.html
+10310.BREAK_LEVEL :4
+10320.BREAK_LEVEL :3
+10330.ANCHOR.5 :file-2002593751.html
+10340.ANCHOR.20 :file-1671503818.html
+10350.BREAK_LEVEL :4
+10360.BREAK_LEVEL :3
+10370.ANCHOR.6 :file2088277692.html
+10380.ANCHOR.20 :file606094155.html
+10390.BREAK_LEVEL :4
+10400.BREAK_LEVEL :3
+10410.ANCHOR.7 :file-548819423.html
+10420.ANCHOR.20 :file1513919628.html
+10430.BREAK_LEVEL :4
+10440.BREAK_LEVEL :3
+10450.ANCHOR.28 :file-583689035.html
+10460.BREAK_LEVEL :3
+10470.BREAK_LEVEL :2
+10480.ANCHOR.3 :file490147034.html
+10490.ANCHOR.0 :file548291658.html
+10500.BREAK_LEVEL :3
+10530.ANCHOR.3 :file-1381191723.html
+10540.BREAK_LEVEL :3
+10550.ANCHOR.26 :file460908356.html
+10560.BREAK_LEVEL :3
+10570.BREAK_LEVEL :2
+10580.ANCHOR.4 :file-1672643228.html
+10590.ANCHOR.0 :file1115226846.html
+10600.ANCHOR.20 :file-721695706.html
+10610.BREAK_LEVEL :4
+10620.BREAK_LEVEL :3
+10630.ANCHOR.1 :file1530230059.html
+10640.ANCHOR.20 :file-715074892.html
+10650.BREAK_LEVEL :4
+10660.BREAK_LEVEL :3
+10670.ANCHOR.2 :file588428781.html
+10680.BREAK_LEVEL :3
+10690.ANCHOR.3 :file-895215870.html
+10700.ANCHOR.19 :file-1530829176.html
+10710.BREAK_LEVEL :4
+10720.BREAK_LEVEL :3
+10730.ANCHOR.4 :file-96067883.html
+10740.ANCHOR.20 :file1485970181.html
+10750.BREAK_LEVEL :4
+10760.BREAK_LEVEL :3
+10770.ANCHOR.25 :file-105386446.html
+10780.BREAK_LEVEL :3
+10790.BREAK_LEVEL :2
+10800.ANCHOR.5 :file-2051463767.html
+10810.ANCHOR.20 :file1168218769.html
+10820.BREAK_LEVEL :3
+10830.BREAK_LEVEL :2
+10840.ANCHOR.7 :file1470574194.html
+10850.ANCHOR.19 :file950284068.html
+10860.BREAK_LEVEL :3
+10870.BREAK_LEVEL :2
+10880.ANCHOR.27 :file-635072572.html
+10890.BREAK_LEVEL :2
+10900.BREAK_LEVEL :1
+10910.ANCHOR.4 :file-1142313256.html
+10920.ANCHOR.19 :file-1618731545.html
+10930.BREAK_LEVEL :2
+10940.BREAK_LEVEL :1
+10950.ANCHOR.5 :file-1484175583.html
+10960.ANCHOR.19 :file1087000158.html
+10970.BREAK_LEVEL :2
+10980.BREAK_LEVEL :1
+10990.ANCHOR.6 :file647661912.html
+11000.ANCHOR.0 :file1212129972.html
+11010.BREAK_LEVEL :2
+11020.ANCHOR.33 :file-1537402740.html
+11030.ANCHOR.48 :file354834496.html
+11040.BREAK_LEVEL :3
+11050.ANCHOR.78 :file-1163688498.html
+11060.BREAK_LEVEL :3
+11070.BREAK_LEVEL :2
+11080.ANCHOR.34 :file444067065.html
+11090.ANCHOR.48 :file347491972.javascript
+11100.BREAK_LEVEL :2
+11110.ANCHOR.35 :file1809657936.html
+11120.ANCHOR.48 :file51326438.html
+11130.BREAK_LEVEL :3
+11140.BREAK_LEVEL :2
+11150.ANCHOR.36 :file940471649.html
+11160.ANCHOR.48 :file499517496.javascript
+11170.BREAK_LEVEL :2
+11180.ANCHOR.37 :file-261041589.html
+11190.ANCHOR.48 :file-1907750723.html
+11200.ANCHOR.19 :file1876937487.html
+11210.BREAK_LEVEL :4
+11220.BREAK_LEVEL :3
+11230.BREAK_LEVEL :2
+11240.ANCHOR.38 :file-347957778.html
+11250.ANCHOR.48 :file2003906050.html
+11260.ANCHOR.19 :file700954558.html
+11270.BREAK_LEVEL :4
+11280.BREAK_LEVEL :3
+11290.BREAK_LEVEL :2
+11300.ANCHOR.39 :file520540230.html
+11310.ANCHOR.48 :file-1381191723.html
+11320.BREAK_LEVEL :3
+11330.BREAK_LEVEL :2
+11340.ANCHOR.40 :file-22990613.html
+11350.ANCHOR.48 :file1580964447.html
+11360.ANCHOR.19 :file409888837.html
+11370.BREAK_LEVEL :4
+11380.BREAK_LEVEL :3
+11390.BREAK_LEVEL :2
+11400.ANCHOR.41 :file-564180781.html
+11430.BREAK_LEVEL :2
+11440.ANCHOR.42 :file1044304741.html
+11450.ANCHOR.48 :file-2094010522.html
+11460.ANCHOR.20 :file-1617997628.html
+11470.BREAK_LEVEL :4
+11480.BREAK_LEVEL :3
+11490.BREAK_LEVEL :2
+11500.ANCHOR.43 :file1526240400.html
+11530.BREAK_LEVEL :2
+11540.ANCHOR.44 :file1721909443.html
+11550.ANCHOR.48 :file-2009206812.html
+11560.ANCHOR.40 :file-1371989947.html
+11570.BREAK_LEVEL :4
+11580.BREAK_LEVEL :3
+11590.BREAK_LEVEL :2
+11600.ANCHOR.45 :file1577782958.html
+11610.ANCHOR.48 :file1034897760.javascript
+11620.BREAK_LEVEL :2
+11630.ANCHOR.46 :file-1395379970.html
+11640.ANCHOR.48 :file430108950.html
+11650.ANCHOR.19 :file237315157.html
+11660.BREAK_LEVEL :4
+11670.BREAK_LEVEL :3
+11680.BREAK_LEVEL :2
+11690.ANCHOR.47 :file-1768380370.html
+11700.ANCHOR.48 :file-1944673309.html
+11710.BREAK_LEVEL :3
+11720.BREAK_LEVEL :2
+11730.ANCHOR.86 :file-1412440552.html
+11740.BREAK_LEVEL :2
+11750.BREAK_LEVEL :1
+11760.ANCHOR.7 :file779269230.html
+11770.ANCHOR.0 :file-451142477.html
+11780.ANCHOR.0 :file516246692.plain
+11790.ANCHOR.1 :file1387610589.plain
+11800.ANCHOR.2 :file-1291952655.plain
+11810.ANCHOR.22 :file-377035014.html
+11820.BREAK_LEVEL :3
+11830.BREAK_LEVEL :2
+11840.ANCHOR.1 :file-1337903257.html
+11850.ANCHOR.0 :file-1956350958.plain
+11860.ANCHOR.1 :file1046565275.plain
+11870.ANCHOR.2 :file1280965334.plain
+11880.ANCHOR.22 :file1071189938.html
+11890.BREAK_LEVEL :3
+11900.BREAK_LEVEL :2
+11910.ANCHOR.2 :file-2046257675.html
+11920.ANCHOR.0 :file-1902111752.plain
+11930.ANCHOR.1 :file1602549860.plain
+11940.ANCHOR.2 :file-99058551.plain
+11950.ANCHOR.3 :file-861467256.plain
+11960.ANCHOR.4 :file-764544853.plain
+11970.ANCHOR.24 :file-1906449748.html
+11980.BREAK_LEVEL :3
+11990.BREAK_LEVEL :2
+12000.ANCHOR.22 :file-1972662817.html
+12010.BREAK_LEVEL :2
+12020.BREAK_LEVEL :1
+12030.ANCHOR.8 :file1135368877.html
+12040.ANCHOR.0 :file1504172570.html
+12050.ANCHOR.4 :file-1363406647.html
+12060.BREAK_LEVEL :3
+12070.ANCHOR.24 :file1118163598.html
+12080.BREAK_LEVEL :3
+12090.BREAK_LEVEL :2
+12100.ANCHOR.1 :file-1871022881.html
+12110.ANCHOR.20 :file-109342533.html
+12120.BREAK_LEVEL :3
+12130.BREAK_LEVEL :2
+12140.ANCHOR.2 :file-425644950.html
+#12150.ANCHOR.0 :file656013278.html
+#12160.ANCHOR.20 :file-971358050.html
+#12170.BREAK_LEVEL :4
+#12180.BREAK_LEVEL :3
+#12190.ANCHOR.1 :file1089118798.html
+#12200.BREAK_LEVEL :3
+12210.ANCHOR.2 :file-1343062876.html
+12220.ANCHOR.20 :file808671836.html
+12230.BREAK_LEVEL :4
+12240.BREAK_LEVEL :3
+12250.ANCHOR.3 :file-1415775260.html
+12260.BREAK_LEVEL :3
+12270.ANCHOR.23 :file1020471525.html
+12280.BREAK_LEVEL :3
+12290.BREAK_LEVEL :2
+12300.ANCHOR.3 :file-26334401.html
+12310.BREAK_LEVEL :2
+12320.ANCHOR.23 :file1696793014.html
+12330.BREAK_LEVEL :2
+12340.BREAK_LEVEL :1
+12350.ANCHOR.9 :file1019812867.html
+12360.ANCHOR.0 :file-376200392.html
+12370.ANCHOR.19 :file1306607320.html
+12380.BREAK_LEVEL :3
+12390.BREAK_LEVEL :2
+12400.ANCHOR.1 :file659664062.html
+12410.ANCHOR.19 :file-264635057.html
+12420.BREAK_LEVEL :3
+12430.BREAK_LEVEL :2
+12440.ANCHOR.2 :file-1547886496.html
+12450.ANCHOR.19 :file-878964333.html
+12460.BREAK_LEVEL :3
+12470.BREAK_LEVEL :2
+12480.ANCHOR.22 :file1835928095.html
+12490.BREAK_LEVEL :2
+12500.BREAK_LEVEL :1
+12510.ANCHOR.10 :file1440455414.html
+12520.ANCHOR.21 :file663686294.html
+12530.BREAK_LEVEL :2
+12540.BREAK_LEVEL :1
+12550.ANCHOR.11 :file-267059501.html
+12560.ANCHOR.22 :file586871899.html
+12570.BREAK_LEVEL :2
+12580.BREAK_LEVEL :1
+12590.ANCHOR.12 :file-1389384112.html
+12600.ANCHOR.0 :file66561706.html
+12610.ANCHOR.19 :file654959491.html
+12620.BREAK_LEVEL :3
+12630.BREAK_LEVEL :2
+12640.ANCHOR.1 :file-1553110989.html
+12650.ANCHOR.19 :file734464507.html
+12660.BREAK_LEVEL :3
+12670.BREAK_LEVEL :2
+12680.ANCHOR.21 :file-1373088266.html
+12690.BREAK_LEVEL :2
+12700.BREAK_LEVEL :1
+12710.ANCHOR.13 :file-587902113.html
+12720.ANCHOR.0 :file2121403955.html
+12730.ANCHOR.0 :file2006889214.html
+12731.ANCHOR.0 :hangman-b-pressed.html
+12732.ANCHOR.0 :hangman-c-pressed.html
+12733.ANCHOR.0 :hangman-d-pressed.html
+12734.ANCHOR.0 :hangman-e-pressed.html
+12735.ANCHOR.0 :hangman-f-pressed.html
+12736.ANCHOR.0 :hangman-g-pressed-lost.html
+12737.BREAK_LEVEL :9
+12738.BREAK_LEVEL :8
+12739.BREAK_LEVEL :7
+12740.BREAK_LEVEL :6
+12741.BREAK_LEVEL :5
+12742.BREAK_LEVEL :4
+12745.ANCHOR.44 :file1536825040.html
+12750.BREAK_LEVEL :4
+12760.BREAK_LEVEL :3
+13270.ANCHOR.45 :file-1801568676.html
+13280.BREAK_LEVEL :3
+13290.BREAK_LEVEL :2
+13300.ANCHOR.1 :file606356818.html
+13310.ANCHOR.0 :file0.html
+13320.BREAK_LEVEL :3
+13330.ANCHOR.45 :file-1247066060.html
+13340.BREAK_LEVEL :3
+13350.BREAK_LEVEL :2
+13360.ANCHOR.21 :file-1258062733.html
+13370.BREAK_LEVEL :2
+13380.BREAK_LEVEL :1
+13390.ANCHOR.14 :file-1823821488.html
+#13400.ANCHOR.0 :file1863774436.html
+#13410.ANCHOR.0 :file1635993582.html
+#13420.ANCHOR.0 :file1863774436.html
+#13430.BREAK_LEVEL :4
+#13440.ANCHOR.20 :file1652161658.html
+#13450.BREAK_LEVEL :4
+#13460.BREAK_LEVEL :3
+#13470.ANCHOR.1 :file-682753003.html
+#13480.BREAK_LEVEL :3
+#13490.ANCHOR.2 :file308746835.html
+#13500.BREAK_LEVEL :3
+#13510.ANCHOR.23 :file2094230191.html
+#13520.BREAK_LEVEL :3
+#13530.BREAK_LEVEL :2
+#13540.ANCHOR.1 :file-880415594.html
+#13550.BREAK_LEVEL :2
+13560.ANCHOR.21 :file2050570603.html
+13570.BREAK_LEVEL :2
+13580.BREAK_LEVEL :1
+13590.ANCHOR.15 :file-45486744.html
+13600.ANCHOR.0 :file817025379.html
+13610.ANCHOR.0 :file-636918499.html
+13640.BREAK_LEVEL :3
+13670.BREAK_LEVEL :2
+13680.ANCHOR.1 :file40415587.html
+13690.ANCHOR.0 :file1729199612.html
+13700.BREAK_LEVEL :3
+13730.BREAK_LEVEL :2
+13740.ANCHOR.21 :file-1294130853.html
+13750.BREAK_LEVEL :2
+13760.BREAK_LEVEL :1
+13770.ANCHOR.16 :file-1799500101.html
+13780.ANCHOR.0 :file1103413840.html
+13790.ANCHOR.1 :file-841225711.html
+13800.ANCHOR.19 :file-864853295.html
+13810.BREAK_LEVEL :4
+13820.BREAK_LEVEL :3
+13830.ANCHOR.2 :file139960172.html
+13840.ANCHOR.0 :file139960172.html
+13850.BREAK_LEVEL :4
+13860.ANCHOR.20 :file1986667012.html
+13870.BREAK_LEVEL :4
+13880.BREAK_LEVEL :3
+13890.ANCHOR.7 :file-1564340197.html
+13900.ANCHOR.20 :file109245717.html
+13910.BREAK_LEVEL :4
+13920.BREAK_LEVEL :3
+13930.ANCHOR.29 :file-518179836.html
+13940.BREAK_LEVEL :3
+13950.BREAK_LEVEL :2
+13960.ANCHOR.1 :file-78492872.html
+13970.ANCHOR.4 :file-1690119625.html
+13980.ANCHOR.19 :file2118613365.html
+13990.BREAK_LEVEL :4
+14000.BREAK_LEVEL :3
+14010.ANCHOR.6 :file-105199380.html
+14020.ANCHOR.20 :file-749838854.html
+14030.BREAK_LEVEL :4
+14040.BREAK_LEVEL :3
+14050.ANCHOR.7 :file-53629694.html
+14060.ANCHOR.19 :file-1791256987.html
+14070.BREAK_LEVEL :4
+14080.BREAK_LEVEL :3
+14090.ANCHOR.8 :file-1485937169.html
+14100.ANCHOR.19 :file37110493.html
+14110.BREAK_LEVEL :4
+14120.BREAK_LEVEL :3
+14130.ANCHOR.28 :file-1063261360.html
+14140.BREAK_LEVEL :3
+14150.BREAK_LEVEL :2
+14160.ANCHOR.21 :file398031919.html
+14170.BREAK_LEVEL :2
+14180.BREAK_LEVEL :1
+14190.ANCHOR.17 :file1800632186.html
+14200.ANCHOR.18 :file1626216406.html
+14210.ANCHOR.0 :file2007641924.html
+14220.ANCHOR.19 :file-1750656503.html
+14230.BREAK_LEVEL :3
+14240.BREAK_LEVEL :2
+14250.ANCHOR.1 :file519640226.html
+14260.ANCHOR.19 :file2077949148.html
+14270.BREAK_LEVEL :3
+14280.BREAK_LEVEL :2
+14290.ANCHOR.2 :file-1777970831.html
+14300.ANCHOR.19 :file2005739327.html
+14310.BREAK_LEVEL :3
+14320.BREAK_LEVEL :2
+14330.ANCHOR.3 :file-1025166809.html
+14340.ANCHOR.19 :file927979690.html
+14350.BREAK_LEVEL :3
+14360.BREAK_LEVEL :2
+14370.ANCHOR.23 :file-1488116065.html
+14380.BREAK_LEVEL :2
+14390.BREAK_LEVEL :1
+14400.ANCHOR.19 :file-107565987.html
+14410.ANCHOR.0 :file-1085145764.html
+14420.ANCHOR.0 :file-1205741220.html
+14430.ANCHOR.29 :file1942957980.html
+14440.BREAK_LEVEL :4
+14450.BREAK_LEVEL :3
+14460.ANCHOR.21 :file-417599426.html
+14470.BREAK_LEVEL :3
+14480.BREAK_LEVEL :2
+#14490.ANCHOR.1 :file-510185881.html
+#14500.ANCHOR.21 :file-648198311.html
+#14510.BREAK_LEVEL :3
+#14520.BREAK_LEVEL :2
+14530.ANCHOR.2 :file-1715309507.html
+14540.ANCHOR.0 :file-1586363553.html
+14550.BREAK_LEVEL :3
+14560.ANCHOR.21 :file-158449204.html
+14570.BREAK_LEVEL :3
+14580.BREAK_LEVEL :2
+14590.ANCHOR.3 :file-1712082961.html
+14600.ANCHOR.19 :file-983365538.html
+14610.BREAK_LEVEL :3
+14620.BREAK_LEVEL :2
+14630.ANCHOR.4 :file1857230745.html
+14640.ANCHOR.19 :file-468248998.html
+14650.BREAK_LEVEL :3
+14660.BREAK_LEVEL :2
+14670.ANCHOR.5 :file-1743881356.html
+14680.ANCHOR.19 :file-1796070150.html
+14690.BREAK_LEVEL :3
+14700.BREAK_LEVEL :2
+14710.ANCHOR.6 :file1148427118.html
+14720.ANCHOR.19 :file-465925079.html
+14730.BREAK_LEVEL :3
+14740.BREAK_LEVEL :2
+14750.ANCHOR.7 :file-1111513550.html
+14760.ANCHOR.19 :file-748338809.html
+14770.BREAK_LEVEL :3
+14780.BREAK_LEVEL :2
+14790.ANCHOR.8 :file1686807590.html
+14800.ANCHOR.0 :file344483367.html
+14810.BREAK_LEVEL :3
+14820.ANCHOR.21 :file-1086687319.html
+14830.BREAK_LEVEL :3
+14840.BREAK_LEVEL :2
+14850.ANCHOR.9 :file-1992227799.html
+14860.BREAK_LEVEL :2
+14870.ANCHOR.29 :file-1488959783.html
+14880.BREAK_LEVEL :2
+14890.BREAK_LEVEL :1
+14900.ANCHOR.20 :file-972726305.html
+14910.ANCHOR.21 :file-216112305.html
+14920.BREAK_LEVEL :2
+14930.BREAK_LEVEL :1
+14940.ANCHOR.30 :file1369020561.html
+14950.BREAK_LEVEL :1
+14960.ANCHOR.40 :file-1806771731.html
+14970.BREAK_LEVEL :1
+14980.BREAK_LEVEL :0

Propchange: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/scenario.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/update_content.html
URL: http://svn.apache.org/viewvc/harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/update_content.html?view=auto&rev=543102
==============================================================================
--- harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/update_content.html (added)
+++ harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/update_content.html Thu May 31 02:55:56 2007
@@ -0,0 +1,7 @@
+
+
+
+
+Result: 01 @ 1234567890123 
+<br/>
+test
\ No newline at end of file

Propchange: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/resources/showcase/update_content.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/src/org/apache/harmony/struts/test/WebAppTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/buildtest/branches/2.0/tests/struts_test/src/org/apache/harmony/struts/test/WebAppTest.java?view=auto&rev=543102
==============================================================================
--- harmony/enhanced/buildtest/branches/2.0/tests/struts_test/src/org/apache/harmony/struts/test/WebAppTest.java (added)
+++ harmony/enhanced/buildtest/branches/2.0/tests/struts_test/src/org/apache/harmony/struts/test/WebAppTest.java Thu May 31 02:55:56 2007
@@ -0,0 +1,748 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.harmony.struts.test;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+
+import junit.framework.Assert;
+import junit.framework.JUnit4TestAdapter;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.JUnitCore;
+import org.xml.sax.SAXException;
+
+import com.gargoylesoftware.htmlunit.BrowserVersion;
+import com.gargoylesoftware.htmlunit.Page;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.ClickableElement;
+import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+/**
+ * WebAppTest class represents generic test driver for web applications testing.
+ * 
+ * It depends on
+ * 
+ *   - htmlUnit v. 1.11 framework (http://sourceforge.net/projects/htmlunit/);
+ *   - jUnit v. 4.1 framework (http://sourceforge.net/projects/junit/).
+ *   
+ * There are two main working modes:
+ * 
+ *   - 'spider' (write) mode for 'golden' data/test scenario generation;
+ *   - 'test' (read) mode for test scenario playback. Text data returned from
+ *     server during scenario execution compared against pregenerated 'golden'
+ *     data.
+ * 
+ * The following files are produced/used by the WebAppTest:
+ *   
+ *   - 'scenario.properties' - Main test scenario generated during 'spider' mode
+ *      run and played during 'test' run. May be updated manually after
+ *      generation.
+ *      Sample (beginning fragment, note - form submission added manually here):
+ *       10000.URL./struts2-showcase-2.0.6/showcase.jsp :file520468537.html
+ *       10010.ANCHOR.3 :file1722219095.html
+ *       10020.ANCHOR.0 :file-1080589601.html
+ *       10030.ANCHOR.20 :file857505531.html
+ *       10040.ANCHOR.19 :file1376914575.html
+ *       10050.BREAK_LEVEL :4
+ *       10060.BREAK_LEVEL :3
+ *       10070.BREAK_LEVEL :2
+ *       10080.ANCHOR.1 :file-2140644304.html
+ *       10085.FORM.0.data.test.Update\ Content  :update_content.html
+ *       10086.BREAK_LEVEL :3
+ *       10090.ANCHOR.20 :file-263602398.html
+ *       ...
+ *   - 'gen.patterns.properties' - regex patterns to be applied to the 'golden'
+ *      content (text server responses) before writing it to the 'golden' file.
+ *      Must be presented if running in 'spider' mode. May contain no patterns.
+ *      Use pattern description line syntax as follows:
+ *        nnnn.<regex>
+ *      in this case relacement string is "". OR
+ *        nnnn.<regex> :<replacement-string>
+ *      The patterns will be applied in their 'nnnn' ascending order.
+ *      Sample:
+ *       0010.;jsessionid\=\\w{32}
+ *       ...
+ *   - 'compare.patterns.properties' - regex patterns to be applied to the
+ *      'golden' content and server responses before actual comparison.
+ *      Must be presented if running in 'test' mode. May contain no patterns if
+ *      there is no test execution context related info in golden files and
+ *      server responses (such as timestamps, references to files with concrete
+ *      paths etc). Use the same pattern description line syntax as
+ *      cpecified for 'gen.patterns.properties' above.
+ *      Sample:
+ *       0010.;jsessionid\=\\w{32}
+ *       0020.[0-9]{2,4}[/\.-][0-9]{2}[/\.-][0-9]{2,4}
+ *       0030.[0-9]{1,2}\:[0-9]{2}[\:[0-9]{2}]*
+ *       0040.[0-9]*\ @\ [0-9]*
+ *       0050.<td>.*@\\w{5,}.*</td>
+ *       0060."struts\.token"\ value\="\\w{30,}" :"struts\.token"\ value\=""
+ *       0080.file%3A.*%2Fjakarta-tomcat-5\.0\.30 :file%3A%2Fjakarta-tomcat-5\.0\.30
+ *       0090.nifty\.js\\?config\=.*" :"
+ *       0100.<td>.*\ ago</td> :<td></td>
+ *       0110.[A-Z][a-z]{2},*\ [0-9]{1,2},*\ [0-9]{4}
+ *       0120.[AP]M</td> :</td>
+ *       0130.[A-Z][a-z]{2}\ [A-Z][a-z]{2}\ [0-9]{2}
+ *       0140.[A-Z]{4,5}\ [0-9]{4}
+ *       ...
+ *   - 'fileXXXXXXXX.yyyy' - 'golden' file containing test data as it was
+ *      returned from server and processed by all replacement patterns from
+ *      'gen.patterns.properties' file during 'spider' mode run.
+ *      
+ *   NOTE: ALL THE ABOVE FILES MUST BE IN THE DIR SPECIFIED BY
+ *   '<app.name>.resource.path' SYSTEM PROPERTY DESCRIBED BELOW.
+ *      
+ * The following system properties are used to control WebAppTest execution:
+ *   
+ *   - 'webapptest.app.name' - mandatory. Name of your concrete test. We will
+ *      refer it's value as '<app.name>' below;
+ *   - 'webapptest.debug' - optional, default is false. Wether to print info
+ *      about visited anchors to stdout in both modes or not;
+ *   - 'webapptest.spider.mode' - optional, false by default. Wether to run
+ *      in 'write' mode or not;
+ *   - 'webapptest.spider.nestinglevel' - optional for both modes,
+ *      default is '10'. Maximum nesting level for visiting anchors starting
+ *      from web application home. MUST be the same for 'spider' and 'test'
+ *      modes for tested web application;
+ *   - '<app.name>.resource.path' - optional, default is relative to the test
+ *      working dir path 'resources/<app.name>';
+ *   - '<app.name>.app.host' - optional, default is 'localhost' (<app.host> below)
+ *   - '<app.name>.app.port' - optional, default is '8080' (<app.port> below)
+ *   - 'webapptest.spider.startfile' - mandatory for 'spider' mode. App home
+ *      URL's tail (<spider.startfile> below) for 'spider' mode. The URL is
+ *      constructed as:
+ *          http://<app.host>:<app.port><spider.startfile>
+ *   - 'http.proxy.host' - optional, specify if connection to the app. host is
+ *      through proxy;
+ *   - 'http.proxy.port' - optional, default is '-1'.
+ */
+public class WebAppTest {
+    
+    private static final String SPLIT_PATTERN = "\\r\\n";
+    
+    private static final String ACTION_URL = "URL";
+    private static final String ACTION_ANCHOR = "ANCHOR";
+    private static final String ACTION_FORM = "FORM";
+    private static final String ACTION_ELEMENT = "ELEMENT";
+    private static final String ACTION_BREAK_LEVEL = ".BREAK_LEVEL";
+    
+    private static final String APP_PROPERTIES_FNAME = "scenario.properties";
+    private static final String APP_PATTERNS_FNAME_SUFFIX = "patterns.properties";
+    
+    private static final int URL_FLAG = -1;
+    
+    private WebClient wc;
+    private int stepCounter = 10000;
+    private boolean spiderMode =
+        (System.getProperty("webapptest.spider.mode") != null);
+    private boolean noCheckMode =
+        (System.getProperty("webapptest.nocheck") != null);
+    private String spiderStartFile =
+        System.getProperty("webapptest.spider.startfile");
+    private final int SPIDER_NESTING_LEVEL =
+        Integer.parseInt(
+                System.getProperty("webapptest.spider.nestinglevel", "10"));
+    private final String appName =
+        System.getProperty("webapptest.app.name");
+    private final boolean debug =
+        (System.getProperty("webapptest.debug") != null);
+    private String APP_RESOURCE_PATH;
+    
+    private HashSet<String> visited = new HashSet<String>();
+
+    private Map appPropertiesMap = new TreeMap();
+    private Map appPatternsMap = new TreeMap();
+    private URL baseUrl;
+        
+    // for pre 4.x test runners
+    public static junit.framework.Test suite() { 
+        return new JUnit4TestAdapter(WebAppTest.class); 
+    }
+    
+    public static void main(String[] args) {
+        JUnitCore.runClasses(WebAppTest.class); 
+    }
+    
+    @Before
+    public void setUp() throws FileNotFoundException, IOException {
+        initApp();
+        initWebClient(BrowserVersion.MOZILLA_1_0);
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void initApp() throws FileNotFoundException, IOException {
+        if (this.appName == null) {
+            throw new RuntimeException(
+            "\"webapptest.app.name\" system property must be set");
+        }
+        String patternsFileNamePrefix = "compare.";
+        if (this.spiderMode) {
+            if(this.spiderStartFile == null) {
+                throw new RuntimeException(
+                "\"webapptest.spider.startfile\" system property must be set");
+            }
+            patternsFileNamePrefix = "gen.";
+        }
+        if (this.spiderMode && this.noCheckMode) {
+            throw new RuntimeException(
+            "\"webapptest.spider.mode\" OR \"webapptest.nocheck\" can be set");
+        }
+        this.APP_RESOURCE_PATH = System.getProperty(
+                this.appName + ".resource.path", "resources" +
+                File.separator + this.appName);
+        String appHost =
+            System.getProperty(this.appName + ".app.host", "localhost");
+        int appPort = Integer.parseInt(
+                System.getProperty(this.appName + ".app.port", "8080"));
+        this.baseUrl = new URL("http", appHost, appPort, "");
+        FileInputStream props = null;
+        try{
+            props = new FileInputStream(new File(
+                    this.APP_RESOURCE_PATH,
+                    patternsFileNamePrefix + APP_PATTERNS_FNAME_SUFFIX));
+            Properties appPatterns = new Properties();
+            appPatterns.load(props);
+            this.appPatternsMap.putAll(appPatterns);
+        } finally {
+            if (props != null) {
+                props.close();
+            }
+        }
+    }
+    
+    private void initWebClient(BrowserVersion bw) {
+        String proxyHost = System.getProperty("http.proxy.host");
+        int proxyPort = -1;
+        if (proxyHost != null) {
+            proxyPort = Integer.parseInt(
+                    System.getProperty("http.proxy.port", "-1"));
+            wc = new WebClient(
+                    bw, proxyHost, proxyPort);
+        } else {
+            wc = new WebClient(bw);
+        }
+        wc.setThrowExceptionOnScriptError(false);
+        wc.setThrowExceptionOnFailingStatusCode(false);
+        wc.setRedirectEnabled(true);
+    }
+    
+    @Test
+    public void test() throws SAXException, MalformedURLException, IOException {
+        PrintStream errStream = null;
+        try {
+            // redirect stderr
+            errStream = new PrintStream(new File(
+                    this.APP_RESOURCE_PATH, this.appName + ".err"));
+            System.setErr(errStream);
+            if (this.spiderMode) {
+                launchSpiderW(SPIDER_NESTING_LEVEL);
+            } else {
+                launchSpiderR(SPIDER_NESTING_LEVEL);
+            }
+            if (debug) {
+                DBG(SPIDER_NESTING_LEVEL, "+---", "Stop");
+            }            
+        } finally {
+            if (errStream != null) {
+                errStream.close();
+            }
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void launchSpiderW(int nestingLevel)
+    throws RuntimeException, MalformedURLException, IOException, SAXException {
+        DataOutputStream props = null;
+        try {
+            props = new DataOutputStream(new FileOutputStream(new File(
+                    this.APP_RESOURCE_PATH, APP_PROPERTIES_FNAME)));
+            if (debug) {
+                DBG(nestingLevel, "----", "URL: " + this.spiderStartFile);
+            }
+            HtmlPage p = (HtmlPage)this.wc.getPage(
+                    new URL(this.baseUrl, this.spiderStartFile));
+            String pHtml = p.getWebResponse().getContentAsString();
+            pHtml = preprocessUsingPatterns(pHtml);
+            writeData(nestingLevel, props, URL_FLAG, this.spiderStartFile,
+                    pHtml, ".html");
+            visitAnchors(nestingLevel, new HashSet<String>(), p, props);
+        } finally {
+            if (props != null) {
+                props.close();
+            }
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void launchSpiderR(int nestingLevel)
+    throws RuntimeException, MalformedURLException, IOException, SAXException {
+        FileInputStream props = null;
+        try{
+            props = new FileInputStream(new File(
+                    this.APP_RESOURCE_PATH, APP_PROPERTIES_FNAME));
+            Properties appProperties = new Properties();
+            appProperties.load(props);
+            this.appPropertiesMap.putAll(appProperties);
+            props.close();
+            props = null;
+            
+            Iterator e = this.appPropertiesMap.keySet().iterator();            
+            this.spiderStartFile  = (String)e.next();
+            String goldenFileName =
+                (String) this.appPropertiesMap.get(this.spiderStartFile);
+            if (debug) {
+                DBG(nestingLevel, "----", "URL " + this.spiderStartFile +
+                        ": testing  with " + goldenFileName);
+            }            
+            HtmlPage p = (HtmlPage)performTest(nestingLevel, null,
+                    this.spiderStartFile,
+                    goldenFileName);
+            
+            visitAnchors(p, nestingLevel, e);
+        } finally {
+            if (props != null) {
+                props.close();
+            }
+        }
+    }
+    
+    // spider 'write' mode
+    @SuppressWarnings("unchecked")
+    private void visitAnchors(int nestingLevel,
+            HashSet<String> toBeVisitedLater,
+            HtmlPage page, 
+            DataOutputStream props) throws IOException {
+
+        String pPrefix = page.getTitleText() + ":";
+        List<HtmlAnchor> l = page.getAnchors();
+        int index = 0;
+        for (ListIterator i = l.listIterator(); i.hasNext(); index++) {
+            HtmlAnchor a = (HtmlAnchor)i.next();
+            String pFile = preprocessUsingPatterns(a.getHrefAttribute());
+            // skip some references
+            if (skipHref(pFile)) {
+                continue;
+            }
+            // skip refs that will be visited from caller page
+            if (skipHref(toBeVisitedLater, pFile)) {
+                continue;
+            }
+            // skip refs that have been already visited
+            if (skipHref(visited, pPrefix+pFile)) {
+                continue;
+            }
+            if (debug) {
+                DBG(nestingLevel, "+---", "Visiting: " + pPrefix+pFile);
+            }
+            // Click on anchor
+            Page p = a.click();
+            String contentType = p.getWebResponse().getContentType();
+            String pHtml = p.getWebResponse().getContentAsString();
+            boolean writeGoldenData = false;
+            if (contentType.startsWith("text") || "".equals(contentType)) {
+                pHtml = preprocessUsingPatterns(pHtml);
+                writeGoldenData = true;
+            }
+            // write data (and scenario) only for text content
+            if (writeGoldenData) {
+                writeData(nestingLevel, props, index, pFile, pHtml, 
+                   ("".equals(contentType) ? ".html" :
+                   ("." + contentType.substring(contentType.indexOf("/")+1))));
+            }
+            // wisit anchors on HtmlPage
+            if (p instanceof HtmlPage) {                
+                HashSet<String> toBeVisitedNew = toBeVisited(page);
+                toBeVisitedNew.addAll(toBeVisitedLater);
+                if (nestingLevel-1 > 0) {
+                    // Visit anchors on retrieved HTML page
+                    visitAnchors(nestingLevel-1, toBeVisitedNew,
+                            (HtmlPage)p, props);
+                }
+            } else {
+                if (debug) {
+                    DBG(nestingLevel,
+                            "|   ", "*************" + p.getClass().getName());
+                }
+            }
+            this.visited.add(pPrefix+pFile);
+        }
+        String propsString =
+            this.stepCounter + ACTION_BREAK_LEVEL + " :" +
+            (SPIDER_NESTING_LEVEL-nestingLevel);
+        this.stepCounter += 10;
+        props.writeBytes(propsString + "\n");
+        if (debug) {
+            DBG(nestingLevel, "|   ", propsString);
+        }
+    }
+    
+    // test 'read' mode
+    private void visitAnchors(HtmlPage page, int nestingLevel,
+            Iterator e) throws SAXException, IOException {
+        for (; e.hasNext();) {
+            String anchorKey  = (String)e.next();
+            if (anchorKey.indexOf(ACTION_BREAK_LEVEL) != -1) {
+                if (debug) {
+                    DBG(nestingLevel, "+---", "Leaving page " +
+                            page.getTitleText());
+                }
+                break;
+            }
+            String goldenFileName =
+                (String) this.appPropertiesMap.get(anchorKey);
+            if (debug) {
+                DBG(nestingLevel, "+---", "Page " + page.getTitleText() +
+                        ": testing " + anchorKey + " with " + goldenFileName);
+            }
+            Page p = performTest(nestingLevel, page, anchorKey, goldenFileName);
+            if (nestingLevel-1 > 0) {
+                if (p instanceof HtmlPage) {
+                    // Visit anchors on current HTML page
+                    visitAnchors((HtmlPage)p, nestingLevel-1, e);
+                } else {
+                    if (debug) {
+                        DBG(nestingLevel, "|   ", "*************" +
+                                p.getClass().getName());
+                    }
+                }
+            }
+        }
+    }
+    
+    private void writeData(int nestingLevel, DataOutputStream props,
+            int anchorIndex, String fileOnHost, String html, String ext)
+    throws IOException {
+        DataOutputStream goldenStream = null;
+        try {
+            String goldenFileName = "file" + html.hashCode() + ext;
+            File goldenFile = 
+                new File(this.APP_RESOURCE_PATH, goldenFileName);
+            if (!goldenFile.exists()) {
+                goldenStream =
+                    new DataOutputStream(new FileOutputStream(goldenFile));
+                goldenStream.writeBytes(html);
+            }
+
+            String propsString = String.valueOf(this.stepCounter);
+            if (anchorIndex == URL_FLAG) {
+                propsString += (".URL." + fileOnHost);
+            } else {
+                propsString += (".ANCHOR." + anchorIndex);
+            }
+            propsString += (" :" + goldenFileName);
+            props.writeBytes(propsString + "\n");
+
+            this.visited.add(fileOnHost);
+            
+            this.stepCounter += 10;
+            if (debug) {
+                DBG(nestingLevel, "|   ", propsString);
+            }
+        } finally {
+            if (goldenStream != null) {
+                goldenStream.close();
+            }
+        }
+    }
+    
+    private String preprocessUsingPatterns(String html) {
+        Set keys = this.appPatternsMap.keySet();
+        for (Iterator e = keys.iterator(); e.hasNext();) {
+            String pattern = (String)e.next();
+            String replacement = (String) this.appPatternsMap.get(pattern);
+            pattern = pattern.substring(pattern.indexOf(".") + 1);
+            html = html.replaceAll(pattern, replacement);
+        }
+        return html;
+    }
+    
+    private Page performTest(int nestingLevel, Page currentResponse,
+            String remoteFileKey,
+            String localFileName) throws SAXException, IOException {
+        String[] action = remoteFileKey.split("\\.", 3);
+        // parse key, issue request and get response from server
+        Page result =
+            parseActionAndGetResponse(nestingLevel, currentResponse, action);
+        if (!this.noCheckMode) {
+            Assert.assertNotNull("could not perform action: '" +
+                    remoteFileKey + "'", result);
+            // compare current response against golden file
+            String pHtml = result.getWebResponse().getContentAsString();
+                pHtml = preprocessUsingPatterns(pHtml);
+            checkResponse(pHtml, localFileName, false);
+        }
+        return result;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Page parseActionAndGetResponse(int nestingLevel,
+            Page currentResponse, String[] action)
+    throws SAXException, IOException {
+        if (ACTION_URL.equals(action[1])) {
+            return this.wc.getPage(new URL(this.baseUrl, action[2]));
+        }
+        Assert.assertNotNull("wrong action for seq # " + action[0],
+                currentResponse);
+        Assert.assertTrue("wrong response type: " +
+                currentResponse.getClass().getName(),
+                currentResponse instanceof HtmlPage);
+        int index = -1;
+        if (ACTION_ANCHOR.equals(action[1])) {
+            // find anchor by it's index
+            // and click it
+            String[] linkDesc = action[2].split("\\.", 2);
+            List<HtmlAnchor> l = ((HtmlPage)currentResponse).getAnchors();
+            index = Integer.parseInt(linkDesc[0]);
+            Assert.assertTrue("no anchor with index: '" + index + "'",
+                    index < l.size());
+            return l.get(index).click();
+        }
+        else if (ACTION_FORM.equals(action[1])) {
+            // find form by it's index,
+            // set specified form parameters
+            // and click dubmit specified
+            String[] formDesc = action[2].split("\\.");
+            index = Integer.parseInt(formDesc[0]);
+            List<HtmlForm> f = ((HtmlPage)currentResponse).getForms();
+            Assert.assertTrue("no form with index: '" + index + "'",
+                    index < f.size());
+            HtmlForm myForm = (HtmlForm)f.get(index);
+            for (int i=1; i<formDesc.length-2; i+=2) {
+                if (debug) {
+                    DBG(nestingLevel, "+---", formDesc[i] +
+                            "->" + formDesc[i+1]);
+                }
+                myForm.getInputByName(
+                        formDesc[i]).setValueAttribute(formDesc[i+1]);
+            }
+            return (HtmlPage)myForm.submit(myForm.getInputByValue(
+                    formDesc[formDesc.length-1]));
+        }
+        else if (ACTION_ELEMENT.equals(action[1])) {
+            String[] elemDesc = action[2].split("\\.");
+            index = Integer.parseInt(elemDesc[1]);
+            List<HtmlElement> e =
+                ((HtmlPage)currentResponse).getDocumentElement().
+                getHtmlElementsByTagName(elemDesc[0]);
+            if (debug) {
+                for (ListIterator i = e.listIterator(); i.hasNext();) {
+                    DBG(nestingLevel, "+---", "E: " + (HtmlElement)i.next());
+                }
+            }
+            Assert.assertTrue("no HTML element with index: '" + index +
+                    "' and tag: '" + elemDesc[0] + "'", index < e.size());
+            HtmlElement he = (HtmlElement)e.get(index);
+//          if (elemDesc.length == 3) {
+//          System.out.println("EH: " + elemDesc[2]);
+//          // execute specified event handler
+//          System.out.println("SO: " + he.getScriptObject().getClass().getName());
+//          HTMLInputElement s = (HTMLInputElement)he.getScriptObject();
+//          s.jsxFunction_click();
+//          ;
+//          Function func = he.getEventHandler(elemDesc[2]);
+//          // DEBUG
+//          System.out.println("F: " + func);
+//          return (HtmlPage)((ScriptResult)wc.getScriptEngine().callFunction(currentResponse,
+//          func, this, new Object[]{"test"}, he)).getNewPage();
+//          return null;
+//          } else {
+            Assert.assertTrue("HTML element '" + he +
+                    "' is not clickable", he instanceof ClickableElement);
+//          if (he instanceof HtmlInput) {
+//          if (elemDesc.length == 3) {
+//          HTMLInputElement s = (HTMLInputElement)he.getScriptObject();
+//          s.
+//          return (HtmlPage)((HtmlInput)he).setValueAttribute(elemDesc[2]);
+//          }
+//          }
+            return (HtmlPage)((ClickableElement)he).click();
+        }
+        return null;
+    }
+    
+    private void checkResponse(String resp,
+            String goldenFileName, boolean binary) throws IOException {
+        DataInputStream localStream = null;
+        try {
+            boolean failed = false;
+            File localFile = new File(this.APP_RESOURCE_PATH, goldenFileName);
+            byte[] fileBuf = new byte[(int)localFile.length()];
+            localStream = new DataInputStream(new FileInputStream(localFile));
+            localStream.readFully(fileBuf);
+            String expected = new String(fileBuf);
+            expected = preprocessUsingPatterns(expected);
+            // compare as byte arrays
+            if (Arrays.equals(resp.getBytes(), expected.getBytes())) {
+                return;
+            }
+            // Compare line by line
+            String[] localLines = expected.split(SPLIT_PATTERN);
+            String[] remoteLines = resp.split(SPLIT_PATTERN);
+            String failureMessage = "";
+            if (localLines.length != remoteLines.length) {
+                failed = true;
+                failureMessage =
+                    "Lines number mismatch: local=" + localLines.length +
+                    ", remote=" + remoteLines.length;
+            } else {
+                // will use the following sets in case
+                // we have the same set of lines but in
+                // different order
+                Set<String> remoteLinesSet = new HashSet<String>();
+                Set<String> localLinesSet = new HashSet<String>();
+                for (int i=0, lineNumber = 1; i<localLines.length; i++, lineNumber++) {
+                    if (!remoteLines[i].equals(localLines[i])) {
+                        // check if we have lines containing hrefs with different
+                        // order of the same parameters in the query string
+                        if (!hrefsCompare(remoteLines[i], localLines[i])) {
+                            // add only different lines for future comparison
+                            remoteLinesSet.add(remoteLines[i]);
+                            localLinesSet.add(localLines[i]);
+                            // prepare failure message anyway
+                            failed = true;
+                            String currentFailureMessage =
+                                goldenFileName + ": Lines " + lineNumber +
+                                " don't match:\n" + "Remote: \"" + remoteLines[i] +
+                                "\"\n Local: \"" + localLines[i] + "\"\n";
+                            System.out.print(currentFailureMessage);
+                            failureMessage =
+                                failureMessage.concat(currentFailureMessage);
+                        }
+                    }
+                }
+                // last chance
+                if (failed && remoteLinesSet.equals(localLinesSet)) {
+                    // ok - we have the same generated HTML
+                    // but with different lines order
+                    System.out.println("OK - the same lines set but in different order");
+                    failed = false;
+                }
+            }
+            // check that there was no lines mismatches
+            Assert.assertFalse(failureMessage, failed);
+        } finally {
+            if (localStream != null) {
+                localStream.close();
+            }
+        }
+    }
+    
+    /**
+     * Compares lines containing href values allowing different order
+     * of the same parameters in href's query string
+     *
+     * @param remote - line of HTML response from remote host
+     *  presumably containing hrefs
+     * @param local  - "golden" line probably containing hrefs
+     * @return true if lines equal
+     */
+    private boolean hrefsCompare(String remote, String local) {
+        if (remote.length() != local.length()) {
+            return false;
+        }
+        String r = remote.replaceAll("href=\".*\"", "href=\"\"");
+        String l = local.replaceAll("href=\".*\"", "href=\"\"");
+        if (!r.equals(l)) {
+            return false;
+        }
+        remote = remote.replaceAll("&amp;", "&");
+        local = local.replaceAll("&amp;", "&");
+        int startIndex = 0, index = -1;
+        while ((index=remote.indexOf("href=", startIndex)) != -1) {
+            startIndex = remote.indexOf("\"", index+6);
+            String rHref = remote.substring(index+6, startIndex);
+            String[] rHrefParts = rHref.split("\\?", 2);
+            String[] rQueryParts = rHrefParts[1].split("&");
+            String lHref = local.substring(index+6, startIndex);
+            if (lHref.indexOf(rHrefParts[0]) == -1 ) {
+                return false;
+            }
+            for (int i=0; i<rQueryParts.length; i++) {
+                if (lHref.indexOf(rQueryParts[i]) == -1) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    @SuppressWarnings("unchecked")
+    private HashSet<String> toBeVisited(HtmlPage page) {
+        HashSet<String> ret = new HashSet<String>();
+        List<HtmlAnchor> l = page.getAnchors();
+        for (ListIterator i = l.listIterator(); i.hasNext();) {
+            HtmlAnchor a = (HtmlAnchor)i.next();
+            String pFile = preprocessUsingPatterns(a.getHrefAttribute());
+            // skip external references
+            if (skipHref(pFile)) {
+                continue;
+            }
+            ret.add(pFile);
+        }
+        return ret;
+    }
+
+    private boolean skipHref(String href) {
+        if (href.startsWith(this.spiderStartFile) ||
+            href.startsWith("http://") ||
+            href.startsWith(".."))
+        {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean skipHref(HashSet<String> skipSet, String href) {
+        Iterator<String> i = skipSet.iterator();
+        for (;i.hasNext();) {
+            String hr = (String) i.next();
+            if (href.startsWith(hr)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void DBG(int tn, String prefix, String msg) {
+        tn = this.SPIDER_NESTING_LEVEL-tn;
+        while(tn-->0) {
+            System.out.print("|   ");
+        }
+        System.out.println(prefix + msg);
+    }
+}

Propchange: harmony/enhanced/buildtest/branches/2.0/tests/struts_test/src/org/apache/harmony/struts/test/WebAppTest.java
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message