Skip to content

Commit 159b5fb

Browse files
author
Abduqodiri Qurbonzoda
committed
Fix the failing OptionsValidationTest
The expected message was incorrect, which lead to failed build. Also rectify the list of valid options.
1 parent 4a74c92 commit 159b5fb

File tree

2 files changed

+74
-31
lines changed

2 files changed

+74
-31
lines changed

integration/src/test/kotlin/kotlinx/benchmark/integration/OptionsValidationTest.kt

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package kotlinx.benchmark.integration
22

3-
import java.io.*
43
import kotlin.test.*
54

65
class OptionsValidationTest : GradleTest() {
@@ -17,7 +16,7 @@ class OptionsValidationTest : GradleTest() {
1716
}
1817

1918
runner.runAndFail("invalidReportFormatBenchmark") {
20-
assertOutputContains("Invalid report format: 'htmll'. Accepted formats: json, csv, scsv, text (e.g., reportFormat = 'json').")
19+
assertOutputContains("Invalid report format: 'htmll'. Accepted formats: json, csv, scsv, text (e.g., reportFormat = \"json\").")
2120
}
2221
}
2322

@@ -67,6 +66,12 @@ class OptionsValidationTest : GradleTest() {
6766
}
6867
}
6968

69+
private val validTimeUnits = "NANOSECONDS, ns, nanos, " +
70+
"MICROSECONDS, us, micros, " +
71+
"MILLISECONDS, ms, millis, " +
72+
"SECONDS, s, sec, " +
73+
"MINUTES, m, min"
74+
7075
@Test
7176
fun testIterationTimeUnitValidation() {
7277
val runner = project("kotlin-multiplatform") {
@@ -75,13 +80,34 @@ class OptionsValidationTest : GradleTest() {
7580
iterationTime = 100
7681
iterationTimeUnit = "x"
7782
}
83+
configuration("incorrectCaseIterationTimeUnit") {
84+
iterations = 1
85+
iterationTime = 1
86+
iterationTimeUnit = "seconds"
87+
}
7888
}
7989

8090
runner.runAndFail("invalidIterationTimeUnitBenchmark") {
81-
assertOutputContains("Invalid iterationTimeUnit: 'x'. Accepted units: seconds, s, microseconds, us, milliseconds, ms, nanoseconds, ns, minutes, m (e.g., iterationTimeUnit = 'ms').")
91+
assertOutputContains("Invalid iterationTimeUnit: 'x'. Accepted units: $validTimeUnits (e.g., iterationTimeUnit = \"ms\").")
92+
}
93+
runner.runAndFail("incorrectCaseIterationTimeUnitBenchmark") {
94+
assertOutputContains("Invalid iterationTimeUnit: 'seconds'. Accepted units: $validTimeUnits (e.g., iterationTimeUnit = \"ms\").")
8295
}
8396
}
8497

98+
@Test
99+
fun testValidOptions() {
100+
val runner = project("kotlin-multiplatform") {
101+
configuration("validOptions") {
102+
iterations = 1
103+
iterationTime = 1
104+
iterationTimeUnit = "SECONDS"
105+
mode = "AverageTime"
106+
}
107+
}
108+
runner.run("validOptionsBenchmark") // Successful
109+
}
110+
85111
@Test
86112
fun testModeValidation() {
87113
val runner = project("kotlin-multiplatform") {
@@ -94,7 +120,7 @@ class OptionsValidationTest : GradleTest() {
94120
}
95121

96122
runner.runAndFail("invalidModeBenchmark") {
97-
assertOutputContains("Invalid benchmark mode: 'x'. Accepted modes: thrpt, avgt (e.g., mode = 'thrpt').")
123+
assertOutputContains("Invalid benchmark mode: 'x'. Accepted modes: thrpt, avgt (e.g., mode = \"thrpt\").")
98124
}
99125
}
100126

@@ -110,7 +136,7 @@ class OptionsValidationTest : GradleTest() {
110136
}
111137

112138
runner.runAndFail("invalidOutputTimeUnitBenchmark") {
113-
assertOutputContains("Invalid outputTimeUnit: 'x'. Accepted units: seconds, s, microseconds, us, milliseconds, ms, nanoseconds, ns, minutes, m (e.g., outputTimeUnit = 'ns').")
139+
assertOutputContains("Invalid outputTimeUnit: 'x'. Accepted units: $validTimeUnits (e.g., outputTimeUnit = \"ns\").")
114140
}
115141
}
116142

