You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by cd...@apache.org on 2009/03/12 00:02:27 UTC

svn commit: r752682 - in /hadoop/core/trunk: ./ src/contrib/hdfsproxy/ src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/ src/contrib/hdfsproxy/src/test/resources/tomcat-config/

Author: cdouglas
Date: Wed Mar 11 23:02:26 2009
New Revision: 752682

URL: http://svn.apache.org/viewvc?rev=752682&view=rev
Log:
HADOOP-5386. Modify hdfsproxy unit test to start on a random port,
implement clover instrumentation. Contributed by Zhiyong Zhang

Added:
    hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/FindFreePort.java
Modified:
    hadoop/core/trunk/CHANGES.txt
    hadoop/core/trunk/src/contrib/hdfsproxy/build.xml
    hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/TestProxyUtil.java
    hadoop/core/trunk/src/contrib/hdfsproxy/src/test/resources/tomcat-config/server.xml

Modified: hadoop/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/CHANGES.txt?rev=752682&r1=752681&r2=752682&view=diff
==============================================================================
--- hadoop/core/trunk/CHANGES.txt (original)
+++ hadoop/core/trunk/CHANGES.txt Wed Mar 11 23:02:26 2009
@@ -291,6 +291,9 @@
 
     HADOOP-5458. Remove leftover Chukwa entries from build, etc. (cdouglas)
 
+    HADOOP-5386. Modify hdfsproxy unit test to start on a random port,
+    implement clover instrumentation. (Zhiyong Zhang via cdouglas)
+
 Release 0.20.0 - Unreleased
 
   INCOMPATIBLE CHANGES

Modified: hadoop/core/trunk/src/contrib/hdfsproxy/build.xml
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/contrib/hdfsproxy/build.xml?rev=752682&r1=752681&r2=752682&view=diff
==============================================================================
--- hadoop/core/trunk/src/contrib/hdfsproxy/build.xml (original)
+++ hadoop/core/trunk/src/contrib/hdfsproxy/build.xml Wed Mar 11 23:02:26 2009
@@ -42,25 +42,41 @@
 	<property name="reports.dir" value="${target.dir}/reports"/>
 	<property name="tomcatconfig.dir" value="${target.dir}/tomcat-config"/>
 	<property name="tomcat.container.id" value="tomcat5x"/>
-	<property name="cargo.servlet.port" value="8087"/>
 	<property name="cargo.logging" value="high"/>
 	<property name="cactus.formatter.type" value="xml"/>
 	<property name="cactus.warfile.name" value="test"/>
-	<property environment="env"/>
 	
+  
+	<available file="${hadoop.root}/build/classes" type="dir" property="test.available"/>
+	<property environment="env"/>
 	<!-- check if environment has been set -->
-  <condition property="source.conf.dir" value="${env.HADOOP_CONF_DIR}" else="${basedir}/conf">
-    <and>
-        <isset property="env.HADOOP_CONF_DIR"/>
-        <available file="${env.HADOOP_CONF_DIR}/core-site.xml"/>        
-    </and>
-  </condition>
   <condition property="proxy.conf.dir" value="${env.HDFSPROXY_CONF_DIR}" else="${basedir}/conf">
     <and>
         <isset property="env.HDFSPROXY_CONF_DIR"/>
         <available file="${env.HDFSPROXY_CONF_DIR}/hdfsproxy-default.xml"/>
     </and>
+  </condition> 
+  
+  <condition property="startCactus">
+  	<and>
+	    <or>
+	    	<equals arg1="${testcase}" arg2="TestProxyFilter" />
+				<equals arg1="${testcase}" arg2="TestProxyUtil" />
+				<not>
+					<isset property="testcase"/>
+				</not>
+	    </or>
+    	<isset property="test.available"/>
+    </and>
+  </condition>
+  
+  <condition property="useClover">
+  	<and>
+    	<isset property="clover.home"/>
+    	<available file="${clover.home}/lib/clover.jar"/>
+    </and>
   </condition>
+
 	<property name="ivy.settings.file" location="${hadoop.root}/ivy/ivysettings.xml"/>
   
   <target name="ivy-init" depends="ivy-init-antlib">
@@ -113,17 +129,17 @@
         <include name="xmlenc-${xmlenc.version}.jar"/>
         <include name="core-${core.vesion}.jar"/> 
 	    </lib>
