Index: common-build.xml
===================================================================
--- common-build.xml	(revision 919748)
+++ common-build.xml	(working copy)
@@ -387,9 +387,10 @@
   <macrodef name="test-macro" description="Executes junit tests.">
   	<attribute name="junit.output.dir" default="${junit.output.dir}"/>
   	<attribute name="junit.classpath" default="junit.classpath"/>
-  	<attribute name="dataDir"/>
-  	<attribute name="tempDir"/>
-  	<element name="contrib-settings" optional="yes"/>
+  	<attribute name="dataDir" default="src/test"/>
+  	<attribute name="tempDir" default="${build.dir}/test"/>
+        <attribute name="pattern" default=""/>
+        <attribute name="flagName" default="junitfailed@{pattern}.flag"/>
 
     <sequential>
 	    <condition property="runall">
@@ -397,8 +398,14 @@
 	        <isset property="testcase" />
 	      	<isset property="testpackage" />
 	      	<isset property="testpackageroot" />
+                <not><equals arg1="@{pattern}" arg2="" /></not>
 	      </or></not>
 	    </condition>
+            <condition property="runpattern">
+              <not>
+                <equals arg1="@{pattern}" arg2="" />
+              </not>
+            </condition>
 	  	<mkdir dir="@{junit.output.dir}"/>
 	    <junit printsummary="off" haltonfailure="no" maxmemory="512M"
 	      errorProperty="tests.failed" failureProperty="tests.failed" forkmode="perBatch">
@@ -418,7 +425,19 @@
 	      <sysproperty key="java.io.tmpdir" file="@{tempDir}"/>
 	      <sysproperty key="lucene.version" value="${dev.version}"/>
 	
-		  <contrib-settings />
+	      <!-- set as a system property so contrib tests can have a fixed root
+	           to reference file paths from, and "ant test" can work from
+	           anywhere.
+	       -->
+	      <sysproperty key="lucene.common.dir" file="${common.dir}" />
+	      
+	      <!-- contrib/ant IndexTaskTest needs these two system properties -->
+	      <sysproperty key="docs.dir" file="src/test"/>
+	      <sysproperty key="index.dir" file="${build.dir}/test/index"/>
+	
+	      <!-- contrib/benchmark uses this system property to locate docs data and defined tasks -->
+	      <sysproperty key="tasks.dir" file="${build.dir}/classes/java/org/apache/lucene/benchmark/byTask/tasks"/>
+	      <sysproperty key="benchmark.work.dir" file="${common.dir}/contrib/benchmark/work"/>
 	    	
 	      <formatter type="xml"/>
 	      <formatter type="brief" usefile="false"/>
@@ -434,34 +453,48 @@
 	      <batchtest fork="yes" todir="@{junit.output.dir}" if="testcase">
 	        <fileset dir="@{dataDir}" includes="**/${testcase}.java"/>
 	      </batchtest>
+	      <batchtest fork="yes" todir="@{junit.output.dir}" if="runpattern">
+	        <fileset dir="@{dataDir}" includes="**/Test@{pattern}*.java,/**/*@{pattern}Test.java" excludes="${junit.excludes}"/>
+	      </batchtest>
 	    </junit>
 	    <!-- create this file, then if we don't fail, delete it -->
 	    <!-- this meme makes it easy to tell if contribs have failed later -->
-	    <echo file="@{junit.output.dir}/junitfailed.flag">MAYBE</echo>
+	    <echo file="@{junit.output.dir}/@{flagName}">MAYBE</echo>
 	    <fail if="tests.failed">Tests failed!</fail>
 	    <!-- life would be easier if echo had an 'if' attribute like fail -->
-	    <delete file="@{junit.output.dir}/junitfailed.flag" />
+	    <delete file="@{junit.output.dir}/@{flagName}" />
   	</sequential>
   </macrodef>
 	
   <target name="test" depends="compile-test" description="Runs unit tests">
-    <test-macro dataDir="src/test" tempDir="${build.dir}/test">
-    	<contrib-settings>
-	      <!-- set as a system property so contrib tests can have a fixed root
-	           to reference file paths from, and "ant test" can work from
-	           anywhere.
-	       -->
-	      <sysproperty key="lucene.common.dir" file="${common.dir}" />
-	      
-	      <!-- contrib/ant IndexTaskTest needs these two system properties -->
-	      <sysproperty key="docs.dir" file="src/test"/>
-	      <sysproperty key="index.dir" file="${build.dir}/test/index"/>
-	
-	      <!-- contrib/benchmark uses this system property to locate docs data and defined tasks -->
-	      <sysproperty key="tasks.dir" file="${build.dir}/classes/java/org/apache/lucene/benchmark/byTask/tasks"/>
-	      <sysproperty key="benchmark.work.dir" file="${common.dir}/contrib/benchmark/work"/>
-	  </contrib-settings>
-    </test-macro>
+    <parallel threadsPerProcessor="2">
+      <test-macro pattern="A"/>
+      <test-macro pattern="B"/>
+      <test-macro pattern="C"/>
+      <test-macro pattern="D"/>
+      <test-macro pattern="E"/>
+      <test-macro pattern="F"/>
+      <test-macro pattern="G"/>
+      <test-macro pattern="H"/>
+      <test-macro pattern="I"/>
+      <test-macro pattern="J"/>
+      <test-macro pattern="K"/>
+      <test-macro pattern="L"/>
+      <test-macro pattern="M"/>
+      <test-macro pattern="N"/>
+      <test-macro pattern="O"/>
+      <test-macro pattern="P"/>
+      <test-macro pattern="Q"/>
+      <test-macro pattern="R"/>
+      <test-macro pattern="S"/>
+      <test-macro pattern="T"/>
+      <test-macro pattern="U"/>
+      <test-macro pattern="V"/>
+      <test-macro pattern="W"/>
+      <test-macro pattern="X"/>
+      <test-macro pattern="Y"/>
+      <test-macro pattern="Z"/>
+    </parallel>
   </target>
 
     <!--
Index: build.xml
===================================================================
--- build.xml	(revision 919748)
+++ build.xml	(working copy)
@@ -146,10 +146,39 @@
 			  			  test.classpath="backwards.test.classpath" javac.source="${javac.source.backwards}" javac.target="${javac.target.backwards}"/>
 		
 	  <!-- run branch tests against trunk jar -->
-      <test-macro dataDir="${backwards.dir}/${backwards.branch}/src/test" 
-      			  tempDir="${build.dir}/${backwards.branch}"
-      			  junit.classpath="backwards.junit.classpath"
-              junit.output.dir="${junit.output.dir.backwards}" />
+      <property name="bwdataDir" value="${backwards.dir}/${backwards.branch}/src/test"/>
+      <property name="bwtempDir" value="${build.dir}/${backwards.branch}"/>
+      <property name="bwclasspath" value="backwards.junit.classpath"/>
+      <property name="bwoutDir" value="${junit.output.dir.backwards}"/>
+
+      <parallel threadsPerProcessor="2">
+        <test-macro pattern="A" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="B" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="C" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="D" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="E" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="F" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="G" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="H" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="I" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="J" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="K" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="L" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="M" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="N" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="O" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="P" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="Q" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="R" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="S" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="T" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="U" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="V" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="W" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="X" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="Y" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+        <test-macro pattern="Z" dataDir="${bwdataDir}" tempDir="${bwtempDir}" junit.classpath="${bwclasspath}" junit.output.dir="${bwoutDir}" />
+      </parallel>
   	</sequential>
   </target>	
 
