From 9d873cb0bf84550cd6b12b245c06c791b7fe6b72 Mon Sep 17 00:00:00 2001 From: yevhenii_zahrebelnyi <39950245+jekka001@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:45:39 +0200 Subject: [PATCH] Fix telemetry edge test (#12496) * Fix telemetry edge test - Changed random failure logic for DownlinkMsg. A DownlinkMsg can fail only twice. * - add case with failureProbability 100 * - refactored naming --- .../server/edge/imitator/EdgeImitator.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java index 45dfed1bcb..890ceb373f 100644 --- a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java +++ b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java @@ -66,7 +66,9 @@ import org.thingsboard.server.gen.edge.v1.WidgetsBundleUpdateMsg; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom; @@ -78,6 +80,7 @@ import java.util.stream.Collectors; @Slf4j public class EdgeImitator { + private static final int MAX_DOWNLINK_FAILS = 2; private final String routingKey; private final String routingSecret; @@ -93,6 +96,7 @@ public class EdgeImitator { private boolean randomFailuresOnTimeseriesDownlink = false; @Setter private double failureProbability = 0.0; + private final Map downlinkFailureCountMap = new HashMap<>(); @Getter private EdgeConfiguration configuration; @@ -244,8 +248,11 @@ public class EdgeImitator { if (downlinkMsg.getEntityDataCount() > 0) { for (EntityDataProto entityData : downlinkMsg.getEntityDataList()) { if (randomFailuresOnTimeseriesDownlink) { - if (getRandomBoolean()) { + int downlinkMsgId = downlinkMsg.getDownlinkMsgId(); + + if (getRandomBoolean() && checkFailureThreshold(downlinkMsgId)) { result.add(Futures.immediateFailedFuture(new RuntimeException("Random failure. This is expected error for edge test"))); + downlinkFailureCountMap.put(downlinkMsgId, downlinkFailureCountMap.getOrDefault(downlinkMsgId, 0) + 1); } else { result.add(saveDownlinkMsg(entityData)); } @@ -354,6 +361,12 @@ public class EdgeImitator { return Futures.allAsList(result); } + private boolean checkFailureThreshold(int downlinkMsgId) { + return failureProbability == 100 || + downlinkFailureCountMap.get(downlinkMsgId) == null || + downlinkFailureCountMap.get(downlinkMsgId) < MAX_DOWNLINK_FAILS; + } + private boolean getRandomBoolean() { double randomValue = ThreadLocalRandom.current().nextDouble() * 100; return randomValue <= this.failureProbability;