-	    <classes dir="${source.conf.dir}" excludes="**/*.example **/*.sh"/>
-	    <classes dir="${proxy.conf.dir}" excludes="**/*.template **/*.sh"/>
+	    <classes dir="${proxy.conf.dir}" excludes="**/*.example **/*.template **/*.sh hadoop-site.xml"/>
 	    <classes dir="${build.classes}"/>
 	    <classes dir="${hadoop.root}/build/classes"/>
 			<classes dir="${test.build.dir}"/>
 	  </war>
 	</target>
+	<target name="cactifywar" depends="war,load-tasks,cactifywar-pure,cactifywar-clover" description="To include clover coverage test use -Dclover.home ..."/>
 	
-	
-	<target name="cactifywar" depends="war,load-tasks">
+	<target name="cactifywar-pure" depends="war,load-tasks" unless="useClover">
 		<mkdir dir="${target.dir}" />
+		<echo> no clover found ...</echo>
     <cactifywar srcfile="${build.dir}/${final.name}.war"
         destfile="${target.dir}/${cactus.warfile.name}.war"
         mergewebxml="${src.test.resources}/cactus-web.xml">
@@ -131,10 +147,77 @@
       <servletredirector name="ServletRedirectorSecure"
           mapping="/ServletRedirectorSecure" roles="test"/>
       <filterredirector mapping="/test/filterRedirector.jsp"/>
+      <classes dir="${proxy.conf.test}" excludes="**/*.template **/*.sh"/>
     </cactifywar>    	
 	</target>
 
-	<target name="test" depends="compile,compile-test,cactifywar" if="test.available">
+	<target name="cactifywar-clover" depends="war,load-tasks" if="useClover">
+		<mkdir dir="${target.dir}" />
+		<echo> Including clover.jar in the war file ...</echo>
+    <cactifywar srcfile="${build.dir}/${final.name}.war"
+        destfile="${target.dir}/${cactus.warfile.name}.war"
+        mergewebxml="${src.test.resources}/cactus-web.xml">
+      <servletredirector/>
+      <servletredirector name="ServletRedirectorSecure"
+          mapping="/ServletRedirectorSecure" roles="test"/>
+      <filterredirector mapping="/test/filterRedirector.jsp"/>
+      <classes dir="${proxy.conf.test}" excludes="**/*.template **/*.sh"/>
+      <lib dir="${clover.home}/lib">
+      	<include name="clover.jar"/> 
+      </lib>
+    </cactifywar>    	
+	</target>
+	
+	<target name="test" depends="compile,compile-test,test-junit,test-cactus" description="Automated Test Framework" if="test.available"/>
+	
+	<target name="test-junit" depends="compile,compile-test" if="test.available">
+		<junit fork="yes" printsummary="yes" errorProperty="tests.failed" failureProperty="tests.failed">
+        <classpath refid="test.classpath"/>
+        <sysproperty key="test.build.data" value="${build.test}/data"/>
+	      <sysproperty key="build.test" value="${build.test}"/>
+	      <sysproperty key="user.dir" value="${build.test}/data"/>
+	      <sysproperty key="fs.default.name" value="${fs.default.name}"/>
+	      <sysproperty key="hadoop.test.localoutputfile" value="${hadoop.test.localoutputfile}"/>
+	      <sysproperty key="hadoop.log.dir" value="${hadoop.log.dir}"/> 
+        <sysproperty key="test.src.dir" value="${test.src.dir}"/>
+        <sysproperty key="javax.net.ssl.trustStore" value="${ssl.keystore.proxy}"/>
+				<sysproperty key="javax.net.ssl.trustStorePassword" value="changeme"/>
+				<sysproperty key="javax.net.ssl.keyStore.proxy" value="${ssl.keystore.proxy}"/>
+				<sysproperty key="javax.net.ssl.keyStore" value="${ssl.keystore.client}"/>
+				<sysproperty key="javax.net.ssl.keyStorePassword" value="changeme"/>
+				<sysproperty key="javax.net.ssl.keyPassword" value="changeme"/>			
+				<sysproperty key="javax.net.ssl.clientCert" value="${ssl.client.cert}"/>
+        <formatter type="xml" />
+        <batchtest todir="${test.build.dir}" unless="testcase">
+           <fileset dir="${src.test}">
+             <include name="**/TestHdfsProxy.java"/>
+             <include name="**/TestProxyUgiManager.java"/>
+           </fileset>
+        </batchtest>
+        <batchtest todir="${test.build.dir}" if="testcase">
+            <fileset dir="${src.test}">
+            	<include name="**/${testcase}.java"/>
+            	<exclude name="**/TestProxyFilter.java"/>
+            	<exclude name="**/TestProxyUtil.java"/>
+            </fileset>
+         </batchtest>
+    </junit>    	
+    <fail if="tests.failed">Tests failed!</fail>
+	</target>
+
+
+	<target name="test-cactus" depends="compile,compile-test,cactifywar" if="startCactus">
+		<exec executable="${env.JAVA_HOME}/bin/java" outputproperty="cargo.servlet.admin.port">
+	    <arg line="-cp ${build.test} org.apache.hadoop.hdfsproxy.FindFreePort -random"/>
+		</exec>
+		<exec executable="${env.JAVA_HOME}/bin/java" outputproperty="cargo.servlet.http.port">
+	    <arg line="-cp ${build.test} org.apache.hadoop.hdfsproxy.FindFreePort ${cargo.servlet.admin.port}"/>
+		</exec>
+		<exec executable="${env.JAVA_HOME}/bin/java" outputproperty="cargo.servlet.https.port">
+	    <arg line="-cp ${build.test} org.apache.hadoop.hdfsproxy.FindFreePort ${cargo.servlet.http.port}"/>
+		</exec>
+		
+		<echo> Free Ports: startup-${cargo.servlet.admin.port} / http-${cargo.servlet.http.port} / https-${cargo.servlet.https.port}</echo>
 	  <echo>Please take a deep breath while Cargo gets the Tomcat for running the servlet tests...</echo>
 	  
 	  <mkdir dir="${tomcatconfig.dir}" />
