This seems to cause a memory leak, see recently failing Jenkins tests!

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: [email protected]


> -----Original Message-----
> From: [email protected] [mailto:[email protected]]
> Sent: Saturday, July 06, 2013 4:46 PM
> To: [email protected]
> Subject: svn commit: r1500284 - in /lucene/dev/trunk/solr: ./
> core/src/java/org/apache/solr/core/
> core/src/java/org/apache/solr/handler/admin/
> core/src/test/org/apache/solr/handler/admin/ test-
> framework/src/java/org/apache/solr/
> 
> Author: erick
> Date: Sat Jul  6 14:45:47 2013
> New Revision: 1500284
> 
> URL: http://svn.apache.org/r1500284
> Log:
> Fix for SOLR-4982, creating cores with sysprops does not dereference them
> properly
> 
> Added:
> 
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA
> dminCreateDiscoverTest.java   (with props)
> Modified:
>     lucene/dev/trunk/solr/CHANGES.txt
> 
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescriptor.j
> ava
>     lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
> 
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreA
> dminHandler.java
> 
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA
> dminHandlerTest.java
>     lucene/dev/trunk/solr/test-
> framework/src/java/org/apache/solr/SolrTestCaseJ4.java
> 
> Modified: lucene/dev/trunk/solr/CHANGES.txt
> URL:
> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=150
> 0284&r1=1500283&r2=1500284&view=diff
> ==========================================================
> ====================
> --- lucene/dev/trunk/solr/CHANGES.txt (original)
> +++ lucene/dev/trunk/solr/CHANGES.txt Sat Jul  6 14:45:47 2013
> @@ -253,6 +253,12 @@ Bug Fixes
> 
>  * SOLR-5000: ManagedIndexSchema doesn't persist uniqueKey tag after
> calling addFields
>    method. (Jun Ohtani, Steve Rowe)
> +
> +* SOLR-4982: Creating a core while referencing system properties looks
> +like it loses files
> +  Actually, instanceDir, config, dataDir and schema are not
> +dereferenced properly
> +  when creating cores that reference sys vars (e.g. &dataDir=${dir}).
> +In the dataDir
> +  case in particular this leads to the index being put in a directory
> +literally named
> +  ${dir} but on restart the sysvar will be properly dereferenced.
> 
>  Optimizations
>  ----------------------
> 
> Modified:
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescriptor.j
> ava
> URL:
> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apa
> che/solr/core/CoreDescriptor.java?rev=1500284&r1=1500283&r2=1500284&v
> iew=diff
> ==========================================================
> ====================
> ---
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescriptor.j
> ava (original)
> +++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreDescrip
> +++ tor.java Sat Jul  6 14:45:47 2013
> @@ -46,7 +46,7 @@ public class CoreDescriptor {
>    public static final String CORE_TRANSIENT = "transient";
>    public static final String CORE_NODE_NAME = "coreNodeName";
> 
> -  static final String[] standardPropNames = {
> +  public static final String[] standardPropNames = {
>        CORE_NAME,
>        CORE_CONFIG,
>        CORE_INSTDIR,
> @@ -65,7 +65,7 @@ public class CoreDescriptor {
>    // them individually.
>    private Properties coreProperties = new Properties();
> 
> -  //TODO: 5.0 remove this, this is solely a hack for persistence.
> +  //TODO: 5.0 remove this, this is solely a hack for persistence. And perhaps
> creating cores in discovery mode?
>    private Properties createdProperties = new Properties();
> 
>    private boolean loadedImplicit = false;
> 
> Modified:
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apa
> che/solr/core/SolrCore.java?rev=1500284&r1=1500283&r2=1500284&view=di
> ff
> ==========================================================
> ====================
> --- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
> (original)
> +++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.ja
> +++ va Sat Jul  6 14:45:47 2013
> @@ -26,6 +26,7 @@ import java.io.Writer;  import
> java.lang.reflect.Constructor;  import java.net.URL;  import 
> java.util.ArrayList;
> +import java.util.Arrays;
>  import java.util.Collection;
>  import java.util.Collections;
>  import java.util.Date;
> @@ -873,6 +874,18 @@ public final class SolrCore implements S
>        propFile.getParentFile().mkdirs();
>        Properties props = new Properties();
>        props.put("name", cd.getName());
> +
> +      // This must be being created since there's no file here already. So 
> write
> out all of the params we were
> +      // created with. This _may_ overwrite the name above, but that's OK.
> +      Collection<String> stds = new
> HashSet(Arrays.asList(CoreDescriptor.standardPropNames));
> +      for (String prop : cd.getCreatedProperties().stringPropertyNames()) {
> +        // Only preserve things that are legal, and let's just keep instDir 
> right out
> of the persisted file even
> +        // though it's part of the create properties on the URL.
> +        if (! CoreDescriptor.CORE_INSTDIR.equals(prop) &&
> stds.contains(prop)) {
> +          props.put(prop, cd.getCreatedProperties().getProperty(prop));
> +        }
> +      }
> +
>        if (cc.isZooKeeperAware()) {
>          String collection = cd.getCloudDescriptor().getCollectionName();
>          if (collection != null) {
> 
> Modified:
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreA
> dminHandler.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apa
> che/solr/handler/admin/CoreAdminHandler.java?rev=1500284&r1=1500283
> &r2=1500284&view=diff
> ==========================================================
> ====================
> ---
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/CoreA
> dminHandler.java (original)
> +++
> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/Co
> +++ reAdminHandler.java Sat Jul  6 14:45:47 2013
> @@ -57,6 +57,7 @@ import org.apache.solr.update.UpdateLog;  import
> org.apache.solr.update.processor.UpdateRequestProcessor;
>  import org.apache.solr.update.processor.UpdateRequestProcessorChain;
>  import org.apache.solr.util.NumberUtils;
> +import org.apache.solr.util.PropertiesUtil;
>  import org.apache.solr.util.RefCounted;  import
> org.apache.zookeeper.KeeperException;
>  import org.slf4j.Logger;
> @@ -414,6 +415,7 @@ public class CoreAdminHandler extends Re
>        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
>                                "Core name is mandatory to CREATE a SolrCore");
>      }
> +
>      CoreDescriptor dcore = null;
>      try {
> 
> @@ -427,22 +429,30 @@ public class CoreAdminHandler extends Re
>        if (instanceDir == null) {
>          // instanceDir = coreContainer.getSolrHome() + "/" + name;
>          instanceDir = name; // bare name is already relative to solr home
> +      } else {
> +        instanceDir = PropertiesUtil.substituteProperty(instanceDir,
> + null);
>        }
> 
>        dcore = new CoreDescriptor(coreContainer, name, instanceDir);
> 
>        //  fillup optional parameters
>        String opts = params.get(CoreAdminParams.CONFIG);
> -      if (opts != null)
> +      if (opts != null) {
> +        opts = PropertiesUtil.substituteProperty(opts, null);
>          dcore.setConfigName(opts);
> +      }
> 
>        opts = params.get(CoreAdminParams.SCHEMA);
> -      if (opts != null)
> +      if (opts != null) {
> +        opts = PropertiesUtil.substituteProperty(opts, null);
>          dcore.setSchemaName(opts);
> +      }
> 
>        opts = params.get(CoreAdminParams.DATA_DIR);
> -      if (opts != null)
> +      if (opts != null) {
> +        opts = PropertiesUtil.substituteProperty(opts, null);
>          dcore.setDataDir(opts);
> +      }
> 
>        opts = params.get(CoreAdminParams.ULOG_DIR);
>        if (opts != null)
> 
> Added:
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA
> dminCreateDiscoverTest.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apa
> che/solr/handler/admin/CoreAdminCreateDiscoverTest.java?rev=1500284&
> view=auto
> ==========================================================
> ====================
> ---
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA
> dminCreateDiscoverTest.java (added)
> +++
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Co
> +++ reAdminCreateDiscoverTest.java Sat Jul  6 14:45:47 2013
> @@ -0,0 +1,228 @@
> +/*
> + * 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.handler.admin;
> +
> +import org.apache.commons.io.FileUtils; import
> +org.apache.solr.SolrTestCaseJ4; import
> +org.apache.solr.common.params.CoreAdminParams;
> +import org.apache.solr.core.CoreDescriptor;
> +import org.apache.solr.core.SolrCoreDiscoverer;
> +import org.apache.solr.response.SolrQueryResponse;
> +import org.junit.AfterClass;
> +import org.junit.BeforeClass;
> +import org.junit.Test;
> +
> +import java.io.File;
> +import java.io.FileInputStream;
> +import java.io.IOException;
> +import java.util.Arrays;
> +import java.util.Collection;
> +import java.util.HashSet;
> +import java.util.Properties;
> +
> +public class CoreAdminCreateDiscoverTest extends SolrTestCaseJ4 {
> +
> +  private static File solrHomeDirectory = null;
> +
> +  private static CoreAdminHandler admin = null; //  private static
> +CoreContainer cc = null;
> +
> +  private static String coreNormal = "normal";  private static String
> + coreSysProps = "sys_props";
> +
> +  @BeforeClass
> +  public static void before() throws Exception {
> +    useFactory(null); // I require FS-based indexes for this test.
> +
> +    solrHomeDirectory = new File(TEMP_DIR, "solrHome/" +
> CoreAdminCreateDiscoverTest.getClassName());
> +    if (solrHomeDirectory.exists()) {
> +      FileUtils.deleteDirectory(solrHomeDirectory);
> +    }
> +    assertTrue("Failed to mkdirs workDir", solrHomeDirectory.mkdirs());
> +
> +    setupNoCoreTest(solrHomeDirectory, null);
> +
> +    admin = new CoreAdminHandler(h.getCoreContainer());
> +  }
> +
> +  @AfterClass
> +  public static void after() throws Exception {
> +    h.close();
> +    if (solrHomeDirectory.exists()) {
> +      FileUtils.deleteDirectory(solrHomeDirectory);
> +    }
> +  }
> +
> +  private static void setupCore(String coreName, boolean blivet) throws
> IOException {
> +    File instDir = new File(solrHomeDirectory, coreName);
> +    File subHome = new File(instDir, "conf");
> +    assertTrue("Failed to make subdirectory ", subHome.mkdirs());
> +
> +    // Be sure we pick up sysvars when we create this
> +    String srcDir = SolrTestCaseJ4.TEST_HOME() + "/collection1/conf";
> +    FileUtils.copyFile(new File(srcDir, "schema-tiny.xml"), new File(subHome,
> "schema_ren.xml"));
> +    FileUtils.copyFile(new File(srcDir, "solrconfig-minimal.xml"), new
> + File(subHome, "solrconfig_ren.xml"));
> +
> +    FileUtils.copyFile(new File(srcDir,
> "solrconfig.snippet.randomindexconfig.xml"),
> +        new File(subHome, "solrconfig.snippet.randomindexconfig.xml"));
> +  }
> +
> +  @Test
> +  public void testCreateSavesSysProps() throws Exception {
> +
> +    setupCore(coreSysProps, true);
> +
> +    // create a new core (using CoreAdminHandler) w/ properties
> +    // Just to be sure its NOT written to the core.properties file
> +    File workDir = new File(solrHomeDirectory, coreSysProps);
> +    System.setProperty("INSTDIR_TEST", workDir.getAbsolutePath());
> +    System.setProperty("CONFIG_TEST", "solrconfig_ren.xml");
> +    System.setProperty("SCHEMA_TEST", "schema_ren.xml");
> +
> +    File dataDir = new File(workDir.getAbsolutePath(), "data_diff");
> +    System.setProperty("DATA_TEST", "data_diff");
> +
> +    SolrQueryResponse resp = new SolrQueryResponse();
> +    admin.handleRequestBody
> +        (req(CoreAdminParams.ACTION,
> +            CoreAdminParams.CoreAdminAction.CREATE.toString(),
> +            CoreAdminParams.NAME, coreSysProps,
> +            CoreAdminParams.INSTANCE_DIR, "${INSTDIR_TEST}",
> +            CoreAdminParams.CONFIG, "${CONFIG_TEST}",
> +            CoreAdminParams.SCHEMA, "${SCHEMA_TEST}",
> +            CoreAdminParams.DATA_DIR, "${DATA_TEST}"),
> +            resp);
> +    assertNull("Exception on create", resp.getException());
> +
> +    // verify props are in persisted file
> +
> +    Properties props = new Properties();
> +    File propFile = new File(solrHomeDirectory, coreSysProps + "/" +
> SolrCoreDiscoverer.CORE_PROP_FILE);
> +    FileInputStream is = new FileInputStream(propFile);
> +    try {
> +      props.load(is);
> +    } finally {
> +      org.apache.commons.io.IOUtils.closeQuietly(is);
> +    }
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.NAME), coreSysProps);
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.CONFIG), "${CONFIG_TEST}");
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.SCHEMA), "${SCHEMA_TEST}");
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.DATA_DIR), "${DATA_TEST}");
> +
> +    checkOnlyKnown(propFile);
> +
> +    // Now assert that certain values are properly dereferenced in the
> process of creating the core, see
> +    // SOLR-4982. Really, we should be able to just verify that the index 
> files
> exist.
> +
> +    // Should NOT be a datadir named ${DATA_TEST} (literal).
> +    File badDir = new File(workDir, "${DATA_TEST}");
> +    assertFalse("Should have substituted the sys var, found file " +
> + badDir.getAbsolutePath(), badDir.exists());
> +
> +    // For the other 3 vars, we couldn't get past creating the core if
> dereferencing didn't work correctly.
> +
> +    // Should have segments in the directory pointed to by the
> ${DATA_TEST}.
> +    File test = new File(dataDir, "index");
> +    assertTrue("Should have found index dir at " + test.getAbsolutePath(),
> test.exists());
> +    File gen = new File(test, "segments.gen");
> +    assertTrue("Should be segments.gen in the dir at " +
> + gen.getAbsolutePath(), gen.exists());
> +
> +  }
> +
> +  @Test
> +  public void testCreateSavesRegProps() throws Exception {
> +
> +    setupCore(coreNormal, true);
> +
> +    // create a new core (using CoreAdminHandler) w/ properties
> +    // Just to be sure its NOT written to the core.properties file
> +    File workDir = new File(solrHomeDirectory, coreNormal);
> +    File data = new File(workDir, "data");
> +
> +    SolrQueryResponse resp = new SolrQueryResponse();
> +    admin.handleRequestBody
> +        (req(CoreAdminParams.ACTION,
> +            CoreAdminParams.CoreAdminAction.CREATE.toString(),
> +            CoreAdminParams.NAME, coreNormal,
> +            CoreAdminParams.INSTANCE_DIR, workDir.getAbsolutePath(),
> +            CoreAdminParams.CONFIG, "solrconfig_ren.xml",
> +            CoreAdminParams.SCHEMA, "schema_ren.xml",
> +            CoreAdminParams.DATA_DIR, data.getAbsolutePath()),
> +            resp);
> +    assertNull("Exception on create", resp.getException());
> +
> +    // verify props are in persisted file
> +    Properties props = new Properties();
> +    File propFile = new File(solrHomeDirectory, coreNormal + "/" +
> SolrCoreDiscoverer.CORE_PROP_FILE);
> +    FileInputStream is = new FileInputStream(propFile);
> +    try {
> +      props.load(is);
> +    } finally {
> +      org.apache.commons.io.IOUtils.closeQuietly(is);
> +    }
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.NAME), coreNormal);
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.CONFIG),
> + "solrconfig_ren.xml");
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.SCHEMA), "schema_ren.xml");
> +
> +    assertEquals("Unexpected value preserved in properties file " +
> propFile.getAbsolutePath(),
> +        props.getProperty(CoreAdminParams.DATA_DIR),
> + data.getAbsolutePath());
> +
> +    checkOnlyKnown(propFile);
> +    // For the other 3 vars, we couldn't get past creating the core if
> dereferencing didn't work correctly.
> +
> +    // Should have segments in the directory pointed to by the
> ${DATA_TEST}.
> +    File test = new File(data, "index");
> +    assertTrue("Should have found index dir at " + test.getAbsolutePath(),
> test.exists());
> +    File gen = new File(test, "segments.gen");
> +    assertTrue("Should be segments.gen in the dir at " +
> + gen.getAbsolutePath(), gen.exists());
> +
> +  }
> +
> +  // Insure that all the props we've preserved are ones that _should_
> + be in the properties file  private void checkOnlyKnown(File propFile)
> + throws IOException {
> +
> +    Properties props = new Properties();
> +    FileInputStream is = new FileInputStream(propFile);
> +    try {
> +      props.load(is);
> +    } finally {
> +      org.apache.commons.io.IOUtils.closeQuietly(is);
> +    }
> +
> +    // Should never be preserving instanceDir in a core.properties file.
> +    assertFalse("Should not be preserving instanceDir!",
> + props.containsKey(CoreAdminParams.INSTANCE_DIR));
> +
> +    Collection<String> stds = new
> HashSet(Arrays.asList(CoreDescriptor.standardPropNames));
> +    for (String key : props.stringPropertyNames()) {
> +      assertTrue("Property '" + key + "' should NOT be preserved in the
> properties file", stds.contains(key));
> +    }
> +  }
> +}
> 
> Modified:
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA
> dminHandlerTest.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apa
> che/solr/handler/admin/CoreAdminHandlerTest.java?rev=1500284&r1=1500
> 283&r2=1500284&view=diff
> ==========================================================
> ====================
> ---
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/CoreA
> dminHandlerTest.java (original)
> +++
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/admin/Co
> +++ reAdminHandlerTest.java Sat Jul  6 14:45:47 2013
> @@ -17,9 +17,9 @@
> 
>  package org.apache.solr.handler.admin;
> 
> +import
> +com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
>  import org.apache.solr.core.CoreContainer;
>  import org.apache.solr.core.SolrCore;
> -import org.apache.solr.handler.admin.CoreAdminHandler;
>  import org.apache.solr.common.SolrException;
>  import org.apache.solr.common.params.CoreAdminParams;
>  import org.apache.solr.common.util.NamedList;
> @@ -28,15 +28,14 @@ import org.apache.solr.SolrTestCaseJ4;
> 
>  import java.util.Map;
>  import java.io.File;
> -import java.io.IOException;
> -
> -import javax.xml.xpath.XPathExpressionException;
> 
>  import org.apache.commons.io.FileUtils;
> 
>  import org.junit.BeforeClass;
> +import org.junit.Rule;
>  import org.junit.Test;
> -import org.xml.sax.SAXException;
> +import org.junit.rules.RuleChain;
> +import org.junit.rules.TestRule;
> 
>  public class CoreAdminHandlerTest extends SolrTestCaseJ4 {
> 
> @@ -44,7 +43,93 @@ public class CoreAdminHandlerTest extend
>    public static void beforeClass() throws Exception {
>      initCore("solrconfig.xml", "schema.xml");
>    }
> -
> +
> +  @Rule
> +  public TestRule solrTestRules = RuleChain.outerRule(new
> + SystemPropertiesRestoreRule());
> +
> +  public String getCoreName() { return this.getClass().getName() +
> + "_sys_vars"; }
> +
> +  @Test
> +  public void testCreateWithSysVars() throws Exception {
> +    useFactory(null); // I require FS-based indexes for this test.
> +
> +    final File workDir = new File(TEMP_DIR, getCoreName());
> +
> +    if (workDir.exists()) {
> +      FileUtils.deleteDirectory(workDir);
> +    }
> +    assertTrue("Failed to mkdirs workDir", workDir.mkdirs());
> +    String coreName = "with_sys_vars";
> +    File instDir = new File(workDir, coreName);
> +    File subHome = new File(instDir, "conf");
> +    assertTrue("Failed to make subdirectory ", subHome.mkdirs());
> +
> +    // Be sure we pick up sysvars when we create this
> +    String srcDir = SolrTestCaseJ4.TEST_HOME() + "/collection1/conf";
> +    FileUtils.copyFile(new File(srcDir, "schema-tiny.xml"), new File(subHome,
> "schema_ren.xml"));
> +    FileUtils.copyFile(new File(srcDir, "solrconfig-minimal.xml"), new
> File(subHome, "solrconfig_ren.xml"));
> +    FileUtils.copyFile(new File(srcDir,
> "solrconfig.snippet.randomindexconfig.xml"),
> +        new File(subHome, "solrconfig.snippet.randomindexconfig.xml"));
> +
> +    final CoreContainer cores = h.getCoreContainer();
> +    cores.setPersistent(false); // we'll do this explicitly as needed
> +
> +    final CoreAdminHandler admin = new CoreAdminHandler(cores);
> +
> +    // create a new core (using CoreAdminHandler) w/ properties
> +    System.setProperty("INSTDIR_TEST", instDir.getAbsolutePath());
> +    System.setProperty("CONFIG_TEST", "solrconfig_ren.xml");
> +    System.setProperty("SCHEMA_TEST", "schema_ren.xml");
> +
> +    File dataDir = new File(workDir.getAbsolutePath(), "data_diff");
> +    System.setProperty("DATA_TEST", dataDir.getAbsolutePath());
> +
> +    SolrQueryResponse resp = new SolrQueryResponse();
> +    admin.handleRequestBody
> +        (req(CoreAdminParams.ACTION,
> +            CoreAdminParams.CoreAdminAction.CREATE.toString(),
> +            CoreAdminParams.NAME, getCoreName(),
> +            CoreAdminParams.INSTANCE_DIR, "${INSTDIR_TEST}",
> +            CoreAdminParams.CONFIG, "${CONFIG_TEST}",
> +            CoreAdminParams.SCHEMA, "${SCHEMA_TEST}",
> +            CoreAdminParams.DATA_DIR, "${DATA_TEST}"),
> +            resp);
> +    assertNull("Exception on create", resp.getException());
> +
> +    // verify props are in persisted file
> +
> +    final File xml = new File(workDir, "persist-solr.xml");
> +    cores.persistFile(xml);
> +
> +    // First assert that these values are persisted.
> +    assertXmlFile
> +        (xml
> +            ,"/solr/cores/core[@name='" + getCoreName() + "' and
> @instanceDir='${INSTDIR_TEST}']"
> +            ,"/solr/cores/core[@name='" + getCoreName() + "' and
> @dataDir='${DATA_TEST}']"
> +            ,"/solr/cores/core[@name='" + getCoreName() + "' and
> @schema='${SCHEMA_TEST}']"
> +            ,"/solr/cores/core[@name='" + getCoreName() + "' and
> @config='${CONFIG_TEST}']"
> +        );
> +
> +    // Now assert that certain values are properly dereferenced in the
> process of creating the core, see
> +    // SOLR-4982.
> +
> +    // Should NOT be a datadir named ${DATA_TEST} (literal). This is the bug
> after all
> +    File badDir = new File(instDir, "${DATA_TEST}");
> +    assertFalse("Should have substituted the sys var, found file " +
> + badDir.getAbsolutePath(), badDir.exists());
> +
> +    // For the other 3 vars, we couldn't get past creating the core fi
> dereferencing didn't work correctly.
> +
> +    // Should have segments in the directory pointed to by the
> ${DATA_TEST}.
> +    File test = new File(dataDir, "index");
> +    assertTrue("Should have found index dir at " + test.getAbsolutePath(),
> test.exists());
> +    test = new File(test,"segments.gen");
> +    assertTrue("Should have found segments.gen at " +
> + test.getAbsolutePath(), test.exists());
> +
> +    // Cleanup
> +    FileUtils.deleteDirectory(workDir);
> +
> +  }
> +
>    @Test
>    public void testCoreAdminHandler() throws Exception {
>      final File workDir = new File(TEMP_DIR, this.getClass().getName()); @@ -
> 141,6 +226,8 @@ public class CoreAdminHandlerTest extend
> 
>      // :TODO: because of SOLR-3665 we can't ask for status from all cores
> 
> -  }
> +    // cleanup
> +    FileUtils.deleteDirectory(workDir);
> 
> +  }
>  }
> 
> Modified: lucene/dev/trunk/solr/test-
> framework/src/java/org/apache/solr/SolrTestCaseJ4.java
> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-
> framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1500284&r1=
> 1500283&r2=1500284&view=diff
> ==========================================================
> ====================
> --- lucene/dev/trunk/solr/test-
> framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
> +++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/SolrTe
> +++ stCaseJ4.java Sat Jul  6 14:45:47 2013
> @@ -21,6 +21,7 @@ import com.carrotsearch.randomizedtestin  import
> com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
>  import
> com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
>  import org.apache.commons.io.FileUtils;
> +import org.apache.lucene.util.IOUtils;
>  import org.apache.lucene.util.LuceneTestCase;
>  import org.apache.lucene.util.QuickPatchThreadsFilter;
>  import org.apache.solr.client.solrj.util.ClientUtils;
> @@ -32,9 +33,11 @@ import org.apache.solr.common.params.Com  import
> org.apache.solr.common.params.ModifiableSolrParams;
>  import org.apache.solr.common.params.SolrParams;
>  import org.apache.solr.common.util.XML;
> +import org.apache.solr.core.ConfigSolr;
>  import org.apache.solr.core.CoreContainer;
>  import org.apache.solr.core.SolrConfig;  import
> org.apache.solr.core.SolrCore;
> +import org.apache.solr.core.SolrResourceLoader;
>  import org.apache.solr.handler.JsonUpdateRequestHandler;
>  import org.apache.solr.request.LocalSolrQueryRequest;
>  import org.apache.solr.request.SolrQueryRequest;
> @@ -155,6 +158,25 @@ public abstract class SolrTestCaseJ4 ext
>      }
>    }
> 
> +  /**
> +   * Call this from @BeforeClass to set up the test harness and update
> handler with no cores.
> +   *
> +   * @param solrHome The solr home directory.
> +   * @param xmlStr - the text of an XML file to use. If null, use the what's 
> the
> absolute minimal file.
> +   * @throws Exception Lost of file-type things can go wrong.
> +   */
> +  public static void setupNoCoreTest(File solrHome, String xmlStr)
> + throws Exception {
> +
> +    File tmpFile = new File(solrHome, ConfigSolr.SOLR_XML_FILE);
> +    if (xmlStr == null) {
> +      xmlStr = "<solr></solr>";
> +    }
> +    FileUtils.write(tmpFile, xmlStr, IOUtils.CHARSET_UTF_8.toString());
> +
> +    SolrResourceLoader loader = new
> SolrResourceLoader(solrHome.getAbsolutePath());
> +    h = new TestHarness(loader, ConfigSolr.fromFile(loader, new
> File(solrHome, "solr.xml")));
> +    lrf = h.getRequestFactory("standard", 0, 20, CommonParams.VERSION,
> + "2.2");  }
> 
>    @Override
>    public void setUp() throws Exception {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to