Merge branch 'master' of git@github.com:jboner/akka

This commit is contained in:
Debasish Ghosh 2011-07-31 02:01:55 +05:30
commit ad07fa363b
9 changed files with 49 additions and 29 deletions

View file

@ -326,7 +326,7 @@ class ActorRefSpec extends WordSpec with MustMatchers {
}
"restart when Kill:ed" in {
filterEvents(EventFilter[ActorKilledException]) {
filterException[ActorKilledException] {
val latch = new CountDownLatch(2)
val boss = Actor.actorOf(new Actor {

View file

@ -59,8 +59,8 @@ object FSMActorSpec {
whenUnhandled {
case Ev(msg) {
unhandledLatch.open
EventHandler.info(this, "unhandled event " + msg + " in state " + stateName + " with data " + stateData)
unhandledLatch.open
stay
}
}
@ -112,7 +112,11 @@ class FSMActorSpec extends WordSpec with MustMatchers with TestKit with BeforeAn
}
override def beforeAll {
EventHandler notify Mute(EventFilter[EventHandler.EventHandlerException]("Next state 2 does not exist"))
EventHandler notify Mute(EventFilter[EventHandler.EventHandlerException]("Next state 2 does not exist"),
EventFilter.custom {
case _: EventHandler.Debug true
case _ false
})
val f = FSM.getClass.getDeclaredField("debugEvent")
f.setAccessible(true)
f.setBoolean(FSM, true)
@ -153,8 +157,13 @@ class FSMActorSpec extends WordSpec with MustMatchers with TestKit with BeforeAn
transitionCallBackLatch.await
lockedLatch.await
lock ! "not_handled"
unhandledLatch.await
filterEvents(EventFilter.custom {
case EventHandler.Info(_: Lock, _) true
case _ false
}) {
lock ! "not_handled"
unhandledLatch.await
}
val answerLatch = TestLatch()
object Hello

View file

@ -10,6 +10,7 @@ import akka.testkit._
import akka.testkit._
import akka.util.duration._
import akka.config.Supervision._
import akka.event.EventHandler
import FSM._
@ -79,9 +80,14 @@ class FSMTransitionSpec extends WordSpec with MustMatchers with TestKit {
val sup = Actor.actorOf[Supervisor].start()
sup link fsm
within(300 millis) {
fsm ! SubscribeTransitionCallBack(forward)
fsm ! "reply"
expectMsg("reply")
filterEvents(EventFilter.custom {
case EventHandler.Warning(_: MyFSM, _) true
case _ false
}) {
fsm ! SubscribeTransitionCallBack(forward)
fsm ! "reply"
expectMsg("reply")
}
forward.start()
fsm ! SubscribeTransitionCallBack(forward)
expectMsg(CurrentState(fsm, 0))

View file

@ -23,7 +23,10 @@ class LoggingReceiveSpec
override def beforeAll {
EventHandler.notify(TestEvent.Mute(EventFilter[UnhandledMessageException],
EventFilter[ActorKilledException]))
EventFilter[ActorKilledException], EventFilter.custom {
case d: EventHandler.Debug true
case _ false
}))
EventHandler.addListener(testActor)
EventHandler.level = EventHandler.DebugLevel
}

View file

@ -34,7 +34,7 @@ class SupervisorTreeSpec extends WordSpec with MustMatchers {
"In a 3 levels deep supervisor tree (linked in the constructor) we" must {
"be able to kill the middle actor and see itself and its child restarted" in {
filterEvents(EventFilter[Exception]) {
filterException[Exception] {
log = "INIT"
val lastActor = actorOf(new Chainer, "lastActor").start

View file

@ -98,7 +98,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"has actions applied" must {
"pass checks" in {
filterEvents(EventFilter[ArithmeticException]) {
filterException[ArithmeticException] {
check({ (future: Future[Int], actions: List[FutureAction])
val result = (future /: actions)(_ /: _)
val expected = (future.await.value.get /: actions)(_ /: _)
@ -128,7 +128,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"throws an exception" must {
behave like futureWithException[RuntimeException] { test
filterEvents(EventFilter[RuntimeException]) {
filterException[RuntimeException] {
val actor = actorOf[TestActor]
actor.start()
val future = actor ? "Failure"
@ -154,7 +154,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"will throw an exception" must {
behave like futureWithException[ArithmeticException] { test
filterEvents(EventFilter[ArithmeticException]) {
filterException[ArithmeticException] {
val actor1 = actorOf[TestActor].start()
val actor2 = actorOf(new Actor { def receive = { case s: String self reply (s.length / 0) } }).start()
val future = actor1 ? "Hello" flatMap { _ match { case s: String actor2 ? s } }
@ -170,7 +170,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
"being tested" must {
"compose with for-comprehensions" in {
filterEvents(EventFilter[ClassCastException]) {
filterException[ClassCastException] {
val actor = actorOf(new Actor {
def receive = {
case s: String self reply s.length
@ -199,7 +199,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"support pattern matching within a for-comprehension" in {
filterEvents(EventFilter[MatchError]) {
filterException[MatchError] {
case class Req[T](req: T)
case class Res[T](res: T)
val actor = actorOf(new Actor {
@ -228,7 +228,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"recover from exceptions" in {
filterEvents(EventFilter[RuntimeException]) {
filterException[RuntimeException] {
val future1 = Future(5)
val future2 = future1 map (_ / 0)
val future3 = future2 map (_.toString)
@ -296,7 +296,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"fold with an exception" in {
filterEvents(EventFilter[IllegalArgumentException]) {
filterException[IllegalArgumentException] {
val actors = (1 to 10).toList map { _
actorOf(new Actor {
def receive = {
@ -345,7 +345,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"shouldReduceResultsWithException" in {
filterEvents(EventFilter[IllegalArgumentException]) {
filterException[IllegalArgumentException] {
val actors = (1 to 10).toList map { _
actorOf(new Actor {
def receive = {
@ -363,7 +363,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"shouldReduceThrowIAEOnEmptyInput" in {
filterEvents(EventFilter[IllegalArgumentException]) {
filterException[IllegalArgumentException] {
intercept[UnsupportedOperationException] { Futures.reduce(List[Future[Int]]())(_ + _).get }
}
}
@ -397,7 +397,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
"shouldHandleThrowables" in {
class ThrowableTest(m: String) extends Throwable(m)
filterEvents(EventFilter[ThrowableTest]) {
filterException[ThrowableTest] {
val f1 = Future { throw new ThrowableTest("test") }
f1.await
intercept[ThrowableTest] { f1.resultOrException }
@ -431,7 +431,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
assert(f2.get === 10)
val f3 = Future({ Thread.sleep(10); 5 }, 10)
filterEvents(EventFilter[FutureTimeoutException]) {
filterException[FutureTimeoutException] {
intercept[FutureTimeoutException] {
f3.get
}
@ -454,7 +454,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"futureComposingWithContinuationsFailureDivideZero" in {
filterEvents(EventFilter[ArithmeticException]) {
filterException[ArithmeticException] {
import Future.flow
val x = Future("Hello")
@ -467,7 +467,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"futureComposingWithContinuationsFailureCastInt" in {
filterEvents(EventFilter[ClassCastException]) {
filterException[ClassCastException] {
import Future.flow
val actor = actorOf[TestActor].start
@ -482,7 +482,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"futureComposingWithContinuationsFailureCastNothing" in {
filterEvents(EventFilter[ClassCastException]) {
filterException[ClassCastException] {
import Future.flow
val actor = actorOf[TestActor].start
@ -630,7 +630,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"futureCompletingWithContinuationsFailure" in {
filterEvents(EventFilter[ArithmeticException]) {
filterException[ArithmeticException] {
import Future.flow
val x, y, z = Promise[Int]()
@ -745,7 +745,7 @@ class FutureSpec extends WordSpec with MustMatchers with Checkers with BeforeAnd
}
"ticket812FutureDispatchCleanup" in {
filterEvents(EventFilter[FutureTimeoutException]) {
filterException[FutureTimeoutException] {
implicit val dispatcher = new Dispatcher("ticket812FutureDispatchCleanup")
assert(dispatcher.pendingFutures === 0)
val future = Future({ Thread.sleep(100); "Done" }, 10)

View file

@ -357,7 +357,7 @@ class ActorPoolSpec extends WordSpec with MustMatchers {
}
"provide default supervision of pooled actors" in {
filterEvents(EventFilter[RuntimeException]) {
filterException[RuntimeException] {
import akka.config.Supervision._
val pingCount = new AtomicInteger(0)
val deathCount = new AtomicInteger(0)

View file

@ -36,7 +36,7 @@ object EventFilter {
def apply[A <: Throwable: Manifest](source: AnyRef, message: String): EventFilter =
ErrorSourceMessageFilter(manifest[A].erasure, source, message)
def apply(test: (Event) Boolean): EventFilter =
def custom(test: (Event) Boolean): EventFilter =
CustomEventFilter(test)
}
@ -92,7 +92,7 @@ class TestEventListener extends EventHandler.DefaultListener {
case event: Event if filter(event)
}: Receive) orElse super.receive
def filter(event: Event): Boolean = try { filters exists (_(event)) } catch { case e: Exception false }
def filter(event: Event): Boolean = filters exists (f try { f(event) } catch { case e: Exception false })
def addFilter(filter: EventFilter): Unit = filters ::= filter

View file

@ -13,4 +13,6 @@ package object testkit {
}
def filterEvents[T](eventFilters: EventFilter*)(block: T): T = filterEvents(eventFilters.toSeq)(block)
def filterException[T <: Throwable: Manifest](block: Unit): Unit = filterEvents(Seq(EventFilter[T]))(block)
}