Added TestEventListener

This commit is contained in:
Derek Williams 2011-06-17 16:45:36 -06:00
parent 389893a0cc
commit 6b73e0982a
4 changed files with 79 additions and 1 deletions

View file

@ -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()))

View file

@ -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)
}
}

9
config/akka.test.conf Normal file
View file

@ -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"]
}

View file

@ -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.
// -------------------------------------------------------------------------------------------------------------------