|
@@ -0,0 +1,145 @@
|
|
|
|
|
+package cz.senslog.analyzer.provider.task;
|
|
|
|
|
+
|
|
|
|
|
+import cz.senslog.analyzer.analysis.Analyzer;
|
|
|
|
|
+import cz.senslog.analyzer.domain.Observation;
|
|
|
|
|
+import cz.senslog.analyzer.domain.Sensor;
|
|
|
|
|
+import cz.senslog.analyzer.domain.Timestamp;
|
|
|
|
|
+import cz.senslog.analyzer.provider.AnalyzerTask;
|
|
|
|
|
+import cz.senslog.analyzer.storage.Connection;
|
|
|
|
|
+import cz.senslog.analyzer.storage.inmemory.TimestampStorage;
|
|
|
|
|
+import cz.senslog.analyzer.storage.inmemory.repository.TimestampRepository;
|
|
|
|
|
+import cz.senslog.analyzer.storage.permanent.repository.SensLogRepository;
|
|
|
|
|
+import org.jdbi.v3.core.Jdbi;
|
|
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
|
|
+
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.OffsetDateTime;
|
|
|
|
|
+import java.time.ZoneOffset;
|
|
|
|
|
+import java.util.Arrays;
|
|
|
|
|
+
|
|
|
|
|
+import static cz.senslog.analyzer.domain.TimestampType.*;
|
|
|
|
|
+import static java.time.temporal.ChronoUnit.SECONDS;
|
|
|
|
|
+import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
|
|
+import static org.mockito.Mockito.*;
|
|
|
|
|
+
|
|
|
|
|
+class ObservationAnalyzerTaskTest {
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void loadData_dataNotAccepted_true() {
|
|
|
|
|
+
|
|
|
|
|
+ LocalDateTime time = LocalDateTime.of(2020, 1, 1, 0, 0);
|
|
|
|
|
+ OffsetDateTime startTime = OffsetDateTime.of(time, ZoneOffset.UTC);
|
|
|
|
|
+
|
|
|
|
|
+ Analyzer<Observation> analyzer = mock(Analyzer.class);
|
|
|
|
|
+ SensLogRepository repository = mock(SensLogRepository.class);
|
|
|
|
|
+ when(repository.getObservationsFromTime(Timestamp.of(startTime), true, 100))
|
|
|
|
|
+ .then(answer -> {
|
|
|
|
|
+ Timestamp timestamp = answer.getArgument(0);
|
|
|
|
|
+ return Arrays.asList(
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(0, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(1, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(2, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(3, SECONDS))
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ Connection<Jdbi> connection = new Connection<>(Jdbi.create("jdbc:h2:mem:loadData_dataNotAccepted_true;DB_CLOSE_DELAY=-1"));
|
|
|
|
|
+ TimestampStorage storage = TimestampStorage.createContext(new TimestampRepository(connection));
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ AnalyzerTask<Observation> task = new ObservationAnalyzerTask(analyzer, storage, repository, startTime);
|
|
|
|
|
+
|
|
|
|
|
+ task.run();
|
|
|
|
|
+ assertEquals(startTime.toInstant(), storage.get(FIRST_PROVIDED_INCLUSIVE).toInstant());
|
|
|
|
|
+ assertEquals(startTime.plusSeconds(2).toInstant(), storage.get(LAST_PROVIDED_EXCLUSIVE).toInstant());
|
|
|
|
|
+
|
|
|
|
|
+ task.run();
|
|
|
|
|
+ assertEquals(startTime.toInstant(), storage.get(FIRST_PROVIDED_INCLUSIVE).toInstant());
|
|
|
|
|
+ assertEquals(startTime.plusSeconds(2).toInstant(), storage.get(LAST_PROVIDED_EXCLUSIVE).toInstant());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void loadData_allDataAccepted_true() {
|
|
|
|
|
+
|
|
|
|
|
+ LocalDateTime time = LocalDateTime.of(2020, 1, 1, 0, 0);
|
|
|
|
|
+ OffsetDateTime startTime = OffsetDateTime.of(time, ZoneOffset.UTC);
|
|
|
|
|
+
|
|
|
|
|
+ Analyzer<Observation> analyzer = mock(Analyzer.class);
|
|
|
|
|
+ SensLogRepository repository = mock(SensLogRepository.class);
|
|
|
|
|
+
|
|
|
|
|
+ doAnswer(answer -> {
|
|
|
|
|
+ Timestamp timestamp = answer.getArgument(0);
|
|
|
|
|
+ return Arrays.asList(
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(0, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(1, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(2, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(3, SECONDS))
|
|
|
|
|
+ );
|
|
|
|
|
+ }).when(repository).getObservationsFromTime(any(Timestamp.class), true, 100);
|
|
|
|
|
+
|
|
|
|
|
+ Connection<Jdbi> connection = new Connection<>(Jdbi.create("jdbc:h2:mem:loadData_allDataAccepted_true;DB_CLOSE_DELAY=-1"));
|
|
|
|
|
+ TimestampStorage storage = TimestampStorage.createContext(new TimestampRepository(connection));
|
|
|
|
|
+ AnalyzerTask<Observation> task = new ObservationAnalyzerTask(analyzer, storage, repository, startTime);
|
|
|
|
|
+
|
|
|
|
|
+ Timestamp startTimestamp;
|
|
|
|
|
+
|
|
|
|
|
+ // 1. run
|
|
|
|
|
+ startTimestamp = Timestamp.of(startTime);
|
|
|
|
|
+ task.run();
|
|
|
|
|
+ assertEquals(startTime.toInstant(), storage.get(FIRST_PROVIDED_INCLUSIVE).toInstant());
|
|
|
|
|
+ assertEquals(startTime.plusSeconds(2).toInstant(), storage.get(LAST_PROVIDED_EXCLUSIVE).toInstant());
|
|
|
|
|
+
|
|
|
|
|
+ // simulate analyzer
|
|
|
|
|
+ storage.update(startTimestamp.plus(2, SECONDS), LAST_ACCEPTED_INCLUSIVE);
|
|
|
|
|
+ storage.update(startTimestamp.plus(2, SECONDS), LAST_COMMITTED_INCLUSIVE);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. run
|
|
|
|
|
+ startTimestamp = startTimestamp.plus(3, SECONDS);
|
|
|
|
|
+ task.run();
|
|
|
|
|
+ assertEquals(startTimestamp.toInstant(), storage.get(FIRST_PROVIDED_INCLUSIVE).toInstant());
|
|
|
|
|
+ assertEquals(startTimestamp.plus(2, SECONDS).toInstant(), storage.get(LAST_PROVIDED_EXCLUSIVE).toInstant());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void loadData_processHalted_true() {
|
|
|
|
|
+
|
|
|
|
|
+ LocalDateTime time = LocalDateTime.of(2020, 1, 1, 0, 0);
|
|
|
|
|
+ OffsetDateTime startTime = OffsetDateTime.of(time, ZoneOffset.UTC);
|
|
|
|
|
+
|
|
|
|
|
+ Analyzer<Observation> analyzer = mock(Analyzer.class);
|
|
|
|
|
+ SensLogRepository repository = mock(SensLogRepository.class);
|
|
|
|
|
+
|
|
|
|
|
+ doAnswer(answer -> {
|
|
|
|
|
+ Timestamp timestamp = answer.getArgument(0);
|
|
|
|
|
+ return Arrays.asList(
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(0, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(1, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(2, SECONDS)),
|
|
|
|
|
+ new Observation(new Sensor(123, 456), 1.0, timestamp.plus(3, SECONDS))
|
|
|
|
|
+ );
|
|
|
|
|
+ }).when(repository).getObservationsFromTime(any(Timestamp.class), true, 100);
|
|
|
|
|
+
|
|
|
|
|
+ Connection<Jdbi> connection = new Connection<>(Jdbi.create("jdbc:h2:mem:loadData_processHalted_true;DB_CLOSE_DELAY=-1"));
|
|
|
|
|
+ TimestampStorage storage = TimestampStorage.createContext(new TimestampRepository(connection));
|
|
|
|
|
+ AnalyzerTask<Observation> task = new ObservationAnalyzerTask(analyzer, storage, repository, startTime);
|
|
|
|
|
+
|
|
|
|
|
+ Timestamp startTimestamp;
|
|
|
|
|
+
|
|
|
|
|
+ // 1. run
|
|
|
|
|
+ task.run();
|
|
|
|
|
+ startTimestamp = Timestamp.of(startTime);
|
|
|
|
|
+ assertEquals(startTimestamp.toInstant(), storage.get(FIRST_PROVIDED_INCLUSIVE).toInstant());
|
|
|
|
|
+ assertEquals(startTimestamp.plus(2, SECONDS).toInstant(), storage.get(LAST_PROVIDED_EXCLUSIVE).toInstant());
|
|
|
|
|
+
|
|
|
|
|
+ // simulate analyzer
|
|
|
|
|
+ // data was accepted but not persisted to the database
|
|
|
|
|
+ storage.update(startTimestamp.plus(1, SECONDS), LAST_ACCEPTED_INCLUSIVE);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. run
|
|
|
|
|
+ task.run();
|
|
|
|
|
+ startTimestamp = startTimestamp.plus(0, SECONDS);
|
|
|
|
|
+ assertEquals(startTimestamp.toInstant(), storage.get(FIRST_PROVIDED_INCLUSIVE).toInstant());
|
|
|
|
|
+ assertEquals(startTimestamp.plus(2, SECONDS).toInstant(), storage.get(LAST_PROVIDED_EXCLUSIVE).toInstant());
|
|
|
|
|
+ }
|
|
|
|
|
+}
|