You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by rm...@apache.org on 2010/03/23 07:02:05 UTC
svn commit: r926470 - in /lucene/solr/branches/newtrunk/solr: build.xml
common-build.xml lib/apache-ant-1.7.1.jar lib/apache-ant-junit-1.7.1.jar
src/test/org/apache/solr/SolrJUnitResultFormatter.java
Author: rmuir
Date: Tue Mar 23 06:02:05 2010
New Revision: 926470
URL: http://svn.apache.org/viewvc?rev=926470&view=rev
Log:
SOLR-1835: run the core tests in parallel... not perfect but a start
Added:
lucene/solr/branches/newtrunk/solr/lib/apache-ant-1.7.1.jar (with props)
lucene/solr/branches/newtrunk/solr/lib/apache-ant-junit-1.7.1.jar (with props)
lucene/solr/branches/newtrunk/solr/src/test/org/apache/solr/SolrJUnitResultFormatter.java (with props)
Modified:
lucene/solr/branches/newtrunk/solr/build.xml
lucene/solr/branches/newtrunk/solr/common-build.xml
Modified: lucene/solr/branches/newtrunk/solr/build.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/newtrunk/solr/build.xml?rev=926470&r1=926469&r2=926470&view=diff
==============================================================================
--- lucene/solr/branches/newtrunk/solr/build.xml (original)
+++ lucene/solr/branches/newtrunk/solr/build.xml Tue Mar 23 06:02:05 2010
@@ -375,8 +375,51 @@
description="Runs the core unit tests."
depends="test-core, test-contrib" />
- <target name="junit" depends="compileTests,dist-contrib">
-
+ <condition property="runsequential">
+ <isset property="testcase"/>
+ </condition>
+
+ <target name="junit" depends="compileTests,dist-contrib,junit-sequential,junit-parallel"/>
+
+ <target name="junit-sequential" if="runsequential">
+ <junit-macro/>
+ </target>
+
+ <target name="junit-parallel" unless="runsequential">
+ <parallel threadsPerProcessor="2">
+ <junit-macro pattern="S"/>
+ <junit-macro pattern="D"/>
+ <junit-macro pattern="A"/>
+ <junit-macro pattern="B"/>
+ <junit-macro pattern="C"/>
+ <junit-macro pattern="E"/>
+ <junit-macro pattern="F"/>
+ <junit-macro pattern="G"/>
+ <junit-macro pattern="H"/>
+ <junit-macro pattern="I"/>
+ <junit-macro pattern="J"/>
+ <junit-macro pattern="K"/>
+ <junit-macro pattern="L"/>
+ <junit-macro pattern="M"/>
+ <junit-macro pattern="N"/>
+ <junit-macro pattern="O"/>
+ <junit-macro pattern="P"/>
+ <junit-macro pattern="Q"/>
+ <junit-macro pattern="R"/>
+ <junit-macro pattern="T"/>
+ <junit-macro pattern="U"/>
+ <junit-macro pattern="V"/>
+ <junit-macro pattern="W"/>
+ <junit-macro pattern="X"/>
+ <junit-macro pattern="Y"/>
+ <junit-macro pattern="Z"/>
+ </parallel>
+ </target>
+
+
+ <macrodef name="junit-macro">
+ <attribute name="pattern" default=""/>
+ <sequential>
<!-- no description so it doesn't show up in -projecthelp -->
<mkdir dir="${junit.output.dir}"/>
<condition property="runall">
@@ -404,17 +447,17 @@
<jvmarg line="${dir.prop}"/>
<jvmarg line="${args}"/>
- <formatter type="brief" usefile="false" if="junit.details"/>
+ <formatter classname="${junit.details.formatter}" usefile="false" if="junit.details"/>
<classpath refid="test.run.classpath"/>
<formatter type="${junit.formatter}"/>
<batchtest fork="yes" todir="${junit.output.dir}" if="runall">
- <fileset dir="src/test" includes="${junit.includes}"/>
+ <fileset dir="src/test" includes="**/Test@{pattern}*.java,**/@{pattern}*Test.java"/>
</batchtest>
<batchtest fork="yes" todir="${junit.output.dir}" if="testpackage">
- <fileset dir="src/test" includes="**/${testpackage}/**/Test*.java,**/${testpackage}/**/*Test.java"/>
+ <fileset dir="src/test" includes="**/${testpackage}/**/Test@{pattern}*.java,**/${testpackage}/**/@{pattern}*Test.java"/>
</batchtest>
<batchtest fork="yes" todir="${junit.output.dir}" if="testpackageroot">
- <fileset dir="src/test" includes="**/${testpackageroot}/Test*.java,**/${testpackageroot}/*Test.java"/>
+ <fileset dir="src/test" includes="**/${testpackageroot}/Test@{pattern}*.java,**/${testpackageroot}/@{pattern}*Test.java"/>
</batchtest>
<batchtest fork="yes" todir="${junit.output.dir}" if="testcase">
<fileset dir="src/test" includes="**/${testcase}.java"/>
@@ -422,7 +465,9 @@
</junit>
<fail if="tests.failed">Tests failed!</fail>
- </target>
+ </sequential>
+ </macrodef>
+
<target name="test-reports"
description="Generates HTML test reports.">
@@ -509,6 +554,7 @@
<exclude name="junit-*.jar" />
<exclude name="*.txt" />
<exclude name="*.template" />
+ <exclude name="apache-ant-*.jar" />
</lib>
<lib dir="lucene-libs"/>
Modified: lucene/solr/branches/newtrunk/solr/common-build.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/newtrunk/solr/common-build.xml?rev=926470&r1=926469&r2=926470&view=diff
==============================================================================
--- lucene/solr/branches/newtrunk/solr/common-build.xml (original)
+++ lucene/solr/branches/newtrunk/solr/common-build.xml Tue Mar 23 06:02:05 2010
@@ -103,6 +103,7 @@
<property name="junit.output.dir" location="${common-solr.dir}/${dest}/test-results"/>
<property name="junit.reports" location="${common-solr.dir}/${dest}/test-results/reports"/>
<property name="junit.formatter" value="plain"/>
+ <property name="junit.details.formatter" value="org.apache.solr.SolrJUnitResultFormatter"/>
<!-- Maven properties -->
<property name="maven.build.dir" value="${basedir}/build/maven"/>
Added: lucene/solr/branches/newtrunk/solr/lib/apache-ant-1.7.1.jar
URL: http://svn.apache.org/viewvc/lucene/solr/branches/newtrunk/solr/lib/apache-ant-1.7.1.jar?rev=926470&view=auto
==============================================================================
Binary file - no diff available.
Propchange: lucene/solr/branches/newtrunk/solr/lib/apache-ant-1.7.1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: lucene/solr/branches/newtrunk/solr/lib/apache-ant-junit-1.7.1.jar
URL: http://svn.apache.org/viewvc/lucene/solr/branches/newtrunk/solr/lib/apache-ant-junit-1.7.1.jar?rev=926470&view=auto
==============================================================================
Binary file - no diff available.
Propchange: lucene/solr/branches/newtrunk/solr/lib/apache-ant-junit-1.7.1.jar
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: lucene/solr/branches/newtrunk/solr/src/test/org/apache/solr/SolrJUnitResultFormatter.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/newtrunk/solr/src/test/org/apache/solr/SolrJUnitResultFormatter.java?rev=926470&view=auto
==============================================================================
--- lucene/solr/branches/newtrunk/solr/src/test/org/apache/solr/SolrJUnitResultFormatter.java (added)
+++ lucene/solr/branches/newtrunk/solr/src/test/org/apache/solr/SolrJUnitResultFormatter.java Tue Mar 23 06:02:05 2010
@@ -0,0 +1,226 @@
+/*
+ * 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.solr;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.NumberFormat;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner;
+import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.StringUtils;
+
+/**
+ * Just like BriefJUnitResultFormatter "brief" bundled with ant,
+ * except all formatted text is buffered until the test suite is finished.
+ * At this point, the output is written at once in synchronized fashion.
+ * This way tests can run in parallel without interleaving output.
+ */
+public class SolrJUnitResultFormatter implements JUnitResultFormatter {
+ private static final double ONE_SECOND = 1000.0;
+
+ /** Where to write the log to. */
+ private OutputStream out;
+
+ /** Formatter for timings. */
+ private NumberFormat numberFormat = NumberFormat.getInstance();
+
+ /** Output suite has written to System.out */
+ private String systemOutput = null;
+
+ /** Output suite has written to System.err */
+ private String systemError = null;
+
+ /** Buffer output until the end of the test */
+ private StringBuilder sb;
+
+ /** Constructor for SolrJUnitResultFormatter. */
+ public SolrJUnitResultFormatter() {
+ sb = new StringBuilder();
+ }
+
+ /**
+ * Sets the stream the formatter is supposed to write its results to.
+ * @param out the output stream to write to
+ */
+ public void setOutput(OutputStream out) {
+ this.out = out;
+ }
+
+ /**
+ * @see JUnitResultFormatter#setSystemOutput(String)
+ */
+ /** {@inheritDoc}. */
+ public void setSystemOutput(String out) {
+ systemOutput = out;
+ }
+
+ /**
+ * @see JUnitResultFormatter#setSystemError(String)
+ */
+ /** {@inheritDoc}. */
+ public void setSystemError(String err) {
+ systemError = err;
+ }
+
+
+ /**
+ * The whole testsuite started.
+ * @param suite the test suite
+ */
+ public synchronized void startTestSuite(JUnitTest suite) {
+ if (out == null) {
+ return; // Quick return - no output do nothing.
+ }
+ sb.setLength(0);
+ sb.append("Testsuite: ");
+ sb.append(suite.getName());
+ sb.append(StringUtils.LINE_SEP);
+ }
+
+ /**
+ * The whole testsuite ended.
+ * @param suite the test suite
+ */
+ public synchronized void endTestSuite(JUnitTest suite) {
+ sb.append("Tests run: ");
+ sb.append(suite.runCount());
+ sb.append(", Failures: ");
+ sb.append(suite.failureCount());
+ sb.append(", Errors: ");
+ sb.append(suite.errorCount());
+ sb.append(", Time elapsed: ");
+ sb.append(numberFormat.format(suite.getRunTime() / ONE_SECOND));
+ sb.append(" sec");
+ sb.append(StringUtils.LINE_SEP);
+ sb.append(StringUtils.LINE_SEP);
+
+ // append the err and output streams to the log
+ if (systemOutput != null && systemOutput.length() > 0) {
+ sb.append("------------- Standard Output ---------------")
+ .append(StringUtils.LINE_SEP)
+ .append(systemOutput)
+ .append("------------- ---------------- ---------------")
+ .append(StringUtils.LINE_SEP);
+ }
+
+ if (systemError != null && systemError.length() > 0) {
+ sb.append("------------- Standard Error -----------------")
+ .append(StringUtils.LINE_SEP)
+ .append(systemError)
+ .append("------------- ---------------- ---------------")
+ .append(StringUtils.LINE_SEP);
+ }
+
+ if (out != null) {
+ try {
+ out.write(sb.toString().getBytes());
+ out.flush();
+ } catch (IOException e) {
+ throw new RuntimeException("unable to write results", e);
+ } finally {
+ if (out != System.out && out != System.err) {
+ FileUtils.close(out);
+ }
+ }
+ }
+ }
+
+ /**
+ * A test started.
+ * @param test a test
+ */
+ public void startTest(Test test) {
+ }
+
+ /**
+ * A test ended.
+ * @param test a test
+ */
+ public void endTest(Test test) {
+ }
+
+ /**
+ * Interface TestListener for JUnit <= 3.4.
+ *
+ * <p>A Test failed.
+ * @param test a test
+ * @param t the exception thrown by the test
+ */
+ public void addFailure(Test test, Throwable t) {
+ formatError("\tFAILED", test, t);
+ }
+
+ /**
+ * Interface TestListener for JUnit > 3.4.
+ *
+ * <p>A Test failed.
+ * @param test a test
+ * @param t the assertion failed by the test
+ */
+ public void addFailure(Test test, AssertionFailedError t) {
+ addFailure(test, (Throwable) t);
+ }
+
+ /**
+ * A test caused an error.
+ * @param test a test
+ * @param error the error thrown by the test
+ */
+ public void addError(Test test, Throwable error) {
+ formatError("\tCaused an ERROR", test, error);
+ }
+
+ /**
+ * Format the test for printing..
+ * @param test a test
+ * @return the formatted testname
+ */
+ protected String formatTest(Test test) {
+ if (test == null) {
+ return "Null Test: ";
+ } else {
+ return "Testcase: " + test.toString() + ":";
+ }
+ }
+
+ /**
+ * Format an error and print it.
+ * @param type the type of error
+ * @param test the test that failed
+ * @param error the exception that the test threw
+ */
+ protected synchronized void formatError(String type, Test test,
+ Throwable error) {
+ if (test != null) {
+ endTest(test);
+ }
+
+ sb.append(formatTest(test) + type);
+ sb.append(error.getMessage());
+ String strace = JUnitTestRunner.getFilteredTrace(error);
+ sb.append(strace);
+ sb.append(StringUtils.LINE_SEP);
+ }
+}
Propchange: lucene/solr/branches/newtrunk/solr/src/test/org/apache/solr/SolrJUnitResultFormatter.java
------------------------------------------------------------------------------
svn:eol-style = native