@@ -143,75 +226,68 @@
 	  <mkdir dir="${tomcatconfig.dir}/temp" />
 	  <mkdir dir="${logs.dir}" />
 	  <mkdir dir="${reports.dir}" />	  
-	  <copy file="${tomcat.conf.test}/server.xml" tofile="${tomcatconfig.dir}/conf/server.xml"/>
+	  <copy file="${tomcat.conf.test}/server.xml" tofile="${tomcatconfig.dir}/conf/server.xml" overwrite="true">
+		  <filterset>
+		    <filter token="ADMIN.PORT" value="${cargo.servlet.admin.port}"/>
+		    <filter token="HTTP.PORT" value="${cargo.servlet.http.port}"/>
+		    <filter token="HTTPS.PORT" value="${cargo.servlet.https.port}"/>
+		  </filterset>
+		</copy>		
 		<copy file="${tomcat.conf.test}/web.xml" tofile="${tomcatconfig.dir}/conf/web.xml"/>
 		<copy file="${tomcat.conf.test}/tomcat-users.xml" tofile="${tomcatconfig.dir}/conf/tomcat-users.xml"/>
-        
-		<cactus warfile="${target.dir}/${cactus.warfile.name}.war" printsummary="yes" failureproperty="tests.failed">
+	
+		<cactus warfile="${target.dir}/${cactus.warfile.name}.war" fork="yes" haltonfailure="no" printsummary="yes" failureproperty="tests.failed">
 			<classpath>
 				<path refid="cactus.classpath"/>
 				<pathelement location="${build.classes}"/>
 				<pathelement location="${proxy.conf.dir}"/>
 				<pathelement location="${src.test.resources}"/>
 				<pathelement location="${src.test.resources}/proxy-config"/>
-			</classpath>		
-		
+			</classpath>			
 			<containerset>
-				<cargo containerId="${tomcat.container.id}" output="${logs.dir}/output.log" log="${logs.dir}/cargo.log">
+				<cargo containerId="${tomcat.container.id}" timeout="30000" output="${logs.dir}/output.log" log="${logs.dir}/cargo.log">
 				 <zipUrlInstaller
             installUrl="http://apache.osuosl.org/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip"
             installDir="${target.dir}/${tomcat.container.id}"/>
-				  <!--<configuration type="standalone" home="${tomcatconfig.dir}">-->
 				  <configuration type="existing" home="${tomcatconfig.dir}">
