From 918f85df10d8d59de3d2c90a81984810dec7a072 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Mon, 19 Jul 2021 20:53:00 +0200 Subject: prog(akka): Iot Example code --- .../test/java/akkamon/domain/AkkamonImplTest.java | 16 +- .../test/java/akkamon/domain/iot/DeviceTest.java | 162 +++++++++++++++++++++ 2 files changed, 164 insertions(+), 14 deletions(-) create mode 100644 domain/src/test/java/akkamon/domain/iot/DeviceTest.java (limited to 'domain/src/test/java') diff --git a/domain/src/test/java/akkamon/domain/AkkamonImplTest.java b/domain/src/test/java/akkamon/domain/AkkamonImplTest.java index 6570c2a..90c4f44 100644 --- a/domain/src/test/java/akkamon/domain/AkkamonImplTest.java +++ b/domain/src/test/java/akkamon/domain/AkkamonImplTest.java @@ -1,23 +1,11 @@ package akkamon.domain; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; +import org.junit.Test; -import static org.junit.jupiter.api.Assertions.*; +import static junit.framework.TestCase.assertNotNull; class AkkamonImplTest { - @BeforeEach - void setUp() { - } - - @AfterEach - void tearDown() { - } - - @Nested class getInstance_behaviour { @Test void given_there_is_no_instance_yet_when_getInstance_is_called_then_give_class_property_instance() { diff --git a/domain/src/test/java/akkamon/domain/iot/DeviceTest.java b/domain/src/test/java/akkamon/domain/iot/DeviceTest.java new file mode 100644 index 0000000..a05499f --- /dev/null +++ b/domain/src/test/java/akkamon/domain/iot/DeviceTest.java @@ -0,0 +1,162 @@ +package akkamon.domain.iot; + +import akka.actor.testkit.typed.javadsl.TestKitJunitResource; +import akka.actor.testkit.typed.javadsl.TestProbe; +import akka.actor.typed.ActorRef; +import org.junit.ClassRule; +import org.junit.Test; + +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class DeviceTest { + + @ClassRule + public static final TestKitJunitResource testKit = new TestKitJunitResource(); + + @Test + public void testReplyWithEmptyReadingIfNoTemperatureIsKnown() { + TestProbe probe = testKit.createTestProbe(Device.RespondTemperature.class); + + ActorRef deviceActor = testKit.spawn(Device.create("group", "device")); + deviceActor.tell(new Device.ReadTemperature(42L, probe.getRef())); + Device.RespondTemperature response = probe.receiveMessage(); + assertEquals(42L, response.requestId); + assertEquals(Optional.empty(), response.value); + + + } + + @Test + public void testReplyWithLatestTemperatureReading() { + TestProbe recordProbe = + testKit.createTestProbe(Device.TemperatureRecorded.class); + + TestProbe readProbe = + testKit.createTestProbe(Device.RespondTemperature.class); + + ActorRef deviceActor = testKit.spawn(Device.create("group", "device")); + + deviceActor.tell(new Device.RecordTemperature(1L, 24.0, recordProbe.getRef())); + assertEquals(1L, recordProbe.receiveMessage().requestId); + + deviceActor.tell(new Device.ReadTemperature(2L, readProbe.getRef())); + Device.RespondTemperature response1 = readProbe.receiveMessage(); + assertEquals(2L, response1.requestId); + assertEquals(Optional.of(24.0), response1.value); + + deviceActor.tell(new Device.RecordTemperature(3L, 55.0, recordProbe.getRef())); + assertEquals(3L, recordProbe.receiveMessage().requestId); + + deviceActor.tell(new Device.ReadTemperature(4L, readProbe.getRef())); + Device.RespondTemperature response2 = readProbe.receiveMessage(); + assertEquals(4L, response2.requestId); + assertEquals(Optional.of(55.0), response2.value); + } + + @Test + public void testReplyToRegistrationRequests() { + TestProbe probe = testKit.createTestProbe(DeviceManager.DeviceRegistered.class); + ActorRef groupActor = testKit.spawn(DeviceGroup.create("group")); + + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device", probe.getRef())); + DeviceManager.DeviceRegistered registered1 = probe.receiveMessage(); + + // another deviceId + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device3", probe.getRef())); + DeviceManager.DeviceRegistered registered2 = probe.receiveMessage(); + assertNotEquals(registered1.device, registered2.device); + + // Check that the device actors are working + TestProbe recordProbe = + testKit.createTestProbe(Device.TemperatureRecorded.class); + registered1.device.tell(new Device.RecordTemperature(0L, 1.0, recordProbe.getRef())); + assertEquals(0L, recordProbe.receiveMessage().requestId); + registered2.device.tell(new Device.RecordTemperature(1L, 2.0, recordProbe.getRef())); + assertEquals(1L, recordProbe.receiveMessage().requestId); + } + + @Test + public void testIgnoreWrongRegistrationRequests() { + TestProbe probe = testKit.createTestProbe(DeviceManager.DeviceRegistered.class); + ActorRef groupActor = testKit.spawn(DeviceGroup.create("group")); + groupActor.tell(new DeviceManager.RequestTrackDevice("wrongGroup", "device1", probe.getRef())); + probe.expectNoMessage(); + } + + + @Test + public void testReturnSameActorForSameDeviceId() { + TestProbe probe = testKit.createTestProbe(DeviceManager.DeviceRegistered.class); + ActorRef groupActor = testKit.spawn(DeviceGroup.create("group")); + + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device", probe.getRef())); + DeviceManager.DeviceRegistered registered1 = probe.receiveMessage(); + + // registering same again should be idempotent + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device", probe.getRef())); + DeviceManager.DeviceRegistered registered2 = probe.receiveMessage(); + assertEquals(registered1.device, registered2.device); + } + + @Test +public void testListActiveDevices() { + TestProbe registeredProbe = testKit.createTestProbe(DeviceManager.DeviceRegistered.class); + ActorRef groupActor = testKit.spawn(DeviceGroup.create("group")); + + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device1", registeredProbe.getRef())); + registeredProbe.receiveMessage(); + + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device2", registeredProbe.getRef())); + registeredProbe.receiveMessage(); + + TestProbe deviceListProbe = testKit.createTestProbe(DeviceManager.ReplyDeviceList.class); + + groupActor.tell(new DeviceManager.RequestDeviceList(0L, "group", deviceListProbe.getRef())); + DeviceManager.ReplyDeviceList reply = deviceListProbe.receiveMessage(); + assertEquals(0L, reply.requestId); + Set testIds = Stream.of("device1", "device2").collect(Collectors.toSet()); + assertEquals(testIds, reply.ids); +} + +@Test +public void testListActiveDevicesAfterOneShutsDown() { + TestProbe registeredProbe = testKit.createTestProbe(DeviceManager.DeviceRegistered.class); + ActorRef groupActor = testKit.spawn(DeviceGroup.create("group")); + + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device1", registeredProbe.getRef())); + DeviceManager.DeviceRegistered registered1 = registeredProbe.receiveMessage(); + + groupActor.tell(new DeviceManager.RequestTrackDevice("group", "device2", registeredProbe.getRef())); + DeviceManager.DeviceRegistered registered2 = registeredProbe.receiveMessage(); + + ActorRef toShutDown = registered1.device; + + TestProbe deviceListProbe = testKit.createTestProbe(DeviceManager.ReplyDeviceList.class); + + groupActor.tell(new DeviceManager.RequestDeviceList(0L, "group", deviceListProbe.getRef())); + DeviceManager.ReplyDeviceList reply = deviceListProbe.receiveMessage(); + assertEquals(0L, reply.requestId); + assertEquals(Stream.of("device1", "device2").collect(Collectors.toSet()), reply.ids); + + toShutDown.tell(Device.Passivate.INSTANCE); + registeredProbe.expectTerminated(toShutDown, registeredProbe.getRemainingOrDefault()); + + // using awaitAssert to retry because it might take longer for the groupActor + // to see the Terminated, that order is undefined + registeredProbe.awaitAssert( + () -> { + groupActor.tell(new DeviceManager.RequestDeviceList(1L, "group", deviceListProbe.getRef())); + DeviceManager.ReplyDeviceList r = deviceListProbe.receiveMessage(); + assertEquals(1L, r.requestId); + assertEquals(Stream.of("device2").collect(Collectors.toSet()), r.ids); + return null; + }); +} + +} -- cgit v1.2.3