You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ja...@apache.org on 2023/09/21 17:47:07 UTC

[solr] branch branch_9x updated: SOLR-16979: Randomize port number of Solr in BATS tests (#1946)

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

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


The following commit(s) were added to refs/heads/branch_9x by this push:
     new fb32cc28835 SOLR-16979: Randomize port number of Solr in BATS tests (#1946)
fb32cc28835 is described below

commit fb32cc28835e42c128c53f8edc547dd681ad70ea
Author: Jan Høydahl <ja...@users.noreply.github.com>
AuthorDate: Thu Sep 21 19:47:01 2023 +0200

    SOLR-16979: Randomize port number of Solr in BATS tests (#1946)
    
    (cherry picked from commit 7eda6a1d32f42e4052351a83670c636b983b561c)
---
 solr/CHANGES.txt                                   |  2 +
 .../java/org/apache/solr/cli/RunExampleTool.java   | 11 ++++-
 solr/packaging/build.gradle                        | 17 ++++++-
 solr/packaging/test/README.md                      |  5 +-
 solr/packaging/test/bats_helper.bash               | 10 ++--
 solr/packaging/test/test_example_noprompt.bats     |  3 +-
 solr/packaging/test/test_export.bats               | 16 +++----
 solr/packaging/test/test_extraction.bats           | 18 ++++----
 solr/packaging/test/test_modules.bats              |  4 +-
 solr/packaging/test/test_packages.bats             |  2 +-
 solr/packaging/test/test_placement_plugin.bats     |  4 +-
 solr/packaging/test/test_post.bats                 | 36 +++++++--------
 solr/packaging/test/test_postlogs.bats             |  8 ++--
 solr/packaging/test/test_security_manager.bats     |  4 +-
 solr/packaging/test/test_ssl.bats                  | 54 +++++++++++-----------
 solr/packaging/test/test_start_solr.bats           | 18 ++++----
 solr/packaging/test/test_status.bats               |  2 +-
 solr/packaging/test/test_zk.bats                   | 18 ++++----
 ..._example_noprompt.bats => test_zz_cleanup.bats} | 19 ++++----
 19 files changed, 143 insertions(+), 108 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 8138ad6fc00..1b73db489df 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -160,6 +160,8 @@ Other Changes
 
 * SOLR-16623: new SolrJettyTestRule for tests needing HTTP or Jetty. (David Smiley, Joshua Ouma)
 
+* SOLR-16979: BATS integration tests now start solr instances on a randomly selected port (janhoy)
+
 * SOLR-16978: Be case insensitive when parsing booleans from text (Tomás Fernández Löbbe)
 
 ==================  9.3.0 ==================
diff --git a/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java b/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java
index 47dfaf30d6f..4cc5cd25647 100644
--- a/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java
@@ -248,7 +248,9 @@ public class RunExampleTool extends ToolBase {
 
     boolean isCloudMode = cli.hasOption('c');
     String zkHost = cli.getOptionValue('z');
-    int port = Integer.parseInt(cli.getOptionValue('p', "8983"));
+    int port =
+        Integer.parseInt(
+            cli.getOptionValue('p', System.getenv().getOrDefault("SOLR_PORT", "8983")));
     Map<String, Object> nodeStatus =
         startSolr(new File(exDir, "solr"), isCloudMode, cli, port, zkHost, 30);
 
@@ -425,6 +427,13 @@ public class RunExampleTool extends ToolBase {
     boolean prompt = !cli.hasOption("noprompt");
     int numNodes = 2;
     int[] cloudPorts = new int[] {8983, 7574, 8984, 7575};
+    int defaultPort =
+        Integer.parseInt(
+            cli.getOptionValue('p', System.getenv().getOrDefault("SOLR_PORT", "8983")));
+    if (defaultPort != 8983) {
+      // Override the old default port numbers if user has started the example overriding SOLR_PORT
+      cloudPorts = new int[] {defaultPort, defaultPort + 1, defaultPort + 2, defaultPort + 3};
+    }
     File cloudDir = new File(exampleDir, "cloud");
     if (!cloudDir.isDirectory()) cloudDir.mkdir();
 
diff --git a/solr/packaging/build.gradle b/solr/packaging/build.gradle
index aa366eaafd6..b028155985c 100644
--- a/solr/packaging/build.gradle
+++ b/solr/packaging/build.gradle
@@ -238,6 +238,15 @@ task integrationTests(type: BatsTask) {
   def integrationTestOutput = "$buildDir/test-output"
   def solrHome = "$integrationTestOutput/solr-home"
   def solrTestFailuresDir = "$integrationTestOutput/failure-snapshots"
+  var solrPort = Integer.parseInt((String) project.findProperty('bats.port') ?: System.getProperty("bats.port", "-1"))
+  while (solrPort > 64000 || solrPort < 0) { // We need room for +1000 for ZK
+    try (ServerSocket s = new ServerSocket(0)) {
+      solrPort = s.getLocalPort()
+    } catch (Exception e) {
+      println("WARN: Could not assign random port for Bats tests. Using default port 8983.")
+      solrPort = 8983
+    }
+  }
 
   inputs.dir(distDir)
   outputs.dir(integrationTestOutput)
@@ -250,11 +259,16 @@ task integrationTests(type: BatsTask) {
 
     // TODO - if quiet then don't tee
     standardOutput = new TeeOutputStream(System.out, new FileOutputStream("$integrationTestOutput/test-output.txt"))
-
+    println("Running BATS tests with Solr base port ${solrPort}")
   }
 
   environment SOLR_TIP: distDir.toString()
   environment SOLR_HOME: solrHome
+  environment SOLR_PID_DIR: solrHome
+  environment SOLR_PORT: solrPort
+  environment SOLR2_PORT: solrPort + 1
+  environment SOLR3_PORT: solrPort + 2
+  environment ZK_PORT: solrPort + 1000
   environment SOLR_LOGS_DIR: "$solrHome/logs"
   environment TEST_OUTPUT_DIR: integrationTestOutput
   environment TEST_FAILURE_DIR: solrTestFailuresDir
@@ -283,6 +297,7 @@ class BatsTask extends Exec {
     // Additional debugging output: -x, --verbose-run
     setArgs(['-T', '--print-output-on-failure'] + (testFiles.empty ? testDir : testFiles))
 
+
     super.exec()
   }
 }
diff --git a/solr/packaging/test/README.md b/solr/packaging/test/README.md
index 93599e3b3fe..bd73d494589 100644
--- a/solr/packaging/test/README.md
+++ b/solr/packaging/test/README.md
@@ -31,8 +31,9 @@ Individual test files can be selected by specifying the `--tests [test_file.bats
  The `--tests` option may be repeated to select multiple test files to run.
  Wildcarding or specifying individual test methods is currently not supported.
 
-Tests do not currently randomize ports or directories, so they cannot be run
- in parallel. They may also fail if you already have an external cluster up.
+Tests run Solr on a randomly assigned port number, so these tests should be able to run even if you have Solr
+running on the host already. To force tests to start Solr on a specific port, set the `bats.port` gradle
+property or system property, e.g. `./gradlew integrationTests -Pbats.port=8983`.
 
 ## Writing Tests
 
diff --git a/solr/packaging/test/bats_helper.bash b/solr/packaging/test/bats_helper.bash
index d3bd00b3c0f..56c743c8fb2 100644
--- a/solr/packaging/test/bats_helper.bash
+++ b/solr/packaging/test/bats_helper.bash
@@ -58,8 +58,12 @@ save_home_on_failure() {
     fi
 }
 
+shutdown_all() {
+  solr stop -all >/dev/null 2>&1
+}
+
 delete_all_collections() {
-  local collection_list="$(solr zk ls /collections -z localhost:9983)"
+  local collection_list="$(solr zk ls /collections -z localhost:${ZK_PORT})"
   for collection in $collection_list; do
     if [[ -n $collection ]]; then
       solr delete -c $collection >/dev/null 2>&1
@@ -69,7 +73,7 @@ delete_all_collections() {
 
 config_exists() {
   local config_name=$1
-  local config_list=$(solr zk ls /configs -z localhost:9983)
+  local config_list=$(solr zk ls /configs -z localhost:${ZK_PORT})
 
   for config in $config_list; do
     if [[ $(echo $config | tr -d " ") == $config_name ]]; then
@@ -82,7 +86,7 @@ config_exists() {
 
 collection_exists() {
   local coll_name=$1
-  local coll_list=$(solr zk ls /collections -z localhost:9983)
+  local coll_list=$(solr zk ls /collections -z localhost:${ZK_PORT})
 
   for coll in $coll_list; do
     if [[ $(echo $coll | tr -d " ") == $coll_name ]]; then
diff --git a/solr/packaging/test/test_example_noprompt.bats b/solr/packaging/test/test_example_noprompt.bats
index 959cdd9d5bc..e683cb4f0a6 100644
--- a/solr/packaging/test/test_example_noprompt.bats
+++ b/solr/packaging/test/test_example_noprompt.bats
@@ -30,5 +30,6 @@ teardown() {
 
 @test "SOLR-16755 test works with noprompt" {
   solr start -e cloud -noprompt
-  solr assert --started http://localhost:8983/solr --timeout 10000
+  solr assert --started http://localhost:${SOLR_PORT}/solr --timeout 10000
+  solr assert --started http://localhost:${SOLR2_PORT}/solr --timeout 10000
 }
diff --git a/solr/packaging/test/test_export.bats b/solr/packaging/test/test_export.bats
index 699eba33911..206b2c96c01 100644
--- a/solr/packaging/test/test_export.bats
+++ b/solr/packaging/test/test_export.bats
@@ -30,32 +30,32 @@ teardown() {
 
 @test "Check export command" {
   run solr start -c -e techproducts
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test" -out "${BATS_TEST_TMPDIR}/output"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test" -out "${BATS_TEST_TMPDIR}/output"
 
   refute_output --partial 'Unrecognized option'
   assert_output --partial 'Export complete'
 
   assert [ -e ${BATS_TEST_TMPDIR}/output.json ]
 
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test"
   assert [ -e techproducts.json ]
   rm techproducts.json
 
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test" -format javabin
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test" -format javabin
   assert [ -e techproducts.javabin ]
   rm techproducts.javabin
 
   # old pattern of putting a suffix on the out that controlled the format no longer supported ;-).
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test" -out "${BATS_TEST_TMPDIR}/output.javabin"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test" -out "${BATS_TEST_TMPDIR}/output.javabin"
   assert [ -e ${BATS_TEST_TMPDIR}/output.javabin.json ]
 
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test" -out "${BATS_TEST_TMPDIR}"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test" -out "${BATS_TEST_TMPDIR}"
   assert [ -e ${BATS_TEST_TMPDIR}/techproducts.json ]
 
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test" -format jsonl -out "${BATS_TEST_TMPDIR}/output"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test" -format jsonl -out "${BATS_TEST_TMPDIR}/output"
   assert [ -e ${BATS_TEST_TMPDIR}/output.jsonl ]
 
-  run solr export -url "http://localhost:8983/solr/techproducts" -query "*:* -id:test" -limit 10 -compress -format jsonl -out "${BATS_TEST_TMPDIR}/output"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/techproducts" -query "*:* -id:test" -limit 10 -compress -format jsonl -out "${BATS_TEST_TMPDIR}/output"
   assert [ -e ${BATS_TEST_TMPDIR}/output.jsonl.gz ]
   assert_output --partial 'Total Docs exported: 10'
 
@@ -64,7 +64,7 @@ teardown() {
 @test "export fails on non cloud mode" {
   run solr start
   run solr create_core -c COLL_NAME
-  run solr export -url "http://localhost:8983/solr/COLL_NAME"
+  run solr export -url "http://localhost:${SOLR_PORT}/solr/COLL_NAME"
   refute_output --partial 'Export complete'
   assert_output --partial "ERROR: Couldn't initialize a HttpClusterStateProvider"
 }
diff --git a/solr/packaging/test/test_extraction.bats b/solr/packaging/test/test_extraction.bats
index 875f4ca2e59..fa3f47e3085 100644
--- a/solr/packaging/test/test_extraction.bats
+++ b/solr/packaging/test/test_extraction.bats
@@ -47,11 +47,11 @@ teardown() {
       "class": "solr.extraction.ExtractingRequestHandler",
       "defaults":{ "lowernames": "true", "captureAttr":"true"}
     }
-  }' 'http://localhost:8983/solr/gettingstarted/config'
+  }' "http://localhost:${SOLR_PORT}/solr/gettingstarted/config"
 
-  curl 'http://localhost:8983/solr/gettingstarted/update/extract?literal.id=doc1&commit=true' -F "myfile=@${SOLR_TIP}/example/exampledocs/solr-word.pdf"
+  curl "http://localhost:${SOLR_PORT}/solr/gettingstarted/update/extract?literal.id=doc1&commit=true" -F "myfile=@${SOLR_TIP}/example/exampledocs/solr-word.pdf"
   
-  run curl 'http://localhost:8983/solr/gettingstarted/select?q=id:doc1'
+  run curl "http://localhost:${SOLR_PORT}/solr/gettingstarted/select?q=id:doc1"
   assert_output --partial '"numFound":1'
 }
 
@@ -70,15 +70,15 @@ teardown() {
       "class": "solr.extraction.ExtractingRequestHandler",
       "defaults":{ "lowernames": "true", "captureAttr":"true"}
     }
-  }' 'http://localhost:8983/solr/content_extraction/config'
+  }' "http://localhost:${SOLR_PORT}/solr/content_extraction/config"
   
   # We filter to pdf to invoke the Extract handler.
-  run solr post -filetypes pdf -commit -url http://localhost:8983/solr/content_extraction/update ${SOLR_TIP}/example/exampledocs
+  run solr post -filetypes pdf -commit -url http://localhost:${SOLR_PORT}/solr/content_extraction/update ${SOLR_TIP}/example/exampledocs
 
   assert_output --partial '1 files indexed.'
   refute_output --partial 'ERROR'
   
-  run curl 'http://localhost:8983/solr/content_extraction/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/content_extraction/select?q=*:*"
   assert_output --partial '"numFound":1'
 }
 
@@ -97,14 +97,14 @@ teardown() {
       "class": "solr.extraction.ExtractingRequestHandler",
       "defaults":{ "lowernames": "true", "captureAttr":"true"}
     }
-  }' 'http://localhost:8983/solr/website_extraction/config'
+  }' "http://localhost:${SOLR_PORT}/solr/website_extraction/config"
   
   # Change to -recursive 1 to crawl multiple pages, but may be too slow.
-  run solr post -mode web -commit -url http://localhost:8983/solr/website_extraction/update -recursive 0 -delay 1 https://solr.apache.org/
+  run solr post -mode web -commit -url http://localhost:${SOLR_PORT}/solr/website_extraction/update -recursive 0 -delay 1 https://solr.apache.org/
 
   assert_output --partial 'POSTed web resource https://solr.apache.org (depth: 0)'
   refute_output --partial 'ERROR'
   
-  run curl 'http://localhost:8983/solr/website_extraction/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/website_extraction/select?q=*:*"
   assert_output --partial '"numFound":1'
 }
diff --git a/solr/packaging/test/test_modules.bats b/solr/packaging/test/test_modules.bats
index ff6d88c8041..17ba8912661 100644
--- a/solr/packaging/test/test_modules.bats
+++ b/solr/packaging/test/test_modules.bats
@@ -32,7 +32,7 @@ teardown() {
 @test "SQL Module" {
   run solr start -c -Dsolr.modules=sql
   run solr create_collection -c COLL_NAME
-  run solr api -get http://localhost:8983/solr/COLL_NAME/sql?stmt=select+id+from+COLL_NAME+limit+10
+  run solr api -get http://localhost:${SOLR_PORT}/solr/COLL_NAME/sql?stmt=select+id+from+COLL_NAME+limit+10
   assert_output --partial '"docs":'
   assert_output --partial '"EOF":true'
   assert_output --partial '"RESPONSE_TIME":'
@@ -52,7 +52,7 @@ teardown() {
     -Dsolr.kerberos.cookie.domain=test
 
   # Upload the custom security.json and wait for Solr to try to load it
-  solr zk cp "${security_json}" zk:security.json -z localhost:9983
+  solr zk cp "${security_json}" zk:security.json -z localhost:${ZK_PORT}
   sleep 1
 
   run cat "${SOLR_LOGS_DIR}/solr.log"
diff --git a/solr/packaging/test/test_packages.bats b/solr/packaging/test/test_packages.bats
index 0396d91508f..d93e4bb464f 100644
--- a/solr/packaging/test/test_packages.bats
+++ b/solr/packaging/test/test_packages.bats
@@ -84,5 +84,5 @@ teardown() {
 #  run solr package deploy solr-splainer -y -cluster
 #  assert_output --partial "Deployment successful"
   
-#  run -0 curl --fail http://localhost:8983/v2/splainer/index.html
+#  run -0 curl --fail http://localhost:${SOLR_PORT}/v2/splainer/index.html
 # }
diff --git a/solr/packaging/test/test_placement_plugin.bats b/solr/packaging/test/test_placement_plugin.bats
index 656c38e032d..965e5e73283 100644
--- a/solr/packaging/test/test_placement_plugin.bats
+++ b/solr/packaging/test/test_placement_plugin.bats
@@ -31,7 +31,7 @@ teardown() {
 
 @test "Affinity placement plugin using sysprop" {
   run solr start -c -Dsolr.placementplugin.default=affinity
-  solr assert -c http://localhost:8983/solr -t 3000
+  solr assert -c http://localhost:${SOLR_PORT}/solr -t 3000
   run solr create_collection -c COLL_NAME
   collection_exists COLL_NAME
   assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement plugin set in solr\.placementplugin\.default to affinity'
@@ -40,7 +40,7 @@ teardown() {
 @test "Random placement plugin using ENV" {
   export SOLR_PLACEMENTPLUGIN_DEFAULT=random
   run solr start -c
-  solr assert -c http://localhost:8983/solr -t 3000
+  solr assert -c http://localhost:${SOLR_PORT}/solr -t 3000
   run solr create_collection -c COLL_NAME
   collection_exists COLL_NAME
   assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement plugin set in solr\.placementplugin\.default to random'
diff --git a/solr/packaging/test/test_post.bats b/solr/packaging/test/test_post.bats
index 2b8c18bfe46..1b0d11705a1 100644
--- a/solr/packaging/test/test_post.bats
+++ b/solr/packaging/test/test_post.bats
@@ -57,7 +57,7 @@ teardown() {
   run solr create_collection -c monitors -d _default
   assert_output --partial "Created collection 'monitors'"
   
-  run solr post -type application/xml -url http://localhost:8983/solr/monitors/update ${SOLR_TIP}/example/exampledocs/monitor.xml
+  run solr post -type application/xml -url http://localhost:${SOLR_PORT}/solr/monitors/update ${SOLR_TIP}/example/exampledocs/monitor.xml
 
   assert_output --partial '1 files indexed.'
   refute_output --partial 'ERROR'
@@ -67,29 +67,29 @@ teardown() {
   
   solr create_collection -c monitors_no_type -d _default
   
-  run solr post -url http://localhost:8983/solr/monitors_no_type/update -commit ${SOLR_TIP}/example/exampledocs/monitor.xml
+  run solr post -url http://localhost:${SOLR_PORT}/solr/monitors_no_type/update -commit ${SOLR_TIP}/example/exampledocs/monitor.xml
 
   assert_output --partial '1 files indexed.'
   refute_output --partial 'ERROR'
-  run curl 'http://localhost:8983/solr/monitors_no_type/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/monitors_no_type/select?q=*:*"
   assert_output --partial '"numFound":1'
   
   solr create_collection -c books_no_type -d _default
   
-  run solr post -url http://localhost:8983/solr/books_no_type/update -commit ${SOLR_TIP}/example/exampledocs/books.json
+  run solr post -url http://localhost:${SOLR_PORT}/solr/books_no_type/update -commit ${SOLR_TIP}/example/exampledocs/books.json
 
   assert_output --partial '1 files indexed.'
   refute_output --partial 'ERROR'
-  run curl 'http://localhost:8983/solr/books_no_type/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/books_no_type/select?q=*:*"
   assert_output --partial '"numFound":4'
   
   solr create_collection -c books_csv_no_type -d _default
   
-  run solr post -url http://localhost:8983/solr/books_csv_no_type/update -commit ${SOLR_TIP}/example/exampledocs/books.csv
+  run solr post -url http://localhost:${SOLR_PORT}/solr/books_csv_no_type/update -commit ${SOLR_TIP}/example/exampledocs/books.csv
 
   assert_output --partial '1 files indexed.'
   refute_output --partial 'ERROR'
-  run curl 'http://localhost:8983/solr/books_csv_no_type/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/books_csv_no_type/select?q=*:*"
   assert_output --partial '"numFound":10'  
 }
 
@@ -98,11 +98,11 @@ teardown() {
   solr create_collection -c mixed_content -d _default
   
   # We filter to xml,json,and csv as we don't want to invoke the Extract handler.
-  run solr post -filetypes xml,json,csv -url http://localhost:8983/solr/mixed_content/update -commit ${SOLR_TIP}/example/exampledocs
+  run solr post -filetypes xml,json,csv -url http://localhost:${SOLR_PORT}/solr/mixed_content/update -commit ${SOLR_TIP}/example/exampledocs
 
   assert_output --partial '16 files indexed.'
   refute_output --partial 'ERROR'
-  run curl 'http://localhost:8983/solr/mixed_content/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/mixed_content/select?q=*:*"
   assert_output --partial '"numFound":46'
 }
 
@@ -116,9 +116,9 @@ teardown() {
       "class": "solr.extraction.ExtractingRequestHandler",
       "defaults":{ "lowernames": "true", "captureAttr":"true"}
     }
-  }' 'http://localhost:8983/solr/webcrawl/config'
+  }' "http://localhost:${SOLR_PORT}/solr/webcrawl/config"
   
-  run solr post -mode web -url http://localhost:8983/webcrawl/update -recursive 1 -delay 1 https://solr.apache.org
+  run solr post -mode web -url http://localhost:${SOLR_PORT}/webcrawl/update -recursive 1 -delay 1 https://solr.apache.org
   assert_output --partial 'Entering crawl at level 0'
 }
 
@@ -127,7 +127,7 @@ teardown() {
   run solr create_collection -c monitors2 -d _default
   assert_output --partial "Created collection 'monitors2'"
   
-  run solr post -url http://localhost:8983/solr/monitors2/update -type application/xml -commit -optimize ${SOLR_TIP}/example/exampledocs/monitor.xml
+  run solr post -url http://localhost:${SOLR_PORT}/solr/monitors2/update -type application/xml -commit -optimize ${SOLR_TIP}/example/exampledocs/monitor.xml
 
   assert_output --partial '1 files indexed.'
   assert_output --partial 'COMMITting Solr index'
@@ -141,26 +141,26 @@ teardown() {
   run solr create_collection -c test_args -d _default
   assert_output --partial "Created collection 'test_args'"
   
-  run solr post -url http://localhost:8983/solr/test_args/update -mode args -type application/xml -out -commit "<delete><query>*:*</query></delete>"
+  run solr post -url http://localhost:${SOLR_PORT}/solr/test_args/update -mode args -type application/xml -out -commit "<delete><query>*:*</query></delete>"
   assert_output --partial '<int name="status">0</int>'
   
   # confirm default type
-  run solr post -url http://localhost:8983/solr/test_args/update -mode args -out -commit "{'delete': {'query': '*:*'}}"
+  run solr post -url http://localhost:${SOLR_PORT}/solr/test_args/update -mode args -out -commit "{'delete': {'query': '*:*'}}"
   assert_output --partial '"status":0'
   
   # confirm we don't get back output without -out
-  run solr post -url http://localhost:8983/solr/test_args/update -mode args -commit "{'delete': {'query': '*:*'}}"
+  run solr post -url http://localhost:${SOLR_PORT}/solr/test_args/update -mode args -commit "{'delete': {'query': '*:*'}}"
   refute_output --partial '"status":0'
   
-  run solr post -url http://localhost:8983/solr/test_args/update -mode args -commit -type text/csv -out $'id,value\nROW1,0.47' 
+  run solr post -url http://localhost:${SOLR_PORT}/solr/test_args/update -mode args -commit -type text/csv -out $'id,value\nROW1,0.47'
   assert_output --partial '"status":0'
-  run curl 'http://localhost:8983/solr/test_args/select?q=id:ROW1'
+  run curl "http://localhost:${SOLR_PORT}/solr/test_args/select?q=id:ROW1"
   assert_output --partial '"numFound":1'
 }
 
 # function used because run echo | solr ends up being (run echo) | solr and we loose the output capture.
 capture_echo_to_solr() {
-    echo "{'commit': {}}" | solr post -url http://localhost:8983/solr/test_stdin/update -mode stdin -type application/json -out
+    echo "{'commit': {}}" | solr post -url http://localhost:${SOLR_PORT}/solr/test_stdin/update -mode stdin -type application/json -out
 }
 
 @test "stdin mode" {
diff --git a/solr/packaging/test/test_postlogs.bats b/solr/packaging/test/test_postlogs.bats
index 64c8230fefd..863a8aa3583 100644
--- a/solr/packaging/test/test_postlogs.bats
+++ b/solr/packaging/test/test_postlogs.bats
@@ -42,11 +42,11 @@ teardown() {
   run solr create_collection -c COLL_NAME
   assert_output --partial "Created collection 'COLL_NAME'"
 
-  run postlogs http://localhost:8983/solr/COLL_NAME ${SOLR_LOGS_DIR}/solr.log
+  run postlogs http://localhost:${SOLR_PORT}/solr/COLL_NAME ${SOLR_LOGS_DIR}/solr.log
   assert_output --partial 'Sending last batch'
   assert_output --partial 'Committed'
 
-  run curl 'http://localhost:8983/solr/COLL_NAME/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/COLL_NAME/select?q=*:*"
   refute_output --partial '"numFound":0'
 }
 
@@ -54,10 +54,10 @@ teardown() {
   run solr create_collection -c COLL_NAME
   assert_output --partial "Created collection 'COLL_NAME'"
 
-  run solr postlogs -url http://localhost:8983/solr/COLL_NAME -rootdir ${SOLR_LOGS_DIR}/solr.log
+  run solr postlogs -url http://localhost:${SOLR_PORT}/solr/COLL_NAME -rootdir ${SOLR_LOGS_DIR}/solr.log
   assert_output --partial 'Sending last batch'
   assert_output --partial 'Committed'
 
-  run curl 'http://localhost:8983/solr/COLL_NAME/select?q=*:*'
+  run curl "http://localhost:${SOLR_PORT}/solr/COLL_NAME/select?q=*:*"
   refute_output --partial '"numFound":0'
 }
diff --git a/solr/packaging/test/test_security_manager.bats b/solr/packaging/test/test_security_manager.bats
index 0d7fa163a1a..da6649cc836 100644
--- a/solr/packaging/test/test_security_manager.bats
+++ b/solr/packaging/test/test_security_manager.bats
@@ -43,12 +43,12 @@ teardown() {
   export SOLR_OPTS="-Dsolr.allowPaths=${backup_dir} -Djava.io.tmpdir=${test_tmp_dir}"
   run solr start -c
   run solr create_collection -c COLL_NAME
-  run solr api -get "http://localhost:8983/solr/admin/collections?action=BACKUP&name=test&collection=COLL_NAME&location=file://${backup_dir}"
+  run solr api -get "http://localhost:${SOLR_PORT}/solr/admin/collections?action=BACKUP&name=test&collection=COLL_NAME&location=file://${backup_dir}"
   assert_output --partial '"status":0'
 
   # Solr is not permissioned for this directory, so it should fail
   backup_dir_other="${backup_dir}-other"
   mkdir -p "${backup_dir_other}"
-  run solr api -get "http://localhost:8983/solr/admin/collections?action=BACKUP&name=test-fail&collection=COLL_NAME&location=file://${backup_dir_other}"
+  run solr api -get "http://localhost:${SOLR_PORT}/solr/admin/collections?action=BACKUP&name=test-fail&collection=COLL_NAME&location=file://${backup_dir_other}"
   assert_output --partial 'access denied'
 }
diff --git a/solr/packaging/test/test_ssl.bats b/solr/packaging/test/test_ssl.bats
index 85e0e32cc2a..2e9b01e263d 100644
--- a/solr/packaging/test/test_ssl.bats
+++ b/solr/packaging/test/test_ssl.bats
@@ -51,12 +51,12 @@ teardown() {
   export SOLR_HOST=localhost
 
   solr start -c
-  solr assert --started https://localhost:8983/solr --timeout 5000
+  solr assert --started https://localhost:${SOLR_PORT}/solr --timeout 5000
 
   run solr create -c test -s 2
   assert_output --partial "Created collection 'test'"
 
-  run solr api -get 'https://localhost:8983/solr/test/select?q=*:*'
+  run solr api -get "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*"
   assert_output --partial '"numFound":0'
 }
 
@@ -84,23 +84,23 @@ teardown() {
   export SOLR_HOST=localhost
 
   solr start -c
-  solr assert --started https://localhost:8983/solr --timeout 5000
+  solr assert --started https://localhost:${SOLR_PORT}/solr --timeout 5000
 
   run solr create -c test -s 2
   assert_output --partial "Created collection 'test'"
 
   # Just test that curl can connect via insecure or via a custom host header
-  run curl --http2 --cacert "$ssl_dir/solr-ssl.pem" -k 'https://localhost:8983/solr/test/select?q=*:*'
+  run curl --http2 --cacert "$ssl_dir/solr-ssl.pem" -k "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*"
   assert_output --partial '"numFound":0'
 
-  run curl --http2 --cacert "$ssl_dir/solr-ssl.pem" -H "Host: test.solr.apache.org" 'https://127.0.0.1:8983/solr/test/select?q=*:*'
+  run curl --http2 --cacert "$ssl_dir/solr-ssl.pem" -H "Host: test.solr.apache.org" "https://127.0.0.1:${SOLR_PORT}/solr/test/select?q=*:*"
   assert_output --partial '"numFound":0'
 
   # This is a client setting, so we don't need to restart Solr to make sure that it fails
   export SOLR_SSL_CHECK_PEER_NAME=true
 
   # This should fail the peername check
-  run ! solr api -get 'https://localhost:8983/solr/test/select?q=*:*'
+  run ! solr api -get "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*"
   assert_output --partial 'Server refused connection'
 }
 
@@ -128,16 +128,16 @@ teardown() {
 
   solr start -c
   solr auth enable -type basicAuth -credentials name:password
-  solr assert --started https://localhost:8983/solr --timeout 5000
+  solr assert --started https://localhost:${SOLR_PORT}/solr --timeout 5000
 
-  run curl -u name:password --basic --cacert "$ssl_dir/solr-ssl.pem" 'https://localhost:8983/solr/admin/collections?action=CREATE&collection.configName=_default&name=test&numShards=2&replicationFactor=1&router.name=compositeId&wt=json'
+  run curl -u name:password --basic --cacert "$ssl_dir/solr-ssl.pem" "https://localhost:${SOLR_PORT}/solr/admin/collections?action=CREATE&collection.configName=_default&name=test&numShards=2&replicationFactor=1&router.name=compositeId&wt=json"
   assert_output --partial '"status":0'
 
-  run curl -u name:password --basic --http2 --cacert "$ssl_dir/solr-ssl.pem" 'https://localhost:8983/solr/test/select?q=*:*'
+  run curl -u name:password --basic --http2 --cacert "$ssl_dir/solr-ssl.pem" "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*"
   assert_output --partial '"numFound":0'
 
   # When the Jenkins box "curl" supports --fail-with-body, add "--fail-with-body" and change "run" to "run !", to expect a failure
-  run curl --http2 --cacert "$ssl_dir/solr-ssl.pem" 'https://localhost:8983/solr/test/select?q=*:*'
+  run curl --http2 --cacert "$ssl_dir/solr-ssl.pem" "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*"
   assert_output --partial 'Error 401 Authentication'
 }
 
@@ -190,12 +190,12 @@ teardown() {
   export SOLR_SSL_TRUST_STORE=
   export SOLR_SSL_TRUST_STORE_PASSWORD=
 
-  solr assert --started https://localhost:8983/solr --timeout 5000
+  solr assert --started https://localhost:${SOLR_PORT}/solr --timeout 5000
 
   run solr create -c test -s 2
   assert_output --partial "Created collection 'test'"
 
-  run solr api -get 'https://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS'
+  run solr api -get "https://localhost:${SOLR_PORT}/solr/admin/collections?action=CLUSTERSTATUS"
   assert_output --partial '"urlScheme":"https"'
 }
 
@@ -298,7 +298,7 @@ teardown() {
   export SOLR_HOST=localhost
 
   solr start -c
-  solr start -c -z localhost:9983 -p 8984
+  solr start -c -z localhost:${ZK_PORT} -p ${SOLR2_PORT}
 
   # Test Client connections, which do not need the server keystore/truststore
   (
@@ -307,16 +307,16 @@ teardown() {
     export SOLR_SSL_TRUST_STORE=
     export SOLR_SSL_TRUST_STORE_PASSWORD=
 
-    solr assert --started https://localhost:8983/solr --timeout 5000
-    solr assert --started https://localhost:8984/solr --timeout 5000
+    solr assert --started https://localhost:${SOLR_PORT}/solr --timeout 5000
+    solr assert --started https://localhost:${SOLR2_PORT}/solr --timeout 5000
 
     run solr create -c test -s 2
     assert_output --partial "Created collection 'test'"
 
-    run solr api -get 'https://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS'
+    run solr api -get "https://localhost:${SOLR_PORT}/solr/admin/collections?action=CLUSTERSTATUS"
     assert_output --partial '"urlScheme":"https"'
 
-    run solr api -get 'https://localhost:8984/solr/test/select?q=*:*&rows=0'
+    run solr api -get "https://localhost:${SOLR2_PORT}/solr/test/select?q=*:*&rows=0"
     assert_output --partial '"numFound":0'
 
     (
@@ -324,7 +324,7 @@ teardown() {
       export SOLR_SSL_CLIENT_KEY_STORE=
       export SOLR_SSL_CLIENT_KEY_STORE_PASSWORD=
 
-      run ! solr api -get 'https://localhost:8983/solr/test/select?q=*:*&rows=0'
+      run ! solr api -get "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*&rows=0"
       assert_output --partial 'Server refused connection'
     )
   )
@@ -332,12 +332,12 @@ teardown() {
   # Turn on client hostname verification, and start a new Solr node since the property is a server setting.
   # Test that it fails because the client cert does not use "localhost"
   export SOLR_SSL_CLIENT_HOSTNAME_VERIFICATION=true
-  solr start -c -z localhost:9983 -p 8985
+  solr start -c -z localhost:${ZK_PORT} -p ${SOLR3_PORT}
 
   # We can't check if the server has come up, because we can't connect to it, so just wait
   sleep 5
 
-  run ! solr api -get 'https://localhost:8985/solr/test/select?q=*:*&rows=0'
+  run ! solr api -get "https://localhost:${SOLR3_PORT}/solr/test/select?q=*:*&rows=0"
   assert_output --partial 'Server refused connection'
 }
 
@@ -437,36 +437,36 @@ teardown() {
   export SOLR_HOST=localhost
 
   solr start -c
-  solr start -c -z localhost:9983 -p 8984
+  solr start -c -z localhost:${ZK_PORT} -p ${SOLR2_PORT}
 
   export SOLR_SSL_KEY_STORE=
   export SOLR_SSL_KEY_STORE_PASSWORD=
   export SOLR_SSL_TRUST_STORE=
   export SOLR_SSL_TRUST_STORE_PASSWORD=
 
-  solr assert --started https://localhost:8983/solr --timeout 5000
-  solr assert --started https://localhost:8984/solr --timeout 5000
+  solr assert --started https://localhost:${SOLR_PORT}/solr --timeout 5000
+  solr assert --started https://localhost:${SOLR2_PORT}/solr --timeout 5000
 
   run solr create -c test -s 2
   assert_output --partial "Created collection 'test'"
 
-  run solr api -get 'https://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS'
+  run solr api -get "https://localhost:${SOLR_PORT}/solr/admin/collections?action=CLUSTERSTATUS"
   assert_output --partial '"urlScheme":"https"'
 
-  run solr api -get 'https://localhost:8984/solr/test/select?q=*:*&rows=0'
+  run solr api -get "https://localhost:${SOLR2_PORT}/solr/test/select?q=*:*&rows=0"
   assert_output --partial '"numFound":0'
 
   export SOLR_SSL_CLIENT_KEY_STORE=
   export SOLR_SSL_CLIENT_KEY_STORE_PASSWORD=
 
   # mTLS requires a keyStore, so just using the truststore would fail if mTLS was "NEED"ed, however it is only "WANT"ed, so its ok
-  run solr api -get 'https://localhost:8983/solr/test/select?q=*:*&rows=0'
+  run solr api -get "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*&rows=0"
   assert_output --partial '"numFound":0'
 
   export SOLR_SSL_CLIENT_TRUST_STORE=
   export SOLR_SSL_CLIENT_TRUST_STORE_PASSWORD=
 
   # TLS cannot work if a truststore and keystore are not provided (either Server or Client)
-  run solr api -get 'https://localhost:8983/solr/test/select?q=*:*&rows=0'
+  run solr api -get "https://localhost:${SOLR_PORT}/solr/test/select?q=*:*&rows=0"
   assert_output --partial 'Server refused connection'
 }
diff --git a/solr/packaging/test/test_start_solr.bats b/solr/packaging/test/test_start_solr.bats
index 3b664759da4..9b9e24a45aa 100644
--- a/solr/packaging/test/test_start_solr.bats
+++ b/solr/packaging/test/test_start_solr.bats
@@ -30,9 +30,9 @@ teardown() {
 
 @test "SOLR-11740 check 'solr stop' connection" {
   solr start
-  solr start -p 7574
-  solr assert --started http://localhost:8983/solr --timeout 5000
-  solr assert --started http://localhost:7574/solr --timeout 5000
+  solr start -p ${SOLR2_PORT}
+  solr assert --started http://localhost:${SOLR_PORT}/solr --timeout 5000
+  solr assert --started http://localhost:${SOLR2_PORT}/solr --timeout 5000
   run bash -c 'solr stop -all 2>&1'
   refute_output --partial 'forcefully killing'
 }
@@ -40,12 +40,12 @@ teardown() {
 @test "stop command for single port" {
 
   solr start
-  solr start -p 7574
-  solr assert --started http://localhost:8983/solr --timeout 5000
-  solr assert --started http://localhost:7574/solr --timeout 5000
+  solr start -p ${SOLR2_PORT}
+  solr assert --started http://localhost:${SOLR_PORT}/solr --timeout 5000
+  solr assert --started http://localhost:${SOLR2_PORT}/solr --timeout 5000
   
-  run solr stop -p 7574
-  solr assert --not-started http://localhost:7574/solr --timeout 5000
-  solr assert --started http://localhost:8983/solr --timeout 5000
+  run solr stop -p ${SOLR2_PORT}
+  solr assert --not-started http://localhost:${SOLR2_PORT}/solr --timeout 5000
+  solr assert --started http://localhost:${SOLR_PORT}/solr --timeout 5000
 
 }
diff --git a/solr/packaging/test/test_status.bats b/solr/packaging/test/test_status.bats
index c1ca0c5986f..f5c15a066ca 100644
--- a/solr/packaging/test/test_status.bats
+++ b/solr/packaging/test/test_status.bats
@@ -41,6 +41,6 @@ teardown() {
 }
 
 @test "status does not expose cli parameters to end user" {
-  run solr status -solr http://localhost:8983/solr
+  run solr status -solr http://localhost:${SOLR_PORT}/solr
   assert_output --partial "ERROR: Unrecognized or misplaced argument: -solr!"
 }
diff --git a/solr/packaging/test/test_zk.bats b/solr/packaging/test/test_zk.bats
index 686437d914e..06c0d75012d 100644
--- a/solr/packaging/test/test_zk.bats
+++ b/solr/packaging/test/test_zk.bats
@@ -38,24 +38,24 @@ teardown() {
 
 @test "listing out files" {
   sleep 1
-  run solr zk ls / -z localhost:9983
+  run solr zk ls / -z localhost:${ZK_PORT}
   assert_output --partial "aliases.json"
 }
 
 @test "copying files around" {
   touch myfile.txt
   # Umm, what is solr cp?  It's like bin/solr zk cp but not?
-  run solr cp -src myfile.txt -dst zk:/myfile.txt -z localhost:9983
-  assert_output --partial "Copying from 'myfile.txt' to 'zk:/myfile.txt'. ZooKeeper at localhost:9983"
+  run solr cp -src myfile.txt -dst zk:/myfile.txt -z localhost:${ZK_PORT}
+  assert_output --partial "Copying from 'myfile.txt' to 'zk:/myfile.txt'. ZooKeeper at localhost:${ZK_PORT}"
   sleep 1
-  run solr zk ls / -z localhost:9983
+  run solr zk ls / -z localhost:${ZK_PORT}
   assert_output --partial "myfile.txt"
 
   touch myfile2.txt
-  run solr zk cp myfile2.txt zk:myfile2.txt -z localhost:9983
-  assert_output --partial "Copying from 'myfile2.txt' to 'zk:myfile2.txt'. ZooKeeper at localhost:9983"
+  run solr zk cp myfile2.txt zk:myfile2.txt -z localhost:${ZK_PORT}
+  assert_output --partial "Copying from 'myfile2.txt' to 'zk:myfile2.txt'. ZooKeeper at localhost:${ZK_PORT}"
   sleep 1
-  run solr zk ls / -z localhost:9983
+  run solr zk ls / -z localhost:${ZK_PORT}
   assert_output --partial "myfile2.txt"
 
   rm myfile.txt
@@ -66,12 +66,12 @@ teardown() {
   local source_configset_dir="${SOLR_TIP}/server/solr/configsets/sample_techproducts_configs"
   test -d $source_configset_dir
 
-  run solr zk upconfig -d ${source_configset_dir} -n techproducts2 -z localhost:9983
+  run solr zk upconfig -d ${source_configset_dir} -n techproducts2 -z localhost:${ZK_PORT}
   assert_output --partial "Uploading"
   refute_output --partial "ERROR"
 
   sleep 1
-  run curl "http://localhost:8983/api/cluster/configs?omitHeader=true"
+  run curl "http://localhost:${SOLR_PORT}/api/cluster/configs?omitHeader=true"
   assert_output --partial '"configSets":["_default","techproducts2"]'
 
 }
diff --git a/solr/packaging/test/test_example_noprompt.bats b/solr/packaging/test/test_zz_cleanup.bats
similarity index 76%
copy from solr/packaging/test/test_example_noprompt.bats
copy to solr/packaging/test/test_zz_cleanup.bats
index 959cdd9d5bc..fe461eddd5e 100644
--- a/solr/packaging/test/test_example_noprompt.bats
+++ b/solr/packaging/test/test_zz_cleanup.bats
@@ -17,18 +17,21 @@
 
 load bats_helper
 
-setup() {
+setup_file() {
   common_clean_setup
 }
 
-teardown() {
-  # save a snapshot of SOLR_HOME for failed tests
-  save_home_on_failure
+teardown_file() {
+  common_setup
+}
 
-  solr stop -all >/dev/null 2>&1
+setup() {
+  common_setup
 }
 
-@test "SOLR-16755 test works with noprompt" {
-  solr start -e cloud -noprompt
-  solr assert --started http://localhost:8983/solr --timeout 10000
+@test "Cleanup" {
+  sleep 1
+  run solr stop -all
+  run solr status
+  assert_output --partial "No Solr nodes are running"
 }