예제 #1
0
        public void DeviceGroupQuery_WhenSomeWorkingDevices_ThenReturnsTemperatureOfAllOfThem()
        {
            var requester = CreateTestProbe();

            var device1 = CreateTestProbe();
            var device2 = CreateTestProbe();

            var queryActor = Sys.ActorOf(DeviceGroupQuery.Props(
                                             actorToDeviceId: new Dictionary <IActorRef, string> {
                [device1.Ref] = "device1", [device2.Ref] = "device2"
            },
                                             requestId: 1,
                                             requester: requester.Ref,
                                             timeout: TimeSpan.FromSeconds(3)
                                             ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }
예제 #2
0
            public void DeviceGroupQuery_must_return_return_DeviceNotAvailable_if_device_stops_before_answering()
            {
                var requester = CreateTestProbe();

                var device1 = CreateTestProbe();
                var device2 = CreateTestProbe();

                var queryActor = Sys.ActorOf(DeviceGroupQuery.Props(
                                                 actorToDeviceId: new Dictionary <IActorRef, string> {
                    [device1.Ref] = "device1", [device2.Ref] = "device2"
                },
                                                 requestId: 1,
                                                 requester: requester.Ref,
                                                 timeout: TimeSpan.FromSeconds(3)
                                                 ));

                device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
                device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

                queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);
                device2.Tell(PoisonPill.Instance);

                requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                             msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                             msg.Temperatures["device2"] is DeviceNotAvailable &&
                                                             msg.RequestId == 1);
            }
