diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-02-23 20:36:02 +0100 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2021-02-23 20:36:02 +0100 |
| commit | 663c5bf8440a9eec43a5e930475277f6cad52b4c (patch) | |
| tree | 6adc0b2a32e80d039f121983e6120638f7c7723d /simulator/opendc-harness | |
| parent | 7adbef95ee487cba4eb368b01759be341e35e97b (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')
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") |
