summaryrefslogtreecommitdiff
path: root/simulator/opendc-compute/opendc-compute-simulator/src/test
diff options
context:
space:
mode:
authorHongyu <39747921+HongyuHe@users.noreply.github.com>2021-03-06 19:36:46 +0100
committerGitHub <noreply@github.com>2021-03-06 19:36:46 +0100
commit2977dd8a5f1d742193eae79364a284e68269f7b5 (patch)
tree3fb378be396d728d30b2769a4610c652cfb71507 /simulator/opendc-compute/opendc-compute-simulator/src/test
parentd72ac4b1df32dd5e6bd3faa4fa528dbf8a03f6f1 (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.kt75
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),
+ )
+ }
+}