-						<property name="cargo.servlet.port" value="${cargo.servlet.port}"/>
+						<property name="cargo.servlet.port" value="${cargo.servlet.http.port}"/>
 						<property name="cargo.logging" value="${cargo.logging}"/>
 						<property name="cactus.toDir" value="${build.test}"/>
 						<deployable type="war" file="${target.dir}/${cactus.warfile.name}.war"/>
 					</configuration>
 				</cargo>
 			</containerset>
+			<sysproperty key="test.build.data" value="${build.test}/data"/>
+      <sysproperty key="build.test" value="${build.test}"/>
+      <sysproperty key="build.target" value="${target.dir}"/>
 			<sysproperty key="javax.net.ssl.trustStore" value="${ssl.keystore.proxy}"/>
 			<sysproperty key="javax.net.ssl.trustStorePassword" value="changeme"/>
 			<sysproperty key="javax.net.ssl.keyStore.proxy" value="${ssl.keystore.proxy}"/>
 			<sysproperty key="javax.net.ssl.keyStore" value="${ssl.keystore.client}"/>
 			<sysproperty key="javax.net.ssl.keyStorePassword" value="changeme"/>
-			<sysproperty key="javax.net.ssl.keyPassword" value="changeme"/>
-			
-			<sysproperty key="javax.net.ssl.clientCert" value="${ssl.client.cert}"/>
-			
-			<sysproperty key="test.build.data" value="${build.test}/data"/>
-      <sysproperty key="build.test" value="${build.test}"/>
-      <sysproperty key="build.target" value="${target.dir}"/>
-      
+			<sysproperty key="javax.net.ssl.keyPassword" value="changeme"/>			
+			<sysproperty key="javax.net.ssl.clientCert" value="${ssl.client.cert}"/>     
       <sysproperty key="test.proxy.conf.dir" value="${proxy.conf.test}"/>
-      <!-- requires fork=yes for: 
-        relative File paths to use the specified user.dir 
-        classpath to use build/contrib/*.jar
-      -->
-      <sysproperty key="user.dir" value="${build.test}/data"/>
+      <sysproperty key="test.proxy.https.port" value="${cargo.servlet.https.port}"/>
       
-      <sysproperty key="fs.default.name" value="${fs.default.name}"/>
-      <sysproperty key="hadoop.test.localoutputfile" value="${hadoop.test.localoutputfile}"/>
-      <sysproperty key="hadoop.log.dir" value="${hadoop.log.dir}"/> 
-      
-			
 			<formatter type="${cactus.formatter.type}"/>
 			<batchtest todir="${reports.dir}" unless="testcase">
 				<fileset dir="${src.test}">
 					<include name="**/Test*.java"/>
+					<exclude name="**/TestHdfsProxy.java"/>
+					<exclude name="**/TestProxyUgiManager.java"/>
 				</fileset>
 			</batchtest>
 			<batchtest todir="${reports.dir}" if="testcase">
-        <fileset dir="${src.test}" includes="**/${testcase}.java"/>
+        <fileset dir="${src.test}">
+        	<include name="**/${testcase}.java"/>
+        	<exclude name="**/TestHdfsProxy.java"/>
+        	<exclude name="**/TestProxyUgiManager.java"/>
+        </fileset>
       </batchtest>
-		</cactus>
-		<junitreport todir="${reports.dir}">
-			<fileset dir="${target.dir}/${tomcat.container.id}" includes="TEST-*.xml"/>
-      <report todir="${reports.dir}" format="frames"/>
-    </junitreport>
+		</cactus>		
     <fail if="tests.failed">Tests failed!</fail>
 	</target>
-
 	<!-- ====================================================== -->
 	<!-- Macro definitions                                      -->
 	<!-- ====================================================== -->
@@ -347,6 +423,7 @@
     <pathelement location="${hadoop.root}/build/classes"/>
     <pathelement location="${hadoop.root}/build/tools"/>
     <pathelement location="${build.examples}"/>
+    <pathelement path="${clover.jar}"/>
     <path refid="contrib-classpath"/>
   </path>
   