예제 #3
0
        public void DeviceGroupQuery_must_return_DeviceTimedOut_if_device_does_not_answer_in_time()
        {
            var requester = CreateTestProbe();

            var device1 = CreateTestProbe();
            var device2 = CreateTestProbe();

            var queryActor = Sys.ActorOf(DeviceGroupQuery.Props(
                                             new Dictionary <IActorRef, string> {
                [device1.Ref] = "device1", [device2.Ref] = "device2"
            },
                                             requestId: 1,
                                             requester: requester.Ref,
                                             timeout: TimeSpan.FromSeconds(1)
                                             ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                         msg.Temperatures["device2"] is DeviceTimeOut &&
                                                         msg.RequestId == 1);
        }
        public void DeviceGroupQuery_must_return_TemperatureNotAvailable_for_devices_with_no_readings()
        {
            var requester = CreateTestProbe();

            var device1 = CreateTestProbe();
            var device2 = CreateTestProbe();

            var queryActor = Sys.ActorOf(DeviceGroupQuery.Props(
                                             new Dictionary <IActorRef, string> {
                [device1.Ref] = "device1", [device2.Ref] = "device2"
            },
                                             requestId: 1,
                                             requester: requester.Ref,
                                             timeout: TimeSpan.FromSeconds(3)
                                             ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: null), device1.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"] is TemperatureNotAvailable &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }
예제 #5
0
        public void DeviceGroupQuery_must_return_temperature_value_for_working_devices()
        {
            var sys       = ActorSystem.Create("mysys");
            var requester = new TestKit().CreateTestProbe();
            var device1   = new TestKit().CreateTestProbe();
            var device2   = new TestKit().CreateTestProbe();

            var queryActor = sys.ActorOf(DeviceGroupQuery.Props(
                                             actorToDeviceId: new Dictionary <IActorRef, string> {
                [device1.Ref] = "device1", [device2.Ref] = "device2"
            },
                                             requestId: 1,
                                             requester: requester.Ref,
                                             timeout: TimeSpan.FromSeconds(3)
                                             ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }
예제 #6
0
        public void DeviceGroupQuery_must_return_temperature_value_for_working_devices()
        {
            var requester = CreateTestProbe();

            var device1 = CreateTestProbe();
            var device2 = CreateTestProbe();

            var queryActor = Sys.ActorOf(DeviceGroupQuery.Props(
                                             actorToDeviceId: ImmutableDictionary <IActorRef, string> .Empty.Add(device1.Ref, "device1").Add(device2.Ref, "device2"),
                                             requestId: 1,
                                             requester: requester.Ref,
                                             timeout: TimeSpan.FromSeconds(3)
                                             ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }
예제 #7
0
        private static void DeviceGroupQuery_must_return_temperature_reading_even_if_device_stops_after_answering()
        {
            TestProbe requester = CreateTestProbe();
            TestProbe device1   = CreateTestProbe();
            TestProbe device2   = CreateTestProbe();
            TestKit   testKit   = new TestKit();
            Dictionary <IActorRef, string> actorToDeviceId = new Dictionary <IActorRef, string>
            {
                [device1.Ref] = "device1",
                [device2.Ref] = "device2"
            };
            TimeSpan  timeout        = TimeSpan.FromSeconds(3);
            long      requestId      = 1;
            IActorRef requesterParam = requester.Ref;
            IActorRef queryActor     = testKit.Sys.ActorOf(DeviceGroupQuery.Props(
                                                               actorToDeviceId,
                                                               requestId,
                                                               requesterParam,
                                                               timeout
                                                               ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);
            device2.Tell(PoisonPill.Instance);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }
예제 #8
0
        private static void DeviceGroupQuery_must_return_TemperatureNotAvailable_for_devices_with_no_readings()
        {
            TestProbe requester = CreateTestProbe();

            TestProbe device1 = CreateTestProbe();
            TestProbe device2 = CreateTestProbe();
            TestKit   testKit = new TestKit();
            Dictionary <IActorRef, string> actorToDeviceId = new Dictionary <IActorRef, string>
            {
                [device1.Ref] = "device1",
                [device2.Ref] = "device2"
            };
            TimeSpan  timeout        = TimeSpan.FromSeconds(3);
            long      requestId      = 1;
            IActorRef requesterParam = requester.Ref;
            IActorRef queryActor     = testKit.Sys.ActorOf(DeviceGroupQuery.Props(
                                                               actorToDeviceId,
                                                               requestId,
                                                               requesterParam,
                                                               timeout
                                                               ));

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);

            queryActor.Tell(new RespondTemperature(requestId: 0, value: null), device1.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);

            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"] is TemperatureNotAvailable &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }
예제 #9
0
 protected override void OnReceive(object message)
 {
     switch (message)
     {
     case RequestAllTemperatures r:
         Context.ActorOf(DeviceGroupQuery.Props(actorToDeviceId, r.RequestId, Sender, TimeSpan.FromSeconds(3)));
         break;
     }
 }
예제 #10
0
            protected override void OnReceive(object message)
            {
                switch (message)
                {
                case RequestTrackDevice trackMsg when trackMsg.GroupId.Equals(GroupId):
                    if (deviceIdToActor.TryGetValue(trackMsg.DeviceId, out var actorRef))
                    {
                        actorRef.Forward(trackMsg);
                    }

                    else
                    {
                        Log.Info($"Creating device actor for {trackMsg.DeviceId}");
                        var deviceActor = Context.ActorOf(Device.Props(trackMsg.GroupId, trackMsg.DeviceId), $"device-{trackMsg.DeviceId}");
                        Context.Watch(deviceActor);
                        actorToDeviceId.Add(deviceActor, trackMsg.DeviceId);
                        deviceIdToActor.Add(trackMsg.DeviceId, deviceActor);
                        deviceActor.Forward(trackMsg);
                    }
                    break;

                case RequestTrackDevice trackMsg:
                    Log.Warning($"Ignoring TrackDevice request for {trackMsg.GroupId}. This actor is responsible for {GroupId}.");
                    break;

                case RequestDeviceList deviceList:
                    Sender.Tell(new ReplyDeviceList(deviceList.RequestId, new HashSet <string>(deviceIdToActor.Keys)));
                    break;

                case Terminated t:
                    var deviceId = actorToDeviceId[t.ActorRef];
                    Log.Info($"Device actor for {deviceId} has been terminated");
                    actorToDeviceId.Remove(t.ActorRef);
                    deviceIdToActor.Remove(deviceId);
                    break;

                case RequestAllTemperatures r:
                    Context.ActorOf(DeviceGroupQuery.Props(actorToDeviceId, r.RequestId, Sender, TimeSpan.FromSeconds(3)));
                    break;
                }
            }
예제 #11
0
        private static void DeviceGroupQuery_must_return_temperature_value_for_working_devices()
        {
            TestProbe requester = CreateTestProbe();
            TestProbe device1   = CreateTestProbe();
            TestProbe device2   = CreateTestProbe();
            TestKit   testKit   = new TestKit();
            Dictionary <IActorRef, string> actorToDeviceId = new Dictionary <IActorRef, string>
            {
                [device1.Ref] = "device1",
                [device2.Ref] = "device2"
            };
            TimeSpan  timeout    = TimeSpan.FromSeconds(3);
            Props     props      = DeviceGroupQuery.Props(actorToDeviceId, 1, requester.Ref, timeout);
            IActorRef queryActor = testKit.Sys.ActorOf(props);

            device1.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            device2.ExpectMsg <ReadTemperature>(read => read.RequestId == 0);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 1.0), device1.Ref);
            queryActor.Tell(new RespondTemperature(requestId: 0, value: 2.0), device2.Ref);
            requester.ExpectMsg <RespondAllTemperatures>(msg =>
                                                         msg.Temperatures["device1"].AsInstanceOf <Temperature>().Value == 1.0 &&
                                                         msg.Temperatures["device2"].AsInstanceOf <Temperature>().Value == 2.0 &&
                                                         msg.RequestId == 1);
        }