From a9efcf709883287cdf51edf2800061078414f19c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20P=C5=82achta?= Date: Tue, 28 Feb 2017 19:51:39 +0100 Subject: [PATCH] fishForSpecificMessage #20118 --- .../src/main/scala/akka/testkit/TestKit.scala | 15 +++++++++ .../scala/akka/testkit/TestProbeSpec.scala | 31 +++++++++++++++++++ project/MiMa.scala | 7 ++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala index b27e23a2ab..d41d26b278 100644 --- a/akka-testkit/src/main/scala/akka/testkit/TestKit.scala +++ b/akka-testkit/src/main/scala/akka/testkit/TestKit.scala @@ -439,6 +439,21 @@ trait TestKitBase { recv } + /** + * Same as `fishForMessage`, but gets a different partial function and returns properly typed message. + */ + def fishForSpecificMessage[T](max: Duration = Duration.Undefined, hint: String = "")(f: PartialFunction[Any, T]): T = { + val _max = remainingOrDilated(max) + val end = now + _max + @tailrec + def recv: T = { + val o = receiveOne(end - now) + assert(o ne null, s"timeout (${_max}) during fishForSpecificMessage, hint: $hint") + if (f.isDefinedAt(o)) f(o) else recv + } + recv + } + /** * Same as `expectMsgType[T](remainingOrDefault)`, but correctly treating the timeFactor. */ diff --git a/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala b/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala index a8862a16b6..84a2d4547b 100644 --- a/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala +++ b/akka-testkit/src/test/scala/akka/testkit/TestProbeSpec.scala @@ -141,6 +141,37 @@ class TestProbeSpec extends AkkaSpec with DefaultTimeout { expectMsgAllClassOf(5 seconds, classOf[Int]) should ===(Seq(42)) } + "be able to fish for messages" in { + val probe = TestProbe() + probe.ref ! "hallo" + probe.ref ! "welt" + probe.ref ! "fishForMe" + probe.ref ! "done" + + probe.fishForMessage() { + case "fishForMe" ⇒ true + case _ ⇒ false + } + + probe.expectMsg(1 second, "done") + } + + "be able to fish for specific messages" in { + val probe = TestProbe() + probe.ref ! "hallo" + probe.ref ! "welt" + probe.ref ! "fishForMe" + probe.ref ! "done" + + val msg: String = probe.fishForSpecificMessage() { + case msg @ "fishForMe" ⇒ msg + } + + msg should be("fishForMe") + + probe.expectMsg(1 second, "done") + } + "be able to ignore primitive types" in { ignoreMsg { case 42 ⇒ true } testActor ! 42 diff --git a/project/MiMa.scala b/project/MiMa.scala index c4af1d2e53..352fe4d2c5 100644 --- a/project/MiMa.scala +++ b/project/MiMa.scala @@ -1043,7 +1043,12 @@ object MiMa extends AutoPlugin { // #22277 changes to internal classes ProblemFilters.exclude[DirectMissingMethodProblem]("akka.remote.transport.netty.TcpServerHandler.this"), ProblemFilters.exclude[DirectMissingMethodProblem]("akka.remote.transport.netty.TcpClientHandler.this"), - ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.remote.transport.netty.TcpHandlers.log") + ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.remote.transport.netty.TcpHandlers.log"), + + // #22374 introduce fishForSpecificMessage in TestKit + ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.testkit.TestKitBase.fishForSpecificMessage$default$1"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.testkit.TestKitBase.fishForSpecificMessage"), + ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.testkit.TestKitBase.fishForSpecificMessage$default$2") ) // make sure that // * this list ends with the latest released version number