refactor: replace Groovy tests in :src:core with Kotlin
diff --git a/checksum.xml b/checksum.xml
index a29e0ba..ce13b9d 100644
--- a/checksum.xml
+++ b/checksum.xml
@@ -94,6 +94,7 @@
<trusted-key id='d477d51812e692011db11e66a6ea2e2bf22e0543' group='io.github.java-diff-utils' />
<trusted-key id='e52567d2589415bd74eb4c2867631bc0568801c3' group='io.github.microutils' />
<trusted-key id='050a37a2e0577f4baa095b52602ec18d20c4661c' group='io.github.x-stream' />
+ <trusted-key id='59b06224fd8912e36603be79fefe78456eddc34a' group='io.mockk' />
<trusted-key id='6dd3b8c64ef75253beb2c53ad908a43fb7ec07ac' group='jakarta.activation' />
<trusted-key id='a1483f88ba771993ab609c43590c2310cee1c9be' group='jakarta.jms' />
<trusted-key id='fc411cd3cb7dcb0abc9801058118b3bcdb1a5000' group='jakarta.xml.bind' />
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/4a/59b06224fd8912e36603be79fefe78456eddc34a.asc b/gradle/checksum-dependency-plugin/cached-pgp-keys/4a/59b06224fd8912e36603be79fefe78456eddc34a.asc
new file mode 100644
index 0000000..9768ac8
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/4a/59b06224fd8912e36603be79fefe78456eddc34a.asc
@@ -0,0 +1,21 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGNBF+y5lsBDAC5h0qk+OBAscHc/ac3A9C8ZPohXcTVpsOjds73soUAH+QCKO0y
+gAUuG/hUUU9xkm9PgTwWOEl2qDDcOFXY+9ykeYNUUcCWfs+JmVRfRod4W5pntaT4
+g9Z+T6LbXKNAfZgPvTv4rr7UjD05N4XS4vckrS4taYLtBRJAmqT3pt43KxlyoTbh
+f4xcO2rWeXsPqgzTYIHH7M5mYPeqA2gc9NBAhkHjesFuYfWXqUfOVcOLvzULxrra
+pZDOyrINr83WikC8DkuDrAav4mIWjIhYmfBWzuNeYJsusVnFENeOxpEHV8RT+8uE
+v1gPjbjAKUPfZoa7egvz3EmDkshpNIIym0XxNGTj5ntJWR2SLT7mDrSYPeHrZKW6
+/aKuAcOxpGLpdVOMM+y4N5mTQfdlL81G9kbGQarMmwGaJb2a82PaF20wRwVgiVfO
+p/GWgwXr0XdJNLqx13LdM8BMM5vmLomOQOjnpQBOlJWRgrYUJQOReKAEAQqNMsxS
+IW9laXkrewJtblEAEQEAAbkBjQRfsuZbAQwAr/owOCxebZMTjp9coUsDjFabJowZ
+H0F++vuh73UY/v2z+vqwug89ABjrPUIccE9/t5dRyEjBt0ED2KFM3mi692QhyYE8
+uRaUKWz0kYaMPuw0W7RTblhhXErBror1m00ibNDGSf3fIr9FZ7u5ep/RTFDCDaZg
+qtWQGVD+uLnqA5EHdwUyieWDSgeThRddM3hKXB1eld4JKJPzQ0XwXLgv8MmbOc9W
+5pxb1ULD44s17SKDjlBtRvrSRdgExgfpKU63HH0D6mn+kJP066knYddunNw7HsKg
+v2mPudTVIQXYGb8xDLhP6UYJowdvJEbM8vp1t/d/CgCMXyVVJOlTZwdJaECE0n4g
+MJ2ihDZ8qbDl81OQhTiWvgoKOFHLTwZgmyhKpt36RvkXkoywqlKNGaZVNi9Ct1Xx
+fprj4sozA5Mcf8BAaxXV9sQfZLKH7NhGrFzc/r1v2R37RYWfmYL79dJj1xsrcEN8
+26cSoyLi69+XOxvbdo4KfyopRxECTdd6Oqk/ABEBAAE=
+=+/j7
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/4a/fefe78456eddc34a.fingerprints b/gradle/checksum-dependency-plugin/cached-pgp-keys/4a/fefe78456eddc34a.fingerprints
new file mode 100644
index 0000000..cc05455
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/4a/fefe78456eddc34a.fingerprints
@@ -0,0 +1 @@
+59b06224fd8912e36603be79fefe78456eddc34a
diff --git a/gradle/checksum-dependency-plugin/cached-pgp-keys/7c/c3720ddc2e713b7c.fingerprints b/gradle/checksum-dependency-plugin/cached-pgp-keys/7c/c3720ddc2e713b7c.fingerprints
new file mode 100644
index 0000000..cc05455
--- /dev/null
+++ b/gradle/checksum-dependency-plugin/cached-pgp-keys/7c/c3720ddc2e713b7c.fingerprints
@@ -0,0 +1 @@
+59b06224fd8912e36603be79fefe78456eddc34a
diff --git a/src/bom-testing/build.gradle.kts b/src/bom-testing/build.gradle.kts
index 0f28bf8..65ddd38 100644
--- a/src/bom-testing/build.gradle.kts
+++ b/src/bom-testing/build.gradle.kts
@@ -38,6 +38,7 @@
// then it should be declared as "api" here since we use useCompileClasspathVersions
// to make runtime classpath consistent with the compile one.
api("com.github.tomakehurst:wiremock-jre8:2.35.1")
+ api("io.mockk:mockk:1.13.7")
api("junit:junit:4.13.2")
api("net.bytebuddy:byte-buddy:1.14.11")
api("nl.jqno.equalsverifier:equalsverifier:3.15.5")
diff --git a/src/core/build.gradle.kts b/src/core/build.gradle.kts
index 1d3e73d..b5e0d3d 100644
--- a/src/core/build.gradle.kts
+++ b/src/core/build.gradle.kts
@@ -120,6 +120,7 @@
runtimeOnly("xml-apis:xml-apis")
testImplementation("commons-net:commons-net")
+ testImplementation("io.mockk:mockk")
testRuntimeOnly("org.spockframework:spock-core")
testFixturesApi(testFixtures(projects.src.jorphan))
diff --git a/src/core/src/main/java/org/apache/jmeter/services/FileServer.java b/src/core/src/main/java/org/apache/jmeter/services/FileServer.java
index 1f9b836..efd4ad7 100644
--- a/src/core/src/main/java/org/apache/jmeter/services/FileServer.java
+++ b/src/core/src/main/java/org/apache/jmeter/services/FileServer.java
@@ -81,7 +81,7 @@
private volatile String scriptName;
// Cannot be instantiated
- private FileServer() {
+ FileServer() {
base = new File(DEFAULT_BASE);
log.info("Default base='{}'", DEFAULT_BASE);
}
diff --git a/src/core/src/test/groovy/org/apache/jmeter/gui/HtmlReportGUISpec.groovy b/src/core/src/test/groovy/org/apache/jmeter/gui/HtmlReportGUISpec.groovy
deleted file mode 100644
index a0caec0..0000000
--- a/src/core/src/test/groovy/org/apache/jmeter/gui/HtmlReportGUISpec.groovy
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jmeter.gui;
-
-import org.apache.jmeter.gui.tree.JMeterTreeListener
-import org.apache.jmeter.gui.tree.JMeterTreeModel
-import org.apache.jmeter.junit.spock.JMeterSpec
-
-import spock.lang.IgnoreIf
-
-@IgnoreIf({ JMeterSpec.isHeadless() })
-class HtmlReportGUISpec extends JMeterSpec {
-
- def "test HtmlReportUI initialization"() {
- given:
- def sut = new HtmlReportUI();
- def treeModel = new JMeterTreeModel();
- def treeListener = new JMeterTreeListener(treeModel);
- GuiPackage.initInstance(treeListener, treeModel);
- GuiPackage.getInstance().setMainFrame(new MainFrame(treeModel, treeListener));
- when:
- sut.showInputDialog(GuiPackage.getInstance().getMainFrame())
- Thread.sleep(50) // https://bugs.openjdk.java.net/browse/JDK-5109571
- sut.messageDialog.setVisible(false)
- then:
- sut.csvFilePathTextField.getText() == ""
- sut.userPropertiesFilePathTextField.getText() == ""
- sut.outputDirectoryPathTextField.getText() == ""
- sut.reportArea.getText() == ""
- sut.messageDialog.getComponents().length == 1;
- }
-}
diff --git a/src/core/src/test/groovy/org/apache/jmeter/testelement/AbstractTestElementSpec.groovy b/src/core/src/test/groovy/org/apache/jmeter/testelement/AbstractTestElementSpec.groovy
deleted file mode 100644
index 91ddecf..0000000
--- a/src/core/src/test/groovy/org/apache/jmeter/testelement/AbstractTestElementSpec.groovy
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to you under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jmeter.testelement
-
-import org.apache.commons.lang3.NotImplementedException
-import org.apache.jmeter.junit.spock.JMeterSpec
-import org.apache.jmeter.testelement.property.JMeterProperty
-import org.apache.jmeter.testelement.property.MultiProperty
-import org.apache.jmeter.testelement.property.PropertyIterator
-import org.apache.jmeter.testelement.property.TestElementProperty
-
-import spock.lang.Unroll
-
-@Unroll
-class AbstractTestElementSpec extends JMeterSpec {
-
- def "set outer properties as temporary when using a TestElementProperty"() {
- given:
- AbstractTestElement sut = Spy(AbstractTestElement.class)
- def outerElement = Mock(TestElement.class)
- def innerElement = Mock(TestElement.class)
- def outerProp = new TestElementProperty("outerProp", outerElement)
- def innerProp = new TestElementProperty("innerProp", innerElement)
- outerProp.addProperty(innerProp)
- when:
- sut.setTemporary(outerProp)
- then:
- sut.isTemporary(outerProp)
- !sut.isTemporary(innerProp)
- }
-
- def "set all properties as temporary when using a MultiProperty"() {
- given:
- AbstractTestElement sut = Spy(AbstractTestElement.class)
- def outerProp = new MinimalMultiProperty()
- def innerProp = new MinimalMultiProperty()
- outerProp.addProperty(innerProp)
- when:
- sut.setTemporary(outerProp)
- then:
- sut.isTemporary(outerProp)
- sut.isTemporary(innerProp)
- }
-
- private class MinimalMultiProperty extends MultiProperty {
-
- Set<JMeterProperty> props = new HashSet<>()
-
- @Override
- void recoverRunningVersion(TestElement owner) {
- throw new NotImplementedException()
- }
-
- @Override
- String getStringValue() {
- throw new NotImplementedException()
- }
-
- @Override
- Object getObjectValue() {
- return null
- }
-
- @Override
- void setObjectValue(Object value) {
- throw new NotImplementedException()
- }
-
- @Override
- PropertyIterator iterator() {
- return props.iterator() as PropertyIterator
- }
-
- @Override
- void addProperty(JMeterProperty prop) {
- props.add(prop)
- }
-
- @Override
- void clear() {
- props.clear()
- }
- }
-}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/engine/util/FunctionParserTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/engine/util/FunctionParserTest.kt
index 039f123..0b4d0f7 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/engine/util/FunctionParserTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/engine/util/FunctionParserTest.kt
@@ -17,46 +17,53 @@
package org.apache.jmeter.engine.util
+import com.google.auto.service.AutoService
import org.apache.jmeter.functions.Function
import org.apache.jmeter.samplers.SampleResult
import org.apache.jmeter.samplers.Sampler
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.ValueSource
-import spock.lang.Specification
-import spock.lang.Unroll
+class FunctionParserTest {
+ @ParameterizedTest
+ @ValueSource(
+ strings = [
+ "\${__func()}",
+ "\${ __func()}",
+ "\${__func() }",
+ "\${ __func() }",
+ ]
+ )
+ fun `simple function call`(input: String) {
+ val parser = FunctionParser()
+ val result = parser.compileString(input)
-@Unroll
-class FunctionParserSpec extends Specification {
- def "function '#value' gets compiled"() {
- given:
- CompoundVariable.functions.put('__func', Func.class)
- def parser = new FunctionParser()
- when:
- def result = parser.compileString(value)
- then:
- "$result" == "$expected"
- where:
- value | expected
- '${__func()}' | [new Func()]
- '${ __func()}' | [new Func()]
- '${__func() }' | [new Func()]
- '${ __func() }' | [new Func()]
+ Assertions.assertEquals(arrayListOf(Func()), result) {
+ "FunctionParser.compileString($input)"
+ }
}
- public static class Func implements Function {
- void setParameters(Collection params) {
- // do nothing
+ @AutoService(Function::class)
+ class Func : Function {
+ override fun execute(previousResult: SampleResult?, currentSampler: Sampler?): String {
+ TODO()
}
- String getReferenceKey() {
- return "__func"
+
+ override fun setParameters(parameters: MutableCollection<CompoundVariable>) {
}
- List<String> getArgumentDesc() {
- return Collections.emptyList()
+
+ override fun getReferenceKey(): String = "__func"
+
+ override fun getArgumentDesc(): List<String> = listOf()
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+ return true
}
- String execute(SampleResult result, Sampler sampler) {
- return "done"
- }
- String toString() {
- return "__func()"
+
+ override fun hashCode(): Int {
+ return javaClass.hashCode()
}
}
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/core/ConvertersTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/core/ConvertersTest.kt
index 7ed9bcd..118a913 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/core/ConvertersTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/core/ConvertersTest.kt
@@ -17,46 +17,57 @@
package org.apache.jmeter.report.core
-import spock.lang.Specification
-import spock.lang.Unroll
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.MethodSource
-@Unroll
-class ConvertersSpec extends Specification {
+class ConvertersTest {
+ data class NumberCase(val input: String, val type: Class<*>?, val expected: Number, val precision: Number)
+ data class SimpleCase(val input: String, val type: Class<*>?, val expected: Any)
+ companion object {
+ @JvmStatic
+ fun numberCases() = listOf(
+ NumberCase(" 42", Int::class.javaObjectType, Integer.valueOf(42), 0),
+ NumberCase("-5", Int::class.javaPrimitiveType, Integer.valueOf(-5), 0),
+ NumberCase("5000000", Long::class.javaObjectType, java.lang.Long.valueOf(5_000_000), 0),
+ NumberCase("500 ", Long::class.javaPrimitiveType, java.lang.Long.valueOf(500), 0),
+ NumberCase("3.14", Double::class.javaObjectType, java.lang.Double.valueOf(3.14), 0.0001),
+ NumberCase(" 100 ", Double::class.javaPrimitiveType, java.lang.Double.valueOf(100.0), 0.0001),
+ NumberCase("+5", Float::class.javaObjectType, java.lang.Float.valueOf(5.0f), 0.0001),
+ NumberCase(" 1.2E16 ", Float::class.javaPrimitiveType, java.lang.Float.valueOf(1.2E16f), 0.0001),
+ )
- def "Convert number-like (#input) to instance of (#conversionDestClass)"() {
- given:
- def converter = Converters.getConverter(conversionDestClass)
- when:
- def result = converter.convert(input)
- then:
- result.class == expectedResult.class
- result == expectedResult || Math.abs(expectedResult - result) < precision
- where:
- input | conversionDestClass | expectedResult | precision
- " 42" | Integer.class | Integer.valueOf(42) | 0
- "-5" | int.class | Integer.valueOf(-5) | 0
- "5000000" | Long.class | Long.valueOf(5_000_000) | 0
- "500 " | long.class | Long.valueOf(500) | 0
- "3.14" | Double.class | Double.valueOf(3.14) | 0.0001
- " 100 " | double.class | Double.valueOf(100) | 0.0001
- "+5" | Float.class | Float.valueOf(5) | 0.0001
- " 1.2E16 " | float.class | Float.valueOf(1.2E16) | 0.0001
+ @JvmStatic
+ fun simpleCases() = listOf(
+ SimpleCase("FALSE", Boolean::class.javaObjectType, false),
+ SimpleCase("true", Boolean::class.javaPrimitiveType, true),
+ SimpleCase(" true", Boolean::class.javaPrimitiveType, false),
+ SimpleCase("fAlSe ", Boolean::class.javaPrimitiveType, false),
+ SimpleCase("a", Char::class.javaObjectType, 'a'),
+ SimpleCase("ä", Char::class.javaPrimitiveType, 'ä'),
+ )
}
- def "Convert (#input) to instance of (#conversionDestClass)"() {
- given:
- def converter = Converters.getConverter(conversionDestClass)
- when:
- def result = converter.convert(input)
- then:
- result == expectedResult
- where:
- input | conversionDestClass | expectedResult
- "FALSE" | Boolean.class | Boolean.FALSE
- "true" | boolean.class | Boolean.TRUE
- " true" | boolean.class | Boolean.FALSE
- "fAlSe " | boolean.class | Boolean.FALSE
- "a" | Character.class | 'a'
- "ä" | char.class | 'ä'
+ @ParameterizedTest
+ @MethodSource("numberCases")
+ fun convertNumbers(case: NumberCase) {
+ val result = Converters.getConverter(case.type).convert(case.input)
+ if (result != case.expected) {
+ assertEquals(case.expected.toDouble(), (result as Number).toDouble(), case.precision.toDouble()) {
+ "Converters.getConverter(${case.type}).convert(${case.input}) should be within ${case.precision} of ${case.expected}"
+ }
+ }
+ assertEquals(case.expected::class.java, result::class.java) {
+ "type of Converters.getConverter(${case.type}).convert(${case.input})"
+ }
+ }
+
+ @ParameterizedTest
+ @MethodSource("simpleCases")
+ fun convertSimple(case: SimpleCase) {
+ val result = Converters.getConverter(case.type).convert(case.input)
+ assertEquals(case.expected, result) {
+ "Converters.getConverter(${case.type}).convert(${case.input})"
+ }
}
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/core/SampleMetadataParserTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/core/SampleMetadataParserTest.kt
index fe1ed72..6806ac6 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/core/SampleMetadataParserTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/core/SampleMetadataParserTest.kt
@@ -17,42 +17,37 @@
package org.apache.jmeter.report.core
-import spock.lang.Specification
-import spock.lang.Unroll
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.MethodSource
-@Unroll
-class SampleMetadataParserSpec extends Specification {
-
- def "Parse headers (#headers) with separator (#separator) and get (#expectedColumns)"() {
- given:
- def sut = new SampleMetaDataParser(separator as char)
- when:
- def columns = sut.parse(headers).columns
- then:
- columns == expectedColumns
- where:
- separator | headers | expectedColumns
- ';' | "a;b;c;d;e" | ["a", "b", "c", "d", "e"]
- '|' | "a|b|c|d|e" | ["a", "b", "c", "d", "e"]
- '|' | "aa|bb|cc|dd|eef" | ["aa", "bb", "cc", "dd", "eef"]
- '&' | "a&b&c&d&e" | ["a", "b", "c", "d", "e"]
- '\t' | "a\tb c\td\te" | ["a", "b c", "d", "e"]
- ',' | "abcdef" | ["abcdef"]
+class SampleMetadataParserTest {
+ data class ParseCase(val separator: Char, val headers: String, val expected: List<String>)
+ companion object {
+ @JvmStatic
+ fun headerCases() = listOf(
+ ParseCase(';', "a;b;c;d;e", listOf("a", "b", "c", "d", "e")),
+ ParseCase(',', "a|b|c|d|e", listOf("a", "b", "c", "d", "e")),
+ ParseCase(',', "aa|bb|cc|dd|eef", listOf("aa", "bb", "cc", "dd", "eef")),
+ ParseCase('&', "a&b&c&d&e", listOf("a", "b", "c", "d", "e")),
+ ParseCase('\t', "a\tb c\td\te", listOf("a", "b c", "d", "e")),
+ ParseCase(',', "abcdef", listOf("abcdef")),
+ // Wrong separator
+ ParseCase(',', "a;b;c;d;e", listOf("a", "b", "c", "d", "e")),
+ ParseCase(',', "a|b|c|d|e", listOf("a", "b", "c", "d", "e")),
+ ParseCase(',', "aa|bb|cc|dd|eef", listOf("aa", "bb", "cc", "dd", "eef")),
+ ParseCase(',', "a&b&c&d&e", listOf("a", "b", "c", "d", "e")),
+ ParseCase(',', "a\tb c\td\te", listOf("a", "b c", "d", "e")),
+ ParseCase(',', "abcdef", listOf("abcdef")),
+ )
}
- def "Parse headers (#headers) with wrong separator (#separator) and get (#expectedColumns)"() {
- given:
- def sut = new SampleMetaDataParser(separator as char)
- when:
- def columns = sut.parse(headers).columns
- then:
- columns == expectedColumns
- where:
- separator | headers | expectedColumns
- ',' | "a;b;c;d;e" | ["a", "b", "c", "d", "e"]
- ',' | "a|b|c|d|e" | ["a", "b", "c", "d", "e"]
- ',' | "aa|bb|cc|dd|eef" | ["aa", "bb", "cc", "dd", "eef"]
- ',' | "a&b&c&d&e" | ["a", "b", "c", "d", "e"]
- ',' | "a\tb c\td\te" | ["a", "b c", "d", "e"]
+ @ParameterizedTest
+ @MethodSource("headerCases")
+ fun parseHeaders(case: ParseCase) {
+ val result = SampleMetaDataParser(case.separator).parse(case.headers).columns
+ Assertions.assertEquals(case.expected, result) {
+ "SampleMetaDataParser(${case.separator}).parse(${case.headers})"
+ }
}
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ApdexSummaryConsumerTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ApdexSummaryConsumerTest.kt
index 595085e..179003b 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ApdexSummaryConsumerTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ApdexSummaryConsumerTest.kt
@@ -17,29 +17,32 @@
package org.apache.jmeter.report.processor
-import spock.lang.Specification
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
-class ApdexSummaryConsumerSpec extends Specification {
+class ApdexSummaryConsumerTest {
+ val sut = ApdexSummaryConsumer()
- def sut = new ApdexSummaryConsumer()
+ @Test
+ fun `createDataResult contains apdex, satisfied, tolerated, key`() {
+ val info = ApdexThresholdsInfo()
+ info.satisfiedThreshold = 3L
+ info.toleratedThreshold = 12L
+ val data = ApdexSummaryData(info).apply {
+ satisfiedCount = 60L
+ toleratedCount = 30L
+ totalCount = 100L
+ }
+ val expectedApdex = 0.75
- def "createDataResult contains apdex, satisfied, tolerated, key"() {
- given:
- def info = new ApdexThresholdsInfo()
- info.setSatisfiedThreshold(3L)
- info.setToleratedThreshold(12L)
- def data = new ApdexSummaryData(info)
- data.satisfiedCount = 60L
- data.toleratedCount = 30L
- data.totalCount = 100L
- def expectedApdex = 0.75
- when:
- def result = sut.createDataResult("key", data)
- then:
- def resultValues = result.asList().collect {
- ((ValueResultData) it).value
- }
- // [apdex, satisfied, tolerated, key]
- resultValues == [expectedApdex, 3L, 12L, "key"]
+ val result = sut.createDataResult("key", data)
+
+ val resultValues = result.map { (it as ValueResultData).value }
+ assertEquals(
+ listOf(expectedApdex, 3L, 12L, "key"),
+ resultValues
+ ) {
+ "ApdexSummaryConsumer().createDataResult(\"key\", $data) should yield [apdex, satisfied, tolerated, key]"
+ }
}
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/FieldSampleComparatorTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/FieldSampleComparatorTest.kt
index d645cf0..9346f8e 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/FieldSampleComparatorTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/FieldSampleComparatorTest.kt
@@ -19,45 +19,52 @@
import org.apache.jmeter.report.core.Sample
import org.apache.jmeter.report.core.SampleMetadata
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Test
+import kotlin.math.sign
-import spock.lang.Specification
+class FieldSampleComparatorTest {
+ companion object {
+ const val separator = ','
+ }
+ private val multiColSampleMeta = SampleMetadata(separator, "col1", "col2")
-class FieldSampleComparatorSpec extends Specification {
-
- static char separator = ',' as char
- def multiColSampleMeta = new SampleMetadata(separator, "col1", "col2")
-
- def testCompare() {
- given:
- def sampleMetadata = new SampleMetadata(separator, "col1")
- def firstRow = new Sample(0, sampleMetadata, "1")
- def secondRow = new Sample(1, sampleMetadata, "2")
- def sut = new FieldSampleComparator("col1")
- sut.initialize(sampleMetadata)
- expect:
- sut.compare(firstRow, secondRow) < 0
- sut.compare(secondRow, firstRow) > 0
- sut.compare(firstRow, firstRow) == 0
- sut.compare(secondRow, secondRow) == 0
+ fun assertCompare(comparator: FieldSampleComparator, a: Sample, b: Sample, expectedSign: Int) {
+ Assertions.assertEquals(expectedSign.sign, comparator.compare(a, b).sign) {
+ "$comparator.compare($a, $b)"
+ }
}
- def "initialize ensures correct column is compared"() {
- given:
- def sut = new FieldSampleComparator("col2")
- def firstRow = new Sample(0, multiColSampleMeta, "1", "3")
- def secondRow = new Sample(1, multiColSampleMeta, "2", "3")
- sut.initialize(multiColSampleMeta)
- expect:
- sut.compare(firstRow, secondRow) == 0
+ @Test
+ fun testCompare() {
+ val sampleMetadata = SampleMetadata(separator, "col1")
+ val firstRow = Sample(0, sampleMetadata, "1")
+ val secondRow = Sample(1, sampleMetadata, "2")
+ val sut = FieldSampleComparator("col1")
+ sut.initialize(sampleMetadata)
+
+ assertCompare(sut, firstRow, secondRow, -1)
+ assertCompare(sut, secondRow, firstRow, 1)
+ assertCompare(sut, firstRow, firstRow, 0)
+ assertCompare(sut, secondRow, secondRow, 0)
}
- def "Incorrectly uses first column if initialize isn't called"() {
- given:
- def sut = new FieldSampleComparator("col2")
- def firstRow = new Sample(0, multiColSampleMeta, "1", "3")
- def secondRow = new Sample(1, multiColSampleMeta, "2", "3")
- expect:
- sut.compare(firstRow, secondRow) != 0
+ @Test
+ fun `initialize ensures correct column is compared`() {
+ val sut = FieldSampleComparator("col2")
+ val firstRow = Sample(0, multiColSampleMeta, "1", "3")
+ val secondRow = Sample(1, multiColSampleMeta, "2", "3")
+ sut.initialize(multiColSampleMeta)
+
+ assertCompare(sut, firstRow, secondRow, 0)
}
+ @Test
+ fun `Incorrectly uses first column if initialize isn't called`() {
+ val sut = FieldSampleComparator("col2")
+ val firstRow = Sample(0, multiColSampleMeta, "1", "3")
+ val secondRow = Sample(1, multiColSampleMeta, "2", "3")
+
+ assertCompare(sut, firstRow, secondRow, -1)
+ }
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ListResultDataTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ListResultDataTest.kt
index 9f4e574..7dc6452 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ListResultDataTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/ListResultDataTest.kt
@@ -17,27 +17,36 @@
package org.apache.jmeter.report.processor
-import spock.lang.Specification
-import spock.lang.Unroll
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertTrue
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.MethodSource
-@Unroll
-class ListResultDataSpec extends Specification {
-
- def sut = new ListResultData()
-
- def "a new ListResultData is empty"() {
- expect:
- new ListResultData().size() == 0
+class ListResultDataTest {
+ companion object {
+ @JvmStatic
+ fun addResultInputs() = listOf(
+ null,
+ ValueResultData(),
+ ListResultData(),
+ )
}
- def "addResult adds #object to list and returns true"() {
- when:
- def result = sut.addResult(object)
- then:
- result
- sut.getSize() == 1
- sut.get(0) == object
- where:
- object << [null, Mock(ResultData), new ListResultData()]
+ val sut = ListResultData()
+
+ @Test
+ fun `a new ListResultData is empty`() {
+ assertEquals(0, sut.size)
+ assertEquals(listOf<Any>(), sut.toList())
+ }
+
+ @ParameterizedTest
+ @MethodSource("addResultInputs")
+ fun addResult(input: ResultData?) {
+ assertTrue(sut.addResult(input), "addResult should return true")
+ assertEquals(listOf(input), sut.toList()) {
+ "ListResultData().add($input).toList()"
+ }
}
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsBySamplerConsumerTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsBySamplerConsumerTest.kt
index f43c41d..f4284f9 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsBySamplerConsumerTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsBySamplerConsumerTest.kt
@@ -17,62 +17,74 @@
package org.apache.jmeter.report.processor
-
+import io.mockk.every
+import io.mockk.mockk
import org.apache.jmeter.report.core.Sample
import org.apache.jmeter.report.utils.MetricUtils
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
-import spock.lang.Specification
+class Top5ErrorsBySamplerConsumerTest {
+ val sut = Top5ErrorsBySamplerConsumer()
-class Top5ErrorsBySamplerConsumerSpec extends Specification {
+ @Test
+ fun `summary info data updated with non-controller passing sample`() {
+ val mockSummaryInfo = mockk<AbstractSummaryConsumer<Top5ErrorsSummaryData>.SummaryInfo> {
+ every { getData() } answers { callOriginal() }
+ every { setData(any()) } answers { callOriginal() }
+ }
+ val mockSample = mockk<Sample>(relaxed = true) {
+ every { success } returns true
+ }
+ sut.updateData(mockSummaryInfo, mockSample)
- def sut = new Top5ErrorsBySamplerConsumer()
-
- def "summary info data updated with non-controller passing sample"() {
- given:
- def mockSummaryInfo = Mock(AbstractSummaryConsumer.SummaryInfo)
- def mockSample = Mock(Sample) {
- getSuccess() >> true
- }
- when:
- sut.updateData(mockSummaryInfo, mockSample)
- then:
- def data = (Top5ErrorsSummaryData) mockSummaryInfo.getData()
- data.getTotal() == 1
+ val data = mockSummaryInfo.getData()
+ assertEquals(1, data.total, "data.total")
}
- def "summary info data updated with non-controller failing sample"() {
- given:
- def mockSummaryInfo = Mock(AbstractSummaryConsumer.SummaryInfo)
- def mockSample = Mock(Sample) {
- getResponseCode() >> "200"
- }
- when:
- sut.updateData(mockSummaryInfo, mockSample)
- then:
- def data = (Top5ErrorsSummaryData) mockSummaryInfo.getData()
- data.getTotal() == 1
- data.getErrors() == 1
- data.top5ErrorsMetrics[0][0] == MetricUtils.ASSERTION_FAILED
- def overallData = (Top5ErrorsSummaryData) sut.getOverallInfo().getData()
- overallData.getTotal() == 1
- overallData.getErrors() == 1
- overallData.top5ErrorsMetrics[0][0] == MetricUtils.ASSERTION_FAILED
+ @Test
+ fun `summary info data updated with non-controller failing sample`() {
+ val mockSummaryInfo = mockk<AbstractSummaryConsumer<Top5ErrorsSummaryData>.SummaryInfo> {
+ every { getData() } answers { callOriginal() }
+ every { setData(any()) } answers { callOriginal() }
+ }
+ val mockSample = mockk<Sample>(relaxed = true) {
+ every { responseCode } returns "200"
+ }
+ sut.updateData(mockSummaryInfo, mockSample)
+
+ val data = mockSummaryInfo.getData()
+ assertEquals(1, data.total, "data.total")
+ assertEquals(1, data.errors, "data.errors")
+ assertEquals(MetricUtils.ASSERTION_FAILED, data.top5ErrorsMetrics[0][0], "data.top5ErrorsMetrics[0][0]")
+
+ val overallData = sut.overallInfo.getData()
+ assertEquals(1, overallData.total, "data.total")
+ assertEquals(1, overallData.errors, "data.errors")
+ assertEquals(
+ MetricUtils.ASSERTION_FAILED,
+ overallData.top5ErrorsMetrics[0][0],
+ "overallData.top5ErrorsMetrics[0][0]"
+ )
}
- def "key from sample is name"() {
- given:
- def mockSample = Mock(Sample)
- when:
- def key = sut.getKeyFromSample(mockSample)
- then:
- 1 * mockSample.getName() >> "name"
- key == "name"
+ @Test
+ fun `key from sample is name`() {
+ val sample = mockk<Sample> {
+ every { name } returns "name"
+ }
+ assertEquals("name", sut.getKeyFromSample(sample)) {
+ "getKeyFromSample(sample) should return the name of the sample"
+ }
}
- def "there are 3 + 2n expected results title columns"() {
- expect:
- sut.createResultTitles().size ==
- 3 + 2 * sut.MAX_NUMBER_OF_ERRORS_IN_TOP
+ @Test
+ fun `there are 3 + 2n expected results title columns`() {
+ assertEquals(
+ 3 + 2 * Top5ErrorsBySamplerConsumer.MAX_NUMBER_OF_ERRORS_IN_TOP,
+ sut.createResultTitles().size
+ ) {
+ ".createResultTitles().size should be 3 + 2 * ${Top5ErrorsBySamplerConsumer.MAX_NUMBER_OF_ERRORS_IN_TOP}"
+ }
}
-
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsSummaryDataTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsSummaryDataTest.kt
index 3ffd87c..f47fb67 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsSummaryDataTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/Top5ErrorsSummaryDataTest.kt
@@ -17,44 +17,59 @@
package org.apache.jmeter.report.processor
-import spock.lang.Specification
+import org.junit.jupiter.api.Assertions.assertArrayEquals
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
-class Top5ErrorsSummaryDataSpec extends Specification {
+class Top5ErrorsSummaryDataTest {
+ val sut = Top5ErrorsSummaryData()
- def sut = new Top5ErrorsSummaryData()
-
- def "error and total count start at 0"() {
- expect:
- sut.getErrors() == 0
- sut.getTotal() == 0
+ @Test
+ fun `error and total count start at 0`() {
+ assertEquals(0, sut.errors, "errors")
+ assertEquals(0, sut.total, "total")
}
- def "error and total count increment by one each time"() {
- when:
- sut.incErrors()
- sut.incTotal()
- then:
- sut.getErrors() == 1
- sut.getTotal() == 1
+ @Test
+ fun `incErrors increments errors`() {
+ sut.incErrors()
+ assertEquals(1, sut.errors, "errors")
}
- def "when no errors are registered an array with null values is returned"() {
- expect:
- sut.getTop5ErrorsMetrics() == new Object[0][0]
+ @Test
+ fun `incTotal increments total`() {
+ sut.incTotal()
+ assertEquals(1, sut.total, "total")
}
- def "error messages with the same frequency are preserved up until the size limit"() {
- given:
- ["A", "B", "C", "D", "E", "F"].each { sut.registerError(it) }
- expect:
- sut.getTop5ErrorsMetrics() == [["A", 1], ["B", 1], ["C", 1], ["D", 1], ["E", 1]]
+ @Test
+ fun `when no errors are registered an array with null values is returned`() {
+ assertArrayEquals(arrayOf<Array<Any>>(), sut.getTop5ErrorsMetrics(), "getTop5ErrorsMetrics")
}
- def "error messages are sorted by size, descending"() {
- given:
- ["A", "A", "A", "B", "B", "C"].each { sut.registerError(it) }
- expect:
- sut.getTop5ErrorsMetrics() == [["A", 3], ["B", 2], ["C", 1]]
+ @Test
+ fun `error messages with the same frequency are preserved up until the size limit`() {
+ val input = listOf("A", "B", "C", "D", "E", "F")
+ input.forEach { sut.registerError(it) }
+ assertArrayEquals(
+ input.take(5).map { arrayOf(it, 1L) }.toTypedArray(),
+ sut.getTop5ErrorsMetrics(),
+ "registerErrors $input, then call getTop5ErrorsMetrics"
+ )
}
+ @Test
+ fun `error messages are sorted by size, descending`() {
+ val input = listOf("A", "A", "A", "B", "B", "C")
+ input.forEach { sut.registerError(it) }
+ assertArrayEquals(
+ arrayOf(
+ arrayOf("A", 3L),
+ arrayOf("B", 2L),
+ arrayOf("C", 1L)
+ ),
+ sut.top5ErrorsMetrics,
+ "registerErrors $input, then call getTop5ErrorsMetrics"
+ )
+ }
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerTest.kt
index 2036bf0..918764e 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerTest.kt
@@ -17,39 +17,37 @@
package org.apache.jmeter.report.processor.graph.impl
-import java.util.stream.Collectors
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertFalse
+import org.junit.jupiter.api.Test
-import org.apache.jmeter.junit.spock.JMeterSpec
+class ResponseTimePercentilesOverTimeGraphConsumerTest {
+ val sut = ResponseTimePercentilesOverTimeGraphConsumer()
-class ResponseTimePercentilesOverTimeGraphConsumerSpec extends JMeterSpec {
+ @Test
+ fun `GroupInfos have only the required keys`() {
+ val groupInfosMap = sut.createGroupInfos()
- static def EXPECTED_KEYS =
- ['aggregate_report_min',
- 'aggregate_report_max',
- 'aggregate_rpt_pct1',
- 'aggregate_rpt_pct2',
- 'aggregate_rpt_pct3',
- 'aggregate_report_median'] as Set
-
- def sut = new ResponseTimePercentilesOverTimeGraphConsumer()
-
- def "GroupInfos have only the required keys"() {
- when:
- def groupInfosMap = sut.createGroupInfos()
- then:
- groupInfosMap.keySet() == EXPECTED_KEYS
+ assertEquals(
+ setOf(
+ "aggregate_report_min",
+ "aggregate_report_max",
+ "aggregate_rpt_pct1",
+ "aggregate_rpt_pct2",
+ "aggregate_rpt_pct3",
+ "aggregate_report_median",
+ ),
+ groupInfosMap.keys,
+ "createGroupInfos().keys"
+ )
}
- def "GroupInfos have the expected settings"() {
- when:
- def groupInfos = sut.createGroupInfos()
- def groupInfoValues = groupInfos
- .entrySet().stream()
- .map { it.value }
- .collect(Collectors.toList())
- then:
- groupInfoValues.every { !it.enablesAggregatedKeysSeries() }
- groupInfoValues.every { !it.enablesOverallSeries() }
+ @Test
+ fun `GroupInfos have the expected settings`() {
+ val groupInfos = sut.createGroupInfos()
+ groupInfos.values.forEach {
+ assertFalse(it.enablesAggregatedKeysSeries(), "enablesAggregatedKeysSeries()")
+ assertFalse(it.enablesOverallSeries(), "enablesOverallSeries()")
+ }
}
-
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/services/FileServerTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/services/FileServerTest.kt
index d02c2dc..c48e619 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/services/FileServerTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/services/FileServerTest.kt
@@ -17,221 +17,249 @@
package org.apache.jmeter.services
-import org.apache.jmeter.junit.spock.JMeterSpec
+import org.apache.jmeter.junit.JMeterTestCase
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.Assertions.assertArrayEquals
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertFalse
+import org.junit.jupiter.api.Assertions.assertTrue
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertThrows
+import org.junit.jupiter.api.fail
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.MethodSource
+import java.io.EOFException
+import java.io.File
+import java.io.IOException
-import spock.lang.Unroll
+class FileServerTest : JMeterTestCase() {
+ val sut = FileServer()
-@Unroll
-class FileServerSpec extends JMeterSpec {
+ val testFile = getResourceFilePath("testfiles/unit/FileServerSpec.csv")
+ val emptyFile = getResourceFilePath("testfiles/empty.csv")
+ val bomFile = getResourceFilePath("testfiles/bomData.csv")
- def sut = new FileServer()
+ data class SetBaseForScriptCase(val file: File, val expectedBaseDirRelative: String)
- def testFile = getResourceFilePath("testfiles/unit/FileServerSpec.csv")
- def emptyFile = getResourceFilePath("testfiles/empty.csv")
- def bomFile = getResourceFilePath("testfiles/bomData.csv")
+ companion object {
+ @JvmStatic
+ fun setBaseForScript(): List<SetBaseForScriptCase> {
+ val baseFile = File(FileServer.getDefaultBase())
+ return listOf(
+ SetBaseForScriptCase(baseFile, "."),
+ SetBaseForScriptCase(baseFile.getParentFile(), "."),
+ SetBaseForScriptCase(File(baseFile.getParentFile(), "abcd/defg.jmx"), "."),
+ SetBaseForScriptCase(File(baseFile, "abcd/defg.jmx"), "abcd"),
+ )
+ }
+ }
- def setup() {
+ @BeforeEach
+ fun setup() {
sut.resetBase()
}
- def tearDown() {
+ @AfterEach
+ fun tearDown() {
sut.closeFiles()
}
- def "reading a non-existent file throws an exception"() {
- when:
+ @Test
+ fun `reading a non-existent file throws an exception`() {
+ assertThrows<IOException> {
sut.readLine("test")
- then:
- thrown(IOException)
+ }
}
- def "writing to a non-exisent file throws an exception"() {
- when:
+ @Test
+ fun `writing to a non-exisent file throws an exception`() {
+ assertThrows<IOException> {
sut.write("test", "")
- then:
- thrown(IOException)
+ }
}
- def "no files should be open following resetBase"() {
- expect:
- !sut.filesOpen()
+ @Test
+ fun `no files should be open following resetBase`() {
+ assertNoFilesOpen()
}
- def "closing unrecognised files are ignored"() {
- when:
- sut.closeFile("xxx")
- then:
- !sut.filesOpen()
- noExceptionThrown()
+ @Test
+ fun `closing unrecognised files are ignored`() {
+ sut.closeFile("xxx")
+ assertNoFilesOpen()
}
- def "file is not opened until read from"() {
- given:
- sut.reserveFile(testFile) // Does not open file
- assert !sut.filesOpen()
- when:
- def line = sut.readLine(testFile)
- then:
- line == "a1,b1,c1,d1"
- sut.filesOpen()
+ @Test
+ fun `file is not opened until read from`() {
+ sut.reserveFile(testFile) // Does not open file
+ assertNoFilesOpen()
+ assertEquals("a1,b1,c1,d1", sut.readLine(testFile)) {
+ "readLine($testFile)"
+ }
+ assertFilesOpen()
}
- def "reading lines loops to start once last line is read"() {
- given:
- sut.reserveFile(testFile)
- when:
- def firstPass = [sut.readLine(testFile), sut.readLine(testFile), sut.readLine(testFile), sut.readLine(testFile)]
- def secondPass = [sut.readLine(testFile), sut.readLine(testFile), sut.readLine(testFile), sut.readLine(testFile)]
- then:
- firstPass == secondPass
+ private fun assertNoFilesOpen() {
+ assertFalse(sut.filesOpen(), "filesOpen")
}
- def "cannot write to reserved file after reading"() {
- given:
- sut.reserveFile(testFile)
- sut.readLine(testFile)
- when:
+ private fun assertFilesOpen() {
+ assertTrue(sut.filesOpen(), "filesOpen")
+ }
+
+ @Test
+ fun `reading lines loops to start once last line is read`() {
+ sut.reserveFile(testFile)
+ val firstPass = Array(4) { sut.readLine(testFile) }
+ val secondPass = Array(4) { sut.readLine(testFile) }
+ assertArrayEquals(firstPass, secondPass)
+ }
+
+ @Test
+ fun `cannot write to reserved file after reading`() {
+ sut.reserveFile(testFile)
+ sut.readLine(testFile)
+ assertThrows<IOException> {
sut.write(testFile, "")
- then:
- thrown(IOException)
+ }
}
- def "closing reserved file after reading resets"() {
- given:
- sut.reserveFile(testFile)
+ @Test
+ fun `closing reserved file after reading resets`() {
+ sut.reserveFile(testFile)
+ sut.readLine(testFile)
+ sut.closeFile(testFile) // does not remove the entry
+ assertNoFilesOpen()
+ assertEquals("a1,b1,c1,d1", sut.readLine(testFile), "re-read first line")
+ assertFilesOpen()
+ }
+
+ @Test
+ fun `closeFiles() prevents reading of reserved file`() {
+ sut.reserveFile(testFile)
+ sut.readLine(testFile)
+ sut.closeFiles() // removes all entries
+ assertThrows<IOException> {
sut.readLine(testFile)
- when:
- sut.closeFile(testFile) // does not remove the entry
- then:
- !sut.filesOpen()
- sut.readLine(testFile) == "a1,b1,c1,d1" // Re-read first line
- sut.filesOpen()
+ }
+ assertNoFilesOpen()
}
- def "closeFiles() prevents reading of reserved file"() {
- given:
- sut.reserveFile(testFile)
- sut.readLine(testFile)
- when:
- sut.closeFiles() // removes all entries
- sut.readLine(testFile)
- then:
- !sut.filesOpen()
- thrown(IOException)
+ @Test
+ fun `baseDir is the defaultBasedir`() {
+ assertEquals(FileServer.getDefaultBase(), sut.getBaseDir()) {
+ "getBaseDir should be FileServer.getDefaultBase()"
+ }
}
- def "baseDir is the defaultBasedir"() {
- expect:
- sut.getBaseDir() == FileServer.getDefaultBase()
- }
+ @Test
+ fun `setBaseDir doesn't error when no files are open`() {
+ sut.setBasedir("testfiles/unit/FileServerSpec.csv")
- def "setBaseDir doesn't error when no files are open"() {
- when:
- sut.setBasedir("testfiles/unit/FileServerSpec.csv")
- then:
- sut.getBaseDir().replaceAll("\\\\", "/").endsWith("testfiles/unit")
+ val result = sut.baseDir.replace("\\", "/")
+ if (!result.endsWith("testfiles/unit")) {
+ fail("baseDir should start with testfiles/unit, but was $result")
+ }
}
// TODO: what about throwing an exception in setBaseDir?
- def "setBaseDir doesn't set base when passed a directory"() {
- def dir = "does-not-exist"
- given:
- sut.setBasedir(dir)
- when:
- sut.getBaseDir().endsWith(dir)
- then:
- thrown(NullPointerException)
+ @Test
+ fun `setBaseDir doesn't set base when passed a directory`() {
+ val dir = "does-not-exist"
+ sut.setBasedir(dir)
+ assertThrows<NullPointerException> {
+ sut.baseDir.endsWith(dir)
+ }
}
- def "cannot set baseDir when files are open"() {
- given:
- sut.reserveFile(testFile)
- sut.readLine(testFile) == "a1,b1,c1,d1"
- when:
+ @Test
+ fun `cannot set baseDir when files are open`() {
+ sut.reserveFile(testFile)
+ assertEquals("a1,b1,c1,d1", sut.readLine(testFile), "sut.readLine($testFile)")
+ assertThrows<IllegalStateException> {
sut.setBasedir("testfiles")
- then:
- thrown(IllegalStateException)
+ }
}
- static def baseFile = new File(FileServer.getDefaultBase())
-
- def "setting base to #file gives getBaseDirRelative == #expectedBaseDirRelative"() {
- when:
- sut.setBaseForScript(file)
- then:
- sut.getBaseDirRelative().toString() == expectedBaseDirRelative
- where:
- file | expectedBaseDirRelative
- baseFile | "."
- baseFile.getParentFile() | "."
- new File(baseFile.getParentFile(), "abcd/defg.jmx") | "."
- new File(baseFile, "abcd/defg.jmx") | "abcd"
+ @ParameterizedTest
+ @MethodSource("setBaseForScript")
+ fun `setting base to #file gives getBaseDirRelative == #expectedBaseDirRelative`(case: SetBaseForScriptCase) {
+ sut.setBaseForScript(case.file)
+ assertEquals(case.expectedBaseDirRelative, sut.getBaseDirRelative().toString())
}
- def "non-existent filename to reserveFile will throw exception"() {
- given:
- def missing = "no-such-file"
- def alias = "missing"
- def charsetName = "UTF-8"
- def hasHeader = true
- when:
+ @Test
+ fun `non-existent filename to reserveFile will throw exception`() {
+ val missing = "no-such-file"
+ val alias = "missing"
+ val charsetName = "UTF-8"
+ val hasHeader = true
+ val ex = assertThrows<IllegalArgumentException> {
sut.reserveFile(missing, charsetName, alias, hasHeader)
- then:
- def ex = thrown(IllegalArgumentException)
- ex.getMessage() == "Could not read file header line for file $missing"
- ex.getCause().getMessage() == "File $missing must exist and be readable"
+ }
+ assertEquals("Could not read file header line for file $missing", ex.message) {
+ "ex.message"
+ }
+ assertEquals("File $missing must exist and be readable", ex.cause?.message) {
+ "ex.cause?.message"
+ }
}
- def "reserving a file with no header will throw an exception if the header is expected"() {
- given:
- def alias = "empty"
- def charsetName = "UTF-8"
- when:
+ @Test
+ fun `reserving a file with no header will throw an exception if the header is expected`() {
+ val alias = "empty"
+ val charsetName = "UTF-8"
+ val e = assertThrows<IllegalArgumentException> {
sut.reserveFile(emptyFile, charsetName, alias, true)
- then:
- def e = thrown(IllegalArgumentException)
- e.getCause() instanceof EOFException
+ }
+ if (e.cause !is EOFException) {
+ fail("reserveFile(emptyFile) should throw IllegalArgumentException(cause=EOFException), got cause=${e.cause}")
+ }
}
- def "resolvedFile returns absolute and relative files"() {
- given:
- def testFile = new File(emptyFile)
- expect:
- // absolute
- sut.getResolvedFile(testFile.getAbsolutePath())
- .getCanonicalFile() == testFile.getCanonicalFile()
- // relative
- sut.getResolvedFile(testFile.getParentFile().getPath() + "/../testfiles/empty.csv")
- .getCanonicalFile() == testFile.getCanonicalFile()
+ @Test
+ fun `resolvedFile returns absolute and relative files`() {
+ val testFile = File(emptyFile)
+ assertEquals(
+ testFile.getCanonicalFile(),
+ sut.getResolvedFile(testFile.absolutePath).getCanonicalFile(),
+ "sut.getResolvedFile(testFile.absolutePath)"
+ )
+ // relative
+ assertEquals(
+ testFile.getCanonicalFile(),
+ sut.getResolvedFile(testFile.getParentFile().path + "/../testfiles/empty.csv")
+ .getCanonicalFile(),
+ "sut.getResolvedFile(testFile.getParentFile().path + \"/../testfiles/empty.csv\")"
+ )
}
- def "resolvedFile returns relative files with BaseForScript set"() {
- given:
- def testFile = new File(emptyFile)
- when:
- sut.setBaseForScript(testFile)
- then:
- sut.getResolvedFile(testFile.getName())
- .getCanonicalFile() == testFile.getCanonicalFile()
+ @Test
+ fun `resolvedFile returns relative files with BaseForScript set`() {
+ val testFile = File(emptyFile)
+ sut.setBaseForScript(testFile)
+ assertEquals(
+ testFile.getCanonicalFile(),
+ sut.getResolvedFile(testFile.getName()).getCanonicalFile()
+ ) {
+ ".getResolvedFile(${testFile.name}).getCanonicalFile()"
+ }
}
- def "skip bom at start of file and set correct encoding"() {
- given:
- sut.reserveFile(bomFile)
- when:
- def header = sut.readLine(bomFile)
- then:
- header == '"äöü"'
+ @Test
+ fun `skip bom at start of file and set correct encoding`() {
+ sut.reserveFile(bomFile)
+ val header = sut.readLine(bomFile)
+ assertEquals("\"äöü\"", header)
}
- def "fail to read a line from a directory"() {
- given:
- def directory = new File(bomFile).parent
- sut.reserveFile(directory)
- when:
+ @Test
+ fun `fail to read a line from a directory`() {
+ val directory = File(bomFile).parent
+ sut.reserveFile(directory)
+ assertThrows<IllegalArgumentException> {
sut.readLine(directory)
- then:
- thrown(IllegalArgumentException)
+ }
}
-
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/testelement/AbstractTestElementTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/testelement/AbstractTestElementTest.kt
index 10347c2..61e0e26 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/testelement/AbstractTestElementTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/testelement/AbstractTestElementTest.kt
@@ -17,7 +17,13 @@
package org.apache.jmeter.testelement
+import io.mockk.mockk
+import io.mockk.spyk
+import org.apache.jmeter.testelement.property.CollectionProperty
+import org.apache.jmeter.testelement.property.TestElementProperty
import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertFalse
+import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class AbstractTestElementTest {
@@ -50,4 +56,40 @@
"Note that comments is added in constructor, however, we remove <<comments>> property before cloning"
}
}
+
+ @Test
+ fun `set outer properties as temporary when using a TestElementProperty`() {
+ val sut = spyk<AbstractTestElement>()
+ val outerElement = mockk<TestElement>(relaxed = true)
+ val innerElement = mockk<TestElement>(relaxed = true)
+ val outerProp = TestElementProperty("outerProp", outerElement)
+ val innerProp = TestElementProperty("innerProp", innerElement)
+ outerProp.addProperty(innerProp)
+
+ sut.setTemporary(outerProp)
+
+ assertTrue(sut.isTemporary(outerProp)) {
+ "isTemporary($outerProp)"
+ }
+ assertFalse(sut.isTemporary(innerProp)) {
+ "isTemporary($innerProp)"
+ }
+ }
+
+ @Test
+ fun `set all properties as temporary when using a MultiProperty`() {
+ val sut = spyk<AbstractTestElement>()
+ val outerProp = CollectionProperty()
+ val innerProp = CollectionProperty()
+
+ outerProp.addProperty(innerProp)
+ sut.setTemporary(outerProp)
+
+ assertTrue(sut.isTemporary(outerProp)) {
+ "isTemporary($outerProp)"
+ }
+ assertTrue(sut.isTemporary(innerProp)) {
+ "isTemporary($innerProp)"
+ }
+ }
}
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/util/keystore/JmeterKeyStoreTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/util/keystore/JmeterKeyStoreTest.kt
index 0ca8fe8..5f906cf 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/util/keystore/JmeterKeyStoreTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/util/keystore/JmeterKeyStoreTest.kt
@@ -17,24 +17,29 @@
package org.apache.jmeter.util.keystore
+import org.junit.jupiter.api.assertThrows
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.MethodSource
import java.security.KeyStore
-import spock.lang.Specification
-import spock.lang.Unroll
-
-@Unroll
-class JmeterKeyStoreSpec extends Specification {
-
- def "IllegalArgumentException expected when (#startIndex, #endIndex) startIndex < 0, endIndex < -1, or endIndex < startIndex"() {
- when:
- JmeterKeyStore.getInstance(KeyStore.defaultType, startIndex, endIndex, "defaultName")
- then:
- thrown IllegalArgumentException
- where:
- startIndex | endIndex
- -1 | 0
- 0 | -2 // -1 indicates to return the first alias only
- 1 | 0
+class JmeterKeyStoreTest {
+ data class Case(val startIndex: Int, val endIndex: Int, val message: String? = null)
+ companion object {
+ @JvmStatic
+ fun inputs() = listOf(
+ Case(-1, 0),
+ Case(0, -2, "-1 indicates to return the first alias only"),
+ Case(1, 0),
+ )
}
+ @ParameterizedTest
+ @MethodSource("inputs")
+ fun `throws IllegalArgumentException`(case: Case) {
+ assertThrows<IllegalArgumentException> {
+ JmeterKeyStore.getInstance(
+ KeyStore.getDefaultType(), case.startIndex, case.endIndex, "defaultName"
+ )
+ }
+ }
}