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