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. --- .../org/opendc/harness/runner/junit5/OpenDCTestEngine.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'simulator/opendc-harness/src/main') 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/src/main') 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