2017-02-27 10:09:36 +01:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009-2017 Lightbend Inc. <http://www.lightbend.com>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package tutorial_3
|
|
|
|
|
|
|
|
|
|
import akka.actor.PoisonPill
|
|
|
|
|
import akka.testkit.{ AkkaSpec, TestProbe }
|
|
|
|
|
|
|
|
|
|
import scala.concurrent.duration._
|
|
|
|
|
|
|
|
|
|
class DeviceGroupSpec extends AkkaSpec {
|
|
|
|
|
|
|
|
|
|
"DeviceGroup actor" must {
|
|
|
|
|
|
|
|
|
|
"be able to register a device actor" in {
|
|
|
|
|
val probe = TestProbe()
|
|
|
|
|
val groupActor = system.actorOf(DeviceGroup.props("group"))
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor1 = probe.lastSender
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device2"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor2 = probe.lastSender
|
|
|
|
|
|
|
|
|
|
// Check that the device actors are working
|
2017-03-27 13:25:26 +02:00
|
|
|
deviceActor1.tell(Device.RecordTemperature(requestId = 0, 1.0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(Device.TemperatureRecorded(requestId = 0))
|
2017-03-27 13:25:26 +02:00
|
|
|
deviceActor2.tell(Device.RecordTemperature(requestId = 1, 2.0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(Device.TemperatureRecorded(requestId = 1))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"ignore requests for wrong groupId" in {
|
|
|
|
|
val probe = TestProbe()
|
|
|
|
|
val groupActor = system.actorOf(DeviceGroup.props("group"))
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("wrongGroup", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectNoMsg(500.milliseconds)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"return same actor for same deviceId" in {
|
|
|
|
|
val probe = TestProbe()
|
|
|
|
|
val groupActor = system.actorOf(DeviceGroup.props("group"))
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor1 = probe.lastSender
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor2 = probe.lastSender
|
|
|
|
|
|
|
|
|
|
deviceActor1 should ===(deviceActor2)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"be able to list active devices" in {
|
|
|
|
|
val probe = TestProbe()
|
|
|
|
|
val groupActor = system.actorOf(DeviceGroup.props("group"))
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device2"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceGroup.RequestDeviceList(requestId = 0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceGroup.ReplyDeviceList(requestId = 0, Set("device1", "device2")))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"be able to list active devices after one shuts down" in {
|
|
|
|
|
val probe = TestProbe()
|
|
|
|
|
val groupActor = system.actorOf(DeviceGroup.props("group"))
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val toShutDown = probe.lastSender
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device2"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceGroup.RequestDeviceList(requestId = 0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceGroup.ReplyDeviceList(requestId = 0, Set("device1", "device2")))
|
|
|
|
|
|
|
|
|
|
probe.watch(toShutDown)
|
|
|
|
|
toShutDown ! PoisonPill
|
|
|
|
|
probe.expectTerminated(toShutDown)
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceGroup.RequestDeviceList(requestId = 1), probe.ref)
|
|
|
|
|
probe.expectMsg(DeviceGroup.ReplyDeviceList(requestId = 1, Set("device2")))
|
2017-02-27 10:09:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"be able to collect temperatures from all active devices" in {
|
|
|
|
|
val probe = TestProbe()
|
|
|
|
|
val groupActor = system.actorOf(DeviceGroup.props("group"))
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device1"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor1 = probe.lastSender
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device2"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor2 = probe.lastSender
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceManager.RequestTrackDevice("group", "device3"), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(DeviceManager.DeviceRegistered)
|
|
|
|
|
val deviceActor3 = probe.lastSender
|
|
|
|
|
|
|
|
|
|
// Check that the device actors are working
|
2017-03-27 13:25:26 +02:00
|
|
|
deviceActor1.tell(Device.RecordTemperature(requestId = 0, 1.0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(Device.TemperatureRecorded(requestId = 0))
|
2017-03-27 13:25:26 +02:00
|
|
|
deviceActor2.tell(Device.RecordTemperature(requestId = 1, 2.0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(Device.TemperatureRecorded(requestId = 1))
|
|
|
|
|
// No temperature for device3
|
|
|
|
|
|
2017-03-27 13:25:26 +02:00
|
|
|
groupActor.tell(DeviceGroup.RequestAllTemperatures(requestId = 0), probe.ref)
|
2017-02-27 10:09:36 +01:00
|
|
|
probe.expectMsg(
|
|
|
|
|
DeviceGroup.RespondAllTemperatures(
|
|
|
|
|
requestId = 0,
|
|
|
|
|
temperatures = Map(
|
2017-03-27 13:25:26 +02:00
|
|
|
"device1" -> DeviceGroup.Temperature(1.0),
|
|
|
|
|
"device2" -> DeviceGroup.Temperature(2.0),
|
|
|
|
|
"device3" -> DeviceGroup.TemperatureNotAvailable
|
2017-02-27 10:09:36 +01:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|