예제 #1
0
        public void ShouldInitiateQuery()
        {
            var probe = CreateTestProbe();
            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestRegisterTemperatureSensor(1, "a", "42"), probe.Ref);
            probe.ExpectMsg <RespondRegisterTemperatureSensor>();
            var sensor1 = probe.LastSender;

            floor.Tell(new RequestRegisterTemperatureSensor(2, "a", "90"), probe.Ref);
            probe.ExpectMsg <RespondRegisterTemperatureSensor>();
            var sensor2 = probe.LastSender;

            sensor1.Tell(new RequestUpdateTemperature(0, 50.4));
            sensor2.Tell(new RequestUpdateTemperature(0, 100.8));

            floor.Tell(new RequestAllTemperatures(1), probe.Ref);
            var response = probe.ExpectMsg <RespondAllTemperatures>(x => x.RequestId == 1);

            Assert.Equal(2, response.TemperatureReadings.Count);

            var reading1 = Assert.IsType <TemperatureAvailable>(
                response.TemperatureReadings["42"]);

            Assert.Equal(50.4, reading1.Temperature);

            var reading2 = Assert.IsType <TemperatureAvailable>(
                response.TemperatureReadings["90"]);

            Assert.Equal(100.8, reading2.Temperature);
        }
예제 #2
0
        public void ReturnEmptyListIfThereAreNosensors()
        {
            var probe = CreateTestProbe();
            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestTemperatureSensorIds(1), probe.Ref);
            var response = probe.ExpectMsg <RespondTemperatureSensorIds>();

            Assert.Equal(0, response.SensorIds.Count);
        }
예제 #3
0
        public void NotRegisterWhenMismatchedFloor()
        {
            var probe            = CreateTestProbe();
            var eventStreamProbe = CreateTestProbe();

            Sys.EventStream.Subscribe(eventStreamProbe, typeof(Akka.Event.UnhandledMessage));

            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestRegisterTemperatureSensor(1, "b", "1"), probe.Ref);
            probe.ExpectNoMsg();

            var unhandled = eventStreamProbe.ExpectMsg <Akka.Event.UnhandledMessage>();

            Assert.IsType <RequestRegisterTemperatureSensor>(unhandled.Message);
            Assert.Equal(floor, unhandled.Recipient);
        }
예제 #4
0
        public void ReturnAllTemperatureSensorIds()
        {
            var probe = CreateTestProbe();
            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestRegisterTemperatureSensor(1, "a", "1"), probe.Ref);
            probe.ExpectMsg <RespondRegisterTemperatureSensor>();

            floor.Tell(new RequestRegisterTemperatureSensor(2, "a", "2"), probe.Ref);
            probe.ExpectMsg <RespondRegisterTemperatureSensor>();

            floor.Tell(new RequestTemperatureSensorIds(3), probe.Ref);
            var response = probe.ExpectMsg <RespondTemperatureSensorIds>();

            Assert.Equal(2, response.SensorIds.Count);
            Assert.Contains("1", response.SensorIds);
            Assert.Contains("2", response.SensorIds);
        }
예제 #5
0
        public void RegisterNewTemperatureSensorWhenDoesNotAlreadyExist()
        {
            var probe = CreateTestProbe();

            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestRegisterTemperatureSensor(1, "a", "42"), probe.Ref);

            var recieved = probe.ExpectMsg <RespondRegisterTemperatureSensor>();

            Assert.Equal(1, recieved.RequestId);

            var sensorActor = probe.LastSender;

            sensorActor.Tell(new RequestUpdateTemperature(2, 200), probe.Ref);

            probe.ExpectMsg <RespondTemperatureUpdated>();
        }
예제 #6
0
        public void ReturnExistingTemperatureSensorWhenReRegistringSameSensor()
        {
            var probe = CreateTestProbe();

            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestRegisterTemperatureSensor(1, "a", "1"), probe.Ref);
            var received = probe.ExpectMsg <RespondRegisterTemperatureSensor>();

            Assert.Equal(1, received.RequestId);
            var firstSensor = probe.LastSender;

            floor.Tell(new RequestRegisterTemperatureSensor(2, "a", "1"), probe.Ref);
            received = probe.ExpectMsg <RespondRegisterTemperatureSensor>();
            Assert.Equal(2, received.RequestId);
            var secondSensor = probe.LastSender;

            Assert.Equal(firstSensor, secondSensor);
        }