@@ -172,6 +198,13 @@ class OptionsValidationTest : GradleTest() {
172198
advanced(" ", "value")
173199
}
174200

201+
configuration("invalidAdvancedConfigName") {
202+
iterations = 1
203+
iterationTime = 100
204+
iterationTimeUnit = "ms"
205+
advanced("jsFork", "value")
206+
}
207+
175208
configuration("invalidNativeFork") {
176209
iterations = 1
177210
iterationTime = 100
@@ -202,19 +235,22 @@ class OptionsValidationTest : GradleTest() {
202235
}
203236

204237
runner.runAndFail("blankAdvancedConfigNameBenchmark") {
205-
assertOutputContains("Invalid advanced config name: ' '. It must not be blank.")
238+
assertOutputContains("Invalid advanced option name: ' '. It must not be blank.")
239+
}
240+
runner.runAndFail("invalidAdvancedConfigNameBenchmark") {
241+
assertOutputContains("Invalid advanced option name: 'jsFork'. Accepted options: \"nativeFork\", \"nativeGCAfterIteration\", \"jvmForks\", \"jsUseBridge\".")
206242
}
207243
runner.runAndFail("invalidNativeForkBenchmark") {
208-
assertOutputContains("Invalid value 'x' for 'nativeFork'. Accepted values: 'perBenchmark', 'perIteration' (e.g., nativeFork = 'perBenchmark').")
244+
assertOutputContains("Invalid value for 'nativeFork': 'x'. Accepted values: perBenchmark, perIteration.")
209245
}
210246
runner.runAndFail("invalidNativeGCAfterIterationBenchmark") {
211-
assertOutputContains("Invalid value 'x' for 'nativeGCAfterIteration'. Expected a boolean value (e.g., nativeGCAfterIteration = true).")
247+
assertOutputContains("Invalid value for 'nativeGCAfterIteration': 'x'. Expected a Boolean value.")
212248
}
213249
runner.runAndFail("invalidJvmForksBenchmark") {
214-
assertOutputContains("Invalid value '-1' for 'jvmForks'. Expected a non-negative integer or 'definedByJmh' (e.g., jvmForks = 2 or jvmForks = 'definedByJmh').")
250+
assertOutputContains("Invalid value for 'jvmForks': '-1'. Expected a non-negative integer or \"definedByJmh\".")
215251
}
216252
runner.runAndFail("invalidJsUseBridgeBenchmark") {
217-
assertOutputContains("Invalid value 'x' for 'jsUseBridge'. Expected a boolean value (e.g., jsUseBridge = true).")
253+
assertOutputContains("Invalid value for 'jsUseBridge': 'x'. Expected a Boolean value.")
218254
}
219255
}
220256
}

plugin/main/src/kotlinx/benchmark/gradle/Utils.kt

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,8 @@ fun writeParameters(
134134

135135
private fun validateConfig(config: BenchmarkConfiguration) {
136136
config.reportFormat?.let {
137-
val validFormats = setOf("json", "csv", "scsv", "text")
138-
require(it.toLowerCase() in validFormats) {
139-
"Invalid report format: '$it'. Accepted formats: ${validFormats.joinToString(", ")} (e.g., reportFormat = 'json')."
137+
require(it.toLowerCase() in ValidOptions.format) {
138+
"Invalid report format: '$it'. Accepted formats: ${ValidOptions.format.joinToString(", ")} (e.g., reportFormat = \"json\")."
140139
}
141140
}
142141

@@ -162,26 +161,23 @@ private fun validateConfig(config: BenchmarkConfiguration) {
162161
}
163162

164163
config.iterationTimeUnit?.let {
165-
val validTimeUnits = setOf("seconds", "s", "microseconds", "us", "milliseconds", "ms", "nanoseconds", "ns", "minutes", "m")
166-
require(it.toLowerCase() in validTimeUnits) {
167-
"Invalid iterationTimeUnit: '$it'. Accepted units: ${validTimeUnits.joinToString(", ")} (e.g., iterationTimeUnit = 'ms')."
164+
require(it in ValidOptions.timeUnits) {
165+
"Invalid iterationTimeUnit: '$it'. Accepted units: ${ValidOptions.timeUnits.joinToString(", ")} (e.g., iterationTimeUnit = \"ms\")."
168166
}
169167
require(config.iterationTime != null) {
170168
"Missing iterationTime. Please provide iterationTime when specifying iterationTimeUnit."
171169
}
172170
}
173171

174172
config.mode?.let {
175-
val validModes = setOf("thrpt", "avgt")
176-
require(it.toLowerCase() in validModes) {
177-
"Invalid benchmark mode: '$it'. Accepted modes: ${validModes.joinToString(", ")} (e.g., mode = 'thrpt')."
173+
require(it in ValidOptions.modes) {
174+
"Invalid benchmark mode: '$it'. Accepted modes: ${ValidOptions.modes.joinToString(", ")} (e.g., mode = \"thrpt\")."
178175
}
179176
}
180177

181178
config.outputTimeUnit?.let {
182-
val validTimeUnits = setOf("seconds", "s", "microseconds", "us", "milliseconds", "ms", "nanoseconds", "ns", "minutes", "m")
183-
require(it.toLowerCase() in validTimeUnits) {
184-
"Invalid outputTimeUnit: '$it'. Accepted units: ${validTimeUnits.joinToString(", ")} (e.g., outputTimeUnit = 'ns')."
179+
require(it in ValidOptions.timeUnits) {
180+
"Invalid outputTimeUnit: '$it'. Accepted units: ${ValidOptions.timeUnits.joinToString(", ")} (e.g., outputTimeUnit = \"ns\")."
185181
}
186182
}
187183

@@ -207,38 +203,49 @@ private fun validateConfig(config: BenchmarkConfiguration) {
207203
}
208204

209205
config.advanced.forEach { (param, value) ->
210-
println("Validating advanced param: $param with value: $value")
211206
require(param.isNotBlank()) {
212-
"Invalid advanced config param: '$param'. It must not be blank."
207+
"Invalid advanced option name: '$param'. It must not be blank."
213208
}
214209
require(value.toString().isNotBlank()) {
215-
"Invalid value for param '$param': '$value'. Value should not be blank."
210+
"Invalid value for advanced option '$param': '$value'. Value should not be blank."
216211
}
217212

218213
when (param) {
219214
"nativeFork" -> {
220-
val validValues = setOf("perbenchmark", "periteration")
221-
require(value.toString().toLowerCase() in validValues) {
222-
"Invalid value for 'nativeFork': '$value'. Accepted values: ${validValues.joinToString(", ")}."
215+
require(value.toString() in ValidOptions.nativeForks) {
216+
"Invalid value for 'nativeFork': '$value'. Accepted values: ${ValidOptions.nativeForks.joinToString(", ")}."
223217
}
224218
}
225219
"nativeGCAfterIteration" -> require(value is Boolean) {
226220
"Invalid value for 'nativeGCAfterIteration': '$value'. Expected a Boolean value."
227221
}
228222
"jvmForks" -> {
229223
val intValue = value.toString().toIntOrNull()
230-
require(intValue != null && intValue >= 0 || value.toString().toLowerCase() == "definedbyjmh") {
231-
"Invalid value for 'jvmForks': '$value'. Expected a non-negative integer or 'definedByJmh'."
224+
require(intValue != null && intValue >= 0 || value.toString() == "definedByJmh") {
225+
"Invalid value for 'jvmForks': '$value'. Expected a non-negative integer or \"definedByJmh\"."
232226
}
233227
}
234228
"jsUseBridge" -> require(value is Boolean) {
235229
"Invalid value for 'jsUseBridge': '$value'. Expected a Boolean value."
236230
}
237-
else -> throw IllegalArgumentException("Invalid advanced config parameter: '$param'. Accepted parameters: 'nativeFork', 'nativeGCAfterIteration', 'jvmForks', 'jsUseBridge'.")
231+
else -> throw IllegalArgumentException("Invalid advanced option name: '$param'. Accepted options: \"nativeFork\", \"nativeGCAfterIteration\", \"jvmForks\", \"jsUseBridge\".")
238232
}
239233
}
240234
}
241235

236+
private object ValidOptions {
237+
val format = setOf("json", "csv", "scsv", "text")
238+
val timeUnits = setOf(
239+
"NANOSECONDS", "ns", "nanos",
240+
"MICROSECONDS", "us", "micros",
241+
"MILLISECONDS", "ms", "millis",
242+
"SECONDS", "s", "sec",
243+
"MINUTES", "m", "min"
244+
)
245+
val modes = setOf("thrpt", "avgt", "Throughput", "AverageTime")
246+
val nativeForks = setOf("perBenchmark", "perIteration")
247+
}
248+
242249
internal val Gradle.isConfigurationCacheAvailable
243250
get() = try {
244251
val startParameters = gradle.startParameter

0 commit comments

Comments
 (0)