Added: hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/FindFreePort.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/FindFreePort.java?rev=752682&view=auto
==============================================================================
--- hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/FindFreePort.java (added)
+++ hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/FindFreePort.java Wed Mar 11 23:02:26 2009
@@ -0,0 +1,87 @@
+/**
+ * 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.hadoop.hdfsproxy;
+
+import java.net.ServerSocket;
+import java.io.IOException;
+import java.net.BindException;
+import java.util.Random;
+
+public class FindFreePort {
+  private static final int MIN_AVAILABLE_PORT = 10000;
+  private static final int MAX_AVAILABLE_PORT = 65535;
+  private static Random random = new Random();
+  /**
+   * 
+   * @param num <= 0, find a single free port
+   * @return free port next to port (>port)
+   * @throws IOException
+   */
+  public static int findFreePort(int port) throws IOException {
+    ServerSocket server;
+    if (port < 0) {
+      server =  new ServerSocket(0);      
+    } else {
+      int freePort = port+1;
+      while (true) {
+        try {
+          server =  new ServerSocket(freePort);
+          break;
+        } catch (IOException e) {
+          if (e instanceof BindException) {
+            if (freePort >= MAX_AVAILABLE_PORT || 
+                freePort < MIN_AVAILABLE_PORT) {
+              throw e;
+            }
+          } else {
+            throw e;
+          }
+          freePort += 1;
+        }
+      }
+    }
+    int fport = server.getLocalPort();
+    server.close();
+    return fport;    
+  }
+ /**
+  * 
+  * @return
+  * @throws IOException
+  */
+  public static int findFreePortRandom() throws IOException {
+    return findFreePort(MIN_AVAILABLE_PORT + random.nextInt(MAX_AVAILABLE_PORT - MIN_AVAILABLE_PORT + 1));
+  }
+   
+
+  public static void main(String[] args) throws Exception {
+    if(args.length < 1) {       
+      System.err.println("Usage: FindFreePort < -random / <#port> >");        
+      System.exit(0);      
+    }
+    int j = 0;
+    String cmd = args[j++];
+    if ("-random".equals(cmd)) {
+      System.out.println(findFreePortRandom());
+    } else {
+      System.out.println(findFreePort(Integer.parseInt(cmd)));
+    }   
+  }
+        
+}

Modified: hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/TestProxyUtil.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/TestProxyUtil.java?rev=752682&r1=752681&r2=752682&view=diff
==============================================================================
--- hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/TestProxyUtil.java (original)
+++ hadoop/core/trunk/src/contrib/hdfsproxy/src/test/org/apache/hadoop/hdfsproxy/TestProxyUtil.java Wed Mar 11 23:02:26 2009
@@ -26,13 +26,15 @@
 public class TestProxyUtil extends TestCase {
   
   private static String TEST_PROXY_CONF_DIR = System.getProperty("test.proxy.conf.dir", "./conf");
+  private static String TEST_PROXY_HTTPS_PORT = System.getProperty("test.proxy.https.port", "8443");
 
   public void testSendCommand() throws Exception {
       
     Configuration conf = new Configuration(false);  
     conf.addResource("ssl-client.xml");
     conf.addResource("hdfsproxy-default.xml");
-    conf.set("hdfsproxy.https.address", "localhost:8443");
+    String address = "localhost:" + TEST_PROXY_HTTPS_PORT;
+    conf.set("hdfsproxy.https.address", address);
     String hostFname = TEST_PROXY_CONF_DIR + "/hdfsproxy-hosts";
     conf.set("hdfsproxy.hosts", hostFname);    
     

Modified: hadoop/core/trunk/src/contrib/hdfsproxy/src/test/resources/tomcat-config/server.xml
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/contrib/hdfsproxy/src/test/resources/tomcat-config/server.xml?rev=752682&r1=752681&r2=752682&view=diff
==============================================================================
--- hadoop/core/trunk/src/contrib/hdfsproxy/src/test/resources/tomcat-config/server.xml (original)
+++ hadoop/core/trunk/src/contrib/hdfsproxy/src/test/resources/tomcat-config/server.xml Wed Mar 11 23:02:26 2009
@@ -15,17 +15,17 @@
    limitations under the License.
 -->
 
-<Server port="8205" shutdown="SHUTDOWN" debug="4">
+<Server port="@ADMIN.PORT@" shutdown="SHUTDOWN" debug="4">
 
   <Service name="Catalina" debug="4">
 
-    <Connector port="8087"
+    <Connector port="@HTTP.PORT@"
         maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true"
         scheme="http" secure="false"
         debug="4"/>
-    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
+    <Connector port="@HTTPS.PORT@" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true" 
                keystoreFile="${javax.net.ssl.keyStore.proxy}" keystorePass="changeme" keystoreType="JKS" clientAuth="true" sslProtocol="TLS" />