From e4e8ddc2a7f9f4900c13eaf954d9f8dca380933a Mon Sep 17 00:00:00 2001 From: Roland Date: Fri, 23 Sep 2011 09:14:42 +0200 Subject: [PATCH] fix more bugs, clean up tests - silence four expected exceptions in SupervisorHierarchySpec - make ActorRef.suspend/resume actually asynchronous and document that - fix broken PoisonPill test in ActorRefSpec --- .../test/scala/akka/actor/ActorRefSpec.scala | 8 +++---- .../akka/actor/SupervisorHierarchySpec.scala | 21 ++++++++++++------- .../akka/actor/dispatch/ActorModelSpec.scala | 2 +- .../src/main/scala/akka/actor/ActorCell.scala | 6 +++--- .../src/main/scala/akka/actor/ActorRef.scala | 6 +++++- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala index d035b28f63..3a59541bd2 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala @@ -112,7 +112,7 @@ object ActorRefSpec { } } -class ActorRefSpec extends WordSpec with MustMatchers { +class ActorRefSpec extends WordSpec with MustMatchers with TestKit { import akka.actor.ActorRefSpec._ def promiseIntercept(f: ⇒ Actor)(to: Promise[Actor]): Actor = try { @@ -358,11 +358,11 @@ class ActorRefSpec extends WordSpec with MustMatchers { fail("shouldn't get here") } - ffive.resultOrException.get must be("five") - fnull.resultOrException.get must be("null") + ffive.get must be("five") + fnull.get must be("null") + awaitCond(ref.isShutdown, 100 millis) ref.isRunning must be(false) - ref.isShutdown must be(true) } "restart when Kill:ed" in { diff --git a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala index 7b043cf5d3..b271392857 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/SupervisorHierarchySpec.scala @@ -9,6 +9,7 @@ import org.junit.Test import Actor._ import akka.config.Supervision.OneForOnePermanentStrategy +import akka.testkit._ import java.util.concurrent.{ TimeUnit, CountDownLatch } @@ -34,12 +35,14 @@ class SupervisorHierarchySpec extends JUnitSuite { val workerOne, workerTwo, workerThree = actorOf(Props(new CountDownActor(countDown)).withSupervisor(manager)) - workerOne ! Kill + filterException[ActorKilledException] { + workerOne ! Kill - // manager + all workers should be restarted by only killing a worker - // manager doesn't trap exits, so boss will restart manager + // manager + all workers should be restarted by only killing a worker + // manager doesn't trap exits, so boss will restart manager - assert(countDown.await(2, TimeUnit.SECONDS)) + assert(countDown.await(2, TimeUnit.SECONDS)) + } } @Test @@ -54,11 +57,13 @@ class SupervisorHierarchySpec extends JUnitSuite { val crasher = actorOf(Props(new CountDownActor(countDownMessages)).withSupervisor(boss)) - crasher ! Kill - crasher ! Kill + filterException[ActorKilledException] { + crasher ! Kill + crasher ! Kill - assert(countDownMessages.await(2, TimeUnit.SECONDS)) - assert(countDownMax.await(2, TimeUnit.SECONDS)) + assert(countDownMessages.await(2, TimeUnit.SECONDS)) + assert(countDownMax.await(2, TimeUnit.SECONDS)) + } } } diff --git a/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala index 0284245974..8f462da426 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/dispatch/ActorModelSpec.scala @@ -401,7 +401,7 @@ abstract class ActorModelSpec extends JUnitSuite { val stopped = a ? PoisonPill val shouldBeCompleted = for (i ← 1 to 10) yield a ? Reply(i) a.resume - assert(f1.get === "foo") + assert(f1.get == "foo") stopped.await for (each ← shouldBeCompleted) assert(each.await.exception.get.isInstanceOf[ActorKilledException]) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 1b99c63158..7448c3976d 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -111,8 +111,8 @@ private[akka] class ActorCell( def start(): Unit = { if (props.supervisor.isDefined) props.supervisor.get.link(self) dispatcher.attach(this) - Actor.registry.register(self) dispatcher.systemDispatch(SystemEnvelope(this, Create, NullChannel)) + Actor.registry.register(self) } def newActor(restart: Boolean): Actor = { @@ -143,9 +143,9 @@ private[akka] class ActorCell( case valid ⇒ valid } - def suspend(): Unit = dispatcher.suspend(this) + def suspend(): Unit = dispatcher.systemDispatch(SystemEnvelope(this, Suspend, NullChannel)) - def resume(): Unit = dispatcher.resume(this) + def resume(): Unit = dispatcher.systemDispatch(SystemEnvelope(this, Resume, NullChannel)) private[akka] def stop(): Unit = if (!terminated) { diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 5cc7d5efe2..e9706f2a1a 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -216,7 +216,11 @@ class LocalActorRef private[akka] ( def isShutdown: Boolean = actorCell.isShutdown /** - * Suspends the actor. It will not process messages while suspended. + * Suspends the actor so that it will not process messages until resumed. The + * suspend request is processed asynchronously to the caller of this method + * as well as to normal message sends: the only ordering guarantee is that + * message sends done from the same thread after calling this method will not + * be processed until resumed. */ def suspend(): Unit = actorCell.suspend()