diff --git a/ros2rag.base/src/main/jastadd/backend/Generation.jadd b/ros2rag.base/src/main/jastadd/backend/Generation.jadd index e698e405ee6d392d2405b15fe0869432b9b18a59..1b6dfff3386d079e75163c4725681a87904f6786 100644 --- a/ros2rag.base/src/main/jastadd/backend/Generation.jadd +++ b/ros2rag.base/src/main/jastadd/backend/Generation.jadd @@ -146,16 +146,23 @@ aspect AspectGeneration { sb.append(ind(indent + 1)).append(preemptiveReturnStatement()).append("\n"); sb.append(ind(indent)).append("}\n"); if (!getAlwaysApply()) { - sb.append(ind(indent)).append("if (").append(preemptiveExpectedValue()); - if (getToken().isPrimitiveType()) { - sb.append(" == ").append(inputVariableName); - } else if (effectiveMappings().get(effectiveMappings().size() - 1).isDefaultMappingDefinition()) { - sb.append(" != null && ").append(preemptiveExpectedValue()).append(".equals(") - .append(inputVariableName).append(")"); + MappingDefinition lastMapping = effectiveMappings().get(effectiveMappings().size() - 1); + sb.append(ind(indent)).append("if ("); + if (lastMapping.getToType().isArray()) { + sb.append("java.util.Arrays.equals(").append(preemptiveExpectedValue()) + .append(", ").append(inputVariableName).append(")"); } else { - sb.append(" != null ? ").append(preemptiveExpectedValue()).append(".equals(") - .append(inputVariableName).append(")").append(" : ") - .append(inputVariableName).append(" == null"); + sb.append(preemptiveExpectedValue()); + if (getToken().isPrimitiveType() && lastMapping.getToType().isPrimitiveType()) { + sb.append(" == ").append(inputVariableName); + } else if (lastMapping.isDefaultMappingDefinition()) { + sb.append(" != null && ").append(preemptiveExpectedValue()).append(".equals(") + .append(inputVariableName).append(")"); + } else { + sb.append(" != null ? ").append(preemptiveExpectedValue()).append(".equals(") + .append(inputVariableName).append(")").append(" : ") + .append(inputVariableName).append(" == null"); + } } sb.append(") { ").append(preemptiveReturnStatement()).append(" }\n"); } diff --git a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag b/ros2rag.base/src/main/jastadd/backend/Mappings.jrag index 7add42fa7e3d3f7c71cb35b5a34c8c5d05b83628..fd40385d9e8879dd188362f6a0acd802652f511e 100644 --- a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag +++ b/ros2rag.base/src/main/jastadd/backend/Mappings.jrag @@ -151,6 +151,12 @@ aspect Mappings { default: return false; } } + syn boolean MappingDefinitionType.isPrimitiveType() = false; + eq JavaMappingDefinitionType.isPrimitiveType() = getType().isPrimitiveType(); + + // --- isArray --- + syn boolean MappingDefinitionType.isArray() = false; + eq JavaArrayMappingDefinitionType.isArray() = true; // --- suitableDefaultMapping --- syn DefaultMappingDefinition UpdateDefinition.suitableDefaultMapping(); diff --git a/ros2rag.tests/src/test/01-input/example/Test.relast b/ros2rag.tests/src/test/01-input/example/Test.relast index c6b346d5df0db5b333141202a800b5951643eef2..ea347d0ec303a8d3555cd0118d403b53664ffe33 100644 --- a/ros2rag.tests/src/test/01-input/example/Test.relast +++ b/ros2rag.tests/src/test/01-input/example/Test.relast @@ -4,7 +4,7 @@ ZoneModel ::= <Size:IntPosition> SafetyZone:Zone* ; Zone ::= Coordinate* ; -RobotArm ::= Joint* EndEffector <AttributeTestSource:int> /<AppropriateSpeed:double>/ ; +RobotArm ::= Joint* EndEffector /<AppropriateSpeed:double>/ ; Joint ::= <Name:String> <CurrentPosition:IntPosition> ; diff --git a/ros2rag.tests/src/test/01-input/example/Test.ros2rag b/ros2rag.tests/src/test/01-input/example/Test.ros2rag index 9168da25b6d98b26784ef67b64c515be6cecf76c..6421bc828cf2f51c3b57e064bfbb6afdd4635545 100644 --- a/ros2rag.tests/src/test/01-input/example/Test.ros2rag +++ b/ros2rag.tests/src/test/01-input/example/Test.ros2rag @@ -5,7 +5,6 @@ write RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ; // --- dependency definitions --- RobotArm.AppropriateSpeed canDependOn Joint.CurrentPosition as dependency1 ; -RobotArm.AppropriateSpeed canDependOn RobotArm.AttributeTestSource as dependency2 ; // --- mapping definitions --- ParseLinkState maps byte[] bytes to panda.Linkstate.PandaLinkState {: @@ -18,8 +17,7 @@ SerializeRobotConfig maps config.Robotconfig.RobotConfig rc to byte[] {: LinkStateToIntPosition maps panda.Linkstate.PandaLinkState pls to IntPosition {: panda.Linkstate.PandaLinkState.Position p = pls.getPos(); - { int i = 0; } - return IntPosition.of((int) p.getPositionX(), (int) p.getPositionY(), (int) p.getPositionZ()); + return IntPosition.of((int) (10 * p.getPositionX()), (int) (10 * p.getPositionY()), (int) (10 * p.getPositionZ())); :} CreateSpeedMessage maps double speed to config.Robotconfig.RobotConfig {: diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java index 3594cfd1a946ba42f65def205aa821354dba50e2..c82e9ca1e1642dbf9589760a03f8d2164a5ff424 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java @@ -106,7 +106,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest { sender.publish(TOPIC_BOXED_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array()); sender.publish(TOPIC_BOXED_CHARACTER, ByteBuffer.allocate(2).putChar(expectedCharValue).array()); - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); assertEquals(expectedIntValue, integers.getIntValue()); assertEquals(expectedShortValue, integers.getShortValue()); diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java index df4a22f5835df09a407595392a4969e7af9ee6f2..a48228e0ad13555016cb86b5de87fe00fcf88fdb 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java @@ -67,21 +67,21 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest { setupReceiverAndConnect(true); // check initial value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(1, 1, 1.1, 'a', "ab"); // set new value setData("2", "2.2", "cd"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(2, 2, 2.2, 'c', "cd"); // set new value setData("3", "3.2", "ee"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(3, 3, 3.2, 'e', "ee"); } @@ -92,21 +92,21 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest { setupReceiverAndConnect(false); // check initial value (will be default values) - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(0, null, null, null, null); // set new value setData("2", "2.2", "cd"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(1, 2, 2.2, 'c', "cd"); // set new value setData("3", "3.2", "ee"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(2, 3, 3.2, 'e', "ee"); } diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java index c22861e996826eaf720a33fe9e0c02f7b110978e..7f8abd9ac7fda8568ea2d1fce3b6c0b33960706a 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java @@ -5,10 +5,9 @@ import config.Robotconfig.RobotConfig; import example.ast.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import panda.Linkstate; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.*; @@ -22,16 +21,19 @@ public class ExampleTest extends AbstractMqttTest { private static final String TOPIC_CONFIG = "robot/config"; private static final String TOPIC_JOINT1 = "robot/arm/joint1"; + private static final String TOPIC_JOINT2 = "robot/arm/joint2"; private Model model; private RobotArm robotArm; private Joint joint1; - private MqttUpdater receiver; + private Joint joint2; + private MqttUpdater handler; + private ReceiverData data; @AfterEach public void closeConnections() { - if (receiver != null) { - receiver.close(); + if (handler != null) { + handler.close(); } if (model != null) { model.MqttCloseConnections(); @@ -44,49 +46,116 @@ public class ExampleTest extends AbstractMqttTest { } @Test - public void communicate() throws IOException, InterruptedException { + public void communicateSendInitialValue() throws IOException, InterruptedException { createModel(); - List<RobotConfig> receivedConfigs = new ArrayList<>(); + setupReceiverAndConnect(true); - createListener(receivedConfigs); - - model.MqttSetHost(TestUtils.getMqttHost()); - assertTrue(model.MqttWaitUntilReady(2, TimeUnit.SECONDS)); // joint is currently within the safety zone, so speed should be low - robotArm.connectAppropriateSpeed(TOPIC_CONFIG, true); - joint1.connectCurrentPosition(TOPIC_JOINT1); + TestUtils.waitForMqtt(); + assertEquals(1, data.numberOfConfigs); + assertFalse(data.failedLastConversion); + assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA); + + // change position of the first joint out of the safety zone, second still in + sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f); + + // still in safety zone, so no update should have been sent + TestUtils.waitForMqtt(); + assertEquals(makePosition(2, 2, 2), joint1.getCurrentPosition()); + assertEquals(1, data.numberOfConfigs); + assertFalse(data.failedLastConversion); + assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA); + + // change position of second joint also out of the safety zone, now speed must be high + sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f); + + TestUtils.waitForMqtt(); + assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition()); + assertEquals(2, data.numberOfConfigs); + assertFalse(data.failedLastConversion); + assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA); + + // change position of second joint, still out of the safety zone, no update should be sent + sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f); + + TestUtils.waitForMqtt(); + assertEquals(makePosition(13, 24, 35), joint2.getCurrentPosition()); + assertEquals(2, data.numberOfConfigs); + } + + @Test + public void communicateOnlyUpdatedValue() throws IOException, InterruptedException { + createModel(); + setupReceiverAndConnect(false); - // now change the position of the joint out of the safety zone - joint1.setCurrentPosition(makePosition(2, 2, 2)); + // no value should have been sent + TestUtils.waitForMqtt(); + assertEquals(0, data.numberOfConfigs); - // and wait for MQTT to send/receive messages - TimeUnit.SECONDS.sleep(2); + // change position of the first joint out of the safety zone, second still in + sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f); - // there should be two configs received by now (the initial one, and the updated) - assertEquals(2, receivedConfigs.size()); - RobotConfig actualInitialConfig = receivedConfigs.get(0); - assertEquals(robotArm.speedLow(), actualInitialConfig.getSpeed(), TestUtils.DELTA); + // still in safety zone, first update should have been sent + TestUtils.waitForMqtt(); + assertEquals(makePosition(2, 2, 2), joint1.getCurrentPosition()); + assertEquals(0, data.numberOfConfigs); - RobotConfig actualUpdatedConfig = receivedConfigs.get(1); - assertEquals(robotArm.speedHigh(), actualUpdatedConfig.getSpeed(), TestUtils.DELTA); + // change position of second joint also out of the safety zone, now speed must be high + sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f); + + TestUtils.waitForMqtt(); + assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition()); + assertEquals(1, data.numberOfConfigs); + assertFalse(data.failedLastConversion); + assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA); + + // change position of second joint, still out of the safety zone, no update should be sent + sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f); + + TestUtils.waitForMqtt(); + assertEquals(makePosition(13, 24, 35), joint2.getCurrentPosition()); + assertEquals(1, data.numberOfConfigs); } - private void createListener(List<RobotConfig> receivedConfigs) { - receiver = new MqttUpdater("receiver"); - try { - receiver.setHost(TestUtils.getMqttHost(), TestUtils.getMqttDefaultPort()); - } catch (IOException e) { - fail("Could not set host: " + e.getMessage()); - } - assertTrue(receiver.waitUntilReady(2, TimeUnit.SECONDS)); - receiver.newConnection(TOPIC_CONFIG, bytes -> { + private void sendData(String topic, float x, float y, float z) { + handler.publish(topic, Linkstate.PandaLinkState.newBuilder() + .setPos(Linkstate.PandaLinkState.Position.newBuilder() + .setPositionX(x) + .setPositionY(y) + .setPositionZ(z) + .build()) + .build() + .toByteArray() + ); + } + + private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException { + model.MqttSetHost(TestUtils.getMqttHost()); + assertTrue(model.MqttWaitUntilReady(2, TimeUnit.SECONDS)); + + handler = new MqttUpdater().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost()); + assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS)); + + // add dependencies + robotArm.addDependency1(joint1); + robotArm.addDependency1(joint2); + robotArm.addDependency1(robotArm.getEndEffector()); + + data = new ReceiverData(); + + handler.newConnection(TOPIC_CONFIG, bytes -> { + data.numberOfConfigs += 1; try { - RobotConfig config = RobotConfig.parseFrom(bytes); - receivedConfigs.add(config); + data.lastConfig = RobotConfig.parseFrom(bytes); + data.failedLastConversion = false; } catch (InvalidProtocolBufferException e) { - fail("Received bad config: " + e.getMessage()); + data.failedLastConversion = true; } }); + + robotArm.connectAppropriateSpeed(TOPIC_CONFIG, writeCurrentValue); + joint1.connectCurrentPosition(TOPIC_JOINT1); + joint2.connectCurrentPosition(TOPIC_JOINT2); } private void createModel() { @@ -95,41 +164,44 @@ public class ExampleTest extends AbstractMqttTest { ZoneModel zoneModel = new ZoneModel(); zoneModel.setSize(makePosition(1, 1, 1)); - IntPosition myPosition = makePosition(0, 0, 0); - Coordinate myCoordinate = new Coordinate(myPosition); - Coordinate leftPosition = new Coordinate(makePosition(-1, 0, 0)); - Coordinate rightPosition = new Coordinate(makePosition(1, 0, 0)); + IntPosition firstPosition = makePosition(0, 0, 0); + IntPosition secondPosition = makePosition(-1, 0, 0); + IntPosition thirdPosition = makePosition(1, 0, 0); Zone safetyZone = new Zone(); - safetyZone.addCoordinate(myCoordinate); - safetyZone.addCoordinate(leftPosition); - safetyZone.addCoordinate(rightPosition); + safetyZone.addCoordinate(new Coordinate(firstPosition)); + safetyZone.addCoordinate(new Coordinate(secondPosition)); + safetyZone.addCoordinate(new Coordinate(thirdPosition)); zoneModel.addSafetyZone(safetyZone); model.setZoneModel(zoneModel); robotArm = new RobotArm(); - robotArm.setAttributeTestSource(1); // set initial value, no trigger joint1 = new Joint(); joint1.setName("joint1"); - joint1.setCurrentPosition(myPosition); + joint1.setCurrentPosition(firstPosition); + + joint2 = new Joint(); + joint2.setName("joint2"); + joint2.setCurrentPosition(secondPosition); EndEffector endEffector = new EndEffector(); endEffector.setName("gripper"); endEffector.setCurrentPosition(makePosition(2, 2, 3)); robotArm.addJoint(joint1); + robotArm.addJoint(joint2); robotArm.setEndEffector(endEffector); model.setRobotArm(robotArm); - - // add dependencies - robotArm.addDependency1(joint1); - robotArm.addDependency1(endEffector); - robotArm.addDependency2(robotArm); } private static IntPosition makePosition(int x, int y, int z) { return IntPosition.of(x, y, z); } + private static class ReceiverData { + RobotConfig lastConfig; + boolean failedLastConversion = true; + int numberOfConfigs = 0; + } } diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java index 9c151da32e5ca12c1dea1ec4e23e4c3168ca4910..e57c78a4c3c0a7f4ba9b8fc90e31b8b072f27e97 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java @@ -59,28 +59,28 @@ public class Read1Write2Test extends AbstractMqttTest { setupReceiverAndConnect(true); // check initial value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE), 1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE)); // set new value sendData("2", "3"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(2, 2, prefixed("2"), 2, 3, prefixed("3")); // set new value sendData("4", "4"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(3, 4, prefixed("4"), 3, 4, prefixed("4")); // set new value only for same setDataOnlySame("77"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(4, 77, prefixed("77"), 3, 4, prefixed("4")); } @@ -94,28 +94,28 @@ public class Read1Write2Test extends AbstractMqttTest { setupReceiverAndConnect(false); // check initial value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(0, null, null, 0, null, null); // set new value sendData("2", "3"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(1, 2, prefixed("2"), 1, 3, prefixed("3")); // set new value sendData("4", "4"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(2, 4, prefixed("4"), 2, 4, prefixed("4")); // set new value only for same setDataOnlySame("77"); // check new value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(3, 77, prefixed("77"), 2, 4, prefixed("4")); } diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java index 6c2b37b83629b245add25fd35659b7ce0ea0185a..ef741400d6bb86edffe804ef2414361f64046761 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java @@ -58,7 +58,7 @@ public class Read2Write1Test extends AbstractMqttTest { setupReceiverAndConnect(true); // check initial value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE), 1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE)); @@ -66,7 +66,7 @@ public class Read2Write1Test extends AbstractMqttTest { sendData(true, "2", true, "3"); // check new value. same: 2, 0. different: 3, 0. - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(2, 20, 2, 30); @@ -74,7 +74,7 @@ public class Read2Write1Test extends AbstractMqttTest { sendData(false, "4", false, "4"); // check new value. same: 2, 4. different: 3, 4. - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(3, 24, 3, 34); @@ -82,7 +82,7 @@ public class Read2Write1Test extends AbstractMqttTest { setDataOnlySame(true, "77"); // check new value. same: 77, 4. different: 3, 4. - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(4, 774, 3, 34); } @@ -97,7 +97,7 @@ public class Read2Write1Test extends AbstractMqttTest { setupReceiverAndConnect(false); // check initial value - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(0, null, 0, null); @@ -105,7 +105,7 @@ public class Read2Write1Test extends AbstractMqttTest { sendData(true, "2", true, "3"); // check new value. same: 2, 0. different: 3, 0. - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(1, 20, 1, 30); @@ -113,7 +113,7 @@ public class Read2Write1Test extends AbstractMqttTest { sendData(false, "4", false, "4"); // check new value. same: 2, 4. different: 3, 4. - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(2, 24, 2, 34); @@ -121,7 +121,7 @@ public class Read2Write1Test extends AbstractMqttTest { setDataOnlySame(true, "77"); // check new value. same: 77, 4. different: 3, 4. - TimeUnit.SECONDS.sleep(2); + TestUtils.waitForMqtt(); checkData(3, 774, 2, 34); } diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java index d0c03c9221023005f7896abf681f6627609ebed5..05db73e8790a25dd9d730ea637e8be500d568d5f 100644 --- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java +++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; /** * Utility methods for tests. @@ -58,4 +59,7 @@ public class TestUtils { return new String(encoded, encoding); } + static void waitForMqtt() throws InterruptedException { + TimeUnit.SECONDS.sleep(2); + } }