diff --git a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala index 358a979c58..e679ebbb94 100644 --- a/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/dispatch/FutureSpec.scala @@ -3,6 +3,7 @@ package akka.dispatch import org.scalatest.junit.JUnitSuite import org.scalatest.WordSpec import org.scalatest.matchers.MustMatchers +import org.scalatest.BeforeAndAfterAll import org.scalatest.prop.Checkers import org.scalacheck._ import org.scalacheck.Arbitrary._ @@ -11,6 +12,8 @@ import org.scalacheck.Gen._ import akka.actor.{ Actor, ActorRef } import Actor._ +import akka.event.EventHandler +import akka.testkit.TestEvent._ import org.multiverse.api.latches.StandardLatch import java.util.concurrent.{ TimeUnit, CountDownLatch } @@ -40,9 +43,17 @@ object FutureSpec { class JavaFutureSpec extends JavaFutureTests with JUnitSuite -class FutureSpec extends WordSpec with MustMatchers with Checkers { +class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAndAfterAll { import FutureSpec._ + override def beforeAll() { + EventHandler.notify(Mute) + } + + override def afterAll() { + EventHandler.notify(UnMute) + } + "A Promise" when { "never completed" must { behave like emptyFuture(_(Promise())) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala new file mode 100644 index 0000000000..420dece90f --- /dev/null +++ b/akka-testkit/src/main/scala/akka/testkit/TestEventListener.scala @@ -0,0 +1,56 @@ +package akka.testkit + +import akka.event.EventHandler +import akka.actor.Actor + +sealed trait TestEvent + +object TestEvent { + case class Mute(filter: EventFilter = EventFilter.all) extends TestEvent + case class UnMute(filter: EventFilter = EventFilter.all) extends TestEvent +} + +case class EventFilter(throwable: Class[_] = classOf[Throwable], source: Option[AnyRef] = None) { + import EventHandler._ + + def apply(event: Event): Boolean = event match { + case Error(cause, instance, _) ⇒ + (throwable isInstance cause) && + (source map (_ eq instance) getOrElse true) + case _ ⇒ false + } +} + +object EventFilter { + val all = EventFilter() +} + +class TestEventListener extends EventHandler.DefaultListener { + import EventHandler._ + import TestEvent._ + + var filters: List[EventFilter] = Nil + + override def receive: Receive = ({ + case Mute(filter) ⇒ addFilter(filter) + case Mute ⇒ addFilter(EventFilter.all) + case UnMute(filter) ⇒ removeFilter(filter) + case UnMute ⇒ addFilter(EventFilter.all) + case event: Error if filter(event) ⇒ // Just test Error events + }: Receive) orElse super.receive + + def filter(event: Event): Boolean = filters exists (_(event)) + + def addFilter(filter: EventFilter): Unit = filters ::= filter + + def removeFilter(filter: EventFilter): Unit = { + @scala.annotation.tailrec + def removeFirst(list: List[EventFilter], zipped: List[EventFilter] = Nil): List[EventFilter] = list match { + case head :: tail if head == filter ⇒ tail.reverse_:::(zipped) + case head :: tail ⇒ removeFirst(tail, head :: zipped) + case Nil ⇒ filters // filter not found, just return original list + } + filters = removeFirst(filters) + } + +} diff --git a/config/akka.test.conf b/config/akka.test.conf new file mode 100644 index 0000000000..025b5895fe --- /dev/null +++ b/config/akka.test.conf @@ -0,0 +1,9 @@ +# This config imports the Akka reference configuration. +include "akka-reference.conf" + +# In this file you can override any option defined in the 'akka-reference.conf' file. +# Copy in all or parts of the 'akka-reference.conf' file and modify as you please. + +akka { + event-handlers = ["akka.testkit.TestEventListener"] +} diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 6b6dba1856..eb7717a557 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -25,6 +25,8 @@ class AkkaParentProject(info: ProjectInfo) extends ParentProject(info) with Exec val javaCompileSettings = Seq("-Xlint:unchecked") + system[String]("akka.mode").update("test") + // ------------------------------------------------------------------------------------------------------------------- // All repositories *must* go here! See ModuleConigurations below. // -------------------------------------------------------------------------------------------------------------------