From 44741b28984a3382de490cb3413b6cc6b460627e Mon Sep 17 00:00:00 2001 From: FateJH Date: Sun, 10 Jun 2018 00:23:59 -0400 Subject: [PATCH 1/3] modification to GridInventory to avoid unnecessary leaking of internal support value and unnecessary complication of item access --- .../converter/AvatarConverter.scala | 5 +-- .../converter/CorpseConverter.scala | 5 +-- .../converter/LockerContainerConverter.scala | 10 ++--- .../net/psforever/objects/guid/GUIDTask.scala | 4 +- .../objects/inventory/GridInventory.scala | 28 ++++++-------- .../objects/inventory/InventoryTile.scala | 8 ++-- .../psforever/objects/loadouts/Loadout.scala | 4 +- .../test/scala/objects/InventoryTest.scala | 37 +++++++++++++++++++ .../src/main/scala/WorldSessionActor.scala | 26 ++++++------- 9 files changed, 76 insertions(+), 51 deletions(-) diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala index 094980fc..e4dd4d63 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/AvatarConverter.scala @@ -200,11 +200,10 @@ class AvatarConverter extends ObjectCreateConverter[Player]() { */ private def MakeInventory(obj : Player) : List[InternalSlot] = { obj.Inventory.Items - .map({ - case(_, item) => + .map(item => { val equip : Equipment = item.obj InternalSlot(equip.Definition.ObjectId, equip.GUID, item.start, equip.Definition.Packet.DetailedConstructorData(equip).get) - }).toList + }) } /** * Given a player with equipment holsters, convert the contents of those holsters into converted-decoded packet data. diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala index 68b7df90..c10fcfac 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/CorpseConverter.scala @@ -62,11 +62,10 @@ class CorpseConverter extends AvatarConverter { */ private def MakeInventory(obj : Player) : List[InternalSlot] = { obj.Inventory.Items - .map({ - case(_, item) => + .map(item => { val equip : Equipment = item.obj BuildEquipment(item.start, equip) - }).toList + }) } /** diff --git a/common/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala b/common/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala index bd321313..124a4c97 100644 --- a/common/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala +++ b/common/src/main/scala/net/psforever/objects/definition/converter/LockerContainerConverter.scala @@ -30,11 +30,10 @@ class LockerContainerConverter extends ObjectCreateConverter[LockerContainer]() */ private def MakeInventory(inv : GridInventory) : List[InternalSlot] = { inv.Items - .map({ - case(_, item) => + .map(item => { val equip : Equipment = item.obj InternalSlot(equip.Definition.ObjectId, equip.GUID, item.start, equip.Definition.Packet.ConstructorData(equip).get) - }).toList + }) } /** @@ -45,10 +44,9 @@ class LockerContainerConverter extends ObjectCreateConverter[LockerContainer]() */ private def MakeDetailedInventory(inv : GridInventory) : List[InternalSlot] = { inv.Items - .map({ - case(_, item) => + .map(item => { val equip : Equipment = item.obj InternalSlot(equip.Definition.ObjectId, equip.GUID, item.start, equip.Definition.Packet.DetailedConstructorData(equip).get) - }).toList + }) } } diff --git a/common/src/main/scala/net/psforever/objects/guid/GUIDTask.scala b/common/src/main/scala/net/psforever/objects/guid/GUIDTask.scala index 2ea7fb4a..af5c2db4 100644 --- a/common/src/main/scala/net/psforever/objects/guid/GUIDTask.scala +++ b/common/src/main/scala/net/psforever/objects/guid/GUIDTask.scala @@ -100,7 +100,7 @@ object GUIDTask { * @return a list of `TaskResolver.GiveTask` messages */ def RegisterInventory(container : Container)(implicit guid : ActorRef) : List[TaskResolver.GiveTask] = { - container.Inventory.Items.values.map(entry => { RegisterEquipment(entry.obj)}).toList + container.Inventory.Items.map(entry => { RegisterEquipment(entry.obj)}) } /** @@ -257,7 +257,7 @@ object GUIDTask { * @return a list of `TaskResolver.GiveTask` messages */ def UnregisterInventory(container : Container)(implicit guid : ActorRef) : List[TaskResolver.GiveTask] = { - container.Inventory.Items.values.map(entry => { UnregisterEquipment(entry.obj)}).toList + container.Inventory.Items.map(entry => { UnregisterEquipment(entry.obj)}) } /** diff --git a/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala b/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala index c05c0460..a8180e9a 100644 --- a/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala +++ b/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala @@ -8,7 +8,6 @@ import net.psforever.objects.EquipmentSlot import net.psforever.packet.game.PlanetSideGUID import scala.annotation.tailrec -import scala.collection.immutable.Map import scala.collection.mutable import scala.util.{Failure, Success, Try} @@ -38,7 +37,7 @@ class GridInventory extends Container { private val entryIndex : AtomicInteger = new AtomicInteger(0) private var grid : Array[Int] = Array.fill[Int](1)(-1) - def Items : Map[Int, InventoryItem] = items.toMap[Int, InventoryItem] + def Items : List[InventoryItem] = items.values.toList def Width : Int = width @@ -331,26 +330,23 @@ class GridInventory extends Container { def Insertion_CheckCollisions(start : Int, obj : Equipment, key : Int) : Boolean = { CheckCollisions(start, obj) match { case Success(Nil) => - val card = InventoryItem(obj, start) - items += key -> card - val tile = obj.Tile - SetCells(start, tile.Width, tile.Height, key) - true + InsertQuickly(start, obj, key) case _ => false } } - def +=(kv : (Int, Equipment)) : Boolean = Insert(kv._1, kv._2) + def InsertQuickly(start : Int, obj : Equipment) : Boolean = InsertQuickly(start, obj, entryIndex.getAndIncrement()) -// def InsertQuickly(start : Int, obj : Equipment) : Boolean = { -// val guid : Int = obj.GUID.guid -// val card = InventoryItemData(obj, start) -// items += guid -> card -// val tile = obj.Tile -// SetCellsOffset(start, tile.width, tile.height, guid) -// true -// } + private def InsertQuickly(start : Int, obj : Equipment, key : Int) : Boolean = { + val card = InventoryItem(obj, start) + items += key -> card + val tile = obj.Tile + SetCellsOffset(start, tile.Width, tile.Height, key) + true + } + + def +=(kv : (Int, Equipment)) : Boolean = Insert(kv._1, kv._2) def Remove(index : Int) : Boolean = { val key = grid(index - Offset) diff --git a/common/src/main/scala/net/psforever/objects/inventory/InventoryTile.scala b/common/src/main/scala/net/psforever/objects/inventory/InventoryTile.scala index ea0b58c3..a1468cd5 100644 --- a/common/src/main/scala/net/psforever/objects/inventory/InventoryTile.scala +++ b/common/src/main/scala/net/psforever/objects/inventory/InventoryTile.scala @@ -26,14 +26,14 @@ object InventoryTile { final val Tile33 = InventoryTile(3,3) //ammo box, pistols, ace final val Tile44 = InventoryTile(4,4) //large ammo box final val Tile55 = InventoryTile(5,5) //bfr ammo box - final val Tile66 = InventoryTile(6,6) //standard assault inventory + final val Tile66 = InventoryTile(6,6) //infiltration suit inventory final val Tile63 = InventoryTile(6,3) //rifles final val Tile93 = InventoryTile(9,3) //long-body weapons - final val Tile96 = InventoryTile(9,6) //standard exo-suit - final val Tile99 = InventoryTile(9,9) //agile exo-suit + final val Tile96 = InventoryTile(9,6) //standard exo-suit inventory + final val Tile99 = InventoryTile(9,9) //agile exo-suit inventory final val Tile1107 = InventoryTile(11, 7) //uncommon small trunk capacity - phantasm final val Tile1111 = InventoryTile(11,11) //common small trunk capacity - final val Tile1209 = InventoryTile(12, 9) //reinforced exo-suit + final val Tile1209 = InventoryTile(12, 9) //reinforced exo-suit inventory final val Tile1511 = InventoryTile(15,11) //common medium trunk capacity final val Tile1515 = InventoryTile(15,15) //common large trunk capacity final val Tile1611 = InventoryTile(16,11) //uncommon medium trunk capacity - vulture diff --git a/common/src/main/scala/net/psforever/objects/loadouts/Loadout.scala b/common/src/main/scala/net/psforever/objects/loadouts/Loadout.scala index 5ff4f92d..82cab3d4 100644 --- a/common/src/main/scala/net/psforever/objects/loadouts/Loadout.scala +++ b/common/src/main/scala/net/psforever/objects/loadouts/Loadout.scala @@ -39,7 +39,7 @@ object Loadout { InfantryLoadout( label, packageSimplifications(player.Holsters()), - packageSimplifications(player.Inventory.Items.values.toList), + packageSimplifications(player.Inventory.Items), player.ExoSuit, DetermineSubtype(player) ) @@ -55,7 +55,7 @@ object Loadout { VehicleLoadout( label, packageSimplifications(vehicle.Weapons.map({ case ((index, weapon)) => InventoryItem(weapon.Equipment.get, index) }).toList), - packageSimplifications(vehicle.Trunk.Items.values.toList), + packageSimplifications(vehicle.Trunk.Items), vehicle.Definition ) } diff --git a/common/src/test/scala/objects/InventoryTest.scala b/common/src/test/scala/objects/InventoryTest.scala index fb6410b7..9236ff24 100644 --- a/common/src/test/scala/objects/InventoryTest.scala +++ b/common/src/test/scala/objects/InventoryTest.scala @@ -349,5 +349,42 @@ class InventoryTest extends Specification { out(1).Definition.Tile mustEqual InventoryTile.Tile22 //did not fit ok } + + "insert items quickly (risk overwriting entries)" in { + val obj : GridInventory = GridInventory(6, 6) + (obj += 0 -> bullet9mmBox1) mustEqual true + val collision1 = obj.CheckCollisions(0,1,1) + obj.CheckCollisions(1,1,1) mustEqual collision1 + obj.CheckCollisions(2,1,1) mustEqual collision1 + obj.CheckCollisions(6,1,1) mustEqual collision1 + obj.CheckCollisions(7,1,1) mustEqual collision1 + obj.CheckCollisions(8,1,1) mustEqual collision1 + obj.CheckCollisions(12,1,1) mustEqual collision1 + obj.CheckCollisions(13,1,1) mustEqual collision1 + obj.CheckCollisions(14,1,1) mustEqual collision1 + + (obj += 7 -> bullet9mmBox2) mustEqual false //can not insert overlapping object + obj.CheckCollisions(0,1,1) mustEqual collision1 + obj.CheckCollisions(1,1,1) mustEqual collision1 + obj.CheckCollisions(2,1,1) mustEqual collision1 + obj.CheckCollisions(6,1,1) mustEqual collision1 + obj.CheckCollisions(7,1,1) mustEqual collision1 + obj.CheckCollisions(8,1,1) mustEqual collision1 + obj.CheckCollisions(12,1,1) mustEqual collision1 + obj.CheckCollisions(13,1,1) mustEqual collision1 + obj.CheckCollisions(14,1,1) mustEqual collision1 + + obj.InsertQuickly(7, bullet9mmBox2) mustEqual true //overwrite + val collision2 = obj.CheckCollisions(7,1,1) + obj.CheckCollisions(0,1,1) mustEqual collision1 + obj.CheckCollisions(1,1,1) mustEqual collision1 + obj.CheckCollisions(2,1,1) mustEqual collision1 + obj.CheckCollisions(6,1,1) mustEqual collision1 + obj.CheckCollisions(7,1,1) mustEqual collision2 + obj.CheckCollisions(8,1,1) mustEqual collision2 + obj.CheckCollisions(12,1,1) mustEqual collision1 + obj.CheckCollisions(13,1,1) mustEqual collision2 + obj.CheckCollisions(14,1,1) mustEqual collision2 + } } } diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 976b7497..40db20e3 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -2012,7 +2012,6 @@ class WorldSessionActor extends Actor with MDCContextAware { //divide capacity across other existing and not full boxes of that ammo type var capacity = previousBox.Capacity val iter = obj.Inventory.Items - .map({case(_, entry) => entry }) .filter(entry => { entry.obj match { case (item : AmmoBox) => @@ -3459,18 +3458,17 @@ class WorldSessionActor extends Actor with MDCContextAware { def AccessContents(vehicle : Vehicle) : Unit = { vehicleService ! Service.Join(s"${vehicle.Actor}") val parent_guid = vehicle.GUID - vehicle.Trunk.Items.foreach({ - case ((_, entry)) => - val obj = entry.obj - val objDef = obj.Definition - sendResponse( - ObjectCreateDetailedMessage( - objDef.ObjectId, - obj.GUID, - ObjectCreateMessageParent(parent_guid, entry.start), - objDef.Packet.DetailedConstructorData(obj).get - ) + vehicle.Trunk.Items.foreach(entry => { + val obj = entry.obj + val objDef = obj.Definition + sendResponse( + ObjectCreateDetailedMessage( + objDef.ObjectId, + obj.GUID, + ObjectCreateMessageParent(parent_guid, entry.start), + objDef.Packet.DetailedConstructorData(obj).get ) + ) }) } @@ -3482,8 +3480,7 @@ class WorldSessionActor extends Actor with MDCContextAware { */ def UnAccessContents(vehicle : Vehicle) : Unit = { vehicleService ! Service.Leave(Some(s"${vehicle.Actor}")) - vehicle.Trunk.Items.foreach({ - case ((_, entry)) => + vehicle.Trunk.Items.foreach(entry =>{ sendResponse(ObjectDeleteMessage(entry.obj.GUID, 0)) }) } @@ -3572,7 +3569,6 @@ class WorldSessionActor extends Actor with MDCContextAware { counting : (Equipment)=>Int = DefaultCount) : List[InventoryItem] = { var currentAmount : Int = 0 obj.Inventory.Items - .map({ case ((_, item)) => item }) .filter(item => filterTest(item.obj)) .toList .sortBy(_.start) From 58d2a35f9f941a0f925e90c5f339da585ad6a111 Mon Sep 17 00:00:00 2001 From: FateJH Date: Sun, 10 Jun 2018 01:11:35 -0400 Subject: [PATCH 2/3] SetCellsOffset -> SetCells --- .../scala/net/psforever/objects/inventory/GridInventory.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala b/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala index a8180e9a..72967165 100644 --- a/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala +++ b/common/src/main/scala/net/psforever/objects/inventory/GridInventory.scala @@ -342,7 +342,7 @@ class GridInventory extends Container { val card = InventoryItem(obj, start) items += key -> card val tile = obj.Tile - SetCellsOffset(start, tile.Width, tile.Height, key) + SetCells(start, tile.Width, tile.Height, key) true } From a29090890b3bfe3dc651e26185d7a4041484fc1d Mon Sep 17 00:00:00 2001 From: FateJH Date: Sun, 10 Jun 2018 01:37:37 -0400 Subject: [PATCH 3/3] changing InventoryEquipmentSlot such that it does not perform the same insertion collision check twice anymore; commenting out entirety of RemoverActorTest to align with the other PR --- .../inventory/InventoryEquipmentSlot.scala | 2 +- pslogin/src/test/scala/RemoverActorTest.scala | 1074 ++++++++--------- 2 files changed, 538 insertions(+), 538 deletions(-) diff --git a/common/src/main/scala/net/psforever/objects/inventory/InventoryEquipmentSlot.scala b/common/src/main/scala/net/psforever/objects/inventory/InventoryEquipmentSlot.scala index 575a43a1..f387eb73 100644 --- a/common/src/main/scala/net/psforever/objects/inventory/InventoryEquipmentSlot.scala +++ b/common/src/main/scala/net/psforever/objects/inventory/InventoryEquipmentSlot.scala @@ -34,7 +34,7 @@ class InventoryEquipmentSlot(private val slot : Int, private val inv : GridInven case Some(equip) => val tile = equip.Definition.Tile inv.CheckCollisionsVar(slot, tile.Width, tile.Height) match { - case Success(Nil) => inv += slot -> equip + case Success(Nil) => inv.InsertQuickly(slot, equip) case _ => ; } diff --git a/pslogin/src/test/scala/RemoverActorTest.scala b/pslogin/src/test/scala/RemoverActorTest.scala index 316c58af..2d0704d3 100644 --- a/pslogin/src/test/scala/RemoverActorTest.scala +++ b/pslogin/src/test/scala/RemoverActorTest.scala @@ -1,537 +1,537 @@ -// Copyright (c) 2017 PSForever -import akka.actor.{ActorRef, Props} -import akka.routing.RandomPool -import akka.testkit.TestProbe -import net.psforever.objects.PlanetSideGameObject -import net.psforever.objects.definition.{EquipmentDefinition, ObjectDefinition} -import net.psforever.objects.equipment.Equipment -import net.psforever.objects.guid.TaskResolver -import net.psforever.objects.zones.{Zone, ZoneMap} -import net.psforever.packet.game.PlanetSideGUID -import services.{RemoverActor, ServiceManager} - -import scala.concurrent.duration._ - -class StandardRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - - "RemoverActor" should { - "handle a simple task" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere) - - val reply1 = probe.receiveOne(200 milliseconds) - assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) - val reply2 = probe.receiveOne(200 milliseconds) - assert(reply2.isInstanceOf[RemoverActorTest.InitialJobAlert]) - probe.expectNoMsg(1 seconds) //delay - val reply3 = probe.receiveOne(300 milliseconds) - assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4 = probe.receiveOne(300 milliseconds) - assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5 = probe.receiveOne(300 milliseconds) - assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6 = probe.receiveOne(500 milliseconds) - assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7 = probe.receiveOne(500 milliseconds) - assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - } - } -} - -class DelayedRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - - "RemoverActor" should { - "handle a simple task (timed)" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(100 milliseconds)) - - val reply1 = probe.receiveOne(200 milliseconds) - assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) - val reply2 = probe.receiveOne(200 milliseconds) - assert(reply2.isInstanceOf[RemoverActorTest.InitialJobAlert]) - //no delay - val reply3 = probe.receiveOne(300 milliseconds) - assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4 = probe.receiveOne(300 milliseconds) - assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5 = probe.receiveOne(300 milliseconds) - assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6 = probe.receiveOne(300 milliseconds) - assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7 = probe.receiveOne(300 milliseconds) - assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - } - } -} - -class ExcludedRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - val AlternateTestObject = new PlanetSideGameObject() { def Definition = new ObjectDefinition(0) { } } - - "RemoverActor" should { - "allow only specific objects" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(AlternateTestObject, Zone.Nowhere) - - val reply1 = probe.receiveOne(200 milliseconds) - assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) - expectNoMsg(2 seconds) - //RemoverActor is stalled because it received an object that it was not allowed to act upon - } - } -} - -class MultipleRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - - "RemoverActor" should { - "work on parallel tasks" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere) - - val replies = probe.receiveN(14, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - var fja : Int = 0 - var cta : Int = 0 - var sja : Int = 0 - var dta : Int = 0 - var dtr : Int = 0 - replies.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case RemoverActorTest.FirstJobAlert() => fja += 1 - case RemoverActorTest.ClearanceTestAlert() => cta += 1 - case RemoverActorTest.SecondJobAlert() => sja += 1 - case RemoverActorTest.DeletionTaskAlert() => dta += 1 - case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 2 && ija == 2 && fja == 2 && cta == 2 && sja == 2 && dta == 2 && dtr == 2) - } - } -} - -class HurrySpecificRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - - "RemoverActor" should { - "be able to hurry certain tasks" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(10 minutes)) //TEN MINUTE WAIT - - val reply1 = probe.receiveOne(200 milliseconds) - assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) - val reply2 = probe.receiveOne(200 milliseconds) - assert(reply2.isInstanceOf[RemoverActorTest.InitialJobAlert]) - probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 10 minutes - remover ! RemoverActor.HurrySpecific(List(RemoverActorTest.TestObject), Zone.Nowhere) //hurried - val reply3 = probe.receiveOne(300 milliseconds) - assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4 = probe.receiveOne(300 milliseconds) - assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5 = probe.receiveOne(300 milliseconds) - assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6 = probe.receiveOne(500 milliseconds) - assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7 = probe.receiveOne(500 milliseconds) - assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - } - } -} - -class HurrySelectionRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - - "RemoverActor" should { - "be able to hurry certain tasks, but let others finish normally" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(10 seconds)) - - val replies = probe.receiveN(4, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 2 && ija == 2) - probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 5 seconds - remover ! RemoverActor.HurrySpecific(List(RemoverActorTest.TestObject), Zone.Nowhere) //hurried - //first - val reply3a = probe.receiveOne(300 milliseconds) - assert(reply3a.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4a = probe.receiveOne(300 milliseconds) - assert(reply4a.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5a = probe.receiveOne(300 milliseconds) - assert(reply5a.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6a = probe.receiveOne(500 milliseconds) - assert(reply6a.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7a = probe.receiveOne(500 milliseconds) - assert(reply7a.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - //second - remover ! RemoverActor.HurrySpecific(List(TestObject2), Zone.Nowhere) //hurried - val reply3b = probe.receiveOne(300 milliseconds) - assert(reply3b.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4b = probe.receiveOne(300 milliseconds) - assert(reply4b.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5b = probe.receiveOne(300 milliseconds) - assert(reply5b.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6b = probe.receiveOne(500 milliseconds) - assert(reply6b.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7b = probe.receiveOne(500 milliseconds) - assert(reply7b.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - } - } -} - -class HurryMultipleRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - final val TestObject3 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(3) } } - - "RemoverActor" should { - "be able to hurry certain tasks, but only valid ones" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) - - val replies = probe.receiveN(4, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 2 && ija == 2) - probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 5 seconds - remover ! RemoverActor.HurrySpecific(List(RemoverActorTest.TestObject, TestObject3), Zone.Nowhere) //multiple hurried, only one valid - //first - val reply3a = probe.receiveOne(300 milliseconds) - assert(reply3a.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4a = probe.receiveOne(300 milliseconds) - assert(reply4a.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5a = probe.receiveOne(300 milliseconds) - assert(reply5a.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6a = probe.receiveOne(500 milliseconds) - assert(reply6a.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7a = probe.receiveOne(500 milliseconds) - assert(reply7a.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - //second - remover ! RemoverActor.HurrySpecific(List(TestObject2), Zone.Nowhere) //hurried - val reply3b = probe.receiveOne(300 milliseconds) - assert(reply3b.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4b = probe.receiveOne(300 milliseconds) - assert(reply4b.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5b = probe.receiveOne(300 milliseconds) - assert(reply5b.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6b = probe.receiveOne(500 milliseconds) - assert(reply6b.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7b = probe.receiveOne(500 milliseconds) - assert(reply7b.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - } - } -} - -class HurryByZoneRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - final val TestObject3 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(3) } } - final val zone = new Zone("test", new ZoneMap("test-map"), 11) - - "RemoverActor" should { - "be able to hurry certain tasks by their zone" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject2, zone, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject3, Zone.Nowhere, Some(5 seconds)) - - val replies1 = probe.receiveN(6, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies1.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 3 && ija == 3) - probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 5 seconds - remover ! RemoverActor.HurrySpecific(List(), Zone.Nowhere) //multiple hurried, only the two entries with Zone.Nowhere - // - val replies2 = probe.receiveN(10, 5 seconds) - var fja : Int = 0 - var cta : Int = 0 - var sja : Int = 0 - var dta : Int = 0 - var dtr : Int = 0 - replies2.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case RemoverActorTest.FirstJobAlert() => fja += 1 - case RemoverActorTest.ClearanceTestAlert() => cta += 1 - case RemoverActorTest.SecondJobAlert() => sja += 1 - case RemoverActorTest.DeletionTaskAlert() => dta += 1 - case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 - case msg => assert(false, s"$msg") - } - assert(fja == 2 && cta == 2 && sja == 2 && dta == 2 && dtr == 2) - //final - remover ! RemoverActor.HurrySpecific(List(), zone) //hurried - val reply3b = probe.receiveOne(300 milliseconds) - assert(reply3b.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4b = probe.receiveOne(300 milliseconds) - assert(reply4b.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5b = probe.receiveOne(300 milliseconds) - assert(reply5b.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6b = probe.receiveOne(500 milliseconds) - assert(reply6b.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7b = probe.receiveOne(500 milliseconds) - assert(reply7b.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - } - } -} - -class HurryAllRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - final val TestObject3 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(3) } } - - "RemoverActor" should { - "be able to hurry all tasks to completion" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(20 seconds)) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(15 seconds)) - remover ! RemoverActor.AddTask(TestObject3, Zone.Nowhere, Some(10 seconds)) - - val replies1 = probe.receiveN(6, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies1.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 3 && ija == 3) - probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet longer than any of the tasks - remover ! RemoverActor.HurryAll() //all hurried - // - val replies2 = probe.receiveN(15, 5 seconds) - var fja : Int = 0 - var cta : Int = 0 - var sja : Int = 0 - var dta : Int = 0 - var dtr : Int = 0 - replies2.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case RemoverActorTest.FirstJobAlert() => fja += 1 - case RemoverActorTest.ClearanceTestAlert() => cta += 1 - case RemoverActorTest.SecondJobAlert() => sja += 1 - case RemoverActorTest.DeletionTaskAlert() => dta += 1 - case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 - case msg => assert(false, s"$msg") - } - assert(fja == 3 && cta == 3 && sja == 3 && dta == 3 && dtr == 3) - } - } -} - -class ClearSelectionRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - - "RemoverActor" should { - "be able to clear certain tasks" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) - - val replies = probe.receiveN(4, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 2 && ija == 2) - probe.expectNoMsg(4 seconds) //long delay, longer than standard but not yet 5 seconds - remover ! RemoverActor.ClearSpecific(List(RemoverActorTest.TestObject), Zone.Nowhere) //cleared - // - val reply3 = probe.receiveOne(2 seconds) - assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) - val reply4 = probe.receiveOne(300 milliseconds) - assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) - val reply5 = probe.receiveOne(300 milliseconds) - assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) - val reply6 = probe.receiveOne(500 milliseconds) - assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) - val reply7 = probe.receiveOne(500 milliseconds) - assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) - //wait - probe.expectNoMsg(2 seconds) //nothing more to do - } - } -} - -class ClearAllRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - - "RemoverActor" should { - "be able to clear all tasks, with no more work on them" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) - - val replies = probe.receiveN(4, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 2 && ija == 2) - probe.expectNoMsg(4 seconds) //long delay, longer than standard but not yet 5 seconds - remover ! RemoverActor.ClearAll() //cleared - //wait - probe.expectNoMsg(3 seconds) //nothing more to do - } - } -} - -class EarlyDeathRemoverActorTest extends ActorTest { - ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") - final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } - - "RemoverActor" should { - "be able to hurry certain tasks" in { - expectNoMsg(500 milliseconds) - val probe = TestProbe() - val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") - remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) - remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) - - val replies = probe.receiveN(4, 5 seconds) - var ita : Int = 0 - var ija : Int = 0 - replies.collect { - case RemoverActorTest.InclusionTestAlert() => ita += 1 - case RemoverActorTest.InitialJobAlert() => ija += 1 - case msg => assert(false, s"$msg") - } - assert(ita == 2 && ija == 2) - probe.expectNoMsg(2 seconds) - remover ! akka.actor.PoisonPill - // - val replies2 = probe.receiveN(8, 5 seconds) - var fja : Int = 0 - var cta : Int = 0 - var sja : Int = 0 - var dta : Int = 0 - var dtr : Int = 0 - replies2.collect { - case RemoverActorTest.FirstJobAlert() => fja += 1 - case RemoverActorTest.ClearanceTestAlert() => cta += 1 - case RemoverActorTest.SecondJobAlert() => sja += 1 - case RemoverActorTest.DeletionTaskAlert() => dta += 1 - case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 - case msg => assert(false, s"$msg") - } - assert(fja == 2 && cta == 0 && sja == 2 && dta == 2 && dtr == 2) //no clearance tests - } - } -} - -object RemoverActorTest { - final val TestObject = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(1) } } - - final case class InclusionTestAlert() - - final case class InitialJobAlert() - - final case class FirstJobAlert() - - final case class SecondJobAlert() - - final case class ClearanceTestAlert() - - final case class DeletionTaskAlert() - - final case class DeletionTaskRunAlert() - - class TestRemover(probe : TestProbe) extends RemoverActor { - import net.psforever.objects.guid.{Task, TaskResolver} - val FirstStandardDuration = 1 seconds - - val SecondStandardDuration = 100 milliseconds - - def InclusionTest(entry : RemoverActor.Entry) : Boolean = { - probe.ref ! InclusionTestAlert() - entry.obj.isInstanceOf[Equipment] - } - - def InitialJob(entry : RemoverActor.Entry) : Unit = { - probe.ref ! InitialJobAlert() - } - - def FirstJob(entry : RemoverActor.Entry) : Unit = { - probe.ref ! FirstJobAlert() - } - - override def SecondJob(entry : RemoverActor.Entry) : Unit = { - probe.ref ! SecondJobAlert() - super.SecondJob(entry) - } - - def ClearanceTest(entry : RemoverActor.Entry) : Boolean = { - probe.ref ! ClearanceTestAlert() - true - } - - def DeletionTask(entry : RemoverActor.Entry) : TaskResolver.GiveTask = { - probe.ref ! DeletionTaskAlert() - TaskResolver.GiveTask(new Task() { - private val localProbe = probe - - override def isComplete = Task.Resolution.Success - - def Execute(resolver : ActorRef) : Unit = { - localProbe.ref ! DeletionTaskRunAlert() - resolver ! scala.util.Success(this) - } - }) - } - } -} +//// Copyright (c) 2017 PSForever +//import akka.actor.{ActorRef, Props} +//import akka.routing.RandomPool +//import akka.testkit.TestProbe +//import net.psforever.objects.PlanetSideGameObject +//import net.psforever.objects.definition.{EquipmentDefinition, ObjectDefinition} +//import net.psforever.objects.equipment.Equipment +//import net.psforever.objects.guid.TaskResolver +//import net.psforever.objects.zones.{Zone, ZoneMap} +//import net.psforever.packet.game.PlanetSideGUID +//import services.{RemoverActor, ServiceManager} +// +//import scala.concurrent.duration._ +// +//class StandardRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// +// "RemoverActor" should { +// "handle a simple task" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere) +// +// val reply1 = probe.receiveOne(200 milliseconds) +// assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) +// val reply2 = probe.receiveOne(200 milliseconds) +// assert(reply2.isInstanceOf[RemoverActorTest.InitialJobAlert]) +// probe.expectNoMsg(1 seconds) //delay +// val reply3 = probe.receiveOne(300 milliseconds) +// assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4 = probe.receiveOne(300 milliseconds) +// assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5 = probe.receiveOne(300 milliseconds) +// assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6 = probe.receiveOne(500 milliseconds) +// assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7 = probe.receiveOne(500 milliseconds) +// assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// } +// } +//} +// +//class DelayedRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// +// "RemoverActor" should { +// "handle a simple task (timed)" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(100 milliseconds)) +// +// val reply1 = probe.receiveOne(200 milliseconds) +// assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) +// val reply2 = probe.receiveOne(200 milliseconds) +// assert(reply2.isInstanceOf[RemoverActorTest.InitialJobAlert]) +// //no delay +// val reply3 = probe.receiveOne(300 milliseconds) +// assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4 = probe.receiveOne(300 milliseconds) +// assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5 = probe.receiveOne(300 milliseconds) +// assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6 = probe.receiveOne(300 milliseconds) +// assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7 = probe.receiveOne(300 milliseconds) +// assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// } +// } +//} +// +//class ExcludedRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// val AlternateTestObject = new PlanetSideGameObject() { def Definition = new ObjectDefinition(0) { } } +// +// "RemoverActor" should { +// "allow only specific objects" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(AlternateTestObject, Zone.Nowhere) +// +// val reply1 = probe.receiveOne(200 milliseconds) +// assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) +// expectNoMsg(2 seconds) +// //RemoverActor is stalled because it received an object that it was not allowed to act upon +// } +// } +//} +// +//class MultipleRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// +// "RemoverActor" should { +// "work on parallel tasks" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere) +// +// val replies = probe.receiveN(14, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// var fja : Int = 0 +// var cta : Int = 0 +// var sja : Int = 0 +// var dta : Int = 0 +// var dtr : Int = 0 +// replies.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case RemoverActorTest.FirstJobAlert() => fja += 1 +// case RemoverActorTest.ClearanceTestAlert() => cta += 1 +// case RemoverActorTest.SecondJobAlert() => sja += 1 +// case RemoverActorTest.DeletionTaskAlert() => dta += 1 +// case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 2 && ija == 2 && fja == 2 && cta == 2 && sja == 2 && dta == 2 && dtr == 2) +// } +// } +//} +// +//class HurrySpecificRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// +// "RemoverActor" should { +// "be able to hurry certain tasks" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(10 minutes)) //TEN MINUTE WAIT +// +// val reply1 = probe.receiveOne(200 milliseconds) +// assert(reply1.isInstanceOf[RemoverActorTest.InclusionTestAlert]) +// val reply2 = probe.receiveOne(200 milliseconds) +// assert(reply2.isInstanceOf[RemoverActorTest.InitialJobAlert]) +// probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 10 minutes +// remover ! RemoverActor.HurrySpecific(List(RemoverActorTest.TestObject), Zone.Nowhere) //hurried +// val reply3 = probe.receiveOne(300 milliseconds) +// assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4 = probe.receiveOne(300 milliseconds) +// assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5 = probe.receiveOne(300 milliseconds) +// assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6 = probe.receiveOne(500 milliseconds) +// assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7 = probe.receiveOne(500 milliseconds) +// assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// } +// } +//} +// +//class HurrySelectionRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// +// "RemoverActor" should { +// "be able to hurry certain tasks, but let others finish normally" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(10 seconds)) +// +// val replies = probe.receiveN(4, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 2 && ija == 2) +// probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 5 seconds +// remover ! RemoverActor.HurrySpecific(List(RemoverActorTest.TestObject), Zone.Nowhere) //hurried +// //first +// val reply3a = probe.receiveOne(300 milliseconds) +// assert(reply3a.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4a = probe.receiveOne(300 milliseconds) +// assert(reply4a.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5a = probe.receiveOne(300 milliseconds) +// assert(reply5a.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6a = probe.receiveOne(500 milliseconds) +// assert(reply6a.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7a = probe.receiveOne(500 milliseconds) +// assert(reply7a.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// //second +// remover ! RemoverActor.HurrySpecific(List(TestObject2), Zone.Nowhere) //hurried +// val reply3b = probe.receiveOne(300 milliseconds) +// assert(reply3b.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4b = probe.receiveOne(300 milliseconds) +// assert(reply4b.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5b = probe.receiveOne(300 milliseconds) +// assert(reply5b.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6b = probe.receiveOne(500 milliseconds) +// assert(reply6b.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7b = probe.receiveOne(500 milliseconds) +// assert(reply7b.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// } +// } +//} +// +//class HurryMultipleRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// final val TestObject3 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(3) } } +// +// "RemoverActor" should { +// "be able to hurry certain tasks, but only valid ones" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) +// +// val replies = probe.receiveN(4, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 2 && ija == 2) +// probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 5 seconds +// remover ! RemoverActor.HurrySpecific(List(RemoverActorTest.TestObject, TestObject3), Zone.Nowhere) //multiple hurried, only one valid +// //first +// val reply3a = probe.receiveOne(300 milliseconds) +// assert(reply3a.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4a = probe.receiveOne(300 milliseconds) +// assert(reply4a.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5a = probe.receiveOne(300 milliseconds) +// assert(reply5a.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6a = probe.receiveOne(500 milliseconds) +// assert(reply6a.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7a = probe.receiveOne(500 milliseconds) +// assert(reply7a.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// //second +// remover ! RemoverActor.HurrySpecific(List(TestObject2), Zone.Nowhere) //hurried +// val reply3b = probe.receiveOne(300 milliseconds) +// assert(reply3b.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4b = probe.receiveOne(300 milliseconds) +// assert(reply4b.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5b = probe.receiveOne(300 milliseconds) +// assert(reply5b.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6b = probe.receiveOne(500 milliseconds) +// assert(reply6b.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7b = probe.receiveOne(500 milliseconds) +// assert(reply7b.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// } +// } +//} +// +//class HurryByZoneRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// final val TestObject3 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(3) } } +// final val zone = new Zone("test", new ZoneMap("test-map"), 11) +// +// "RemoverActor" should { +// "be able to hurry certain tasks by their zone" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, zone, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject3, Zone.Nowhere, Some(5 seconds)) +// +// val replies1 = probe.receiveN(6, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies1.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 3 && ija == 3) +// probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet 5 seconds +// remover ! RemoverActor.HurrySpecific(List(), Zone.Nowhere) //multiple hurried, only the two entries with Zone.Nowhere +// // +// val replies2 = probe.receiveN(10, 5 seconds) +// var fja : Int = 0 +// var cta : Int = 0 +// var sja : Int = 0 +// var dta : Int = 0 +// var dtr : Int = 0 +// replies2.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case RemoverActorTest.FirstJobAlert() => fja += 1 +// case RemoverActorTest.ClearanceTestAlert() => cta += 1 +// case RemoverActorTest.SecondJobAlert() => sja += 1 +// case RemoverActorTest.DeletionTaskAlert() => dta += 1 +// case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 +// case msg => assert(false, s"$msg") +// } +// assert(fja == 2 && cta == 2 && sja == 2 && dta == 2 && dtr == 2) +// //final +// remover ! RemoverActor.HurrySpecific(List(), zone) //hurried +// val reply3b = probe.receiveOne(300 milliseconds) +// assert(reply3b.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4b = probe.receiveOne(300 milliseconds) +// assert(reply4b.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5b = probe.receiveOne(300 milliseconds) +// assert(reply5b.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6b = probe.receiveOne(500 milliseconds) +// assert(reply6b.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7b = probe.receiveOne(500 milliseconds) +// assert(reply7b.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// } +// } +//} +// +//class HurryAllRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// final val TestObject3 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(3) } } +// +// "RemoverActor" should { +// "be able to hurry all tasks to completion" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(20 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(15 seconds)) +// remover ! RemoverActor.AddTask(TestObject3, Zone.Nowhere, Some(10 seconds)) +// +// val replies1 = probe.receiveN(6, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies1.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 3 && ija == 3) +// probe.expectNoMsg(3 seconds) //long delay, longer than standard but not yet longer than any of the tasks +// remover ! RemoverActor.HurryAll() //all hurried +// // +// val replies2 = probe.receiveN(15, 5 seconds) +// var fja : Int = 0 +// var cta : Int = 0 +// var sja : Int = 0 +// var dta : Int = 0 +// var dtr : Int = 0 +// replies2.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case RemoverActorTest.FirstJobAlert() => fja += 1 +// case RemoverActorTest.ClearanceTestAlert() => cta += 1 +// case RemoverActorTest.SecondJobAlert() => sja += 1 +// case RemoverActorTest.DeletionTaskAlert() => dta += 1 +// case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 +// case msg => assert(false, s"$msg") +// } +// assert(fja == 3 && cta == 3 && sja == 3 && dta == 3 && dtr == 3) +// } +// } +//} +// +//class ClearSelectionRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// +// "RemoverActor" should { +// "be able to clear certain tasks" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) +// +// val replies = probe.receiveN(4, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 2 && ija == 2) +// probe.expectNoMsg(4 seconds) //long delay, longer than standard but not yet 5 seconds +// remover ! RemoverActor.ClearSpecific(List(RemoverActorTest.TestObject), Zone.Nowhere) //cleared +// // +// val reply3 = probe.receiveOne(2 seconds) +// assert(reply3.isInstanceOf[RemoverActorTest.FirstJobAlert]) +// val reply4 = probe.receiveOne(300 milliseconds) +// assert(reply4.isInstanceOf[RemoverActorTest.ClearanceTestAlert]) +// val reply5 = probe.receiveOne(300 milliseconds) +// assert(reply5.isInstanceOf[RemoverActorTest.SecondJobAlert]) +// val reply6 = probe.receiveOne(500 milliseconds) +// assert(reply6.isInstanceOf[RemoverActorTest.DeletionTaskAlert]) +// val reply7 = probe.receiveOne(500 milliseconds) +// assert(reply7.isInstanceOf[RemoverActorTest.DeletionTaskRunAlert]) +// //wait +// probe.expectNoMsg(2 seconds) //nothing more to do +// } +// } +//} +// +//class ClearAllRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// +// "RemoverActor" should { +// "be able to clear all tasks, with no more work on them" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) +// +// val replies = probe.receiveN(4, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 2 && ija == 2) +// probe.expectNoMsg(4 seconds) //long delay, longer than standard but not yet 5 seconds +// remover ! RemoverActor.ClearAll() //cleared +// //wait +// probe.expectNoMsg(3 seconds) //nothing more to do +// } +// } +//} +// +//class EarlyDeathRemoverActorTest extends ActorTest { +// ServiceManager.boot ! ServiceManager.Register(RandomPool(2).props(Props[TaskResolver]), "taskResolver") +// final val TestObject2 = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(2) } } +// +// "RemoverActor" should { +// "be able to hurry certain tasks" in { +// expectNoMsg(500 milliseconds) +// val probe = TestProbe() +// val remover = system.actorOf(Props(classOf[RemoverActorTest.TestRemover], probe), "test-remover") +// remover ! RemoverActor.AddTask(RemoverActorTest.TestObject, Zone.Nowhere, Some(5 seconds)) +// remover ! RemoverActor.AddTask(TestObject2, Zone.Nowhere, Some(5 seconds)) +// +// val replies = probe.receiveN(4, 5 seconds) +// var ita : Int = 0 +// var ija : Int = 0 +// replies.collect { +// case RemoverActorTest.InclusionTestAlert() => ita += 1 +// case RemoverActorTest.InitialJobAlert() => ija += 1 +// case msg => assert(false, s"$msg") +// } +// assert(ita == 2 && ija == 2) +// probe.expectNoMsg(2 seconds) +// remover ! akka.actor.PoisonPill +// // +// val replies2 = probe.receiveN(8, 5 seconds) +// var fja : Int = 0 +// var cta : Int = 0 +// var sja : Int = 0 +// var dta : Int = 0 +// var dtr : Int = 0 +// replies2.collect { +// case RemoverActorTest.FirstJobAlert() => fja += 1 +// case RemoverActorTest.ClearanceTestAlert() => cta += 1 +// case RemoverActorTest.SecondJobAlert() => sja += 1 +// case RemoverActorTest.DeletionTaskAlert() => dta += 1 +// case RemoverActorTest.DeletionTaskRunAlert() => dtr += 1 +// case msg => assert(false, s"$msg") +// } +// assert(fja == 2 && cta == 0 && sja == 2 && dta == 2 && dtr == 2) //no clearance tests +// } +// } +//} +// +//object RemoverActorTest { +// final val TestObject = new Equipment() { def Definition = new EquipmentDefinition(0) { GUID = PlanetSideGUID(1) } } +// +// final case class InclusionTestAlert() +// +// final case class InitialJobAlert() +// +// final case class FirstJobAlert() +// +// final case class SecondJobAlert() +// +// final case class ClearanceTestAlert() +// +// final case class DeletionTaskAlert() +// +// final case class DeletionTaskRunAlert() +// +// class TestRemover(probe : TestProbe) extends RemoverActor { +// import net.psforever.objects.guid.{Task, TaskResolver} +// val FirstStandardDuration = 1 seconds +// +// val SecondStandardDuration = 100 milliseconds +// +// def InclusionTest(entry : RemoverActor.Entry) : Boolean = { +// probe.ref ! InclusionTestAlert() +// entry.obj.isInstanceOf[Equipment] +// } +// +// def InitialJob(entry : RemoverActor.Entry) : Unit = { +// probe.ref ! InitialJobAlert() +// } +// +// def FirstJob(entry : RemoverActor.Entry) : Unit = { +// probe.ref ! FirstJobAlert() +// } +// +// override def SecondJob(entry : RemoverActor.Entry) : Unit = { +// probe.ref ! SecondJobAlert() +// super.SecondJob(entry) +// } +// +// def ClearanceTest(entry : RemoverActor.Entry) : Boolean = { +// probe.ref ! ClearanceTestAlert() +// true +// } +// +// def DeletionTask(entry : RemoverActor.Entry) : TaskResolver.GiveTask = { +// probe.ref ! DeletionTaskAlert() +// TaskResolver.GiveTask(new Task() { +// private val localProbe = probe +// +// override def isComplete = Task.Resolution.Success +// +// def Execute(resolver : ActorRef) : Unit = { +// localProbe.ref ! DeletionTaskRunAlert() +// resolver ! scala.util.Success(this) +// } +// }) +// } +// } +//}