summaryrefslogtreecommitdiff
path: root/simulator/opendc-harness
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-02-23 20:36:02 +0100
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-02-23 20:36:02 +0100
commit663c5bf8440a9eec43a5e930475277f6cad52b4c (patch)
tree6adc0b2a32e80d039f121983e6120638f7c7723d /simulator/opendc-harness
parent7adbef95ee487cba4eb368b01759be341e35e97b (diff)
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.
Diffstat (limited to 'simulator/opendc-harness')
-rw-r--r--simulator/opendc-harness/src/main/kotlin/org/opendc/harness/engine/ExperimentEngine.kt54
-rw-r--r--simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/JUnitExperimentExecutionListener.kt10
-rw-r--r--simulator/opendc-harness/src/main/kotlin/org/opendc/harness/runner/junit5/OpenDCTestEngine.kt2
3 files changed, 43 insertions, 23 deletions
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<TestSource> {
+ 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<String> = Optional.of("org.opendc")