|
Akka/Scala example source code file (LoggingReceiveSpec.scala)
The LoggingReceiveSpec.scala Akka example source code/** * Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com> */ package akka.event import language.postfixOps import org.scalatest.BeforeAndAfterAll import scala.concurrent.duration._ import akka.testkit._ import org.scalatest.WordSpec import com.typesafe.config.ConfigFactory import scala.collection.JavaConverters._ import akka.actor._ object LoggingReceiveSpec { class TestLogActor extends Actor { override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds)(List(classOf[Throwable])) def receive = { case _ ⇒ } } } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) class LoggingReceiveSpec extends WordSpec with BeforeAndAfterAll { import LoggingReceiveSpec._ val config = ConfigFactory.parseString(""" akka.loglevel=DEBUG akka.actor.serialize-messages = off # debug noise from serialization """).withFallback(AkkaSpec.testConf) val appLogging = ActorSystem("logging", ConfigFactory.parseMap(Map("akka.actor.debug.receive" -> true).asJava).withFallback(config)) val appAuto = ActorSystem("autoreceive", ConfigFactory.parseMap(Map("akka.actor.debug.autoreceive" -> true).asJava).withFallback(config)) val appLifecycle = ActorSystem("lifecycle", ConfigFactory.parseMap(Map("akka.actor.debug.lifecycle" -> true).asJava).withFallback(config)) val filter = TestEvent.Mute(EventFilter.custom { case _: Logging.Debug ⇒ true case _: Logging.Info ⇒ true case _ ⇒ false }) appLogging.eventStream.publish(filter) appAuto.eventStream.publish(filter) appLifecycle.eventStream.publish(filter) def ignoreMute(t: TestKit) { t.ignoreMsg { case (_: TestEvent.Mute | _: TestEvent.UnMute) ⇒ true } } override def afterAll() { TestKit.shutdownActorSystem(appLogging) TestKit.shutdownActorSystem(appAuto) TestKit.shutdownActorSystem(appLifecycle) } "A LoggingReceive" must { "decorate a Receive" in { new TestKit(appLogging) { system.eventStream.subscribe(testActor, classOf[Logging.Debug]) system.eventStream.subscribe(testActor, classOf[UnhandledMessage]) val a = system.actorOf(Props(new Actor { def receive = new LoggingReceive(Some("funky"), { case null ⇒ }) })) a ! "hallo" expectMsg(1 second, Logging.Debug("funky", classOf[DummyClassForStringSources], "received unhandled message hallo")) expectMsgType[UnhandledMessage](1 second) } } "be added on Actor if requested" in { new TestKit(appLogging) with ImplicitSender { ignoreMute(this) system.eventStream.subscribe(testActor, classOf[Logging.Debug]) system.eventStream.subscribe(testActor, classOf[UnhandledMessage]) val r: Actor.Receive = { case null ⇒ } val actor = TestActorRef(new Actor { def switch: Actor.Receive = { case "becomenull" ⇒ context.become(r, false) } def receive = switch orElse LoggingReceive { case x ⇒ sender() ! "x" } }) val name = actor.path.toString actor ! "buh" within(1 second) { expectMsg(Logging.Debug(actor.path.toString, actor.underlyingActor.getClass, "received handled message buh")) expectMsg("x") } actor ! "becomenull" within(500 millis) { actor ! "bah" expectMsgPF() { case UnhandledMessage("bah", testActor, `actor`) ⇒ true } } } } "not duplicate logging" in { new TestKit(appLogging) with ImplicitSender { system.eventStream.subscribe(testActor, classOf[Logging.Debug]) val actor = TestActorRef(new Actor { def receive = LoggingReceive(LoggingReceive { case _ ⇒ sender() ! "x" }) }) actor ! "buh" within(1 second) { expectMsg(Logging.Debug(actor.path.toString, actor.underlyingActor.getClass, "received handled message buh")) expectMsg("x") } } } } "An Actor" must { "log AutoReceiveMessages if requested" in { new TestKit(appAuto) { system.eventStream.subscribe(testActor, classOf[Logging.Debug]) val actor = TestActorRef(new Actor { def receive = { case _ ⇒ } }) val name = actor.path.toString actor ! PoisonPill expectMsgPF() { case Logging.Debug(`name`, _, msg: String) if msg startsWith "received AutoReceiveMessage Envelope(PoisonPill" ⇒ true } awaitCond(actor.isTerminated, 100 millis) } } "log Supervision events if requested" in { new TestKit(appLifecycle) { system.eventStream.subscribe(testActor, classOf[Logging.Debug]) within(3 seconds) { val lifecycleGuardian = appLifecycle.asInstanceOf[ActorSystemImpl].guardian val lname = lifecycleGuardian.path.toString val supervisor = TestActorRef[TestLogActor](Props[TestLogActor]) val sname = supervisor.path.toString fishForMessage(hint = "now supervising") { case Logging.Debug(`lname`, _, msg: String) if msg startsWith "now supervising" ⇒ true case _ ⇒ false } TestActorRef[TestLogActor](Props[TestLogActor], supervisor, "none") fishForMessage(hint = "now supervising") { case Logging.Debug(`sname`, _, msg: String) if msg startsWith "now supervising" ⇒ true case _ ⇒ false } } } } "log DeathWatch events if requested" in { new TestKit(appLifecycle) { system.eventStream.subscribe(testActor, classOf[Logging.Debug]) within(3 seconds) { val supervisor = TestActorRef[TestLogActor](Props[TestLogActor]) val sclass = classOf[TestLogActor] val actor = TestActorRef[TestLogActor](Props[TestLogActor], supervisor, "none") val aname = actor.path.toString supervisor watch actor fishForMessage(hint = "now watched by") { case Logging.Debug(`aname`, `sclass`, msg: String) if msg.startsWith("now watched by") ⇒ true case _ ⇒ false } supervisor unwatch actor expectMsgPF(hint = "no longer watched by") { case Logging.Debug(`aname`, `sclass`, msg: String) if msg.startsWith("no longer watched by") ⇒ } } } } "log LifeCycle events if requested" in { new TestKit(appLifecycle) { system.eventStream.subscribe(testActor, classOf[Logging.Debug]) system.eventStream.subscribe(testActor, classOf[Logging.Error]) within(3 seconds) { val supervisor = TestActorRef[TestLogActor](Props[TestLogActor]) val sname = supervisor.path.toString val sclass = classOf[TestLogActor] fishForMessage(hint = "started") { case Logging.Debug(`sname`, `sclass`, msg: String) if msg startsWith "started" ⇒ true case _ ⇒ false } val actor = TestActorRef[TestLogActor](Props[TestLogActor], supervisor, "none") val aname = actor.path.toString val aclass = classOf[TestLogActor] fishForMessage(hint = "started") { case Logging.Debug(`aname`, `aclass`, msg: String) if msg startsWith "started" ⇒ true case _ ⇒ false } EventFilter[ActorKilledException](occurrences = 1) intercept { actor ! Kill val set = receiveWhile(messages = 3) { case Logging.Error(_: ActorKilledException, `aname`, _, "Kill") ⇒ 1 case Logging.Debug(`aname`, `aclass`, "restarting") ⇒ 2 case Logging.Debug(`aname`, `aclass`, "restarted") ⇒ 3 }.toSet expectNoMsg(Duration.Zero) assert(set == Set(1, 2, 3), set + " was not Set(1, 2, 3)") } system.stop(supervisor) expectMsgAllOf( Logging.Debug(aname, aclass, "stopped"), Logging.Debug(sname, sclass, "stopping"), Logging.Debug(sname, sclass, "stopped")) } } } } } Other Akka source code examplesHere is a short list of links related to this Akka LoggingReceiveSpec.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.