mirror of
https://github.com/apache/lucene.git
synced 2025-02-08 19:15:06 +00:00
Branch for LUCENE-5622
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/LUCENE-5622@1589645 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2899801a3d
commit
5767c9a835
@ -219,7 +219,7 @@ public class TestBugInSomething extends BaseTokenStreamTestCase {
|
|||||||
@Override
|
@Override
|
||||||
public boolean incrementToken() throws IOException {
|
public boolean incrementToken() throws IOException {
|
||||||
if (input.incrementToken()) {
|
if (input.incrementToken()) {
|
||||||
System.out.println(input.getClass().getSimpleName() + "->" + this.reflectAsString(false));
|
if (VERBOSE) System.out.println(input.getClass().getSimpleName() + "->" + this.reflectAsString(false));
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@ -229,19 +229,19 @@ public class TestBugInSomething extends BaseTokenStreamTestCase {
|
|||||||
@Override
|
@Override
|
||||||
public void end() throws IOException {
|
public void end() throws IOException {
|
||||||
super.end();
|
super.end();
|
||||||
System.out.println(input.getClass().getSimpleName() + ".end()");
|
if (VERBOSE) System.out.println(input.getClass().getSimpleName() + ".end()");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
super.close();
|
super.close();
|
||||||
System.out.println(input.getClass().getSimpleName() + ".close()");
|
if (VERBOSE) System.out.println(input.getClass().getSimpleName() + ".close()");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reset() throws IOException {
|
public void reset() throws IOException {
|
||||||
super.reset();
|
super.reset();
|
||||||
System.out.println(input.getClass().getSimpleName() + ".reset()");
|
if (VERBOSE) System.out.println(input.getClass().getSimpleName() + ".reset()");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,8 +70,9 @@ import java.util.Locale;
|
|||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
|
@SuppressSysoutChecks(bugUrl = "External tool.")
|
||||||
public class TestCompile extends LuceneTestCase {
|
public class TestCompile extends LuceneTestCase {
|
||||||
|
|
||||||
public void testCompile() throws Exception {
|
public void testCompile() throws Exception {
|
||||||
|
@ -31,6 +31,7 @@ import org.apache.lucene.search.MatchAllDocsQuery;
|
|||||||
import org.apache.lucene.search.TopDocs;
|
import org.apache.lucene.search.TopDocs;
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
import org.apache.lucene.store.RAMDirectory;
|
import org.apache.lucene.store.RAMDirectory;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -41,6 +42,7 @@ import java.util.Map;
|
|||||||
/**
|
/**
|
||||||
* Testcase for {@link UIMABaseAnalyzer}
|
* Testcase for {@link UIMABaseAnalyzer}
|
||||||
*/
|
*/
|
||||||
|
@SuppressSysoutChecks(bugUrl = "UIMA logs via ju.logging")
|
||||||
public class UIMABaseAnalyzerTest extends BaseTokenStreamTestCase {
|
public class UIMABaseAnalyzerTest extends BaseTokenStreamTestCase {
|
||||||
|
|
||||||
private UIMABaseAnalyzer analyzer;
|
private UIMABaseAnalyzer analyzer;
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.lucene.analysis.uima;
|
|||||||
|
|
||||||
import org.apache.lucene.analysis.BaseTokenStreamTestCase;
|
import org.apache.lucene.analysis.BaseTokenStreamTestCase;
|
||||||
import org.apache.lucene.analysis.TokenStream;
|
import org.apache.lucene.analysis.TokenStream;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -26,6 +27,7 @@ import org.junit.Test;
|
|||||||
/**
|
/**
|
||||||
* Testcase for {@link UIMATypeAwareAnalyzer}
|
* Testcase for {@link UIMATypeAwareAnalyzer}
|
||||||
*/
|
*/
|
||||||
|
@SuppressSysoutChecks(bugUrl = "UIMA logs via ju.logging")
|
||||||
public class UIMATypeAwareAnalyzerTest extends BaseTokenStreamTestCase {
|
public class UIMATypeAwareAnalyzerTest extends BaseTokenStreamTestCase {
|
||||||
|
|
||||||
private UIMATypeAwareAnalyzer analyzer;
|
private UIMATypeAwareAnalyzer analyzer;
|
||||||
|
@ -26,11 +26,12 @@ import java.io.StringReader;
|
|||||||
|
|
||||||
import org.apache.lucene.benchmark.byTask.Benchmark;
|
import org.apache.lucene.benchmark.byTask.Benchmark;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
|
|
||||||
/** Base class for all Benchmark unit tests. */
|
/** Base class for all Benchmark unit tests. */
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Output expected.")
|
||||||
public abstract class BenchmarkTestCase extends LuceneTestCase {
|
public abstract class BenchmarkTestCase extends LuceneTestCase {
|
||||||
private static File WORKDIR;
|
private static File WORKDIR;
|
||||||
|
|
||||||
|
@ -62,10 +62,12 @@ import org.apache.lucene.store.Directory;
|
|||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test very simply that perf tasks - simple algorithms - are doing what they should.
|
* Test very simply that perf tasks - simple algorithms - are doing what they should.
|
||||||
*/
|
*/
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Output expected.")
|
||||||
public class TestPerfTasksLogic extends BenchmarkTestCase {
|
public class TestPerfTasksLogic extends BenchmarkTestCase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -37,13 +37,12 @@ import org.apache.lucene.benchmark.byTask.utils.Config;
|
|||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.store.RAMDirectory;
|
import org.apache.lucene.store.RAMDirectory;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
|
||||||
|
|
||||||
import conf.ConfLoader;
|
import conf.ConfLoader;
|
||||||
|
|
||||||
/** Test very simply that perf tasks are parses as expected. */
|
/** Test very simply that perf tasks are parses as expected. */
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Output expected.")
|
||||||
public class TestPerfTasksParse extends LuceneTestCase {
|
public class TestPerfTasksParse extends LuceneTestCase {
|
||||||
|
|
||||||
static final String NEW_LINE = System.getProperty("line.separator");
|
static final String NEW_LINE = System.getProperty("line.separator");
|
||||||
@ -52,8 +51,7 @@ public class TestPerfTasksParse extends LuceneTestCase {
|
|||||||
// properties in effect in all tests here
|
// properties in effect in all tests here
|
||||||
static final String propPart =
|
static final String propPart =
|
||||||
INDENT + "directory=RAMDirectory" + NEW_LINE +
|
INDENT + "directory=RAMDirectory" + NEW_LINE +
|
||||||
INDENT + "print.props=false" + NEW_LINE
|
INDENT + "print.props=false" + NEW_LINE;
|
||||||
;
|
|
||||||
|
|
||||||
/** Test the repetiotion parsing for parallel tasks */
|
/** Test the repetiotion parsing for parallel tasks */
|
||||||
public void testParseParallelTaskSequenceRepetition() throws Exception {
|
public void testParseParallelTaskSequenceRepetition() throws Exception {
|
||||||
|
@ -26,6 +26,7 @@ import org.apache.lucene.index.DirectoryReader;
|
|||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
import org.apache.lucene.search.IndexSearcher;
|
import org.apache.lucene.search.IndexSearcher;
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -43,6 +44,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
* this test will not work correctly, as it does not dynamically
|
* this test will not work correctly, as it does not dynamically
|
||||||
* generate its test trec topics/qrels!
|
* generate its test trec topics/qrels!
|
||||||
*/
|
*/
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Output expected.")
|
||||||
public class TestQualityRun extends BenchmarkTestCase {
|
public class TestQualityRun extends BenchmarkTestCase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -118,7 +118,7 @@
|
|||||||
<property name="tests.verbose" value="false"/>
|
<property name="tests.verbose" value="false"/>
|
||||||
<property name="tests.infostream" value="${tests.verbose}"/>
|
<property name="tests.infostream" value="${tests.verbose}"/>
|
||||||
<property name="tests.filterstacks" value="true"/>
|
<property name="tests.filterstacks" value="true"/>
|
||||||
|
|
||||||
<condition property="tests.heapsize" value="768M">
|
<condition property="tests.heapsize" value="768M">
|
||||||
<isset property="run.clover"/>
|
<isset property="run.clover"/>
|
||||||
</condition>
|
</condition>
|
||||||
@ -1008,6 +1008,7 @@
|
|||||||
<propertyref prefix="tests.leavetmpdir" />
|
<propertyref prefix="tests.leavetmpdir" />
|
||||||
<propertyref prefix="tests.leaveTemporary" />
|
<propertyref prefix="tests.leaveTemporary" />
|
||||||
<propertyref prefix="tests.leavetemporary" />
|
<propertyref prefix="tests.leavetemporary" />
|
||||||
|
<propertyref prefix="tests.sysouts" />
|
||||||
<propertyref prefix="solr.test.leavetmpdir" />
|
<propertyref prefix="solr.test.leavetmpdir" />
|
||||||
</syspropertyset>
|
</syspropertyset>
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import org.apache.lucene.store.FSDirectory;
|
|||||||
import org.apache.lucene.util.CommandLineUtil;
|
import org.apache.lucene.util.CommandLineUtil;
|
||||||
import org.apache.lucene.util.Constants;
|
import org.apache.lucene.util.Constants;
|
||||||
import org.apache.lucene.util.InfoStream;
|
import org.apache.lucene.util.InfoStream;
|
||||||
|
import org.apache.lucene.util.PrintStreamInfoStream;
|
||||||
import org.apache.lucene.util.Version;
|
import org.apache.lucene.util.Version;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -42,7 +43,7 @@ import java.util.Collection;
|
|||||||
* refuses to run by default. Specify {@code -delete-prior-commits}
|
* refuses to run by default. Specify {@code -delete-prior-commits}
|
||||||
* to override this, allowing the tool to delete all but the last commit.
|
* to override this, allowing the tool to delete all but the last commit.
|
||||||
* From Java code this can be enabled by passing {@code true} to
|
* From Java code this can be enabled by passing {@code true} to
|
||||||
* {@link #IndexUpgrader(Directory,Version,PrintStream,boolean)}.
|
* {@link #IndexUpgrader(Directory,Version,InfoStream,boolean)}.
|
||||||
* <p><b>Warning:</b> This tool may reorder documents if the index was partially
|
* <p><b>Warning:</b> This tool may reorder documents if the index was partially
|
||||||
* upgraded before execution (e.g., documents were added). If your application relies
|
* upgraded before execution (e.g., documents were added). If your application relies
|
||||||
* on "monotonicity" of doc IDs (which means that the order in which the documents
|
* on "monotonicity" of doc IDs (which means that the order in which the documents
|
||||||
@ -76,7 +77,7 @@ public final class IndexUpgrader {
|
|||||||
static IndexUpgrader parseArgs(String[] args) throws IOException {
|
static IndexUpgrader parseArgs(String[] args) throws IOException {
|
||||||
String path = null;
|
String path = null;
|
||||||
boolean deletePriorCommits = false;
|
boolean deletePriorCommits = false;
|
||||||
PrintStream out = null;
|
InfoStream out = null;
|
||||||
String dirImpl = null;
|
String dirImpl = null;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i<args.length) {
|
while (i<args.length) {
|
||||||
@ -84,7 +85,7 @@ public final class IndexUpgrader {
|
|||||||
if ("-delete-prior-commits".equals(arg)) {
|
if ("-delete-prior-commits".equals(arg)) {
|
||||||
deletePriorCommits = true;
|
deletePriorCommits = true;
|
||||||
} else if ("-verbose".equals(arg)) {
|
} else if ("-verbose".equals(arg)) {
|
||||||
out = System.out;
|
out = new PrintStreamInfoStream(System.out);
|
||||||
} else if ("-dir-impl".equals(arg)) {
|
} else if ("-dir-impl".equals(arg)) {
|
||||||
if (i == args.length - 1) {
|
if (i == args.length - 1) {
|
||||||
System.out.println("ERROR: missing value for -dir-impl option");
|
System.out.println("ERROR: missing value for -dir-impl option");
|
||||||
@ -125,7 +126,7 @@ public final class IndexUpgrader {
|
|||||||
/** Creates index upgrader on the given directory, using an {@link IndexWriter} using the given
|
/** Creates index upgrader on the given directory, using an {@link IndexWriter} using the given
|
||||||
* {@code matchVersion}. You have the possibility to upgrade indexes with multiple commit points by removing
|
* {@code matchVersion}. You have the possibility to upgrade indexes with multiple commit points by removing
|
||||||
* all older ones. If {@code infoStream} is not {@code null}, all logging output will be sent to this stream. */
|
* all older ones. If {@code infoStream} is not {@code null}, all logging output will be sent to this stream. */
|
||||||
public IndexUpgrader(Directory dir, Version matchVersion, PrintStream infoStream, boolean deletePriorCommits) {
|
public IndexUpgrader(Directory dir, Version matchVersion, InfoStream infoStream, boolean deletePriorCommits) {
|
||||||
this(dir, new IndexWriterConfig(matchVersion, null), deletePriorCommits);
|
this(dir, new IndexWriterConfig(matchVersion, null), deletePriorCommits);
|
||||||
if (null != infoStream) {
|
if (null != infoStream) {
|
||||||
this.iwc.setInfoStream(infoStream);
|
this.iwc.setInfoStream(infoStream);
|
||||||
|
@ -61,6 +61,7 @@ import org.apache.lucene.util.Bits;
|
|||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
import org.apache.lucene.util.Constants;
|
import org.apache.lucene.util.Constants;
|
||||||
import org.apache.lucene.util.IOUtils;
|
import org.apache.lucene.util.IOUtils;
|
||||||
|
import org.apache.lucene.util.InfoStream;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
|
import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
|
||||||
import org.apache.lucene.util.StringHelper;
|
import org.apache.lucene.util.StringHelper;
|
||||||
@ -213,7 +214,7 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
|
|||||||
switch (choice) {
|
switch (choice) {
|
||||||
case 0: return new IndexUpgrader(dir, TEST_VERSION_CURRENT);
|
case 0: return new IndexUpgrader(dir, TEST_VERSION_CURRENT);
|
||||||
case 1: return new IndexUpgrader(dir, TEST_VERSION_CURRENT,
|
case 1: return new IndexUpgrader(dir, TEST_VERSION_CURRENT,
|
||||||
streamType ? null : System.err, false);
|
streamType ? null : InfoStream.NO_OUTPUT, false);
|
||||||
case 2: return new IndexUpgrader(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, null), false);
|
case 2: return new IndexUpgrader(dir, newIndexWriterConfig(TEST_VERSION_CURRENT, null), false);
|
||||||
default: fail("case statement didn't get updated when random bounds changed");
|
default: fail("case statement didn't get updated when random bounds changed");
|
||||||
}
|
}
|
||||||
@ -876,47 +877,53 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
|
|||||||
|
|
||||||
public void testCommandLineArgs() throws Exception {
|
public void testCommandLineArgs() throws Exception {
|
||||||
|
|
||||||
for (String name : oldIndexDirs.keySet()) {
|
PrintStream savedSystemOut = System.out;
|
||||||
File dir = createTempDir(name);
|
System.setOut(new PrintStream(new ByteArrayOutputStream(), false, "UTF-8"));
|
||||||
File dataFile = new File(TestBackwardsCompatibility.class.getResource("index." + name + ".zip").toURI());
|
try {
|
||||||
TestUtil.unzip(dataFile, dir);
|
for (String name : oldIndexDirs.keySet()) {
|
||||||
|
File dir = createTempDir(name);
|
||||||
String path = dir.getAbsolutePath();
|
File dataFile = new File(TestBackwardsCompatibility.class.getResource("index." + name + ".zip").toURI());
|
||||||
|
TestUtil.unzip(dataFile, dir);
|
||||||
List<String> args = new ArrayList<>();
|
|
||||||
if (random().nextBoolean()) {
|
String path = dir.getAbsolutePath();
|
||||||
args.add("-verbose");
|
|
||||||
}
|
List<String> args = new ArrayList<>();
|
||||||
if (random().nextBoolean()) {
|
if (random().nextBoolean()) {
|
||||||
args.add("-delete-prior-commits");
|
args.add("-verbose");
|
||||||
}
|
}
|
||||||
if (random().nextBoolean()) {
|
if (random().nextBoolean()) {
|
||||||
// TODO: need to better randomize this, but ...
|
args.add("-delete-prior-commits");
|
||||||
// - LuceneTestCase.FS_DIRECTORIES is private
|
}
|
||||||
// - newFSDirectory returns BaseDirectoryWrapper
|
if (random().nextBoolean()) {
|
||||||
// - BaseDirectoryWrapper doesn't expose delegate
|
// TODO: need to better randomize this, but ...
|
||||||
Class<? extends FSDirectory> dirImpl = random().nextBoolean() ?
|
// - LuceneTestCase.FS_DIRECTORIES is private
|
||||||
SimpleFSDirectory.class : NIOFSDirectory.class;
|
// - newFSDirectory returns BaseDirectoryWrapper
|
||||||
|
// - BaseDirectoryWrapper doesn't expose delegate
|
||||||
args.add("-dir-impl");
|
Class<? extends FSDirectory> dirImpl = random().nextBoolean() ?
|
||||||
args.add(dirImpl.getName());
|
SimpleFSDirectory.class : NIOFSDirectory.class;
|
||||||
}
|
|
||||||
args.add(path);
|
args.add("-dir-impl");
|
||||||
|
args.add(dirImpl.getName());
|
||||||
IndexUpgrader upgrader = null;
|
}
|
||||||
try {
|
args.add(path);
|
||||||
upgrader = IndexUpgrader.parseArgs(args.toArray(new String[0]));
|
|
||||||
} catch (Exception e) {
|
IndexUpgrader upgrader = null;
|
||||||
throw new AssertionError("unable to parse args: " + args, e);
|
try {
|
||||||
}
|
upgrader = IndexUpgrader.parseArgs(args.toArray(new String[0]));
|
||||||
upgrader.upgrade();
|
} catch (Exception e) {
|
||||||
|
throw new AssertionError("unable to parse args: " + args, e);
|
||||||
Directory upgradedDir = newFSDirectory(dir);
|
}
|
||||||
try {
|
upgrader.upgrade();
|
||||||
checkAllSegmentsUpgraded(upgradedDir);
|
|
||||||
} finally {
|
Directory upgradedDir = newFSDirectory(dir);
|
||||||
upgradedDir.close();
|
try {
|
||||||
|
checkAllSegmentsUpgraded(upgradedDir);
|
||||||
|
} finally {
|
||||||
|
upgradedDir.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
System.setOut(savedSystemOut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,9 +93,13 @@ public class TestCrash extends LuceneTestCase {
|
|||||||
// This test relies on being able to open a reader before any commit
|
// This test relies on being able to open a reader before any commit
|
||||||
// happened, so we must create an initial commit just to allow that, but
|
// happened, so we must create an initial commit just to allow that, but
|
||||||
// before any documents were added.
|
// before any documents were added.
|
||||||
System.out.println("TEST: initIndex");
|
if (VERBOSE) {
|
||||||
|
System.out.println("TEST: initIndex");
|
||||||
|
}
|
||||||
IndexWriter writer = initIndex(random(), true);
|
IndexWriter writer = initIndex(random(), true);
|
||||||
System.out.println("TEST: done initIndex");
|
if (VERBOSE) {
|
||||||
|
System.out.println("TEST: done initIndex");
|
||||||
|
}
|
||||||
MockDirectoryWrapper dir = (MockDirectoryWrapper) writer.getDirectory();
|
MockDirectoryWrapper dir = (MockDirectoryWrapper) writer.getDirectory();
|
||||||
|
|
||||||
// We create leftover files because merging could be
|
// We create leftover files because merging could be
|
||||||
@ -103,7 +107,9 @@ public class TestCrash extends LuceneTestCase {
|
|||||||
dir.setAssertNoUnrefencedFilesOnClose(false);
|
dir.setAssertNoUnrefencedFilesOnClose(false);
|
||||||
|
|
||||||
dir.setPreventDoubleWrite(false);
|
dir.setPreventDoubleWrite(false);
|
||||||
System.out.println("TEST: now crash");
|
if (VERBOSE) {
|
||||||
|
System.out.println("TEST: now crash");
|
||||||
|
}
|
||||||
crash(writer);
|
crash(writer);
|
||||||
writer = initIndex(random(), dir, false);
|
writer = initIndex(random(), dir, false);
|
||||||
writer.shutdown();
|
writer.shutdown();
|
||||||
|
@ -279,8 +279,10 @@ public class TestDocValuesIndexing extends LuceneTestCase {
|
|||||||
fail("didn't hit expected exception");
|
fail("didn't hit expected exception");
|
||||||
} catch (IllegalArgumentException expected) {
|
} catch (IllegalArgumentException expected) {
|
||||||
// expected
|
// expected
|
||||||
System.out.println("hit exc:");
|
if (VERBOSE) {
|
||||||
expected.printStackTrace(System.out);
|
System.out.println("hit exc:");
|
||||||
|
expected.printStackTrace(System.out);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iwriter.shutdown();
|
iwriter.shutdown();
|
||||||
|
@ -17,8 +17,11 @@ package org.apache.lucene.index;
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintStream;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -990,6 +993,8 @@ public class TestIndexWriter extends LuceneTestCase {
|
|||||||
volatile boolean allowInterrupt = false;
|
volatile boolean allowInterrupt = false;
|
||||||
final Random random;
|
final Random random;
|
||||||
final Directory adder;
|
final Directory adder;
|
||||||
|
final ByteArrayOutputStream bytesLog = new ByteArrayOutputStream();
|
||||||
|
final PrintStream log = new PrintStream(bytesLog, true, IOUtils.UTF_8);
|
||||||
|
|
||||||
IndexerThreadInterrupt() throws IOException {
|
IndexerThreadInterrupt() throws IOException {
|
||||||
this.random = new Random(random().nextLong());
|
this.random = new Random(random().nextLong());
|
||||||
@ -1126,27 +1131,27 @@ public class TestIndexWriter extends LuceneTestCase {
|
|||||||
// on!! This test doesn't repro easily so when
|
// on!! This test doesn't repro easily so when
|
||||||
// Jenkins hits a fail we need to study where the
|
// Jenkins hits a fail we need to study where the
|
||||||
// interrupts struck!
|
// interrupts struck!
|
||||||
System.out.println("TEST: got interrupt");
|
log.println("TEST: got interrupt");
|
||||||
re.printStackTrace(System.out);
|
re.printStackTrace(log);
|
||||||
Throwable e = re.getCause();
|
Throwable e = re.getCause();
|
||||||
assertTrue(e instanceof InterruptedException);
|
assertTrue(e instanceof InterruptedException);
|
||||||
if (finish) {
|
if (finish) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
System.out.println("FAILED; unexpected exception");
|
log.println("FAILED; unexpected exception");
|
||||||
t.printStackTrace(System.out);
|
t.printStackTrace(log);
|
||||||
failed = true;
|
failed = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VERBOSE) {
|
if (VERBOSE) {
|
||||||
System.out.println("TEST: now finish failed=" + failed);
|
log.println("TEST: now finish failed=" + failed);
|
||||||
}
|
}
|
||||||
if (!failed) {
|
if (!failed) {
|
||||||
if (VERBOSE) {
|
if (VERBOSE) {
|
||||||
System.out.println("TEST: now rollback");
|
log.println("TEST: now rollback");
|
||||||
}
|
}
|
||||||
// clear interrupt state:
|
// clear interrupt state:
|
||||||
Thread.interrupted();
|
Thread.interrupted();
|
||||||
@ -1162,8 +1167,8 @@ public class TestIndexWriter extends LuceneTestCase {
|
|||||||
TestUtil.checkIndex(dir);
|
TestUtil.checkIndex(dir);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
failed = true;
|
failed = true;
|
||||||
System.out.println("CheckIndex FAILED: unexpected exception");
|
log.println("CheckIndex FAILED: unexpected exception");
|
||||||
e.printStackTrace(System.out);
|
e.printStackTrace(log);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
IndexReader r = DirectoryReader.open(dir);
|
IndexReader r = DirectoryReader.open(dir);
|
||||||
@ -1171,8 +1176,8 @@ public class TestIndexWriter extends LuceneTestCase {
|
|||||||
r.close();
|
r.close();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
failed = true;
|
failed = true;
|
||||||
System.out.println("DirectoryReader.open FAILED: unexpected exception");
|
log.println("DirectoryReader.open FAILED: unexpected exception");
|
||||||
e.printStackTrace(System.out);
|
e.printStackTrace(log);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
@ -1216,7 +1221,9 @@ public class TestIndexWriter extends LuceneTestCase {
|
|||||||
}
|
}
|
||||||
t.finish = true;
|
t.finish = true;
|
||||||
t.join();
|
t.join();
|
||||||
assertFalse(t.failed);
|
if (t.failed) {
|
||||||
|
fail(new String(t.bytesLog.toString("UTF-8")));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** testThreadInterruptDeadlock but with 2 indexer threads */
|
/** testThreadInterruptDeadlock but with 2 indexer threads */
|
||||||
@ -2499,7 +2506,9 @@ public class TestIndexWriter extends LuceneTestCase {
|
|||||||
fail("didn't hit exception");
|
fail("didn't hit exception");
|
||||||
} catch (RuntimeException re) {
|
} catch (RuntimeException re) {
|
||||||
// expected
|
// expected
|
||||||
System.out.println("GOT: " + re.getMessage());
|
if (VERBOSE) {
|
||||||
|
System.out.println("GOT: " + re.getMessage());
|
||||||
|
}
|
||||||
assertTrue(re.getMessage().contains("this writer is closed, but some pending changes or running merges were discarded"));
|
assertTrue(re.getMessage().contains("this writer is closed, but some pending changes or running merges were discarded"));
|
||||||
}
|
}
|
||||||
w.rollback();
|
w.rollback();
|
||||||
|
@ -106,7 +106,7 @@ public class TestExceptionInBeforeClassHooks extends WithNestedTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testExceptionInBeforeClassFailsTheTest() {
|
public void testExceptionInBeforeClassFailsTheTest() {
|
||||||
Result runClasses = JUnitCore.runClasses(Nested1.class);
|
Result runClasses = JUnitCore.runClasses(Nested1.class);
|
||||||
Assert.assertEquals(1, runClasses.getFailureCount());
|
assertFailureCount(1, runClasses);
|
||||||
Assert.assertEquals(1, runClasses.getRunCount());
|
Assert.assertEquals(1, runClasses.getRunCount());
|
||||||
Assert.assertTrue(runClasses.getFailures().get(0).getTrace().contains("foobar"));
|
Assert.assertTrue(runClasses.getFailures().get(0).getTrace().contains("foobar"));
|
||||||
}
|
}
|
||||||
@ -114,7 +114,7 @@ public class TestExceptionInBeforeClassHooks extends WithNestedTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testExceptionWithinTestFailsTheTest() {
|
public void testExceptionWithinTestFailsTheTest() {
|
||||||
Result runClasses = JUnitCore.runClasses(Nested2.class);
|
Result runClasses = JUnitCore.runClasses(Nested2.class);
|
||||||
Assert.assertEquals(3, runClasses.getFailureCount());
|
assertFailureCount(3, runClasses);
|
||||||
Assert.assertEquals(3, runClasses.getRunCount());
|
Assert.assertEquals(3, runClasses.getRunCount());
|
||||||
|
|
||||||
ArrayList<String> foobars = new ArrayList<>();
|
ArrayList<String> foobars = new ArrayList<>();
|
||||||
@ -133,7 +133,7 @@ public class TestExceptionInBeforeClassHooks extends WithNestedTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testExceptionWithinBefore() {
|
public void testExceptionWithinBefore() {
|
||||||
Result runClasses = JUnitCore.runClasses(Nested3.class);
|
Result runClasses = JUnitCore.runClasses(Nested3.class);
|
||||||
Assert.assertEquals(1, runClasses.getFailureCount());
|
assertFailureCount(1, runClasses);
|
||||||
Assert.assertEquals(1, runClasses.getRunCount());
|
Assert.assertEquals(1, runClasses.getRunCount());
|
||||||
Assert.assertTrue(runClasses.getFailures().get(0).getTrace().contains("foobar"));
|
Assert.assertTrue(runClasses.getFailures().get(0).getTrace().contains("foobar"));
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,11 @@ package org.apache.lucene.util.junitcompat;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.JUnitCore;
|
import org.junit.runner.JUnitCore;
|
||||||
import org.junit.runner.Result;
|
import org.junit.runner.Result;
|
||||||
import org.junit.runner.notification.Failure;
|
|
||||||
|
|
||||||
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
||||||
|
|
||||||
@ -31,6 +31,7 @@ public class TestFailIfDirectoryNotClosed extends WithNestedTests {
|
|||||||
super(true);
|
super(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Expected.")
|
||||||
public static class Nested1 extends WithNestedTests.AbstractNestedTest {
|
public static class Nested1 extends WithNestedTests.AbstractNestedTest {
|
||||||
public void testDummy() throws Exception {
|
public void testDummy() throws Exception {
|
||||||
Directory dir = newDirectory();
|
Directory dir = newDirectory();
|
||||||
@ -43,11 +44,7 @@ public class TestFailIfDirectoryNotClosed extends WithNestedTests {
|
|||||||
Result r = JUnitCore.runClasses(Nested1.class);
|
Result r = JUnitCore.runClasses(Nested1.class);
|
||||||
RandomizedTest.assumeTrue("Ignoring nested test, very likely zombie threads present.",
|
RandomizedTest.assumeTrue("Ignoring nested test, very likely zombie threads present.",
|
||||||
r.getIgnoreCount() == 0);
|
r.getIgnoreCount() == 0);
|
||||||
|
assertFailureCount(1, r);
|
||||||
for (Failure f : r.getFailures()) {
|
|
||||||
System.out.println("Failure: " + f);
|
|
||||||
}
|
|
||||||
Assert.assertEquals(1, r.getFailureCount());
|
|
||||||
Assert.assertTrue(r.getFailures().get(0).toString().contains("Resource in scope SUITE failed to close"));
|
Assert.assertTrue(r.getFailures().get(0).toString().contains("Resource in scope SUITE failed to close"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package org.apache.lucene.util.junitcompat;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
import org.junit.rules.RuleChain;
|
import org.junit.rules.RuleChain;
|
||||||
import org.junit.rules.TestRule;
|
import org.junit.rules.TestRule;
|
||||||
@ -42,6 +43,7 @@ public class TestSameRandomnessLocalePassedOrNot extends WithNestedTests {
|
|||||||
super(true);
|
super(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Expected.")
|
||||||
public static class Nested extends WithNestedTests.AbstractNestedTest {
|
public static class Nested extends WithNestedTests.AbstractNestedTest {
|
||||||
public static String pickString;
|
public static String pickString;
|
||||||
public static Locale defaultLocale;
|
public static Locale defaultLocale;
|
||||||
|
@ -18,6 +18,7 @@ package org.apache.lucene.util.junitcompat;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.JUnitCore;
|
import org.junit.runner.JUnitCore;
|
||||||
@ -29,6 +30,7 @@ import org.junit.runner.notification.Failure;
|
|||||||
* console.
|
* console.
|
||||||
*/
|
*/
|
||||||
public class TestSeedFromUncaught extends WithNestedTests {
|
public class TestSeedFromUncaught extends WithNestedTests {
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Expected.")
|
||||||
public static class ThrowInUncaught extends AbstractNestedTest {
|
public static class ThrowInUncaught extends AbstractNestedTest {
|
||||||
@Test
|
@Test
|
||||||
public void testFoo() throws Exception {
|
public void testFoo() throws Exception {
|
||||||
@ -53,7 +55,7 @@ public class TestSeedFromUncaught extends WithNestedTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testUncaughtDumpsSeed() {
|
public void testUncaughtDumpsSeed() {
|
||||||
Result result = JUnitCore.runClasses(ThrowInUncaught.class);
|
Result result = JUnitCore.runClasses(ThrowInUncaught.class);
|
||||||
Assert.assertEquals(1, result.getFailureCount());
|
assertFailureCount(1, result);
|
||||||
Failure f = result.getFailures().get(0);
|
Failure f = result.getFailures().get(0);
|
||||||
String trace = f.getTrace();
|
String trace = f.getTrace();
|
||||||
Assert.assertTrue(trace.contains("SeedInfo.seed("));
|
Assert.assertTrue(trace.contains("SeedInfo.seed("));
|
||||||
|
@ -29,6 +29,7 @@ import org.apache.lucene.util.LuceneTestCase;
|
|||||||
import org.apache.lucene.util.TestRuleIgnoreAfterMaxFailures;
|
import org.apache.lucene.util.TestRuleIgnoreAfterMaxFailures;
|
||||||
import org.apache.lucene.util.TestRuleIgnoreTestSuites;
|
import org.apache.lucene.util.TestRuleIgnoreTestSuites;
|
||||||
import org.apache.lucene.util.TestRuleMarkFailure;
|
import org.apache.lucene.util.TestRuleMarkFailure;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Assume;
|
import org.junit.Assume;
|
||||||
@ -37,6 +38,8 @@ import org.junit.ClassRule;
|
|||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.rules.RuleChain;
|
import org.junit.rules.RuleChain;
|
||||||
import org.junit.rules.TestRule;
|
import org.junit.rules.TestRule;
|
||||||
|
import org.junit.runner.Result;
|
||||||
|
import org.junit.runner.notification.Failure;
|
||||||
|
|
||||||
import com.carrotsearch.randomizedtesting.RandomizedRunner;
|
import com.carrotsearch.randomizedtesting.RandomizedRunner;
|
||||||
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
||||||
@ -57,6 +60,7 @@ import com.carrotsearch.randomizedtesting.rules.TestRuleAdapter;
|
|||||||
* cause havoc (static fields).
|
* cause havoc (static fields).
|
||||||
*/
|
*/
|
||||||
public abstract class WithNestedTests {
|
public abstract class WithNestedTests {
|
||||||
|
@SuppressSysoutChecks(bugUrl = "WithNestedTests has its own stream capture.")
|
||||||
public static abstract class AbstractNestedTest extends LuceneTestCase
|
public static abstract class AbstractNestedTest extends LuceneTestCase
|
||||||
implements TestRuleIgnoreTestSuites.NestedTestSuite {
|
implements TestRuleIgnoreTestSuites.NestedTestSuite {
|
||||||
protected static boolean isRunningNested() {
|
protected static boolean isRunningNested() {
|
||||||
@ -164,6 +168,20 @@ public abstract class WithNestedTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void assertFailureCount(int expected, Result result) {
|
||||||
|
if (result.getFailureCount() != expected) {
|
||||||
|
StringBuilder b = new StringBuilder();
|
||||||
|
for (Failure f : result.getFailures()) {
|
||||||
|
b.append("\n\n");
|
||||||
|
b.append(f.getMessage());
|
||||||
|
b.append("\n");
|
||||||
|
b.append(f.getTrace());
|
||||||
|
}
|
||||||
|
RandomizedTest.assertFalse("Expected failures: " + expected + " but was " +
|
||||||
|
result.getFailureCount() + ", failures below: " + b.toString(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected String getSysOut() {
|
protected String getSysOut() {
|
||||||
Assert.assertTrue(suppressOutputStreams);
|
Assert.assertTrue(suppressOutputStreams);
|
||||||
System.out.flush();
|
System.out.flush();
|
||||||
|
@ -23,8 +23,9 @@ import java.io.PrintStream;
|
|||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Output expected.")
|
||||||
public class TestDemo extends LuceneTestCase {
|
public class TestDemo extends LuceneTestCase {
|
||||||
|
|
||||||
private void testOneSearch(File indexPath, String query, int expectedHitCount) throws Exception {
|
private void testOneSearch(File indexPath, String query, int expectedHitCount) throws Exception {
|
||||||
|
@ -133,7 +133,6 @@ public class TestDrillDownQuery extends FacetTestCase {
|
|||||||
// Making sure the query yields 25 documents with the facet "a"
|
// Making sure the query yields 25 documents with the facet "a"
|
||||||
DrillDownQuery q = new DrillDownQuery(config);
|
DrillDownQuery q = new DrillDownQuery(config);
|
||||||
q.add("a");
|
q.add("a");
|
||||||
System.out.println("q=" + q);
|
|
||||||
QueryUtils.check(q);
|
QueryUtils.check(q);
|
||||||
TopDocs docs = searcher.search(q, 100);
|
TopDocs docs = searcher.search(q, 100);
|
||||||
assertEquals(25, docs.totalHits);
|
assertEquals(25, docs.totalHits);
|
||||||
|
@ -17,9 +17,6 @@
|
|||||||
package org.apache.lucene.document;
|
package org.apache.lucene.document;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -28,7 +25,6 @@ import java.io.IOException;
|
|||||||
|
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.store.*;
|
import org.apache.lucene.store.*;
|
||||||
import org.apache.lucene.document.*;
|
|
||||||
import org.apache.lucene.analysis.*;
|
import org.apache.lucene.analysis.*;
|
||||||
import org.apache.lucene.index.*;
|
import org.apache.lucene.index.*;
|
||||||
import org.apache.lucene.search.*;
|
import org.apache.lucene.search.*;
|
||||||
@ -118,7 +114,7 @@ public class TestLazyDocument extends LuceneTestCase {
|
|||||||
assertFalse(f.name() + " is loaded", lf.hasBeenLoaded());
|
assertFalse(f.name() + " is loaded", lf.hasBeenLoaded());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("numFieldValues == " + numFieldValues);
|
if (VERBOSE) System.out.println("numFieldValues == " + numFieldValues);
|
||||||
assertEquals("numFieldValues", 1 + (NUM_VALUES * FIELDS.length),
|
assertEquals("numFieldValues", 1 + (NUM_VALUES * FIELDS.length),
|
||||||
numFieldValues);
|
numFieldValues);
|
||||||
|
|
||||||
|
@ -22,7 +22,9 @@ import org.apache.lucene.document.Field;
|
|||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Output expected (external tool).")
|
||||||
public class TestMultiPassIndexSplitter extends LuceneTestCase {
|
public class TestMultiPassIndexSplitter extends LuceneTestCase {
|
||||||
IndexReader input;
|
IndexReader input;
|
||||||
int NUM_DOCS = 11;
|
int NUM_DOCS = 11;
|
||||||
|
@ -246,6 +246,13 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
|
|
||||||
/** @see #ignoreAfterMaxFailures*/
|
/** @see #ignoreAfterMaxFailures*/
|
||||||
public static final String SYSPROP_FAILFAST = "tests.failfast";
|
public static final String SYSPROP_FAILFAST = "tests.failfast";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If true, enables assertions on writing to system streams.
|
||||||
|
*
|
||||||
|
* @see TestRuleDisallowSysouts
|
||||||
|
*/
|
||||||
|
public static final String SYSPROP_SYSOUTS = "tests.sysouts";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Annotation for tests that should only be run during nightly builds.
|
* Annotation for tests that should only be run during nightly builds.
|
||||||
@ -346,6 +353,21 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
public String bugUrl() default "None";
|
public String bugUrl() default "None";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks any suite which is known to print to {@link System#out} or {@link System#err},
|
||||||
|
* even when {@link #VERBOSE} is disabled.
|
||||||
|
*
|
||||||
|
* @see TestRuleDisallowSysouts
|
||||||
|
*/
|
||||||
|
@Documented
|
||||||
|
@Inherited
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
public @interface SuppressSysoutChecks {
|
||||||
|
/** Point to JIRA entry. */
|
||||||
|
public String bugUrl();
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
// Truly immutable fields and constants, initialized once and valid
|
// Truly immutable fields and constants, initialized once and valid
|
||||||
// for all suites ever since.
|
// for all suites ever since.
|
||||||
@ -360,11 +382,13 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* True if and only if tests are run in verbose mode. If this flag is false
|
* True if and only if tests are run in verbose mode. If this flag is false
|
||||||
* tests are not expected to print any messages.
|
* tests are not expected to print any messages. Enforced with {@link TestRuleDisallowSysouts}.
|
||||||
*/
|
*/
|
||||||
public static final boolean VERBOSE = systemPropertyAsBoolean("tests.verbose", false);
|
public static final boolean VERBOSE = systemPropertyAsBoolean("tests.verbose", false);
|
||||||
|
|
||||||
/** TODO: javadoc? */
|
/**
|
||||||
|
* Enables or disables dumping of {@link InfoStream} messages.
|
||||||
|
*/
|
||||||
public static final boolean INFOSTREAM = systemPropertyAsBoolean("tests.infostream", VERBOSE);
|
public static final boolean INFOSTREAM = systemPropertyAsBoolean("tests.infostream", VERBOSE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -478,7 +502,7 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
/**
|
/**
|
||||||
* Suite failure marker (any error in the test or suite scope).
|
* Suite failure marker (any error in the test or suite scope).
|
||||||
*/
|
*/
|
||||||
public static TestRuleMarkFailure suiteFailureMarker;
|
private static TestRuleMarkFailure suiteFailureMarker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ignore tests after hitting a designated number of initial failures. This
|
* Ignore tests after hitting a designated number of initial failures. This
|
||||||
@ -511,6 +535,15 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
new TestRuleIgnoreAfterMaxFailures(maxFailures));
|
new TestRuleIgnoreAfterMaxFailures(maxFailures));
|
||||||
ignoreAfterMaxFailures = TestRuleDelegate.of(ignoreAfterMaxFailuresDelegate);
|
ignoreAfterMaxFailures = TestRuleDelegate.of(ignoreAfterMaxFailuresDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to capture streams early so that other classes don't have a chance to steal references
|
||||||
|
* to them (as is the case with ju.logging handlers).
|
||||||
|
*/
|
||||||
|
static {
|
||||||
|
TestRuleDisallowSysouts.checkCaptureStreams();
|
||||||
|
Logger.getGlobal().getHandlers();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Temporarily substitute the global {@link TestRuleIgnoreAfterMaxFailures}. See
|
* Temporarily substitute the global {@link TestRuleIgnoreAfterMaxFailures}. See
|
||||||
@ -545,6 +578,7 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
.around(ignoreAfterMaxFailures)
|
.around(ignoreAfterMaxFailures)
|
||||||
.around(suiteFailureMarker = new TestRuleMarkFailure())
|
.around(suiteFailureMarker = new TestRuleMarkFailure())
|
||||||
.around(new TestRuleAssertionsRequired())
|
.around(new TestRuleAssertionsRequired())
|
||||||
|
.around(new TestRuleDisallowSysouts(suiteFailureMarker))
|
||||||
.around(new TemporaryFilesCleanupRule())
|
.around(new TemporaryFilesCleanupRule())
|
||||||
.around(new StaticFieldsInvariantRule(STATIC_LEAK_THRESHOLD, true) {
|
.around(new StaticFieldsInvariantRule(STATIC_LEAK_THRESHOLD, true) {
|
||||||
@Override
|
@Override
|
||||||
@ -2359,6 +2393,12 @@ public abstract class LuceneTestCase extends Assert {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks and cleans up temporary files.
|
||||||
|
*
|
||||||
|
* @see LuceneTestCase#createTempDir()
|
||||||
|
* @see LuceneTestCase#createTempFile()
|
||||||
|
*/
|
||||||
private static class TemporaryFilesCleanupRule extends TestRuleAdapter {
|
private static class TemporaryFilesCleanupRule extends TestRuleAdapter {
|
||||||
@Override
|
@Override
|
||||||
protected void before() throws Throwable {
|
protected void before() throws Throwable {
|
||||||
|
@ -154,6 +154,9 @@ public final class RunListenerPrintReproduceInfo extends RunListener {
|
|||||||
addVmOpt(b, "testcase", RandomizedContext.current().getTargetClass().getSimpleName());
|
addVmOpt(b, "testcase", RandomizedContext.current().getTargetClass().getSimpleName());
|
||||||
addVmOpt(b, "tests.method", testName);
|
addVmOpt(b, "tests.method", testName);
|
||||||
addVmOpt(b, "tests.seed", RandomizedContext.current().getRunnerSeedAsString());
|
addVmOpt(b, "tests.seed", RandomizedContext.current().getRunnerSeedAsString());
|
||||||
|
|
||||||
|
// Misc switches.
|
||||||
|
addVmOpt(b, SYSPROP_SYSOUTS, System.getProperty(SYSPROP_SYSOUTS));
|
||||||
|
|
||||||
// Test groups and multipliers.
|
// Test groups and multipliers.
|
||||||
if (RANDOM_MULTIPLIER > 1) addVmOpt(b, "tests.multiplier", RANDOM_MULTIPLIER);
|
if (RANDOM_MULTIPLIER > 1) addVmOpt(b, "tests.multiplier", RANDOM_MULTIPLIER);
|
||||||
|
@ -0,0 +1,193 @@
|
|||||||
|
package org.apache.lucene.util;
|
||||||
|
|
||||||
|
import java.io.FilterOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
|
|
||||||
|
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
||||||
|
import com.carrotsearch.randomizedtesting.rules.TestRuleAdapter;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fails the suite if it prints anything to {@link System#out} or {@link System#err},
|
||||||
|
* unless the condition is not enforced (see {@link #isEnforced()}).
|
||||||
|
*/
|
||||||
|
public class TestRuleDisallowSysouts extends TestRuleAdapter {
|
||||||
|
/**
|
||||||
|
* Stack trace of any thread that wrote something to sysout or syserr.
|
||||||
|
*/
|
||||||
|
private final static AtomicReference<StackTraceElement[]> firstWriteStack = new AtomicReference<StackTraceElement[]>();
|
||||||
|
|
||||||
|
private final static DelegateStream capturedSystemOut;
|
||||||
|
private final static DelegateStream capturedSystemErr;
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.out.flush();
|
||||||
|
System.err.flush();
|
||||||
|
|
||||||
|
final String csn = Charset.defaultCharset().name();
|
||||||
|
capturedSystemOut = new DelegateStream(System.out, csn, firstWriteStack);
|
||||||
|
capturedSystemErr = new DelegateStream(System.err, csn, firstWriteStack);
|
||||||
|
|
||||||
|
System.setOut(capturedSystemOut.printStream);
|
||||||
|
System.setErr(capturedSystemErr.printStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test failures from any tests or rules before.
|
||||||
|
*/
|
||||||
|
private final TestRuleMarkFailure failureMarker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets {@link #firstWriteStack} to the current stack trace upon the first actual write
|
||||||
|
* to an underlying stream.
|
||||||
|
*/
|
||||||
|
static class DelegateStream extends FilterOutputStream {
|
||||||
|
private final AtomicReference<StackTraceElement[]> firstWriteStack;
|
||||||
|
final PrintStream printStream;
|
||||||
|
|
||||||
|
public DelegateStream(OutputStream delegate, String charset, AtomicReference<StackTraceElement[]> firstWriteStack) {
|
||||||
|
super(delegate);
|
||||||
|
try {
|
||||||
|
this.firstWriteStack = firstWriteStack;
|
||||||
|
this.printStream = new PrintStream(this, true, charset);
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do override all three write() methods to make sure nothing slips through.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(byte[] b) throws IOException {
|
||||||
|
if (b.length > 0) {
|
||||||
|
bytesWritten();
|
||||||
|
}
|
||||||
|
super.write(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(byte[] b, int off, int len) throws IOException {
|
||||||
|
if (len > 0) {
|
||||||
|
bytesWritten();
|
||||||
|
}
|
||||||
|
super.write(b, off, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(int b) throws IOException {
|
||||||
|
bytesWritten();
|
||||||
|
super.write(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void bytesWritten() {
|
||||||
|
// This check isn't really needed, but getting the stack is expensive and may involve
|
||||||
|
// jit deopts, so we'll do it anyway.
|
||||||
|
if (firstWriteStack.get() == null) {
|
||||||
|
firstWriteStack.compareAndSet(null, Thread.currentThread().getStackTrace());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestRuleDisallowSysouts(TestRuleMarkFailure failureMarker) {
|
||||||
|
this.failureMarker = failureMarker;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** */
|
||||||
|
@Override
|
||||||
|
protected void before() throws Throwable {
|
||||||
|
if (isEnforced()) {
|
||||||
|
checkCaptureStreams();
|
||||||
|
}
|
||||||
|
resetCaptureState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures {@link System#out} and {@link System#err} point to delegate streams.
|
||||||
|
*/
|
||||||
|
public static void checkCaptureStreams() {
|
||||||
|
// Make sure we still hold the right references to wrapper streams.
|
||||||
|
if (System.out != capturedSystemOut.printStream) {
|
||||||
|
throw new AssertionError("Something has changed System.out to: " + System.out.getClass().getName());
|
||||||
|
}
|
||||||
|
if (System.err != capturedSystemErr.printStream) {
|
||||||
|
throw new AssertionError("Something has changed System.err to: " + System.err.getClass().getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isEnforced() {
|
||||||
|
if (LuceneTestCase.VERBOSE ||
|
||||||
|
LuceneTestCase.INFOSTREAM ||
|
||||||
|
RandomizedTest.getContext().getTargetClass().isAnnotationPresent(SuppressSysoutChecks.class)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !RandomizedTest.systemPropertyAsBoolean(LuceneTestCase.SYSPROP_SYSOUTS, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We're only interested in failing the suite if it was successful. Otherwise
|
||||||
|
* just propagate the original problem and don't bother.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void afterIfSuccessful() throws Throwable {
|
||||||
|
if (isEnforced()) {
|
||||||
|
checkCaptureStreams();
|
||||||
|
|
||||||
|
// Flush any buffers.
|
||||||
|
capturedSystemOut.printStream.flush();
|
||||||
|
capturedSystemErr.printStream.flush();
|
||||||
|
|
||||||
|
// And check for offenders, but only if everything was successful so far.
|
||||||
|
StackTraceElement[] offenderStack = firstWriteStack.get();
|
||||||
|
if (offenderStack != null && failureMarker.wasSuccessful()) {
|
||||||
|
AssertionError e = new AssertionError("The test or suite printed information to stdout or stderr," +
|
||||||
|
" even though verbose mode is turned off and it's not annotated with @" +
|
||||||
|
SuppressSysoutChecks.class.getSimpleName() + ". This exception contains the stack" +
|
||||||
|
" trace of the first offending call.");
|
||||||
|
e.setStackTrace(offenderStack);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restore original streams.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void afterAlways(List<Throwable> errors) throws Throwable {
|
||||||
|
resetCaptureState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetCaptureState() {
|
||||||
|
capturedSystemOut.printStream.flush();
|
||||||
|
capturedSystemErr.printStream.flush();
|
||||||
|
firstWriteStack.set(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -58,6 +58,7 @@ import org.apache.lucene.util.IOUtils;
|
|||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.QuickPatchThreadsFilter;
|
import org.apache.lucene.util.QuickPatchThreadsFilter;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
|
||||||
import org.apache.solr.client.solrj.impl.HttpClientConfigurer;
|
import org.apache.solr.client.solrj.impl.HttpClientConfigurer;
|
||||||
import org.apache.solr.client.solrj.impl.HttpClientUtil;
|
import org.apache.solr.client.solrj.impl.HttpClientUtil;
|
||||||
import org.apache.solr.client.solrj.util.ClientUtils;
|
import org.apache.solr.client.solrj.util.ClientUtils;
|
||||||
@ -118,6 +119,7 @@ import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
|
|||||||
SolrIgnoredThreadsFilter.class,
|
SolrIgnoredThreadsFilter.class,
|
||||||
QuickPatchThreadsFilter.class
|
QuickPatchThreadsFilter.class
|
||||||
})
|
})
|
||||||
|
@SuppressSysoutChecks(bugUrl = "Solr dumps logs to console.")
|
||||||
public abstract class SolrTestCaseJ4 extends LuceneTestCase {
|
public abstract class SolrTestCaseJ4 extends LuceneTestCase {
|
||||||
private static String coreName = ConfigSolrXmlOld.DEFAULT_DEFAULT_CORE_NAME;
|
private static String coreName = ConfigSolrXmlOld.DEFAULT_DEFAULT_CORE_NAME;
|
||||||
public static int DEFAULT_CONNECTION_TIMEOUT = 60000; // default socket connection timeout in ms
|
public static int DEFAULT_CONNECTION_TIMEOUT = 60000; // default socket connection timeout in ms
|
||||||
|
Loading…
x
Reference in New Issue
Block a user