From 384de3d8e60a30da505df3cb63f12dc6d745caf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Henning?= <soeren.henning@email.uni-kiel.de> Date: Wed, 19 Jan 2022 14:20:38 +0100 Subject: [PATCH] Make Titan record generator testable --- .../workloadgeneration/LoadGenerator.java | 4 +- .../TitanRecordGenerator.java | 38 ++++++++++++++++++ .../TitanRecordGeneratorFactory.java | 21 ---------- .../TitanRecordGeneratorTest.java | 40 +++++++++++++++++++ 4 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGenerator.java delete mode 100644 theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorFactory.java create mode 100644 theodolite-benchmarks/load-generator-commons/src/test/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorTest.java diff --git a/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/LoadGenerator.java b/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/LoadGenerator.java index e1ef55887..6453ef0bd 100644 --- a/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/LoadGenerator.java +++ b/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/LoadGenerator.java @@ -95,7 +95,7 @@ public final class LoadGenerator { new KeySpace(SENSOR_PREFIX_DEFAULT, NUMBER_OF_KEYS_DEFAULT), Duration.ofMillis(PERIOD_MS_DEFAULT))) .setGeneratorConfig(new LoadGeneratorConfig( - TitanRecordGeneratorFactory.forConstantValue(VALUE_DEFAULT), + TitanRecordGenerator.forConstantValue(VALUE_DEFAULT), TitanKafkaSenderFactory.forKafkaConfig( KAFKA_BOOTSTRAP_SERVERS_DEFAULT, KAFKA_TOPIC_DEFAULT, @@ -198,7 +198,7 @@ public final class LoadGenerator { new KeySpace(SENSOR_PREFIX_DEFAULT, numSensors), Duration.ofMillis(periodMs))) .setGeneratorConfig(new LoadGeneratorConfig( - TitanRecordGeneratorFactory.forConstantValue(value), + TitanRecordGenerator.forConstantValue(value), recordSender)) .withThreads(threads); } diff --git a/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGenerator.java b/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGenerator.java new file mode 100644 index 000000000..cebdacaee --- /dev/null +++ b/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGenerator.java @@ -0,0 +1,38 @@ +package theodolite.commons.workloadgeneration; + +import java.time.Clock; +import titan.ccp.model.records.ActivePowerRecord; + +/** + * A factory for creating {@link RecordGenerator}s that creates Titan {@link ActivePowerRecord}s. + */ +public final class TitanRecordGenerator implements RecordGenerator<ActivePowerRecord> { + + private final Clock clock; + + private final double constantValue; + + private TitanRecordGenerator(final double constantValue) { + this.constantValue = constantValue; + this.clock = Clock.systemUTC(); + } + + /* default */ TitanRecordGenerator(final double constantValue, final Clock clock) { + this.constantValue = constantValue; + this.clock = clock; + } + + /** + * Create a {@link RecordGenerator} that generates Titan {@link ActivePowerRecord}s with a + * constant value. + */ + public static RecordGenerator<ActivePowerRecord> forConstantValue(final double value) { + return new TitanRecordGenerator(value); + } + + @Override + public ActivePowerRecord generate(final String key) { + return new ActivePowerRecord(key, this.clock.millis(), this.constantValue); + } + +} diff --git a/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorFactory.java b/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorFactory.java deleted file mode 100644 index 4e1c10071..000000000 --- a/theodolite-benchmarks/load-generator-commons/src/main/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package theodolite.commons.workloadgeneration; - -import titan.ccp.model.records.ActivePowerRecord; - -/** - * A factory for creating {@link RecordGenerator}s that creates Titan {@link ActivePowerRecord}s. - */ -public final class TitanRecordGeneratorFactory { - - - private TitanRecordGeneratorFactory() {} - - /** - * Create a {@link RecordGenerator} that generates Titan {@link ActivePowerRecord}s with a - * constant value. - */ - public static RecordGenerator<ActivePowerRecord> forConstantValue(final double value) { - return sensor -> new ActivePowerRecord(sensor, System.currentTimeMillis(), value); - } - -} diff --git a/theodolite-benchmarks/load-generator-commons/src/test/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorTest.java b/theodolite-benchmarks/load-generator-commons/src/test/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorTest.java new file mode 100644 index 000000000..04ba38b9c --- /dev/null +++ b/theodolite-benchmarks/load-generator-commons/src/test/java/theodolite/commons/workloadgeneration/TitanRecordGeneratorTest.java @@ -0,0 +1,40 @@ +package theodolite.commons.workloadgeneration; + +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import org.junit.Assert; +import org.junit.Test; +import titan.ccp.model.records.ActivePowerRecord; + +public class TitanRecordGeneratorTest { + + @Test + public void testGenerate() { + final ZoneId zoneId = ZoneOffset.UTC; + final LocalDateTime dateTime = LocalDateTime.of(2022, 1, 17, 14, 2, 42); + final Instant instant = dateTime.atZone(zoneId).toInstant(); + final TitanRecordGenerator generator = + new TitanRecordGenerator(42.0, Clock.fixed(instant, zoneId)); + + final ActivePowerRecord activePowerRecord = generator.generate("my-identifier"); + Assert.assertEquals("my-identifier", activePowerRecord.getIdentifier()); + Assert.assertEquals(instant.toEpochMilli(), activePowerRecord.getTimestamp()); + Assert.assertEquals(42.0, activePowerRecord.getValueInW(), 0.001); + } + + @Test + public void testTimestampForArbitraryClockTimeZone() { + final LocalDateTime dateTime = LocalDateTime.of(2022, 1, 17, 14, 2, 42); + final Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant(); + // Setting of ZoneId should have no impact on result as we request epoch millis + final Clock clock = Clock.fixed(instant, ZoneId.of("America/Sao_Paulo")); + final TitanRecordGenerator generator = new TitanRecordGenerator(42.0, clock); + + final ActivePowerRecord activePowerRecord = generator.generate("my-identifier"); + Assert.assertEquals(instant.toEpochMilli(), activePowerRecord.getTimestamp()); + } + +} -- GitLab