Fix MailboxSelectorSpec race (#30429)
The comment already said there could be 2 dead letters, but the log assertion failed when there was a second 'excess' one. Add a flag to skip checking for excess log lines.
This commit is contained in:
parent
42d85a3019
commit
cca1c20d93
5 changed files with 25 additions and 4 deletions
|
|
@ -0,0 +1,6 @@
|
||||||
|
# Extra methods on interfaces not for user extension:
|
||||||
|
ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.actor.testkit.typed.javadsl.LoggingTestKit.withCheckExcess")
|
||||||
|
ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.actor.testkit.typed.scaladsl.LoggingTestKit.withCheckExcess")
|
||||||
|
|
||||||
|
# Impl
|
||||||
|
ProblemFilters.exclude[Problem]("akka.actor.testkit.typed.internal.LoggingTestKitImpl.*")
|
||||||
|
|
@ -24,7 +24,8 @@ import akka.testkit.TestKit
|
||||||
* INTERNAL API
|
* INTERNAL API
|
||||||
*/
|
*/
|
||||||
@InternalApi private[akka] object LoggingTestKitImpl {
|
@InternalApi private[akka] object LoggingTestKitImpl {
|
||||||
def empty: LoggingTestKitImpl = new LoggingTestKitImpl(1, None, None, None, None, None, None, Map.empty, None)
|
def empty: LoggingTestKitImpl =
|
||||||
|
new LoggingTestKitImpl(1, None, None, None, None, None, None, Map.empty, checkExcess = true, None)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -39,6 +40,7 @@ import akka.testkit.TestKit
|
||||||
messageRegex: Option[Regex],
|
messageRegex: Option[Regex],
|
||||||
cause: Option[Class[_ <: Throwable]],
|
cause: Option[Class[_ <: Throwable]],
|
||||||
mdc: Map[String, String],
|
mdc: Map[String, String],
|
||||||
|
checkExcess: Boolean,
|
||||||
custom: Option[Function[LoggingEvent, Boolean]])
|
custom: Option[Function[LoggingEvent, Boolean]])
|
||||||
extends javadsl.LoggingTestKit
|
extends javadsl.LoggingTestKit
|
||||||
with scaladsl.LoggingTestKit {
|
with scaladsl.LoggingTestKit {
|
||||||
|
|
@ -92,14 +94,14 @@ import akka.testkit.TestKit
|
||||||
try {
|
try {
|
||||||
val result = code
|
val result = code
|
||||||
|
|
||||||
// wait some more when occurrences=0 to find asynchronous exceess messages
|
// wait some more when occurrences=0 to find asynchronous excess messages
|
||||||
if (occurrences == 0)
|
if (occurrences == 0)
|
||||||
awaitNoExcess(settings.ExpectNoMessageDefaultTimeout)
|
awaitNoExcess(settings.ExpectNoMessageDefaultTimeout)
|
||||||
|
|
||||||
if (!awaitDone(settings.FilterLeeway))
|
if (!awaitDone(settings.FilterLeeway))
|
||||||
if (todo > 0)
|
if (todo > 0)
|
||||||
throw new AssertionError(s"Timeout (${settings.FilterLeeway}) waiting for $todo messages on $this.")
|
throw new AssertionError(s"Timeout (${settings.FilterLeeway}) waiting for $todo messages on $this.")
|
||||||
else
|
else if (checkExcess)
|
||||||
throw new AssertionError(s"Received ${-todo} excess messages on $this.")
|
throw new AssertionError(s"Received ${-todo} excess messages on $this.")
|
||||||
result
|
result
|
||||||
} finally {
|
} finally {
|
||||||
|
|
@ -152,6 +154,9 @@ import akka.testkit.TestKit
|
||||||
withMdc(newMdc.asScala.toMap)
|
withMdc(newMdc.asScala.toMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def withCheckExcess(check: Boolean): LoggingTestKitImpl =
|
||||||
|
copy(checkExcess = check)
|
||||||
|
|
||||||
override def withCustom(newCustom: Function[LoggingEvent, Boolean]): LoggingTestKitImpl =
|
override def withCustom(newCustom: Function[LoggingEvent, Boolean]): LoggingTestKitImpl =
|
||||||
copy(custom = Option(newCustom))
|
copy(custom = Option(newCustom))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,11 @@ import akka.annotation.DoNotInherit
|
||||||
*/
|
*/
|
||||||
def withMdc(newMdc: java.util.Map[String, String]): LoggingTestKit
|
def withMdc(newMdc: java.util.Map[String, String]): LoggingTestKit
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After matching the expected number of hits, check for excess messages
|
||||||
|
*/
|
||||||
|
def withCheckExcess(check: Boolean): LoggingTestKit
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Matching events for which the supplied function returns `true`.
|
* Matching events for which the supplied function returns `true`.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,11 @@ import akka.annotation.DoNotInherit
|
||||||
*/
|
*/
|
||||||
def withMdc(newMdc: Map[String, String]): LoggingTestKit
|
def withMdc(newMdc: Map[String, String]): LoggingTestKit
|
||||||
|
|
||||||
|
/**
|
||||||
|
* After matching the expected number of hits, check for excess messages
|
||||||
|
*/
|
||||||
|
def withCheckExcess(checkExcess: Boolean): LoggingTestKit
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Matching events for which the supplied function returns`true`.
|
* Matching events for which the supplied function returns`true`.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ class MailboxSelectorSpec extends ScalaTestWithActorTestKit("""
|
||||||
}, MailboxSelector.bounded(2))
|
}, MailboxSelector.bounded(2))
|
||||||
actor ! "one" // actor will block here
|
actor ! "one" // actor will block here
|
||||||
actor ! "two"
|
actor ! "two"
|
||||||
LoggingTestKit.deadLetters().expect {
|
LoggingTestKit.deadLetters().withCheckExcess(false).expect {
|
||||||
// one or both of these doesn't fit in mailbox
|
// one or both of these doesn't fit in mailbox
|
||||||
// depending on race with how fast actor consumes
|
// depending on race with how fast actor consumes
|
||||||
actor ! "three"
|
actor ! "three"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue