From 0b092b352dc29ce69f6f126eb7857a1243a6ef62 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 23 Feb 2021 11:46:06 +0100 Subject: Extract testing conventions from Kotlin conventions This change extracts the configuration for test from the Kotlin library conventions. --- simulator/opendc-harness/build.gradle.kts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'simulator/opendc-harness') diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index 359d2384..fd692237 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -24,24 +24,22 @@ description = "Harness for defining repeatable experiments using OpenDC" /* Build configuration */ plugins { - `kotlin-library-convention` + `kotlin-library-conventions` + `testing-conventions` } dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Library.KOTLINX_COROUTINES}") - api("org.junit.platform:junit-platform-commons:${Library.JUNIT_PLATFORM}") + api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.KOTLINX_COROUTINES}") + api("org.junit.platform:junit-platform-commons:${Versions.JUNIT_PLATFORM}") implementation("io.github.classgraph:classgraph:4.8.98") implementation("me.tongfei:progressbar:0.9.0") implementation("io.github.microutils:kotlin-logging:2.0.4") implementation("com.github.ajalt.clikt:clikt:3.1.0") - api("org.junit.platform:junit-platform-engine:${Library.JUNIT_PLATFORM}") - api("org.junit.platform:junit-platform-suite-api:${Library.JUNIT_PLATFORM}") - api("org.junit.platform:junit-platform-launcher:${Library.JUNIT_PLATFORM}") + api("org.junit.platform:junit-platform-engine:${Versions.JUNIT_PLATFORM}") + api("org.junit.platform:junit-platform-suite-api:${Versions.JUNIT_PLATFORM}") + api("org.junit.platform:junit-platform-launcher:${Versions.JUNIT_PLATFORM}") runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:2.14.0") - - testImplementation("org.junit.jupiter:junit-jupiter-api:${Library.JUNIT_JUPITER}") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${Library.JUNIT_JUPITER}") } -- cgit v1.2.3 From 90de768b8bfb3acc222f508d2e602ef3b7f1ff91 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 23 Feb 2021 12:05:59 +0100 Subject: Move dependency versions to gradle.properties This change moves the version of the dependencies from buildSrc to gradle.properties to prevent recompilation when changing dependency versions. --- simulator/opendc-harness/build.gradle.kts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'simulator/opendc-harness') diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index fd692237..ebede556 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -29,17 +29,17 @@ plugins { } dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.KOTLINX_COROUTINES}") - api("org.junit.platform:junit-platform-commons:${Versions.JUNIT_PLATFORM}") + api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${versions.kotlinxCoroutines}") + api("org.junit.platform:junit-platform-commons:${versions.junitPlatform}") implementation("io.github.classgraph:classgraph:4.8.98") implementation("me.tongfei:progressbar:0.9.0") - implementation("io.github.microutils:kotlin-logging:2.0.4") + implementation("io.github.microutils:kotlin-logging:${versions.kotlinLogging}") implementation("com.github.ajalt.clikt:clikt:3.1.0") - api("org.junit.platform:junit-platform-engine:${Versions.JUNIT_PLATFORM}") - api("org.junit.platform:junit-platform-suite-api:${Versions.JUNIT_PLATFORM}") - api("org.junit.platform:junit-platform-launcher:${Versions.JUNIT_PLATFORM}") + api("org.junit.platform:junit-platform-engine:${versions.junitPlatform}") + api("org.junit.platform:junit-platform-suite-api:${versions.junitPlatform}") + api("org.junit.platform:junit-platform-launcher:${versions.junitPlatform}") - runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:2.14.0") + runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}") } -- cgit v1.2.3 From 2119427fe6f7874867c6985cacda28befc53436b Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 23 Feb 2021 12:37:31 +0100 Subject: Utilize version constraints for shared versions This change updates the Gradle configuration to utilize version constraints to force the same dependency version across modules. --- simulator/opendc-harness/build.gradle.kts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'simulator/opendc-harness') diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index ebede556..25ffbd57 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -29,17 +29,17 @@ plugins { } dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${versions.kotlinxCoroutines}") + api("org.jetbrains.kotlinx:kotlinx-coroutines-core") api("org.junit.platform:junit-platform-commons:${versions.junitPlatform}") - implementation("io.github.classgraph:classgraph:4.8.98") - implementation("me.tongfei:progressbar:0.9.0") - implementation("io.github.microutils:kotlin-logging:${versions.kotlinLogging}") - implementation("com.github.ajalt.clikt:clikt:3.1.0") + implementation("io.github.classgraph:classgraph:${versions["classgraph"]}") + implementation("io.github.microutils:kotlin-logging") + implementation("com.github.ajalt.clikt:clikt:${versions["clikt"]}") + implementation("me.tongfei:progressbar:${versions["progressbar"]}") - api("org.junit.platform:junit-platform-engine:${versions.junitPlatform}") - api("org.junit.platform:junit-platform-suite-api:${versions.junitPlatform}") - api("org.junit.platform:junit-platform-launcher:${versions.junitPlatform}") + implementation("org.junit.platform:junit-platform-engine:${versions.junitPlatform}") + implementation("org.junit.platform:junit-platform-suite-api:${versions.junitPlatform}") + implementation("org.junit.platform:junit-platform-launcher:${versions.junitPlatform}") runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}") } -- cgit v1.2.3 From 7adbef95ee487cba4eb368b01759be341e35e97b Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 23 Feb 2021 14:35:13 +0100 Subject: Remove unnecessary JUnit dependencies in opendc-harness This change removes unnecessary JUnit dependencies from the opendc-harness module. They are not used nor should they be used by the harness. --- simulator/opendc-harness/build.gradle.kts | 6 ++---- .../org/opendc/harness/runner/junit5/OpenDCTestEngine.kt | 12 +++++------- 2 files changed, 7 insertions(+), 11 deletions(-) (limited to 'simulator/opendc-harness') diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index 25ffbd57..132b9b3b 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -32,14 +32,12 @@ dependencies { api("org.jetbrains.kotlinx:kotlinx-coroutines-core") api("org.junit.platform:junit-platform-commons:${versions.junitPlatform}") + implementation("org.junit.platform:junit-platform-engine:${versions.junitPlatform}") implementation("io.github.classgraph:classgraph:${versions["classgraph"]}") implementation("io.github.microutils:kotlin-logging") + implementation("com.github.ajalt.clikt:clikt:${versions["clikt"]}") implementation("me.tongfei:progressbar:${versions["progressbar"]}") - implementation("org.junit.platform:junit-platform-engine:${versions.junitPlatform}") - implementation("org.junit.platform:junit-platform-suite-api:${versions.junitPlatform}") - implementation("org.junit.platform:junit-platform-launcher:${versions.junitPlatform}") - runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j}") } diff --git a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt index 685cd41a..0a420405 100644 --- a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt +++ b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt @@ -30,13 +30,13 @@ import org.junit.platform.engine.discovery.ClassNameFilter import org.junit.platform.engine.discovery.ClassSelector import org.junit.platform.engine.discovery.MethodSelector import org.junit.platform.engine.support.descriptor.EngineDescriptor -import org.junit.platform.launcher.LauncherDiscoveryRequest import org.opendc.harness.api.ExperimentDefinition import org.opendc.harness.engine.ExperimentEngineLauncher import org.opendc.harness.engine.discovery.DiscoveryFilter import org.opendc.harness.engine.discovery.DiscoveryProvider import org.opendc.harness.engine.discovery.DiscoveryRequest import org.opendc.harness.engine.discovery.DiscoverySelector +import java.util.* /** * A [TestEngine] implementation that is able to run experiments defined using the harness. @@ -49,13 +49,11 @@ public class OpenDCTestEngine : TestEngine { override fun getId(): String = "opendc" - override fun discover(request: EngineDiscoveryRequest, uniqueId: UniqueId): TestDescriptor { - // Test whether are excluded from the engines - val isEnabled = (request as? LauncherDiscoveryRequest)?.engineFilters?.all { it.toPredicate().test(this) } ?: true - if (!isEnabled) { - return ExperimentEngineDescriptor(uniqueId, emptyFlow()) - } + override fun getGroupId(): Optional = Optional.of("org.opendc") + override fun getArtifactId(): Optional = Optional.of("opendc-harness") + + override fun discover(request: EngineDiscoveryRequest, uniqueId: UniqueId): TestDescriptor { // IntelliJ will pass a [MethodSelector] to run just a single method inside a file. In that // case, no experiments should be discovered, since we support only experiments by class. if (request.getSelectorsByType(MethodSelector::class.java).isNotEmpty()) { -- cgit v1.2.3 From 663c5bf8440a9eec43a5e930475277f6cad52b4c Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 23 Feb 2021 20:36:02 +0100 Subject: harness: Do not finish experiment before scenario and trials This change fixes an issue with the harness where an experiment would be reported finished while its scenarios and trials were still running. This causes issues with Gradle reporting the experiments. --- .../org/opendc/harness/engine/ExperimentEngine.kt | 54 +++++++++++++--------- .../junit5/JUnitExperimentExecutionListener.kt | 10 ++++ .../harness/runner/junit5/OpenDCTestEngine.kt | 2 +- 3 files changed, 43 insertions(+), 23 deletions(-) (limited to 'simulator/opendc-harness') diff --git a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt index 65a0604d..a36f1f9b 100644 --- a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt +++ b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt @@ -51,38 +51,48 @@ public class ExperimentEngine( * * @param root The experiment to execute. */ - @OptIn(InternalCoroutinesApi::class) - public suspend fun execute(root: ExperimentDefinition): Unit = supervisorScope { + public suspend fun execute(root: ExperimentDefinition) { listener.experimentStarted(root) try { - strategy.generate(root) - .asFlow() - .map { scenario -> - listener.scenarioStarted(scenario) - scenario - } - .buffer(100) - .collect { scenario -> - val jobs = (0 until repeats).map { repeat -> - val worker = scheduler.allocate() + supervisorScope { + strategy.generate(root) + .asFlow() + .map { scenario -> + listener.scenarioStarted(scenario) + scenario + } + .buffer(100) + .collect { scenario -> launch { - val trial = Trial(scenario, repeat) + val jobs = (0 until repeats).map { repeat -> + val worker = scheduler.allocate() + launch { + val trial = Trial(scenario, repeat) + try { + listener.trialStarted(trial) + worker.dispatch(trial) + listener.trialFinished(trial, null) + } catch (e: Throwable) { + listener.trialFinished(trial, e) + throw e + } + } + } + try { - listener.trialStarted(trial) - worker.dispatch(trial) - listener.trialFinished(trial, null) + jobs.joinAll() + listener.scenarioFinished(scenario, null) + } catch (e: CancellationException) { + listener.scenarioFinished(scenario, null) + throw e } catch (e: Throwable) { - listener.trialFinished(trial, e) + listener.scenarioFinished(scenario, e) } } } + } - launch { - jobs.joinAll() - listener.scenarioFinished(scenario, null) - } - } listener.experimentFinished(root, null) } catch (e: Throwable) { listener.experimentFinished(root, e) diff --git a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt index 58791549..9e2b629d 100644 --- a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt +++ b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt @@ -24,11 +24,13 @@ package org.opendc.harness.runner.junit5 import org.junit.platform.engine.* import org.junit.platform.engine.support.descriptor.AbstractTestDescriptor +import org.junit.platform.engine.support.descriptor.ClassSource import org.junit.platform.engine.support.descriptor.EngineDescriptor import org.opendc.harness.api.ExperimentDefinition import org.opendc.harness.api.Scenario import org.opendc.harness.api.Trial import org.opendc.harness.engine.ExperimentExecutionListener +import java.util.* /** * An [ExperimentExecutionListener] that notifies JUnit platform of the progress of the experiment trials. @@ -121,6 +123,14 @@ public class JUnitExperimentExecutionListener( override fun mayRegisterTests(): Boolean = true override fun toString(): String = "ExperimentDescriptor" + + override fun getSource(): Optional { + val cls = meta["class.name"] as? String + return if (cls != null) + Optional.of(ClassSource.from(cls)) + else + Optional.empty() + } } } diff --git a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt index 0a420405..ab7367b8 100644 --- a/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt +++ b/simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt @@ -47,7 +47,7 @@ public class OpenDCTestEngine : TestEngine { */ private val logger = KotlinLogging.logger {} - override fun getId(): String = "opendc" + override fun getId(): String = "opendc-harness" override fun getGroupId(): Optional = Optional.of("org.opendc") -- cgit v1.2.3 From 15fcd1a10018605f59ca7a644b8f3b3960e7b6b0 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Tue, 23 Feb 2021 21:40:53 +0100 Subject: Use Java Platform for shared dependency constraints This change uses the Java Platform functionality from Gradle to enable shared dependency constraints across modules. --- simulator/opendc-harness/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) (limited to 'simulator/opendc-harness') diff --git a/simulator/opendc-harness/build.gradle.kts b/simulator/opendc-harness/build.gradle.kts index 132b9b3b..f980853c 100644 --- a/simulator/opendc-harness/build.gradle.kts +++ b/simulator/opendc-harness/build.gradle.kts @@ -29,6 +29,7 @@ plugins { } dependencies { + api(platform(project(":opendc-platform"))) api("org.jetbrains.kotlinx:kotlinx-coroutines-core") api("org.junit.platform:junit-platform-commons:${versions.junitPlatform}") -- cgit v1.2.3