예제 #7
0
        public void ReturnTemperatureSensorIdsOnlyFromActiveActors()
        {
            var probe = CreateTestProbe();
            var floor = Sys.ActorOf(FloorActor.Props("a"));

            floor.Tell(new RequestRegisterTemperatureSensor(1, "a", "1"), probe.Ref);
            probe.ExpectMsg <RespondRegisterTemperatureSensor>();
            var firstSensorAdded = probe.LastSender;

            floor.Tell(new RequestRegisterTemperatureSensor(2, "a", "2"), probe.Ref);
            probe.ExpectMsg <RespondRegisterTemperatureSensor>();

            //stop actor
            probe.Watch(firstSensorAdded);
            firstSensorAdded.Tell(PoisonPill.Instance);
            probe.ExpectTerminated(firstSensorAdded);

            floor.Tell(new RequestTemperatureSensorIds(3), probe.Ref);
            var response = probe.ExpectMsg <RespondTemperatureSensorIds>();

            Assert.Equal(1, response.SensorIds.Count);
            Assert.Contains("2", response.SensorIds);
        }
예제 #8
0
        protected override void OnPersist(IEvent persistedEvent)
        {
            switch (persistedEvent)
            {
            case ConstructedHostel hostel:
            {
                var construct = hostel.Construction;
                foreach (var floor in construct.Floors)
                {
                    if (Context.Child(floor.Tag).IsNobody())
                    {
                        floor.HostelId = hostel.Construction.Detail.HostelId;
                        var createFloor = new CreateFloor(floor);
                        Self.Tell(createFloor);
                        Context.System.Log.Info($"FloorActor", $"Creating Floor - {floor.Tag}");
                    }
                }
                if (Context.Child(construct.SepticTank.Tag).IsNobody())
                {
                    var septicSpec = construct.SepticTank;
                    septicSpec.HostelId = hostel.Construction.Detail.HostelId;
                    var septic = new CreateSepticTank(septicSpec);
                    Self.Tell(septic);
                }
                if (Context.Child(construct.Reservoir.Tag).IsNobody())
                {
                    var waterSpec = construct.Reservoir;
                    waterSpec.HostelId = hostel.Construction.Detail.HostelId;;
                    var water = new CreateWaterReservoir(waterSpec);
                    Self.Tell(water);
                }
            }
            break;

            case CreatedFloor createdFloor:
            {
                var floor = createdFloor.Floor;
                floor.HostelId = State.ConstructionRecord.Detail.HostelId;
                var floorState = new FloorState(floor);
                var floorActor = Context.ActorOf(FloorActor.Prop(new FloorHandler(), floorState, floor.Tag, _connectionString), floor.Tag);
                floorActor.Tell(new LayoutFloor());
            }
            break;

            case CreatedSepticTank createdSepticTank:
            {
                var septic = createdSepticTank.SepticTankSpec;
                septic.HostelId = State.ConstructionRecord.Detail.HostelId;
                var septicState = new SepticTankState(septic.SepticTankId, septic.Height, septic.AlertHeight, septic.Sensors);
                var septicActor = Context.ActorOf(SepticTankActor.Prop(new SepticTankHandler(), septicState, septic.Tag, _connectionString), septic.Tag);
                septicActor.Tell(new InstallSensor());
            }
            break;

            case CreatedWaterReservoir createdWater:
            {
                var water = createdWater.ReservoirSpec;
                water.HostelId = State.ConstructionRecord.Detail.HostelId;
                var reservoirState = new WaterReservoirState(water.ReservoirId, water.Height, water.AlertHeight, water.Sensors);
                var waterActor     = Context.ActorOf(WaterReservoirActor.Prop(new WaterReservoirHandler(), reservoirState, water.Tag, _connectionString), water.Tag);
                waterActor.Tell(new InstallSensor());
            }
            break;
            }
            base.OnPersist(persistedEvent);
        }