From cf43718bcaf0fd39637570f6de4c5e867239620d Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Fri, 31 Dec 2010 20:17:20 +0000 Subject: [PATCH] SOLR-2299: enforce resource handling, prevent test interference by running in a jvm-unique CWD (under build/, same as tempDir) git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1054164 13f79535-47bb-0310-9956-ffa450edef68 --- solr/build.xml | 6 ++++- solr/contrib/analysis-extras/build.xml | 6 ++++- solr/contrib/clustering/build.xml | 6 ++++- .../AbstractClusteringTestCase.java | 2 +- .../conf/mapping-ISOLatin1Accent.txt | 0 .../conf/protwords.txt | 0 .../{solr => solr-clustering}/conf/schema.xml | 0 .../conf/solrconfig.xml | 0 .../conf/spellings.txt | 0 .../conf/stopwords.txt | 0 .../conf/synonyms.txt | 0 solr/contrib/dataimporthandler/build.xml | 12 +++++++-- .../dataimport/TestTikaEntityProcessor.java | 4 +-- .../conf/dataimport-schema-no-unique-key.xml | 0 .../conf/dataimport-solrconfig.xml | 0 .../src/extras/test/resources/solr-word.pdf | Bin 0 -> 21052 bytes .../AbstractDataImportHandlerTestCase.java | 5 ++++ .../TestContentStreamDataSource.java | 8 +++--- .../conf/contentstream-solrconfig.xml | 0 .../conf/data-config-with-datasource.xml | 0 .../conf/data-config-with-transformer.xml | 0 .../conf/dataconfig-contentstream.xml | 0 .../dataimport-nodatasource-solrconfig.xml | 0 .../conf/dataimport-schema.xml | 0 .../conf/dataimport-solr_id-schema.xml | 0 .../conf/dataimport-solrconfig.xml | 0 .../{solr => solr-dih}/conf/protwords.txt | 0 .../conf/single-entity-data-config.xml | 0 .../{solr => solr-dih}/conf/stopwords.txt | 0 .../{solr => solr-dih}/conf/synonyms.txt | 0 solr/contrib/extraction/build.xml | 6 ++++- .../handler/ExtractingRequestHandlerTest.java | 4 +-- .../conf/protwords.txt | 0 .../{solr => solr-extraction}/conf/schema.xml | 0 .../conf/solrconfig.xml | 0 .../conf/stopwords.txt | 0 .../conf/synonyms.txt | 0 .../test/org/apache/solr/SolrTestCaseJ4.java | 25 +++++++++++++++--- .../solr/client/solrj/SolrJettyTestBase.java | 24 ----------------- .../solr/cloud/BasicDistributedZkTest.java | 3 ++- .../apache/solr/core/TestXIncludeConfig.java | 7 ++++- .../solr/servlet/NoCacheHeaderTest.java | 2 +- .../solr/util/AbstractSolrTestCase.java | 10 ++++++- .../solr/conf/solrconfig-xinclude.xml | 3 ++- 44 files changed, 86 insertions(+), 47 deletions(-) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/mapping-ISOLatin1Accent.txt (100%) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/protwords.txt (100%) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/schema.xml (100%) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/solrconfig.xml (100%) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/spellings.txt (100%) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/stopwords.txt (100%) rename solr/contrib/clustering/src/test/resources/{solr => solr-clustering}/conf/synonyms.txt (100%) rename solr/contrib/dataimporthandler/src/extras/test/resources/{solr => solr-dihextras}/conf/dataimport-schema-no-unique-key.xml (100%) rename solr/contrib/dataimporthandler/src/extras/test/resources/{solr => solr-dihextras}/conf/dataimport-solrconfig.xml (100%) create mode 100644 solr/contrib/dataimporthandler/src/extras/test/resources/solr-word.pdf rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/contentstream-solrconfig.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/data-config-with-datasource.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/data-config-with-transformer.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/dataconfig-contentstream.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/dataimport-nodatasource-solrconfig.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/dataimport-schema.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/dataimport-solr_id-schema.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/dataimport-solrconfig.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/protwords.txt (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/single-entity-data-config.xml (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/stopwords.txt (100%) rename solr/contrib/dataimporthandler/src/test/resources/{solr => solr-dih}/conf/synonyms.txt (100%) rename solr/contrib/extraction/src/test/resources/{solr => solr-extraction}/conf/protwords.txt (100%) rename solr/contrib/extraction/src/test/resources/{solr => solr-extraction}/conf/schema.xml (100%) rename solr/contrib/extraction/src/test/resources/{solr => solr-extraction}/conf/solrconfig.xml (100%) rename solr/contrib/extraction/src/test/resources/{solr => solr-extraction}/conf/stopwords.txt (100%) rename solr/contrib/extraction/src/test/resources/{solr => solr-extraction}/conf/synonyms.txt (100%) diff --git a/solr/build.xml b/solr/build.xml index e6b7f2bc5af..b1cd11d31be 100644 --- a/solr/build.xml +++ b/solr/build.xml @@ -361,6 +361,10 @@ classpathref="test.compile.classpath"> + + + + @@ -421,7 +425,7 @@ maxmemory="512M" errorProperty="tests.failed" failureProperty="tests.failed" - dir="src/test/test-files/" + dir="@{tempDir}/@{threadNum}" tempdir="@{tempDir}/@{threadNum}" forkmode="perBatch" > diff --git a/solr/contrib/analysis-extras/build.xml b/solr/contrib/analysis-extras/build.xml index e882f5bdf5b..9a2e7d942c3 100644 --- a/solr/contrib/analysis-extras/build.xml +++ b/solr/contrib/analysis-extras/build.xml @@ -118,6 +118,10 @@ classpathref="test.classpath"> + + + + @@ -136,7 +140,7 @@ maxmemory="512M" errorProperty="tests.failed" failureProperty="tests.failed" - dir="src/test/test-files/" + dir="${junit.output.dir}" tempdir="${junit.output.dir}" forkmode="perBatch" > diff --git a/solr/contrib/clustering/build.xml b/solr/contrib/clustering/build.xml index a9125177809..a8036428c9a 100644 --- a/solr/contrib/clustering/build.xml +++ b/solr/contrib/clustering/build.xml @@ -90,6 +90,10 @@ classpathref="test.classpath"> + + + + @@ -108,7 +112,7 @@ maxmemory="512M" errorProperty="tests.failed" failureProperty="tests.failed" - dir="src/test/resources/" + dir="${junit.output.dir}" tempdir="${junit.output.dir}" forkmode="perBatch" > diff --git a/solr/contrib/clustering/src/test/java/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java b/solr/contrib/clustering/src/test/java/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java index cb6bb1ff8bd..c4fec5e0a53 100644 --- a/solr/contrib/clustering/src/test/java/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java +++ b/solr/contrib/clustering/src/test/java/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java @@ -28,7 +28,7 @@ public abstract class AbstractClusteringTestCase extends SolrTestCaseJ4 { @BeforeClass public static void beforeClass() throws Exception { - initCore("solrconfig.xml", "schema.xml"); + initCore("solrconfig.xml", "schema.xml", "solr-clustering"); numberOfDocs = 0; for (String[] doc : DOCUMENTS) { assertNull(h.validateUpdate(adoc("id", Integer.toString(numberOfDocs), "url", doc[0], "title", doc[1], "snippet", doc[2]))); diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/mapping-ISOLatin1Accent.txt b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/mapping-ISOLatin1Accent.txt similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/mapping-ISOLatin1Accent.txt rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/mapping-ISOLatin1Accent.txt diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/protwords.txt b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/protwords.txt similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/protwords.txt rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/protwords.txt diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/schema.xml b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/schema.xml similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/schema.xml rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/schema.xml diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/solrconfig.xml b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/solrconfig.xml similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/solrconfig.xml rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/solrconfig.xml diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/spellings.txt b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/spellings.txt similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/spellings.txt rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/spellings.txt diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/stopwords.txt b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/stopwords.txt similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/stopwords.txt rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/stopwords.txt diff --git a/solr/contrib/clustering/src/test/resources/solr/conf/synonyms.txt b/solr/contrib/clustering/src/test/resources/solr-clustering/conf/synonyms.txt similarity index 100% rename from solr/contrib/clustering/src/test/resources/solr/conf/synonyms.txt rename to solr/contrib/clustering/src/test/resources/solr-clustering/conf/synonyms.txt diff --git a/solr/contrib/dataimporthandler/build.xml b/solr/contrib/dataimporthandler/build.xml index cd0decfdc0d..c21c0f9a648 100644 --- a/solr/contrib/dataimporthandler/build.xml +++ b/solr/contrib/dataimporthandler/build.xml @@ -123,6 +123,10 @@ classpathref="test.classpath"> + + + + @@ -130,6 +134,10 @@ classpathref="test.classpath"> + + + + @@ -156,7 +164,7 @@ maxmemory="512M" errorProperty="tests.failed" failureProperty="tests.failed" - dir="src/test/resources/" + dir="${tempDir}" tempdir="${tempDir}" forkmode="perBatch" > @@ -217,7 +225,7 @@ maxmemory="512M" errorProperty="tests.failed" failureProperty="tests.failed" - dir="src/extras/test/resources/" + dir="${tempDir}" tempdir="${tempDir}" forkmode="perBatch" > diff --git a/solr/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java b/solr/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java index eb468067623..0a09d45e7c5 100644 --- a/solr/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java +++ b/solr/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java @@ -25,7 +25,7 @@ import org.junit.BeforeClass; public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase { @BeforeClass public static void beforeClass() throws Exception { - initCore("dataimport-solrconfig.xml", "dataimport-schema-no-unique-key.xml"); + initCore("dataimport-solrconfig.xml", "dataimport-schema-no-unique-key.xml", "solr-dihextras"); } public void testIndexingWithTikaEntityProcessor() throws Exception { @@ -33,7 +33,7 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase { "" + " " + " " + - " " + + " " + " " + " " + " " + diff --git a/solr/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-schema-no-unique-key.xml b/solr/contrib/dataimporthandler/src/extras/test/resources/solr-dihextras/conf/dataimport-schema-no-unique-key.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-schema-no-unique-key.xml rename to solr/contrib/dataimporthandler/src/extras/test/resources/solr-dihextras/conf/dataimport-schema-no-unique-key.xml diff --git a/solr/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-solrconfig.xml b/solr/contrib/dataimporthandler/src/extras/test/resources/solr-dihextras/conf/dataimport-solrconfig.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-solrconfig.xml rename to solr/contrib/dataimporthandler/src/extras/test/resources/solr-dihextras/conf/dataimport-solrconfig.xml diff --git a/solr/contrib/dataimporthandler/src/extras/test/resources/solr-word.pdf b/solr/contrib/dataimporthandler/src/extras/test/resources/solr-word.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd8b865905fc8e21d15921068dce37267c19f57c GIT binary patch literal 21052 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 z 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 HR>J=S)~yn4 literal 0 HcmV?d00001 diff --git a/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java b/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java index bd4b8322939..07f78d0b412 100644 --- a/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java +++ b/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java @@ -52,6 +52,11 @@ import java.util.Map; public abstract class AbstractDataImportHandlerTestCase extends SolrTestCaseJ4 { + // note, a little twisted that we shadow this static method + public static void initCore(String config, String schema) throws Exception { + initCore(config, schema, "solr-dih"); + } + @Override @Before public void setUp() throws Exception { diff --git a/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java b/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java index 248e3e982f3..c49be006377 100644 --- a/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java +++ b/solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java @@ -39,7 +39,7 @@ import java.util.List; * @since solr 1.4 */ public class TestContentStreamDataSource extends AbstractDataImportHandlerTestCase { - private static final String CONF_DIR = "." + File.separator + "solr" + File.separator + "conf" + File.separator; + private static final String CONF_DIR = "." + File.separator + "solr-dih" + File.separator + "conf" + File.separator; SolrInstance instance = null; JettySolrRunner jetty; @@ -129,12 +129,12 @@ public class TestContentStreamDataSource extends AbstractDataImportHandlerTestCa confDir.mkdirs(); File f = new File(confDir, "solrconfig.xml"); - FileUtils.copyFile(new File(getSolrConfigFile()), f); + FileUtils.copyFile(getFile(getSolrConfigFile()), f); f = new File(confDir, "schema.xml"); - FileUtils.copyFile(new File(getSchemaFile()), f); + FileUtils.copyFile(getFile(getSchemaFile()), f); f = new File(confDir, "data-config.xml"); - FileUtils.copyFile(new File(CONF_DIR + "dataconfig-contentstream.xml"), f); + FileUtils.copyFile(getFile(CONF_DIR + "dataconfig-contentstream.xml"), f); } public void tearDown() throws Exception { diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/contentstream-solrconfig.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/contentstream-solrconfig.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/contentstream-solrconfig.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/contentstream-solrconfig.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/data-config-with-datasource.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/data-config-with-datasource.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/data-config-with-datasource.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/data-config-with-datasource.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/data-config-with-transformer.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/data-config-with-transformer.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/data-config-with-transformer.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/data-config-with-transformer.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataconfig-contentstream.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataconfig-contentstream.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataconfig-contentstream.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataconfig-contentstream.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-nodatasource-solrconfig.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-nodatasource-solrconfig.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-nodatasource-solrconfig.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-nodatasource-solrconfig.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-schema.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-schema.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-schema.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-schema.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solr_id-schema.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-solr_id-schema.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solr_id-schema.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-solr_id-schema.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-solrconfig.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/dataimport-solrconfig.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/protwords.txt b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/protwords.txt similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/protwords.txt rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/protwords.txt diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/single-entity-data-config.xml similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/single-entity-data-config.xml diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/stopwords.txt b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/stopwords.txt similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/stopwords.txt rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/stopwords.txt diff --git a/solr/contrib/dataimporthandler/src/test/resources/solr/conf/synonyms.txt b/solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/synonyms.txt similarity index 100% rename from solr/contrib/dataimporthandler/src/test/resources/solr/conf/synonyms.txt rename to solr/contrib/dataimporthandler/src/test/resources/solr-dih/conf/synonyms.txt diff --git a/solr/contrib/extraction/build.xml b/solr/contrib/extraction/build.xml index 86f2b2ab812..73182c45264 100644 --- a/solr/contrib/extraction/build.xml +++ b/solr/contrib/extraction/build.xml @@ -79,6 +79,10 @@ classpathref="test.classpath"> + + + + @@ -105,7 +109,7 @@ maxmemory="512M" errorProperty="tests.failed" failureProperty="tests.failed" - dir="src/test/resources/" + dir="${tempDir}" tempdir="${tempDir}" forkmode="perBatch" > diff --git a/solr/contrib/extraction/src/test/java/org/apache/solr/handler/ExtractingRequestHandlerTest.java b/solr/contrib/extraction/src/test/java/org/apache/solr/handler/ExtractingRequestHandlerTest.java index a4658f46a71..af1bcf88f7c 100644 --- a/solr/contrib/extraction/src/test/java/org/apache/solr/handler/ExtractingRequestHandlerTest.java +++ b/solr/contrib/extraction/src/test/java/org/apache/solr/handler/ExtractingRequestHandlerTest.java @@ -43,7 +43,7 @@ import java.io.File; public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 { @BeforeClass public static void beforeClass() throws Exception { - initCore("solrconfig.xml", "schema.xml"); + initCore("solrconfig.xml", "schema.xml", "solr-extraction"); } @Before @@ -367,7 +367,7 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 { // TODO: stop using locally defined streams once stream.file and // stream.body work everywhere List cs = new ArrayList(); - cs.add(new ContentStreamBase.FileStream(new File(filename))); + cs.add(new ContentStreamBase.FileStream(getFile(filename))); req.setContentStreams(cs); return h.queryAndResponse("/update/extract", req); } finally { diff --git a/solr/contrib/extraction/src/test/resources/solr/conf/protwords.txt b/solr/contrib/extraction/src/test/resources/solr-extraction/conf/protwords.txt similarity index 100% rename from solr/contrib/extraction/src/test/resources/solr/conf/protwords.txt rename to solr/contrib/extraction/src/test/resources/solr-extraction/conf/protwords.txt diff --git a/solr/contrib/extraction/src/test/resources/solr/conf/schema.xml b/solr/contrib/extraction/src/test/resources/solr-extraction/conf/schema.xml similarity index 100% rename from solr/contrib/extraction/src/test/resources/solr/conf/schema.xml rename to solr/contrib/extraction/src/test/resources/solr-extraction/conf/schema.xml diff --git a/solr/contrib/extraction/src/test/resources/solr/conf/solrconfig.xml b/solr/contrib/extraction/src/test/resources/solr-extraction/conf/solrconfig.xml similarity index 100% rename from solr/contrib/extraction/src/test/resources/solr/conf/solrconfig.xml rename to solr/contrib/extraction/src/test/resources/solr-extraction/conf/solrconfig.xml diff --git a/solr/contrib/extraction/src/test/resources/solr/conf/stopwords.txt b/solr/contrib/extraction/src/test/resources/solr-extraction/conf/stopwords.txt similarity index 100% rename from solr/contrib/extraction/src/test/resources/solr/conf/stopwords.txt rename to solr/contrib/extraction/src/test/resources/solr-extraction/conf/stopwords.txt diff --git a/solr/contrib/extraction/src/test/resources/solr/conf/synonyms.txt b/solr/contrib/extraction/src/test/resources/solr-extraction/conf/synonyms.txt similarity index 100% rename from solr/contrib/extraction/src/test/resources/solr/conf/synonyms.txt rename to solr/contrib/extraction/src/test/resources/solr-extraction/conf/synonyms.txt diff --git a/solr/src/test/org/apache/solr/SolrTestCaseJ4.java b/solr/src/test/org/apache/solr/SolrTestCaseJ4.java index d3d7fc92ff4..2906e46c630 100755 --- a/solr/src/test/org/apache/solr/SolrTestCaseJ4.java +++ b/solr/src/test/org/apache/solr/SolrTestCaseJ4.java @@ -84,7 +84,7 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase { /** Call initCore in @BeforeClass to instantiate a solr core in your test class. * deleteCore will be called for you via SolrTestCaseJ4 @AfterClass */ public static void initCore(String config, String schema) throws Exception { - initCore(config, schema, null); + initCore(config, schema, TEST_HOME); } /** Call initCore in @BeforeClass to instantiate a solr core in your test class. @@ -1028,7 +1028,7 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase { * if a real file is needed. To get a stream, code should prefer * {@link Class#getResourceAsStream} using {@code this.getClass()}. */ - public static File getFile(String name) throws IOException { + public static File getFile(String name) { try { File file = new File(name); if (!file.exists()) { @@ -1036,7 +1036,26 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase { } return file; } catch (Exception e) { - throw new IOException("Cannot find resource: " + name); + /* more friendly than NPE */ + throw new RuntimeException("Cannot find resource: " + name); } } + + private static final String SOURCE_HOME = determineSourceHome(); + public static String TEST_HOME = getFile("solr/conf").getParent(); + public static String WEBAPP_HOME = new File(SOURCE_HOME, "src/webapp/web").getAbsolutePath(); + public static String EXAMPLE_HOME = new File(SOURCE_HOME, "example/solr").getAbsolutePath(); + public static String EXAMPLE_MULTICORE_HOME = new File(SOURCE_HOME, "example/multicore").getAbsolutePath(); + public static String EXAMPLE_SCHEMA=EXAMPLE_HOME+"/conf/schema.xml"; + public static String EXAMPLE_CONFIG=EXAMPLE_HOME+"/conf/solrconfig.xml"; + + static String determineSourceHome() { + // ugly, ugly hack to determine the example home without depending on the CWD + // this is needed for example/multicore tests which reside outside the classpath + File base = getFile("solr/conf/"); + while (!new File(base, "solr/CHANGES.txt").exists()) { + base = base.getParentFile(); + } + return new File(base, "solr/").getAbsolutePath(); + } } diff --git a/solr/src/test/org/apache/solr/client/solrj/SolrJettyTestBase.java b/solr/src/test/org/apache/solr/client/solrj/SolrJettyTestBase.java index a4b5f19d535..145317efeae 100755 --- a/solr/src/test/org/apache/solr/client/solrj/SolrJettyTestBase.java +++ b/solr/src/test/org/apache/solr/client/solrj/SolrJettyTestBase.java @@ -15,13 +15,6 @@ abstract public class SolrJettyTestBase extends SolrTestCaseJ4 // using configs in the test directory allows more flexibility to change "example" // without breaking configs. - private static final String SOURCE_HOME = determineSourceHome(); - public static String WEBAPP_HOME = new File(SOURCE_HOME, "src/webapp/web").getAbsolutePath(); - public static String EXAMPLE_HOME = new File(SOURCE_HOME, "example/solr").getAbsolutePath(); - public static String EXAMPLE_MULTICORE_HOME = new File(SOURCE_HOME, "example/multicore").getAbsolutePath(); - public static String EXAMPLE_SCHEMA=EXAMPLE_HOME+"/conf/schema.xml"; - public static String EXAMPLE_CONFIG=EXAMPLE_HOME+"/conf/solrconfig.xml"; - public String getSolrHome() { return EXAMPLE_HOME; } public static JettySolrRunner jetty; @@ -29,23 +22,6 @@ abstract public class SolrJettyTestBase extends SolrTestCaseJ4 public static SolrServer server; public static String context; - static String determineSourceHome() { - // ugly, ugly hack to determine the example home without depending on the CWD - try { - File file = new File("../../../example/solr"); - if (file.exists()) - return new File("../../../").getAbsolutePath(); - // let the hacks begin - File base = getFile("solr/conf/"); - while (!new File(base, "solr/CHANGES.txt").exists()) { - base = base.getParentFile(); - } - return new File(base, "solr/").getAbsolutePath(); - } catch (IOException e) { - throw new RuntimeException("Cannot determine example home!"); - } - } - public static JettySolrRunner createJetty(String solrHome, String configFile, String context) throws Exception { // creates the data dir initCore(null, null); diff --git a/solr/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java b/solr/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java index ff27f9fc52a..fbcd378cf0e 100644 --- a/solr/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java +++ b/solr/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java @@ -19,6 +19,7 @@ package org.apache.solr.cloud; import java.net.MalformedURLException; +import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.CloudSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; @@ -59,7 +60,7 @@ public class BasicDistributedZkTest extends AbstractDistributedZkTestCase { @BeforeClass public static void beforeClass() throws Exception { - + System.setProperty("solr.solr.home", SolrTestCaseJ4.TEST_HOME); } @Override diff --git a/solr/src/test/org/apache/solr/core/TestXIncludeConfig.java b/solr/src/test/org/apache/solr/core/TestXIncludeConfig.java index 8a3d85af2be..95b03bfb327 100644 --- a/solr/src/test/org/apache/solr/core/TestXIncludeConfig.java +++ b/solr/src/test/org/apache/solr/core/TestXIncludeConfig.java @@ -1,5 +1,8 @@ package org.apache.solr.core; +import java.io.File; + +import org.apache.commons.io.FileUtils; import org.apache.solr.util.AbstractSolrTestCase; import org.apache.solr.request.SolrRequestHandler; @@ -24,7 +27,9 @@ public class TestXIncludeConfig extends AbstractSolrTestCase { @Override public void setUp() throws Exception { - + File dest = new File("solrconfig-reqHandler.incl"); + dest.deleteOnExit(); + FileUtils.copyFile(getFile("solr/conf/solrconfig-reqHandler.incl"), dest); supports = true; javax.xml.parsers.DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { diff --git a/solr/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java b/solr/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java index 26c3e162200..b6bf2adaa3b 100644 --- a/solr/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java +++ b/solr/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java @@ -31,7 +31,7 @@ import org.junit.Test; public class NoCacheHeaderTest extends CacheHeaderTestBase { @BeforeClass public static void beforeTest() throws Exception { - createJetty("solr/", "solr/conf/solrconfig-nocache.xml", null); + createJetty(TEST_HOME, "solr/conf/solrconfig-nocache.xml", null); } // The tests diff --git a/solr/src/test/org/apache/solr/util/AbstractSolrTestCase.java b/solr/src/test/org/apache/solr/util/AbstractSolrTestCase.java index a111f3a4b0d..fec67be17b0 100644 --- a/solr/src/test/org/apache/solr/util/AbstractSolrTestCase.java +++ b/solr/src/test/org/apache/solr/util/AbstractSolrTestCase.java @@ -84,6 +84,14 @@ public abstract class AbstractSolrTestCase extends LuceneTestCase { */ public abstract String getSolrConfigFile(); + /** + * Subclasses can override this to change a test's solr home + * (default is in test-files) + */ + public String getSolrHome() { + return SolrTestCaseJ4.TEST_HOME; + } + /** * The directory used to story the index managed by the TestHarness h */ @@ -114,8 +122,8 @@ public abstract class AbstractSolrTestCase extends LuceneTestCase { dataDir = new File(TEMP_DIR, getClass().getName() + "-" + System.currentTimeMillis()); dataDir.mkdirs(); - String configFile = getSolrConfigFile(); + System.setProperty("solr.solr.home", getSolrHome()); if (configFile != null) { solrConfig = h.createConfig(getSolrConfigFile()); diff --git a/solr/src/test/test-files/solr/conf/solrconfig-xinclude.xml b/solr/src/test/test-files/solr/conf/solrconfig-xinclude.xml index 63cd3d5cd37..b171a3002d7 100644 --- a/solr/src/test/test-files/solr/conf/solrconfig-xinclude.xml +++ b/solr/src/test/test-files/solr/conf/solrconfig-xinclude.xml @@ -19,5 +19,6 @@ ${tests.luceneMatchVersion:LUCENE_CURRENT} - + +