From d7a43929e87d99a0c67dd59491f7404393c0ba35 Mon Sep 17 00:00:00 2001 From: Manuel Krombholz <s3866577@msx.tu-dresden.de> Date: Tue, 20 Apr 2021 00:07:35 +0200 Subject: [PATCH] Added test for single ItemPerformance --- eraser-base/src/main/jastadd/Item.jrag | 4 +- eraser-base/src/main/jastadd/StateData.jrag | 7 +++- .../inf/st/eraser/util/TestUtils.java | 9 +++++ .../de/tudresden/inf/st/eraser/RulesTest.java | 37 ++++++++++++++++++- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index 3cda6928..0afb11fc 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -294,7 +294,6 @@ aspect ItemHandling { * @param shouldSendState whether to send the new state (currently affects MQTT and Influx) */ protected void Item.stateUpdated(boolean shouldSendState) { - this.getStateData().afterStateChangeApplied(); if (shouldSendState) { try { // sendState() refined in MQTT and Influx aspect @@ -303,7 +302,8 @@ aspect ItemHandling { logger.catching(e); } } - if (hasItemObserver() && this.getStateData().checkStateTransitionTime()) { + if (hasItemObserver() && this.getStateData().checkStateProcessingTime()) { + this.getStateData().afterStateChangeProcessed(); getItemObserver().apply(); } } diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag index 66b6d724..bfb18d69 100644 --- a/eraser-base/src/main/jastadd/StateData.jrag +++ b/eraser-base/src/main/jastadd/StateData.jrag @@ -1,14 +1,17 @@ aspect StateData { - public void StateData.afterStateChangeApplied() { + public void StateData.afterStateChangeProcessed() { this.setLastChangeDate(Instant.now()); } - public boolean StateData.checkStateTransitionTime() { + public boolean StateData.checkStateProcessingTime() { if (this.getItemPerformance()==null) { return true; } double frequency = this.getItemPerformance().getEventProcessingFrequency(); Instant lastStateChange = this.getLastChangeDate(); + if (lastStateChange==null) { + return true; + } return lastStateChange.toEpochMilli() + (1/frequency)*1000 < Instant.now().toEpochMilli(); diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java index fd6024bd..3654470a 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java @@ -2,6 +2,8 @@ package de.tudresden.inf.st.eraser.util; import de.tudresden.inf.st.eraser.jastadd.model.*; +import java.util.ArrayList; + /** * Helper class to create models used in tests. * @@ -35,6 +37,13 @@ public class TestUtils { return ModelAndItem.of(root.getSmartHomeEntityModel(), item); } + public static SmartHomeEntityModel createModelWithGroup() { + Root root = Root.createEmptyRoot(); + ParserUtils.createUnknownGroup(root.getSmartHomeEntityModel(),new ArrayList<>()); + + return root.getSmartHomeEntityModel(); + } + public static NumberItem addItemTo(SmartHomeEntityModel model, double initialValue) { return addItemTo(model, initialValue, false); } diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java index 1a1ea62a..1c57da5f 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java @@ -15,6 +15,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.StreamSupport; +import static de.tudresden.inf.st.eraser.util.TestUtils.getDefaultGroup; import static org.assertj.core.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -245,6 +246,11 @@ public class RulesTest { assertEquals(2, counter.get(item), "Change of item to 7 should not trigger the rule, check2 violated"); } + private static void addItemToModel(SmartHomeEntityModel model, Item item) { + getDefaultGroup(model).addItem(item); + } + + @Test public void testTwoActions() { TestUtils.ModelAndItem modelAndItem = createModelAndItem(2); @@ -662,6 +668,35 @@ public class RulesTest { assertEquals(2, counter.get(null), "Rule was not executed two times"); } + @Test + public void testItemPerformance() { + + TestUtils.ModelAndItem mai = createModelAndItem(0); + NumberItem numberItem = mai.item; + + ItemPerformance itemPerformance = new ItemPerformance(); + itemPerformance.setEventProcessingFrequency(10); + numberItem.getStateData().setItemPerformance(itemPerformance); + + Rule rule = new Rule(); + CountingAction counter = new CountingAction(); + rule.addAction(counter); + rule.activateFor(numberItem); + numberItem.setState(1); + numberItem.setState(2); + assertEquals(1, counter.get(numberItem), "Action was triggered although ItemPerformance too small"); + counter.reset(); + waitMillis(100); + numberItem.setState(3); + assertEquals(1, counter.get(numberItem), "Action wasn't triggered although frequency ItemPerformance is small enough"); + counter.reset(); + numberItem.setState(4); + numberItem.setState(5); + assertEquals(0, counter.get(numberItem), "Action was triggered although ItemPerformance too small"); + counter.reset(); + + } + private static void waitMillis(int millis) { try { Thread.sleep(millis); @@ -673,7 +708,7 @@ public class RulesTest { private StringItem addStringItem(SmartHomeEntityModel model, String initialValue) { StringItem item = new StringItem(); - Group group = TestUtils.getDefaultGroup(model); + Group group = getDefaultGroup(model); item.setID("item" + group.getNumItem()); item.setState(initialValue, false); group.addItem(item); -- GitLab