This is an automated email from the ASF dual-hosted git repository.

dsmiley pushed a commit to branch branch_10x
in repository https://gitbox.apache.org/repos/asf/solr.git

commit 4f4bf3e713a983262a8ff03fcf1c38ef7c8a045e
Author: Dawid Weiss <[email protected]>
AuthorDate: Sun Apr 12 18:35:19 2026 +0200

    SOLR-18092: fix solr-test-framework for 3rd party -- ExternalPaths NPE 
(#4225)
    
    Co-authored-by: David Smiley <[email protected]>
---
 ...OLR-18171-test-framework-external-usage-NPE.yml | 12 +++++++++++
 .../src/java/org/apache/solr/SolrTestCase.java     |  3 +--
 .../java/org/apache/solr/util/ExternalPaths.java   | 25 ++++++++++++----------
 3 files changed, 27 insertions(+), 13 deletions(-)

diff --git 
a/changelog/unreleased/SOLR-18171-test-framework-external-usage-NPE.yml 
b/changelog/unreleased/SOLR-18171-test-framework-external-usage-NPE.yml
new file mode 100644
index 00000000000..d22fa358c5a
--- /dev/null
+++ b/changelog/unreleased/SOLR-18171-test-framework-external-usage-NPE.yml
@@ -0,0 +1,12 @@
+title: solr-test-framework isn't usable outside Solr, a 10.0 regression.
+type: fixed
+authors:
+  - name: Dawid Weiss
+  - name: David Smiley
+  - name: Eric Pugh
+  - name: hossman
+links:
+  - name: SOLR-18092
+    url: https://issues.apache.org/jira/browse/SOLR-18092
+
+
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java 
b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
index d7a0475fc7b..d1c3e539bf1 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
@@ -25,7 +25,6 @@ import 
com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
 import com.carrotsearch.randomizedtesting.rules.TestRuleAdapter;
 import java.lang.invoke.MethodHandles;
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.Objects;
@@ -130,7 +129,7 @@ public class SolrTestCase extends LuceneTestCase {
       return;
     }
     final Path extPath = ExternalPaths.DEFAULT_CONFIGSET;
-    if (Files.isReadable(extPath /* implies exists() */) && 
Files.isDirectory(extPath)) {
+    if (extPath != null) {
       log.info(
           "Setting '{}' system property to test-framework derived value of 
'{}'",
           ConfigSetService.SOLR_CONFIGSET_DEFAULT_CONFDIR,
diff --git 
a/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java 
b/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java
index 940ec58b9e9..638a6fe3774 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java
@@ -30,38 +30,38 @@ import org.apache.solr.common.SolrException;
 public class ExternalPaths {
 
   /**
-   * The main directory path for the solr source being built if it can be 
determined. If it can not
+   * The main directory path for the solr source being built if it can be 
determined. If it cannot
    * be determined -- possibly because the current context is a client code 
base using the test
    * framework -- then this variable will be null.
    *
    * <p>Note that all other static paths available in this class are derived 
from the source home,
-   * and if it is null, those paths will just be relative to 'null' and may 
not be meaningful.
+   * and if it is null, those paths will be null as well.
    */
-  public static final Path SOURCE_HOME = determineSourceHome();
+  public static final Path SOURCE_HOME = determineSourceHome(); // absolute
 
   /**
    * @see #SOURCE_HOME
    */
-  public static Path WEBAPP_HOME = 
SOURCE_HOME.resolve("webapp/web").toAbsolutePath();
+  public static Path WEBAPP_HOME = SOURCE_HOME == null ? null : 
SOURCE_HOME.resolve("webapp/web");
 
   /**
    * @see #SOURCE_HOME
    */
   public static Path DEFAULT_CONFIGSET =
-      
SOURCE_HOME.resolve("server/solr/configsets/_default/conf").toAbsolutePath();
+      SOURCE_HOME == null ? null : 
SOURCE_HOME.resolve("server/solr/configsets/_default/conf");
 
   /**
    * @see #SOURCE_HOME
    */
   public static Path TECHPRODUCTS_CONFIGSET =
-      SOURCE_HOME
-          .resolve("server/solr/configsets/sample_techproducts_configs/conf")
-          .toAbsolutePath();
+      SOURCE_HOME == null
+          ? null
+          : 
SOURCE_HOME.resolve("server/solr/configsets/sample_techproducts_configs/conf");
 
   /**
    * @see #SOURCE_HOME
    */
-  public static Path SERVER_HOME = 
SOURCE_HOME.resolve("server/solr").toAbsolutePath();
+  public static Path SERVER_HOME = SOURCE_HOME == null ? null : 
SOURCE_HOME.resolve("server/solr");
 
   /**
    * Ugly, ugly hack to determine the example home without depending on the 
CWD this is needed for
@@ -83,10 +83,13 @@ public class ExternalPaths {
       }
 
       Path base = file.toAbsolutePath();
-      while (!Files.exists(base.resolve("solr/test-framework/build.gradle")) 
&& null != base) {
+      while (!Files.exists(base.resolve("test-framework/build.gradle"))) {
         base = base.getParent();
+        if (base == null) {
+          return null;
+        }
       }
-      return (null == base) ? null : base.resolve("solr/").toAbsolutePath();
+      return base;
     } catch (Exception e) {
       // all bets are off
       throw new SolrException(

Reply via email to