New implementation of expectNoMsg in TestKit #23224
This commit is contained in:
parent
cd4ee59cc8
commit
dfd94d3aea
3 changed files with 64 additions and 3 deletions
|
|
@ -124,7 +124,9 @@ object TestPublisher {
|
|||
|
||||
/**
|
||||
* Expect no messages.
|
||||
* NOTE! Timeout value is automatically multiplied by timeFactor.
|
||||
*/
|
||||
@deprecated(message = "Use expectNoMessage instead", since = "2.5.5")
|
||||
def expectNoMsg(): Self = executeAfterSubscription {
|
||||
probe.expectNoMsg()
|
||||
self
|
||||
|
|
@ -132,12 +134,22 @@ object TestPublisher {
|
|||
|
||||
/**
|
||||
* Expect no messages for a given duration.
|
||||
* NOTE! Timeout value is automatically multiplied by timeFactor.
|
||||
*/
|
||||
@deprecated(message = "Use expectNoMessage instead", since = "2.5.5")
|
||||
def expectNoMsg(max: FiniteDuration): Self = executeAfterSubscription {
|
||||
probe.expectNoMsg(max)
|
||||
self
|
||||
}
|
||||
|
||||
/**
|
||||
* Expect no messages for a given duration.
|
||||
*/
|
||||
def expectNoMessage(max: FiniteDuration): Self = executeAfterSubscription {
|
||||
probe.expectNoMessage(max)
|
||||
self
|
||||
}
|
||||
|
||||
/**
|
||||
* Receive messages for a given duration or until one does not match a given partial function.
|
||||
*/
|
||||
|
|
@ -557,7 +569,9 @@ object TestSubscriber {
|
|||
* Fluent DSL
|
||||
*
|
||||
* Same as `expectNoMsg(remaining)`, but correctly treating the timeFactor.
|
||||
* NOTE! Timeout value is automatically multiplied by timeFactor.
|
||||
*/
|
||||
@deprecated(message = "Use expectNoMessage instead", since = "2.5.5")
|
||||
def expectNoMsg(): Self = {
|
||||
probe.expectNoMsg()
|
||||
self
|
||||
|
|
@ -567,12 +581,24 @@ object TestSubscriber {
|
|||
* Fluent DSL
|
||||
*
|
||||
* Assert that no message is received for the specified time.
|
||||
* NOTE! Timeout value is automatically multiplied by timeFactor.
|
||||
*/
|
||||
@deprecated(message = "Use expectNoMessage instead", since = "2.5.5")
|
||||
def expectNoMsg(remaining: FiniteDuration): Self = {
|
||||
probe.expectNoMsg(remaining)
|
||||
self
|
||||
}
|
||||
|
||||
/**
|
||||
* Fluent DSL
|
||||
*
|
||||
* Assert that no message is received for the specified time.
|
||||
*/
|
||||
def expectNoMessage(remaining: FiniteDuration): Self = {
|
||||
probe.expectNoMessage(remaining)
|
||||
self
|
||||
}
|
||||
|
||||
/**
|
||||
* Expect a stream element and test it with partial function.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
# #23224 TestKit expectNoMsg fix
|
||||
ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.testkit.TestKitBase.expectNoMessage")
|
||||
ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.testkit.TestKitBase.expectNoMessage$default$1")
|
||||
|
|
@ -640,16 +640,48 @@ trait TestKitBase {
|
|||
/**
|
||||
* Same as `expectNoMsg(remainingOrDefault)`, but correctly treating the timeFactor.
|
||||
*/
|
||||
@deprecated(message = "Use expectNoMessage instead", since = "2.5.5")
|
||||
def expectNoMsg() { expectNoMsg_internal(remainingOrDefault) }
|
||||
|
||||
/**
|
||||
* Assert that no message is received for the specified time.
|
||||
* NOTE! Supplied value is always dilated.
|
||||
*/
|
||||
def expectNoMsg(max: FiniteDuration) { expectNoMsg_internal(max.dilated) }
|
||||
@deprecated(message = "Use expectNoMessage instead", since = "2.5.5")
|
||||
def expectNoMsg(max: FiniteDuration) {
|
||||
expectNoMsg_internal(max.dilated)
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert that no message is received for the specified time.
|
||||
* Supplied value is not dilated.
|
||||
*/
|
||||
def expectNoMessage(max: FiniteDuration) = {
|
||||
expectNoMsg_internal(max)
|
||||
}
|
||||
|
||||
private def expectNoMsg_internal(max: FiniteDuration) {
|
||||
val o = receiveOne(max)
|
||||
assert(o eq null, s"received unexpected message $o")
|
||||
val finish = System.nanoTime() + max.toNanos
|
||||
val pollInterval = 100.millis
|
||||
|
||||
def leftNow = (finish - System.nanoTime()).nanos
|
||||
|
||||
var elem: AnyRef = queue.peekFirst()
|
||||
var left = leftNow
|
||||
while (left.toNanos > 0 && elem == null) {
|
||||
//Use of (left / 2) gives geometric series limited by finish time similar to (1/2)^n limited by 1,
|
||||
//so it is very precise
|
||||
Thread.sleep(
|
||||
pollInterval.toMillis min (left / 2).toMillis
|
||||
)
|
||||
left = leftNow
|
||||
if (left.toNanos > 0) {
|
||||
elem = queue.peekFirst()
|
||||
}
|
||||
}
|
||||
val diff = (max.toNanos - left.toNanos).nanos
|
||||
val m = s"received unexpected message $elem after ${diff.toMillis} millis"
|
||||
assert(elem eq null, m)
|
||||
lastWasNoMsg = true
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue