Extract 'testJavaVersion' param

Closes https://github.com/gradle/gradle-private/issues/4931

This PR creates a param `testJavaVersion`, which could be overwritten via TeamCity parameter.

Co-authored-by: Bo Zhang <bo@gradle.com>
diff --git a/.teamcity/src/main/kotlin/common/CommonExtensions.kt b/.teamcity/src/main/kotlin/common/CommonExtensions.kt
index e1b715e..fa9cced 100644
--- a/.teamcity/src/main/kotlin/common/CommonExtensions.kt
+++ b/.teamcity/src/main/kotlin/common/CommonExtensions.kt
@@ -334,7 +334,7 @@
         )
     return (
         listOf(
-            "-PtestJavaVersion=$testJvmVersion",
+            "-PtestJavaVersion=%testJavaVersion%",
             "-PtestJavaVendor=$testJvmVendor",
         ) +
             buildScanTags.map { buildScanTagParam(it) } +
diff --git a/.teamcity/src/main/kotlin/common/PerformanceTestExtensions.kt b/.teamcity/src/main/kotlin/common/PerformanceTestExtensions.kt
index cf14266..b6af529 100644
--- a/.teamcity/src/main/kotlin/common/PerformanceTestExtensions.kt
+++ b/.teamcity/src/main/kotlin/common/PerformanceTestExtensions.kt
@@ -50,12 +50,11 @@
     extraParameters: String = "",
     os: Os = Os.LINUX,
     arch: Arch = Arch.AMD64,
-    testJavaVersion: String = os.perfTestJavaVersion.major.toString(),
     testJavaVendor: String = os.perfTestJavaVendor.name.lowercase(),
 ) = listOf(
     "$task${if (extraParameters.isEmpty()) "" else " $extraParameters"}",
     "-PperformanceBaselines=$baselines",
-    "-PtestJavaVersion=$testJavaVersion",
+    "-PtestJavaVersion=%testJavaVersion%",
     "-PtestJavaVendor=$testJavaVendor",
     "-PautoDownloadAndroidStudio=true",
     "-PrunAndroidStudioInHeadlessMode=true",
diff --git a/.teamcity/src/main/kotlin/configurations/BuildDistributions.kt b/.teamcity/src/main/kotlin/configurations/BuildDistributions.kt
index 8c2e4b0..eb1d07b 100644
--- a/.teamcity/src/main/kotlin/configurations/BuildDistributions.kt
+++ b/.teamcity/src/main/kotlin/configurations/BuildDistributions.kt
@@ -14,6 +14,10 @@
         name = "Build Distributions"
         description = "Creation and verification of the distribution and documentation"
 
+        params {
+            param("testJavaVersion", LINUX.buildJavaVersion.major.toString())
+        }
+
         applyDefaults(
             model,
             this,
@@ -22,7 +26,7 @@
                 listOf(
                     stage.getBuildScanCustomValueParam(),
                     buildScanTagParam("BuildDistributions"),
-                    "-PtestJavaVersion=${LINUX.buildJavaVersion.major}",
+                    "-PtestJavaVersion=%testJavaVersion%",
                     "-Dorg.gradle.java.installations.auto-download=false",
                     "-Porg.gradle.java.installations.auto-download=false",
                 ).joinToString(" "),
diff --git a/.teamcity/src/main/kotlin/configurations/DocsTest.kt b/.teamcity/src/main/kotlin/configurations/DocsTest.kt
index 9b06d9a..ea351c9 100644
--- a/.teamcity/src/main/kotlin/configurations/DocsTest.kt
+++ b/.teamcity/src/main/kotlin/configurations/DocsTest.kt
@@ -85,6 +85,10 @@
             javaCrash = false
         }
 
+        params {
+            param("testJavaVersion", testJava.version.major.toString())
+        }
+
         applyTestDefaults(
             model,
             this,
@@ -97,7 +101,7 @@
                     buildScanTagParam(docsTestType.docsTestName),
                     parallelizationMethod.extraBuildParameters,
                     "-PenableConfigurationCacheForDocsTests=${docsTestType.ccEnabled}",
-                    "-PtestJavaVersion=${testJava.version.major}",
+                    "-PtestJavaVersion=%testJavaVersion%",
                     "-PtestJavaVendor=${testJava.vendor.name.lowercase()}",
                 ).joinToString(" "),
         )
diff --git a/.teamcity/src/main/kotlin/configurations/FlakyTestQuarantine.kt b/.teamcity/src/main/kotlin/configurations/FlakyTestQuarantine.kt
index 2e59b4d..1d4466c 100644
--- a/.teamcity/src/main/kotlin/configurations/FlakyTestQuarantine.kt
+++ b/.teamcity/src/main/kotlin/configurations/FlakyTestQuarantine.kt
@@ -92,6 +92,10 @@
             }
         }
 
+        params {
+            param("testJavaVersion", testCoverage.testJvmVersion.major.toString())
+        }
+
         val extraParameters =
             functionalTestExtraParameters(
                 listOf("FlakyTestQuarantine"),
diff --git a/.teamcity/src/main/kotlin/configurations/FunctionalTest.kt b/.teamcity/src/main/kotlin/configurations/FunctionalTest.kt
index 9fa59e6..92858ab 100644
--- a/.teamcity/src/main/kotlin/configurations/FunctionalTest.kt
+++ b/.teamcity/src/main/kotlin/configurations/FunctionalTest.kt
@@ -86,6 +86,10 @@
         this.id(id)
         val testTasks = getTestTaskName(testCoverage, subprojects)
 
+        params {
+            param("testJavaVersion", testCoverage.testJvmVersion.major.toString())
+        }
+
         val assembledExtraParameters =
             mutableListOf(
                 stage.getBuildScanCustomValueParam(testCoverage),
diff --git a/.teamcity/src/main/kotlin/configurations/FunctionalTestsPass.kt b/.teamcity/src/main/kotlin/configurations/FunctionalTestsPass.kt
index ec4e08b..e1811a6 100644
--- a/.teamcity/src/main/kotlin/configurations/FunctionalTestsPass.kt
+++ b/.teamcity/src/main/kotlin/configurations/FunctionalTestsPass.kt
@@ -17,6 +17,7 @@
 package configurations
 
 import common.applyDefaultSettings
+import jetbrains.buildServer.configs.kotlin.ParameterDisplay
 import model.CIBuildModel
 import model.TestCoverage
 import projects.FunctionalTestProject
@@ -34,6 +35,16 @@
         dependencies {
             snapshotDependencies(functionalTestProject.functionalTests)
         }
+
+        params {
+            text(
+                "reverse.dep.*.testJavaVersion",
+                functionalTestProject.testCoverage.testJvmVersion.major.toString(),
+                display = ParameterDisplay.NORMAL,
+                allowEmpty = true,
+                description = "Set to 'true' if you want to skip all dependency builds",
+            )
+        }
     }) {
     val testCoverage: TestCoverage = functionalTestProject.testCoverage
 
diff --git a/.teamcity/src/main/kotlin/configurations/PerformanceTest.kt b/.teamcity/src/main/kotlin/configurations/PerformanceTest.kt
index e340deb..5fb9d37 100644
--- a/.teamcity/src/main/kotlin/configurations/PerformanceTest.kt
+++ b/.teamcity/src/main/kotlin/configurations/PerformanceTest.kt
@@ -72,6 +72,7 @@
                 )
                 param("env.PERFORMANCE_CHANNEL", performanceTestBuildSpec.channel())
                 param("env.PERFORMANCE_DB_PASSWORD_TCAGENT", "%performance.db.password.tcagent%")
+                param("testJavaVersion", os.perfTestJavaVersion.major.toString())
                 when (os) {
                     Os.WINDOWS -> param("env.PATH", "%env.PATH%;C:/Program Files/7-zip")
                     else -> param("env.PATH", "%env.PATH%:/opt/swift/4.2.3/usr/bin:/opt/swift/4.2.4-RELEASE-ubuntu18.04/usr/bin")
diff --git a/.teamcity/src/main/kotlin/configurations/SmokeTests.kt b/.teamcity/src/main/kotlin/configurations/SmokeTests.kt
index 242c5fb..c813fe6 100644
--- a/.teamcity/src/main/kotlin/configurations/SmokeTests.kt
+++ b/.teamcity/src/main/kotlin/configurations/SmokeTests.kt
@@ -31,6 +31,10 @@
             requiresNotEc2Agent()
         }
 
+        params {
+            param("testJavaVersion", testJava.version.major.toString())
+        }
+
         applyTestDefaults(
             model,
             this,
@@ -40,7 +44,7 @@
                 listOf(
                     stage.getBuildScanCustomValueParam(),
                     buildScanTagParam("SmokeTests"),
-                    "-PtestJavaVersion=${testJava.version.major}",
+                    "-PtestJavaVersion=%testJavaVersion%",
                     "-PtestJavaVendor=${testJava.vendor.name.lowercase()}",
                     "-PflakyTests=$flakyTestStrategy",
                 ).joinToString(" "),
diff --git a/.teamcity/src/main/kotlin/configurations/TestPerformanceTest.kt b/.teamcity/src/main/kotlin/configurations/TestPerformanceTest.kt
index 6d7b1b2..de96631 100644
--- a/.teamcity/src/main/kotlin/configurations/TestPerformanceTest.kt
+++ b/.teamcity/src/main/kotlin/configurations/TestPerformanceTest.kt
@@ -49,21 +49,6 @@
             }
         }
 
-        fun BuildSteps.adHocPerformanceTest(tests: List<String>) {
-            gradleStep(
-                listOf(
-                    "clean",
-                    "performance:${testProject}PerformanceAdHocTest",
-                    tests.map { """--tests "$it"""" }.joinToString(" "),
-                    """--warmups 2 --runs 2 --checks none""",
-                    "-PtestJavaVersion=${os.perfTestJavaVersion.major}",
-                    "-PtestJavaVendor=${os.perfTestJavaVendor.name.lowercase()}",
-                    "-PautoDownloadAndroidStudio=true",
-                    "-PrunAndroidStudioInHeadlessMode=true",
-                ) + os.javaInstallationLocations(),
-            )
-        }
-
         id("${model.projectId}_TestPerformanceTest")
         name = "Test performance test tasks - Java8 Linux"
         description = "Tries to run an adhoc performance test without a database connection to verify this is still working"
@@ -71,14 +56,28 @@
         applyPerformanceTestSettings()
         artifactRules = INDIVIDUAL_PERFORAMCE_TEST_ARTIFACT_RULES
 
+        params {
+            param("testJavaVersion", os.perfTestJavaVersion.major.toString())
+        }
+
         steps {
             killProcessStep(buildTypeThis, KILL_ALL_GRADLE_PROCESSES, os)
-            adHocPerformanceTest(
+
+            gradleStep(
                 listOf(
-                    "org.gradle.performance.regression.java.JavaIDEModelPerformanceTest.get IDE model for IDEA",
-                    "org.gradle.performance.regression.java.JavaUpToDatePerformanceTest.up-to-date assemble (parallel true)",
-                    "org.gradle.performance.regression.corefeature.TaskAvoidancePerformanceTest.help with lazy and eager tasks",
-                ),
+                    "clean",
+                    "performance:${testProject}PerformanceAdHocTest",
+                    listOf(
+                        "org.gradle.performance.regression.java.JavaIDEModelPerformanceTest.get IDE model for IDEA",
+                        "org.gradle.performance.regression.java.JavaUpToDatePerformanceTest.up-to-date assemble (parallel true)",
+                        "org.gradle.performance.regression.corefeature.TaskAvoidancePerformanceTest.help with lazy and eager tasks",
+                    ).joinToString(" ") { """--tests "$it"""" },
+                    """--warmups 2 --runs 2 --checks none""",
+                    "-PtestJavaVersion=%testJavaVersion%",
+                    "-PtestJavaVendor=${os.perfTestJavaVendor.name.lowercase()}",
+                    "-PautoDownloadAndroidStudio=true",
+                    "-PrunAndroidStudioInHeadlessMode=true",
+                ) + os.javaInstallationLocations(),
             )
 
             checkCleanM2AndAndroidUserHome(os)
diff --git a/.teamcity/src/main/kotlin/projects/CheckProject.kt b/.teamcity/src/main/kotlin/projects/CheckProject.kt
index 317e2d2..072e4d1 100644
--- a/.teamcity/src/main/kotlin/projects/CheckProject.kt
+++ b/.teamcity/src/main/kotlin/projects/CheckProject.kt
@@ -51,6 +51,13 @@
                         "e.g. `-PrerunAllTests` or `--no-build-cache`",
             )
             text(
+                "testJavaVersion",
+                "should-be-overwritten",
+                display = ParameterDisplay.NORMAL,
+                allowEmpty = true,
+                description = "The java version to use for test, e.g. '17', '21'",
+            )
+            text(
                 "reverse.dep.*.skip.build",
                 "",
                 display = ParameterDisplay.NORMAL,
diff --git a/.teamcity/src/main/kotlin/util/AdHocPerformanceScenario.kt b/.teamcity/src/main/kotlin/util/AdHocPerformanceScenario.kt
index edc297c..38b098a 100644
--- a/.teamcity/src/main/kotlin/util/AdHocPerformanceScenario.kt
+++ b/.teamcity/src/main/kotlin/util/AdHocPerformanceScenario.kt
@@ -56,13 +56,6 @@
                     "Which performance test to run. Should be the fully qualified class name dot (unrolled) method name. " +
                         "E.g. org.gradle.performance.regression.java.JavaUpToDatePerformanceTest.up-to-date assemble (parallel true)",
             )
-            text(
-                "testJavaVersion",
-                "17",
-                display = ParameterDisplay.PROMPT,
-                allowEmpty = false,
-                description = "The java version to run the performance tests, e.g. 8/11/17",
-            )
             select(
                 "testJavaVendor",
                 JvmVendor.OPENJDK.name.lowercase(),
@@ -103,7 +96,6 @@
                             """--warmups %warmups% --runs %runs% --checks %checks% --profiler %profiler% %additional.gradle.parameters%""",
                             os,
                             arch,
-                            "%testJavaVersion%",
                             "%testJavaVendor%",
                         ) + buildToolGradleParameters(isContinue = false)
                     ).joinToString(separator = " ")
diff --git a/.teamcity/src/main/kotlin/util/RerunFlakyTest.kt b/.teamcity/src/main/kotlin/util/RerunFlakyTest.kt
index d800216..1876845 100644
--- a/.teamcity/src/main/kotlin/util/RerunFlakyTest.kt
+++ b/.teamcity/src/main/kotlin/util/RerunFlakyTest.kt
@@ -19,7 +19,6 @@
 import common.Arch
 import common.BuildToolBuildJvm
 import common.JvmVendor
-import common.JvmVersion
 import common.KillProcessMode.KILL_LEAKED_PROCESSES_FROM_PREVIOUS_BUILDS
 import common.KillProcessMode.KILL_PROCESSES_STARTED_BY_GRADLE
 import common.Os
@@ -45,7 +44,6 @@
         description = "Allows you to rerun a selected flaky test 10 times"
         id(id)
         val testJvmVendorParameter = "testJavaVendor"
-        val testJvmVersionParameter = "testJavaVersion"
         val testTaskParameterName = "testTask"
         val testNameParameterName = "testName"
         val testTaskOptionsParameterName = "testTaskOptions"
@@ -59,7 +57,7 @@
                 listOf("RerunFlakyTest"),
                 os,
                 arch,
-                "%$testJvmVersionParameter%",
+                "%testJavaVersion%",
                 "%$testJvmVendorParameter%",
             )
         val parameters =
@@ -105,13 +103,6 @@
                     "The name of the test to run, as should be passed to --tests. " +
                         "Can't contain spaces since there are problems with Teamcity's escaping, you can use * instead.",
             )
-            text(
-                testJvmVersionParameter,
-                JvmVersion.JAVA_11.major.toString(),
-                display = ParameterDisplay.PROMPT,
-                allowEmpty = false,
-                description = "Java version to run the test with",
-            )
             select(
                 testJvmVendorParameter,
                 JvmVendor.OPENJDK.name.lowercase(),
diff --git a/.teamcity/src/test/kotlin/BuildTypeTest.kt b/.teamcity/src/test/kotlin/BuildTypeTest.kt
index 27cb5ec..4c2e15f 100644
--- a/.teamcity/src/test/kotlin/BuildTypeTest.kt
+++ b/.teamcity/src/test/kotlin/BuildTypeTest.kt
@@ -113,7 +113,7 @@
                 "%additional.gradle.parameters%",
                 "--continue",
                 "-DbuildScan.PartOf=PlatformJava25AdoptiumWindowsAmd64,PullRequestFeedback,ReadyforNightly,ReadyforRelease",
-                "-PtestJavaVersion=25",
+                "-PtestJavaVersion=%testJavaVersion%",
                 "-PtestJavaVendor=openjdk",
                 "-Dscan.tag.FunctionalTest",
                 "-Dscan.value.coverageOs=windows",
diff --git a/.teamcity/src/test/kotlin/PerformanceTestBuildTypeTest.kt b/.teamcity/src/test/kotlin/PerformanceTestBuildTypeTest.kt
index 01de3ce..4090bc0 100644
--- a/.teamcity/src/test/kotlin/PerformanceTestBuildTypeTest.kt
+++ b/.teamcity/src/test/kotlin/PerformanceTestBuildTypeTest.kt
@@ -84,7 +84,7 @@
         val expectedRunnerParams =
             listOf(
                 "-PperformanceBaselines=%performance.baselines%",
-                "-PtestJavaVersion=17",
+                "-PtestJavaVersion=%testJavaVersion%",
                 "-PtestJavaVendor=openjdk",
                 "-PautoDownloadAndroidStudio=true",
                 "-PrunAndroidStudioInHeadlessMode=true",
@@ -161,7 +161,7 @@
         val expectedRunnerParams =
             listOf(
                 "-PperformanceBaselines=%performance.baselines%",
-                "-PtestJavaVersion=17",
+                "-PtestJavaVersion=%testJavaVersion%",
                 "-PtestJavaVendor=openjdk",
                 "-PautoDownloadAndroidStudio=true",
                 "-PrunAndroidStudioInHeadlessMode=true",