You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ep...@apache.org on 2022/11/29 16:25:59 UTC

[solr] branch main updated: SOLR-16498: Tests to retrieve url from SolrClient (#1149)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 251136de064 SOLR-16498: Tests to retrieve url from SolrClient (#1149)
251136de064 is described below

commit 251136de064e7745b06be3ec3844ed86b68b3deb
Author: Joshua Ouma <jo...@gmail.com>
AuthorDate: Tue Nov 29 19:25:52 2022 +0300

    SOLR-16498: Tests to retrieve url from SolrClient (#1149)
    
    Reduce the casting to HttpSolrClient just to get the url out when we can instead access JettySolrRunner object that provides that variable.   Also introduced a getHttpClient() method on SolrJettyTestBase that gets the Apache HttpClient that we use in many tests.
    
    Started the process of referring to collection1 via the DEFAULT_TEST_COLLECTION_NAME constant.
    
    Co-authored-by: Eric Pugh <ep...@opensourceconnections.com>
---
 .../apache/solr/cloud/MultiThreadedOCPTest.java    | 11 ++--
 .../TestRequestStatusCollectionAPI.java            |  5 +-
 .../org/apache/solr/handler/TestBlobHandler.java   |  3 +-
 .../solr/handler/TestReplicationHandler.java       | 59 ++++++++--------------
 .../DistributedQueryElevationComponentTest.java    |  2 +-
 .../apache/solr/request/TestRemoteStreaming.java   | 32 +++++++-----
 .../apache/solr/schema/TestCloudManagedSchema.java |  4 +-
 .../org/apache/solr/servlet/CacheHeaderTest.java   | 32 ++++++------
 .../apache/solr/servlet/CacheHeaderTestBase.java   | 19 +++----
 .../org/apache/solr/servlet/NoCacheHeaderTest.java | 22 ++++----
 .../apache/solr/servlet/ResponseHeaderTest.java    |  8 +--
 .../solr/update/TestInPlaceUpdatesDistrib.java     |  8 +++
 .../client/solrj/SolrSchemalessExampleTest.java    | 14 ++---
 .../solr/client/solrj/TestSolrJErrorHandling.java  |  4 +-
 .../solrj/embedded/SolrExampleJettyTest.java       | 16 +++---
 .../java/org/apache/solr/SolrJettyTestBase.java    |  7 +++
 .../cloud/AbstractBasicDistributedZk2TestBase.java | 27 +++++-----
 .../solr/cloud/AbstractFullDistribZkTestBase.java  | 23 ++++-----
 .../solr/cloud/AbstractSyncSliceTestBase.java      |  5 +-
 19 files changed, 145 insertions(+), 156 deletions(-)

diff --git a/solr/core/src/test/org/apache/solr/cloud/MultiThreadedOCPTest.java b/solr/core/src/test/org/apache/solr/cloud/MultiThreadedOCPTest.java
index ea55fb02063..3f02637ff36 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MultiThreadedOCPTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MultiThreadedOCPTest.java
@@ -23,7 +23,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.Random;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest.Create;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest.SplitShard;
@@ -51,7 +50,7 @@ public class MultiThreadedOCPTest extends AbstractFullDistribZkTestBase {
 
   @Test
   public void testFillWorkQueue() throws Exception {
-    try (SolrClient client = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)))) {
+    try (SolrClient client = createNewSolrClient("", getBaseUrl(jettys.get(0)))) {
       // This test does not make sense when the Collection API execution is distributed. There is no
       // queue to fill
       if (!new CollectionAdminRequest.RequestApiDistributedProcessing()
@@ -147,7 +146,7 @@ public class MultiThreadedOCPTest extends AbstractFullDistribZkTestBase {
   @Test
   public void testParallelCollectionAPICalls() throws IOException, SolrServerException {
     final int ASYNC_SHIFT = 10000;
-    try (SolrClient client = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)))) {
+    try (SolrClient client = createNewSolrClient("", getBaseUrl(jettys.get(0)))) {
       for (int i = 1 + ASYNC_SHIFT; i <= NUM_COLLECTIONS + ASYNC_SHIFT; i++) {
         CollectionAdminRequest.createCollection("ocptest" + i, "conf1", 3, 1)
             .processAsync(String.valueOf(i), client);
@@ -188,7 +187,7 @@ public class MultiThreadedOCPTest extends AbstractFullDistribZkTestBase {
 
   @Test
   public void testTaskExclusivity() throws Exception, SolrServerException {
-    try (SolrClient client = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)))) {
+    try (SolrClient client = createNewSolrClient("", getBaseUrl(jettys.get(0)))) {
 
       Create createCollectionRequest =
           CollectionAdminRequest.createCollection("ocptest_shardsplit", "conf1", 4, 1);
@@ -246,7 +245,7 @@ public class MultiThreadedOCPTest extends AbstractFullDistribZkTestBase {
 
   @Test
   public void testDeduplicationOfSubmittedTasks() throws IOException, SolrServerException {
-    try (SolrClient client = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)))) {
+    try (SolrClient client = createNewSolrClient("", getBaseUrl(jettys.get(0)))) {
       CollectionAdminRequest.createCollection("ocptest_shardsplit2", "conf1", 3, 1)
           .processAsync("3000", client);
 
@@ -301,7 +300,7 @@ public class MultiThreadedOCPTest extends AbstractFullDistribZkTestBase {
           }
         };
     indexThread.start();
-    try (SolrClient client = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)))) {
+    try (SolrClient client = createNewSolrClient("", getBaseUrl(jettys.get(0)))) {
 
       SplitShard splitShardRequest =
           CollectionAdminRequest.splitShard("collection1").setShardName(SHARD1);
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java
index 36e1e4e81f6..e5545ee8eab 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java
@@ -22,7 +22,6 @@ import java.util.Arrays;
 import java.util.Map;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.response.RequestStatusState;
 import org.apache.solr.cloud.BasicDistributedZkTest;
@@ -222,9 +221,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
     QueryRequest request = new QueryRequest(params);
     request.setPath("/admin/collections");
 
-    String baseUrl =
-        ((HttpSolrClient) shardToJetty.get(SHARD1).get(0).client.getSolrClient()).getBaseURL();
-    baseUrl = baseUrl.substring(0, baseUrl.length() - "collection1".length());
+    String baseUrl = shardToJetty.get(SHARD1).get(0).jetty.getBaseUrl().toString();
 
     try (SolrClient baseServer = getHttpSolrClient(baseUrl, 15000)) {
       return baseServer.request(request);
diff --git a/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java b/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
index 1e2b51e34b2..8d4e8c68ad9 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestBlobHandler.java
@@ -36,7 +36,6 @@ import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
@@ -58,7 +57,7 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
   @Test
   public void doBlobHandlerTest() throws Exception {
 
-    try (SolrClient client = createNewSolrClient("", getBaseUrl((HttpSolrClient) clients.get(0)))) {
+    try (SolrClient client = createNewSolrClient("", getBaseUrl(jettys.get(0)))) {
       CollectionAdminResponse response1;
       CollectionAdminRequest.Create createCollectionRequest =
           CollectionAdminRequest.createCollection(".system", 1, 2);
diff --git a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
index c4b502c06b6..780781bd02c 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
@@ -34,7 +34,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import org.apache.lucene.index.DirectoryReader;
@@ -42,7 +41,7 @@ import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.NIOFSDirectory;
-import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.BaseDistributedSearchTestCase;
@@ -52,9 +51,7 @@ import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.embedded.JettyConfig;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.GenericSolrRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -64,7 +61,6 @@ import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
@@ -76,7 +72,6 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.StandardDirectoryFactory;
 import org.apache.solr.core.snapshots.SolrSnapshotMetaDataManager;
 import org.apache.solr.security.AllowListUrlChecker;
-import org.apache.solr.util.FileUtils;
 import org.apache.solr.util.TestInjection;
 import org.apache.solr.util.TimeOut;
 import org.hamcrest.MatcherAssert;
@@ -92,7 +87,7 @@ import org.slf4j.LoggerFactory;
  *
  * @since 1.4
  */
-@Nightly
+@LuceneTestCase.Nightly
 @SuppressSSL // Currently, unknown why SSL does not work with this test
 public class TestReplicationHandler extends SolrTestCaseJ4 {
 
@@ -178,23 +173,11 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
   }
 
   static JettySolrRunner createAndStartJetty(SolrInstance instance) throws Exception {
-    FileUtils.copyFile(
-        new File(SolrTestCaseJ4.TEST_HOME(), "solr.xml"),
-        new File(instance.getHomeDir(), "solr.xml"));
-    Properties nodeProperties = new Properties();
-    nodeProperties.setProperty("solr.data.dir", instance.getDataDir());
-    JettyConfig jettyConfig = JettyConfig.builder().setContext("/solr").setPort(0).build();
-    JettySolrRunner jetty = new JettySolrRunner(instance.getHomeDir(), nodeProperties, jettyConfig);
-    jetty.start();
-    return jetty;
+    return ReplicationTestHelper.createAndStartJetty(instance);
   }
 
-  static int index(SolrClient s, Object... fields) throws Exception {
-    SolrInputDocument doc = new SolrInputDocument();
-    for (int i = 0; i < fields.length; i += 2) {
-      doc.addField((String) (fields[i]), fields[i + 1]);
-    }
-    return s.add(doc).getStatus();
+  static int index(SolrClient client, Object... fields) throws Exception {
+    return ReplicationTestHelper.index(client, fields);
   }
 
   NamedList<Object> query(String query, SolrClient s) throws SolrServerException, IOException {
@@ -261,7 +244,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     return res;
   }
 
-  private NamedList<Object> reloadCore(SolrClient s, String core) throws Exception {
+  private void reloadCore(JettySolrRunner jettySolrRunner, String core) throws Exception {
 
     ModifiableSolrParams params = new ModifiableSolrParams();
     params.set("action", "reload");
@@ -269,15 +252,15 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     params.set("qt", "/admin/cores");
     QueryRequest req = new QueryRequest(params);
 
-    try (SolrClient adminClient = adminClient(s)) {
+    try (SolrClient adminClient = adminClient(jettySolrRunner)) {
       NamedList<Object> res = adminClient.request(req);
       assertNotNull("null response from server", res);
-      return res;
     }
   }
 
-  private SolrClient adminClient(SolrClient client) {
-    String adminUrl = ((HttpSolrClient) client).getBaseURL().replace("/collection1", "");
+  private SolrClient adminClient(JettySolrRunner client) {
+    String adminUrl =
+        client.getBaseUrl().toString().replace("/" + DEFAULT_TEST_COLLECTION_NAME, "");
     return getHttpSolrClient(adminUrl);
   }
 
@@ -1019,10 +1002,10 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
         assertEquals(totalDocs, leaderQueryResult.getNumFound());
 
         // index fetch
-        Date followerCoreStart = watchCoreStartAt(followerClient, null);
+        Date followerCoreStart = watchCoreStartAt(followerJetty, null);
         pullFromTo(leaderJetty, followerJetty);
         if (confCoreReload) {
-          watchCoreStartAt(followerClient, followerCoreStart);
+          watchCoreStartAt(followerJetty, followerCoreStart);
         }
 
         // get docs from follower and check if number is equal to leader
@@ -1353,7 +1336,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
 
     Object version = getIndexVersion(leaderClient).get("indexversion");
 
-    reloadCore(leaderClient, "collection1");
+    reloadCore(leaderJetty, DEFAULT_TEST_COLLECTION_NAME);
 
     assertEquals(version, getIndexVersion(leaderClient).get("indexversion"));
 
@@ -1433,7 +1416,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     rQuery(0, "*:*", followerClient); // sanity check w/retry
 
     // record collection1's start time on follower
-    final Date followerStartTime = watchCoreStartAt(followerClient, null);
+    final Date followerStartTime = watchCoreStartAt(followerJetty, null);
 
     // add a doc with new field and commit on leader to trigger index fetch from follower.
     index(leaderClient, "id", "2000", "name", "name = " + 2000, "newname", "n2000");
@@ -1441,7 +1424,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     rQuery(1, "newname:n2000", leaderClient); // sanity check
 
     // wait for follower to reload core by watching updated startTime
-    watchCoreStartAt(followerClient, followerStartTime);
+    watchCoreStartAt(followerJetty, followerStartTime);
 
     NamedList<Object> leaderQueryRsp2 = rQuery(1, "id:2000", leaderClient);
     SolrDocumentList leaderQueryResult2 = (SolrDocumentList) leaderQueryRsp2.get("response");
@@ -1780,22 +1763,22 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
   }
 
   /**
-   * Polls the SolrCore stats using the specified client until the "startTime" time for collection
-   * is after the specified "min". Will loop for at most "timeout" milliseconds before throwing an
-   * assertion failure.
+   * Polls the SolrCore stats using the specified jettySolrRunner until the "startTime" time for
+   * collection is after the specified "min". Will loop for at most "timeout" milliseconds before
+   * throwing an assertion failure.
    *
-   * @param client The SolrClient to poll
+   * @param jettySolrRunner The JettySolrRunner to poll
    * @param min the startTime value must exceed this value before the method will return, if null
    *     this method will return the first startTime value encountered.
    * @return the startTime value of collection
    */
   @SuppressWarnings("unchecked")
-  private Date watchCoreStartAt(SolrClient client, final Date min)
+  private Date watchCoreStartAt(JettySolrRunner jettySolrRunner, final Date min)
       throws InterruptedException, IOException, SolrServerException {
     final long sleepInterval = 200;
     long timeSlept = 0;
 
-    try (SolrClient adminClient = adminClient(client)) {
+    try (SolrClient adminClient = adminClient(jettySolrRunner)) {
       SolrParams p = params("action", "status", "core", "collection1");
       while (timeSlept < TIMEOUT) {
         QueryRequest req = new QueryRequest(p);
diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java
index 8381e272910..2de368f74c5 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedQueryElevationComponentTest.java
@@ -166,7 +166,7 @@ public class DistributedQueryElevationComponentTest extends BaseDistributedSearc
     assertEquals(true, document.getFieldValue("[elevated]"));
 
     // Force javabin format
-    final String clientUrl = ((HttpSolrClient) clients.get(0)).getBaseURL();
+    final String clientUrl = jettys.get(0).getBaseUrl() + "/collection1";
     SolrClient client = getHttpSolrClient(clientUrl);
     ((HttpSolrClient) client).setParser(new BinaryResponseParser());
     SolrQuery solrQuery =
diff --git a/solr/core/src/test/org/apache/solr/request/TestRemoteStreaming.java b/solr/core/src/test/org/apache/solr/request/TestRemoteStreaming.java
index 8438b3a111a..f7db16a7c87 100644
--- a/solr/core/src/test/org/apache/solr/request/TestRemoteStreaming.java
+++ b/solr/core/src/test/org/apache/solr/request/TestRemoteStreaming.java
@@ -32,7 +32,7 @@ import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
@@ -46,12 +46,14 @@ import org.junit.Test;
 @SuppressSSL // does not yet work with ssl yet - uses raw java.net.URL API rather than HttpClient
 public class TestRemoteStreaming extends SolrJettyTestBase {
 
+  private static JettySolrRunner jettySolrRunner;
+
   @BeforeClass
   public static void beforeTest() throws Exception {
     // this one has handleSelect=true which a test here needs
     File solrHomeDirectory = createTempDir(LuceneTestCase.getTestClass().getSimpleName()).toFile();
     setupJettyTestHome(solrHomeDirectory, "collection1");
-    createAndStartJetty(solrHomeDirectory.getAbsolutePath());
+    jettySolrRunner = createAndStartJetty(solrHomeDirectory.getAbsolutePath());
   }
 
   @AfterClass
@@ -70,25 +72,30 @@ public class TestRemoteStreaming extends SolrJettyTestBase {
 
   @Test
   public void testMakeDeleteAllUrl() throws Exception {
-    getUrlForString(makeDeleteAllUrl());
+    assertTrue(searchFindsIt());
+    attemptHttpGet(makeDeleteAllUrl());
     assertFalse(searchFindsIt());
   }
 
   @Test
   public void testStreamUrl() throws Exception {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
-    String streamUrl = client.getBaseURL() + "/select?q=*:*&fl=id&wt=csv";
+    String streamUrl =
+        jettySolrRunner.getBaseUrl().toString()
+            + "/"
+            + DEFAULT_TEST_COLLECTION_NAME
+            + "/select?q=*:*&fl=id&wt=csv";
 
     String getUrl =
-        client.getBaseURL()
+        jettySolrRunner.getBaseUrl().toString()
+            + "/"
+            + DEFAULT_TEST_COLLECTION_NAME
             + "/debug/dump?wt=xml&stream.url="
             + URLEncoder.encode(streamUrl, "UTF-8");
-    String content = getUrlForString(getUrl);
+    String content = attemptHttpGet(getUrl);
     assertTrue(content.contains("1234"));
-    // System.out.println(content);
   }
 
-  private String getUrlForString(String getUrl) throws IOException {
+  private String attemptHttpGet(String getUrl) throws IOException {
     Object obj = new URL(getUrl).getContent();
     if (obj instanceof InputStream) {
       InputStream inputStream = (InputStream) obj;
@@ -113,11 +120,12 @@ public class TestRemoteStreaming extends SolrJettyTestBase {
     assertSame(ErrorCode.BAD_REQUEST, ErrorCode.getErrorCode(se.code()));
   }
 
-  /** Compose an url that if you get it, it will delete all the data. */
+  /** Compose an HTTP GET url that will delete all the data. */
   private String makeDeleteAllUrl() throws UnsupportedEncodingException {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
     String deleteQuery = "<delete><query>*:*</query></delete>";
-    return client.getBaseURL()
+    return jettySolrRunner.getBaseUrl().toString()
+        + "/"
+        + DEFAULT_TEST_COLLECTION_NAME
         + "/update?commit=true&stream.body="
         + URLEncoder.encode(deleteQuery, "UTF-8");
   }
diff --git a/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java b/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
index 5b6fe56d36c..3d9acdc61b1 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
@@ -55,8 +55,8 @@ public class TestCloudManagedSchema extends AbstractFullDistribZkTestBase {
     int which = r.nextInt(clients.size());
     HttpSolrClient client = (HttpSolrClient) clients.get(which);
     String previousBaseURL = client.getBaseURL();
-    // Strip /collection1 step from baseURL - requests fail otherwise
-    client.setBaseURL(previousBaseURL.substring(0, previousBaseURL.lastIndexOf("/")));
+    // Set client to Solr root url - requests fail otherwise
+    client.setBaseURL(jettys.get(which).getBaseUrl().toString());
     NamedList<?> namedListResponse = client.request(request);
     client.setBaseURL(previousBaseURL); // Restore baseURL
     NamedList<?> status = (NamedList<?>) namedListResponse.get("status");
diff --git a/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTest.java b/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTest.java
index 77e45711e08..b845cb179bd 100644
--- a/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTest.java
@@ -59,7 +59,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
             f.getCanonicalPath(),
             CommonParams.STREAM_CONTENTTYPE,
             "text/csv");
-    HttpResponse response = getClient().execute(m);
+    HttpResponse response = getHttpClient().execute(m);
     assertEquals(200, response.getStatusLine().getStatusCode());
     checkVetoHeaders(response, true);
     Files.delete(f.toPath());
@@ -69,7 +69,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
   public void testCacheVetoException() throws Exception {
     HttpRequestBase m = getSelectMethod("GET", "q", "xyz_ignore_exception:solr", "qt", "standard");
     // We force an exception from Solr. This should emit "no-cache" HTTP headers
-    HttpResponse response = getClient().execute(m);
+    HttpResponse response = getHttpClient().execute(m);
     assertNotEquals(200, response.getStatusLine().getStatusCode());
     checkVetoHeaders(response, false);
   }
@@ -104,7 +104,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     // We do a first request to get the last modified
     // This must result in a 200 OK response
     HttpRequestBase get = getSelectMethod(method);
-    HttpResponse response = getClient().execute(get);
+    HttpResponse response = getHttpClient().execute(get);
     checkResponseBody(method, response);
 
     assertEquals(
@@ -121,7 +121,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     get = getSelectMethod(method);
     get.addHeader("If-Modified-Since", DateUtils.formatDate(new Date()));
 
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 304 NotModified response with current date",
@@ -131,7 +131,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     get = getSelectMethod(method);
     get.addHeader(
         "If-Modified-Since", DateUtils.formatDate(new Date(lastModified.getTime() - 10000)));
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 200 OK response with If-Modified-Since in the past",
@@ -143,7 +143,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     get.addHeader(
         "If-Unmodified-Since", DateUtils.formatDate(new Date(lastModified.getTime() - 10000)));
 
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 412 Precondition failed with If-Unmodified-Since in the past",
@@ -152,7 +152,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
 
     get = getSelectMethod(method);
     get.addHeader("If-Unmodified-Since", DateUtils.formatDate(new Date()));
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 200 OK response with If-Unmodified-Since and current date",
@@ -164,7 +164,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
   @Override
   protected void doETag(String method) throws Exception {
     HttpRequestBase get = getSelectMethod(method);
-    HttpResponse response = getClient().execute(get);
+    HttpResponse response = getHttpClient().execute(get);
     checkResponseBody(method, response);
 
     assertEquals(
@@ -183,7 +183,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     // we set a non-matching ETag
     get = getSelectMethod(method);
     get.addHeader("If-None-Match", "\"xyz123456\"");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-None-Match: Got no response code 200 in response to non matching ETag",
@@ -194,7 +194,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     get = getSelectMethod(method);
     get.addHeader("If-None-Match", "\"xyz1223\"");
     get.addHeader("If-None-Match", "\"1231323423\", \"1211211\",   " + etag);
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-None-Match: Got no response 304 to matching ETag",
@@ -204,7 +204,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     // we now set the special star ETag
     get = getSelectMethod(method);
     get.addHeader("If-None-Match", "*");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-None-Match: Got no response 304 for star ETag",
@@ -215,7 +215,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     // we set a non-matching ETag
     get = getSelectMethod(method);
     get.addHeader("If-Match", "\"xyz123456\"");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-Match: Got no response code 412 in response to non matching ETag",
@@ -226,7 +226,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     get = getSelectMethod(method);
     get.addHeader("If-Match", "\"xyz1223\"");
     get.addHeader("If-Match", "\"1231323423\", \"1211211\",   " + etag);
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-Match: Got no response 200 to matching ETag",
@@ -236,7 +236,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
     // now we set the special star ETag
     get = getSelectMethod(method);
     get.addHeader("If-Match", "*");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-Match: Got no response 200 to star ETag",
@@ -248,7 +248,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
   protected void doCacheControl(String method) throws Exception {
     if ("POST".equals(method)) {
       HttpRequestBase m = getSelectMethod(method);
-      HttpResponse response = getClient().execute(m);
+      HttpResponse response = getHttpClient().execute(m);
       checkResponseBody(method, response);
 
       Header head = response.getFirstHeader("Cache-Control");
@@ -258,7 +258,7 @@ public class CacheHeaderTest extends CacheHeaderTestBase {
       assertNull("We got an Expires  header in response to POST", head);
     } else {
       HttpRequestBase m = getSelectMethod(method);
-      HttpResponse response = getClient().execute(m);
+      HttpResponse response = getHttpClient().execute(m);
       checkResponseBody(method, response);
 
       Header head = response.getFirstHeader("Cache-Control");
diff --git a/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTestBase.java b/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTestBase.java
index 76f0484ba59..b372b4b3c8f 100644
--- a/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTestBase.java
+++ b/solr/core/src/test/org/apache/solr/servlet/CacheHeaderTestBase.java
@@ -20,7 +20,6 @@ import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpHead;
 import org.apache.http.client.methods.HttpPost;
@@ -29,13 +28,11 @@ import org.apache.http.client.utils.URLEncodedUtils;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 import org.apache.solr.SolrJettyTestBase;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.junit.Test;
 
 public abstract class CacheHeaderTestBase extends SolrJettyTestBase {
 
   protected HttpRequestBase getSelectMethod(String method, String... params) {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
     HttpRequestBase m = null;
 
     ArrayList<BasicNameValuePair> qparams = new ArrayList<>();
@@ -49,7 +46,9 @@ public abstract class CacheHeaderTestBase extends SolrJettyTestBase {
 
     URI uri =
         URI.create(
-            client.getBaseURL()
+            jetty.getBaseUrl().toString()
+                + "/"
+                + DEFAULT_TEST_COLLECTION_NAME
                 + "/select?"
                 + URLEncodedUtils.format(qparams, StandardCharsets.UTF_8));
 
@@ -64,8 +63,7 @@ public abstract class CacheHeaderTestBase extends SolrJettyTestBase {
     return m;
   }
 
-  protected HttpRequestBase getUpdateMethod(String method, String... params) {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
+  HttpRequestBase getUpdateMethod(String method, String... params) {
     HttpRequestBase m = null;
 
     ArrayList<BasicNameValuePair> qparams = new ArrayList<>();
@@ -75,7 +73,9 @@ public abstract class CacheHeaderTestBase extends SolrJettyTestBase {
 
     URI uri =
         URI.create(
-            client.getBaseURL()
+            jetty.getBaseUrl()
+                + "/"
+                + DEFAULT_TEST_COLLECTION_NAME
                 + "/update?"
                 + URLEncodedUtils.format(qparams, StandardCharsets.UTF_8));
 
@@ -90,11 +90,6 @@ public abstract class CacheHeaderTestBase extends SolrJettyTestBase {
     return m;
   }
 
-  protected HttpClient getClient() {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
-    return client.getHttpClient();
-  }
-
   protected void checkResponseBody(String method, HttpResponse resp) throws Exception {
     String responseBody = "";
 
diff --git a/solr/core/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java b/solr/core/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java
index 78bc6f05bca..02e5f2422be 100644
--- a/solr/core/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/servlet/NoCacheHeaderTest.java
@@ -63,7 +63,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     // We do a first request to get the last modified
     // This must result in a 200 OK response
     HttpRequestBase get = getSelectMethod(method);
-    HttpResponse response = getClient().execute(get);
+    HttpResponse response = getHttpClient().execute(get);
     checkResponseBody(method, response);
 
     assertEquals(
@@ -78,7 +78,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     get = getSelectMethod(method);
     get.addHeader("If-Modified-Since", DateUtils.formatDate(new Date()));
 
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 200 with If-Modified-Since header. We should never get a 304 here",
@@ -88,7 +88,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     get = getSelectMethod(method);
     get.addHeader(
         "If-Modified-Since", DateUtils.formatDate(new Date(System.currentTimeMillis() - 10000)));
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 200 with If-Modified-Since header. We should never get a 304 here",
@@ -100,7 +100,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     get.addHeader(
         "If-Unmodified-Since", DateUtils.formatDate(new Date(System.currentTimeMillis() - 10000)));
 
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 200 with If-Unmodified-Since header. We should never get a 304 here",
@@ -109,7 +109,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
 
     get = getSelectMethod(method);
     get.addHeader("If-Unmodified-Since", DateUtils.formatDate(new Date()));
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "Expected 200 with If-Unmodified-Since header. We should never get a 304 here",
@@ -121,7 +121,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
   @Override
   protected void doETag(String method) throws Exception {
     HttpRequestBase get = getSelectMethod(method);
-    HttpResponse response = getClient().execute(get);
+    HttpResponse response = getHttpClient().execute(get);
     checkResponseBody(method, response);
 
     assertEquals(
@@ -136,7 +136,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     // we set a non-matching ETag
     get = getSelectMethod(method);
     get.addHeader("If-None-Match", "\"xyz123456\"");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-None-Match: Got no response code 200 in response to non matching ETag",
@@ -146,7 +146,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     // we now set the special star ETag
     get = getSelectMethod(method);
     get.addHeader("If-None-Match", "*");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-None-Match: Got no response 200 for star ETag",
@@ -157,7 +157,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     // we set a non-matching ETag
     get = getSelectMethod(method);
     get.addHeader("If-Match", "\"xyz123456\"");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-Match: Got no response code 200 in response to non matching ETag",
@@ -167,7 +167,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
     // now we set the special star ETag
     get = getSelectMethod(method);
     get.addHeader("If-Match", "*");
-    response = getClient().execute(get);
+    response = getHttpClient().execute(get);
     checkResponseBody(method, response);
     assertEquals(
         "If-Match: Got no response 200 to star ETag",
@@ -178,7 +178,7 @@ public class NoCacheHeaderTest extends CacheHeaderTestBase {
   @Override
   protected void doCacheControl(String method) throws Exception {
     HttpRequestBase m = getSelectMethod(method);
-    HttpResponse response = getClient().execute(m);
+    HttpResponse response = getHttpClient().execute(m);
     checkResponseBody(method, response);
 
     Header head = response.getFirstHeader("Cache-Control");
diff --git a/solr/core/src/test/org/apache/solr/servlet/ResponseHeaderTest.java b/solr/core/src/test/org/apache/solr/servlet/ResponseHeaderTest.java
index daa587369ee..62fd7fa6c22 100644
--- a/solr/core/src/test/org/apache/solr/servlet/ResponseHeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/servlet/ResponseHeaderTest.java
@@ -22,11 +22,9 @@ import java.net.URI;
 import org.apache.commons.io.FileUtils;
 import org.apache.http.Header;
 import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.solr.SolrJettyTestBase;
 import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.handler.component.ResponseBuilder;
 import org.apache.solr.handler.component.SearchComponent;
 import org.junit.AfterClass;
@@ -57,11 +55,9 @@ public class ResponseHeaderTest extends SolrJettyTestBase {
 
   @Test
   public void testHttpResponse() throws IOException {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
-    HttpClient httpClient = client.getHttpClient();
-    URI uri = URI.create(client.getBaseURL() + "/withHeaders?q=*:*");
+    URI uri = URI.create(jetty.getBaseUrl() + "/collection1/withHeaders?q=*:*");
     HttpGet httpGet = new HttpGet(uri);
-    HttpResponse response = httpClient.execute(httpGet);
+    HttpResponse response = getHttpClient().execute(httpGet);
     Header[] headers = response.getAllHeaders();
     boolean containsWarningHeader = false;
     for (Header header : headers) {
diff --git a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
index 64078919cf0..ec1f468e336 100644
--- a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
+++ b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
@@ -1489,6 +1489,14 @@ public class TestInPlaceUpdatesDistrib extends AbstractFullDistribZkTestBase {
     return slice.getLeader().getCoreUrl();
   }
 
+  protected String getBaseUrl(HttpSolrClient client) {
+    // take a complete Solr url that ends with /collection1 and truncates it to the root url
+    // that is used for admin api calls.
+    return client
+        .getBaseURL()
+        .substring(0, client.getBaseURL().length() - DEFAULT_COLLECTION.length() - 1);
+  }
+
   UpdateRequest regularUpdateRequest(Object... fields) {
     UpdateRequest ur = new UpdateRequest();
     SolrInputDocument doc = sdoc(fields);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/SolrSchemalessExampleTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/SolrSchemalessExampleTest.java
index 16e18076799..daf9c2a677d 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/SolrSchemalessExampleTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/SolrSchemalessExampleTest.java
@@ -75,15 +75,16 @@ public class SolrSchemalessExampleTest extends SolrExampleTestsBase {
 
   @Test
   public void testArbitraryJsonIndexing() throws Exception {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
+    SolrClient client = getSolrClient();
     client.deleteByQuery("*:*");
     client.commit();
     assertNumFound("*:*", 0); // make sure it got in
 
     // two docs, one with uniqueKey, another without it
     String json = "{\"id\":\"abc1\", \"name\": \"name1\"} {\"name\" : \"name2\"}";
-    HttpClient httpClient = client.getHttpClient();
-    HttpPost post = new HttpPost(client.getBaseURL() + "/update/json/docs");
+    HttpClient httpClient = getHttpClient();
+    HttpPost post =
+        new HttpPost(jetty.getBaseUrl() + "/" + DEFAULT_TEST_COLLECTION_NAME + "/update/json/docs");
     post.setHeader("Content-Type", "application/json");
     post.setEntity(
         new InputStreamEntity(new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)), -1));
@@ -97,7 +98,7 @@ public class SolrSchemalessExampleTest extends SolrExampleTestsBase {
 
   @Test
   public void testFieldMutating() throws Exception {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
+    SolrClient client = getSolrClient();
     client.deleteByQuery("*:*");
     client.commit();
     assertNumFound("*:*", 0); // make sure it got in
@@ -110,8 +111,9 @@ public class SolrSchemalessExampleTest extends SolrExampleTestsBase {
             + "{\"p%q\" : \"name\"}"
             + "{\"p.q\" : \"name\"}"
             + "{\"a&b\" : \"name\"}";
-    HttpClient httpClient = client.getHttpClient();
-    HttpPost post = new HttpPost(client.getBaseURL() + "/update/json/docs");
+    HttpClient httpClient = getHttpClient();
+    HttpPost post =
+        new HttpPost(jetty.getBaseUrl() + "/" + DEFAULT_TEST_COLLECTION_NAME + "/update/json/docs");
     post.setHeader("Content-Type", "application/json");
     post.setEntity(
         new InputStreamEntity(new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)), -1));
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java b/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java
index 52249b35ac3..ab7840a1a35 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/TestSolrJErrorHandling.java
@@ -270,9 +270,7 @@ public class TestSolrJErrorHandling extends SolrJettyTestBase {
     // sometimes succeeds with this size, but larger can cause OOM from command line
     String bodyString = getJsonDocs(200000);
 
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
-
-    String urlString = client.getBaseURL() + "/update";
+    String urlString = jetty.getBaseUrl() + "/" + DEFAULT_TEST_COLLECTION_NAME + "/update";
 
     HttpURLConnection conn = null;
     URL url = new URL(urlString);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
index 57a026546f6..09a37dd01f1 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
@@ -34,6 +34,7 @@ import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.InputStreamEntity;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
+import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrExampleTests;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -72,15 +73,17 @@ public class SolrExampleJettyTest extends SolrExampleTests {
 
   @Test
   public void testArbitraryJsonIndexing() throws Exception {
-    HttpSolrClient client = (HttpSolrClient) getSolrClient();
+    SolrClient client = getSolrClient();
     client.deleteByQuery("*:*");
     client.commit();
     assertNumFound("*:*", 0); // make sure it got in
 
     // two docs, one with uniqueKey, another without it
     String json = "{\"id\":\"abc1\", \"name\": \"name1\"} {\"name\" : \"name2\"}";
-    HttpClient httpClient = client.getHttpClient();
-    HttpPost post = new HttpPost(getUri(client));
+    HttpClient httpClient = getHttpClient();
+    HttpPost post =
+        new HttpPost(
+            getRandomizedUpdateUri(jetty.getBaseUrl() + "/" + DEFAULT_TEST_COLLECTION_NAME));
     post.setHeader("Content-Type", "application/json");
     post.setEntity(
         new InputStreamEntity(new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8)), -1));
@@ -104,11 +107,10 @@ public class SolrExampleJettyTest extends SolrExampleTests {
     assertEquals("name2", m.get("name"));
   }
 
-  private String getUri(HttpSolrClient client) {
-    String baseURL = client.getBaseURL();
+  private String getRandomizedUpdateUri(String baseUrl) {
     return random().nextBoolean()
-        ? baseURL.replace("/collection1", "/____v2/cores/collection1/update")
-        : baseURL + "/update/json/docs";
+        ? baseUrl.replace("/collection1", "/____v2/cores/collection1/update")
+        : baseUrl + "/update/json/docs";
   }
 
   @Test
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java b/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
index 42d3f6e7960..b3fb4237ada 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
@@ -28,10 +28,12 @@ import java.nio.file.Path;
 import java.util.Properties;
 import java.util.SortedMap;
 import org.apache.commons.io.file.PathUtils;
+import org.apache.http.client.HttpClient;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.util.DirectoryUtil;
 import org.apache.solr.util.ExternalPaths;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -164,6 +166,11 @@ public abstract class SolrJettyTestBase extends SolrTestCaseJ4 {
     }
   }
 
+  public HttpClient getHttpClient() {
+    HttpSolrClient client = (HttpSolrClient) getSolrClient();
+    return client.getHttpClient();
+  }
+
   // Sets up the necessary config files for Jetty. At least some tests require that the solrconfig
   // from the test file directory are used, but some also require that the solr.xml file be
   // explicitly there as of SOLR-4817
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZk2TestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZk2TestBase.java
index 24488e60685..2afb6ef2442 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZk2TestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZk2TestBase.java
@@ -24,7 +24,7 @@ import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
+import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -176,8 +176,8 @@ public abstract class AbstractBasicDistributedZk2TestBase extends AbstractFullDi
     ZkStateReader.from(cloudClient).getLeaderRetry(ONE_NODE_COLLECTION, SHARD1, 30000);
 
     int docs = 2;
-    for (SolrClient client : clients) {
-      final String clientUrl = getBaseUrl((HttpSolrClient) client);
+    for (JettySolrRunner jetty : jettys) {
+      final String clientUrl = getBaseUrl(jetty);
       addAndQueryDocs(clientUrl, docs);
       docs += 2;
     }
@@ -188,33 +188,34 @@ public abstract class AbstractBasicDistributedZk2TestBase extends AbstractFullDi
 
     SolrQuery query = new SolrQuery("*:*");
 
-    try (HttpSolrClient qclient = getHttpSolrClient(baseUrl + "/onenodecollection" + "core")) {
+    String collectionUrl = baseUrl + "/onenodecollection" + "core";
+    try (SolrClient client = getHttpSolrClient(collectionUrl)) {
 
       // it might take a moment for the proxy node to see us in their cloud state
-      waitForNon403or404or503(qclient);
+      waitForNon403or404or503(client, collectionUrl);
 
       // add a doc
       SolrInputDocument doc = new SolrInputDocument();
       doc.addField("id", docs);
-      qclient.add(doc);
-      qclient.commit();
+      client.add(doc);
+      client.commit();
 
-      QueryResponse results = qclient.query(query);
+      QueryResponse results = client.query(query);
       assertEquals(docs - 1, results.getResults().getNumFound());
     }
 
-    try (SolrClient qclient = getHttpSolrClient(baseUrl + "/onenodecollection")) {
-      QueryResponse results = qclient.query(query);
+    try (SolrClient client = getHttpSolrClient(baseUrl + "/onenodecollection")) {
+      QueryResponse results = client.query(query);
       assertEquals(docs - 1, results.getResults().getNumFound());
 
       SolrInputDocument doc = new SolrInputDocument();
       doc.addField("id", docs + 1);
-      qclient.add(doc);
-      qclient.commit();
+      client.add(doc);
+      client.commit();
 
       query = new SolrQuery("*:*");
       query.set("rows", 0);
-      results = qclient.query(query);
+      results = client.query(query);
       assertEquals(docs, results.getResults().getNumFound());
     }
   }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index 4a3c47474eb..62ec5f66748 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -2082,7 +2082,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
 
     CollectionAdminResponse res = new CollectionAdminResponse();
     if (client == null) {
-      final String baseUrl = getBaseUrl((HttpSolrClient) clients.get(clientIndex));
+      final String baseUrl = getBaseUrl(jettys.get(clientIndex));
       try (SolrClient adminClient = createNewSolrClient("", baseUrl)) {
         res.setResponse(adminClient.request(request));
       }
@@ -2207,10 +2207,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
     }
   }
 
-  protected String getBaseUrl(HttpSolrClient client) {
-    return client
-        .getBaseURL()
-        .substring(0, client.getBaseURL().length() - DEFAULT_COLLECTION.length() - 1);
+  protected String getBaseUrl(JettySolrRunner jetty) {
+    return jetty.getBaseUrl().toString();
   }
 
   public static SolrInputDocument getDoc(Object... fields) throws Exception {
@@ -2341,7 +2339,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
     throw new RuntimeException("Could not find a live node for collection:" + collection);
   }
 
-  public static void waitForNon403or404or503(HttpSolrClient collectionClient) throws Exception {
+  public static void waitForNon403or404or503(SolrClient collectionClient, String baseUrl)
+      throws Exception {
     SolrException exp = null;
     final TimeOut timeout = new TimeOut(30, TimeUnit.SECONDS, TimeSource.NANO_TIME);
 
@@ -2363,11 +2362,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
       Thread.sleep(50);
     }
 
-    fail(
-        "Could not find the new collection - "
-            + exp.code()
-            + " : "
-            + collectionClient.getBaseURL());
+    fail("Could not find the new collection - " + exp.code() + " : " + baseUrl);
   }
 
   protected void createCollection(
@@ -2841,8 +2836,10 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
   }
 
   protected void setupRestTestHarnesses() {
-    for (final SolrClient client : clients) {
-      RestTestHarness harness = new RestTestHarness(() -> ((HttpSolrClient) client).getBaseURL());
+    for (final JettySolrRunner jetty : jettys) {
+      RestTestHarness harness =
+          new RestTestHarness(
+              () -> jetty.getBaseUrl().toString() + "/" + DEFAULT_TEST_COLLECTION_NAME);
       restTestHarnesses.add(harness);
     }
   }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
index 6efa386ff38..6b177d3dc5e 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
@@ -29,7 +29,6 @@ import java.util.stream.Collectors;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrInputDocument;
@@ -102,9 +101,7 @@ public abstract class AbstractSyncSliceTestBase extends AbstractFullDistribZkTes
     QueryRequest request = new QueryRequest(params);
     request.setPath("/admin/collections");
 
-    String baseUrl =
-        ((HttpSolrClient) shardToJetty.get("shard1").get(2).client.solrClient).getBaseURL();
-    baseUrl = baseUrl.substring(0, baseUrl.length() - "collection1".length());
+    String baseUrl = shardToJetty.get(SHARD1).get(2).jetty.getBaseUrl().toString();
 
     // we only set the connect timeout, not so timeout
     try (SolrClient baseClient = getHttpSolrClient(baseUrl, 30000)) {