diff options
| author | Hongyu <39747921+HongyuHe@users.noreply.github.com> | 2021-03-06 19:36:46 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-06 19:36:46 +0100 |
| commit | 2977dd8a5f1d742193eae79364a284e68269f7b5 (patch) | |
| tree | 3fb378be396d728d30b2769a4610c652cfb71507 /simulator/opendc-compute/opendc-compute-simulator/src/test | |
| parent | d72ac4b1df32dd5e6bd3faa4fa528dbf8a03f6f1 (diff) | |
sim: Implement energy models from CloudSim (#79)
This commit implements the energy models that are present in CloudSim:
1. Constant
2. Linear
3. Cubic
4. Square root
5. Interpolation based on data.
Diffstat (limited to 'simulator/opendc-compute/opendc-compute-simulator/src/test')
| -rw-r--r-- | simulator/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/power/CpuPowerModelTest.kt | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/simulator/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/power/CpuPowerModelTest.kt b/simulator/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/power/CpuPowerModelTest.kt new file mode 100644 index 00000000..7b0c7515 --- /dev/null +++ b/simulator/opendc-compute/opendc-compute-simulator/src/test/kotlin/org/opendc/compute/simulator/power/CpuPowerModelTest.kt @@ -0,0 +1,75 @@ +package org.opendc.compute.simulator.power + +import io.mockk.* +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource +import org.opendc.compute.core.metal.driver.BareMetalDriver +import org.opendc.compute.simulator.power.api.CpuPowerModel +import org.opendc.compute.simulator.power.models.* +import java.util.stream.Stream +import kotlin.math.pow + +internal class CpuPowerModelTest { + private val epsilon = 10.0.pow(-3) + private val cpuUtil = .9 + + @ParameterizedTest + @MethodSource("cpuPowerModelArgs") + fun `compute power consumption given CPU loads`( + powerModel: CpuPowerModel, + expectedPowerConsumption: Double + ) { + val computedPowerConsumption = powerModel.computeCpuPower(cpuUtil) + assertEquals(expectedPowerConsumption, computedPowerConsumption, epsilon) + } + + @ParameterizedTest + @MethodSource("cpuPowerModelArgs") + fun `ignore idle power when computing power consumptions`( + powerModel: CpuPowerModel, + expectedPowerConsumption: Double + ) { + val zeroPowerModel = ZeroIdlePowerDecorator(powerModel) + val computedPowerConsumption = zeroPowerModel.computeCpuPower(0.0) + assertEquals(0.0, computedPowerConsumption) + } + + @ParameterizedTest + @MethodSource("cpuPowerModelArgs") + fun `emit power draw for hosts by different models`( + powerModel: CpuPowerModel, + expectedPowerConsumption: Double + ) { + val cpuLoads = flowOf(cpuUtil, cpuUtil, cpuUtil) + val bareMetalDriver = mockkClass(BareMetalDriver::class) + every { bareMetalDriver.usage } returns cpuLoads + + runBlocking { + val serverPowerDraw = powerModel.getPowerDraw(bareMetalDriver) + + assertEquals(serverPowerDraw.count(), cpuLoads.count()) + assertEquals( + serverPowerDraw.first().toDouble(), + flowOf(expectedPowerConsumption).first().toDouble(), + epsilon + ) + } + verify(exactly = 1) { bareMetalDriver.usage } + } + + @Suppress("unused") + private companion object { + @JvmStatic + fun cpuPowerModelArgs(): Stream<Arguments> = Stream.of( + Arguments.of(ConstantPowerModel(0.0), 0.0), + Arguments.of(LinearPowerModel(350.0, 200 / 350.0), 335.0), + Arguments.of(SquarePowerModel(350.0, 200 / 350.0), 321.5), + Arguments.of(CubicPowerModel(350.0, 200 / 350.0), 309.35), + Arguments.of(SqrtPowerModel(350.0, 200 / 350.0), 342.302), + ) + } +} |
