Executes the passed by-name, and if it throws an exception, forwards it to the thread that calls await
, unless
a by-name passed during a previous invocation of this method threw an exception.
Executes the passed by-name, and if it throws an exception, forwards it to the thread that calls await
, unless
a by-name passed during a previous invocation of this method threw an exception.
This method returns normally whether or not the passed function completes abruptly. If called multiple times, only the
first invocation that yields an exception will "win" and have its exception forwarded to the thread that calls await
.
Any subsequent exceptions will be "swallowed." This method may be invoked by multiple threads concurrently, in which case it is a race
to see who wins and has their exception forwarded to await
. The await
call will eventually complete
abruptly with the winning exception, or return normally if that instance of Waiter
is dismissed. Any exception thrown by
a by-name passed to apply
after the Waiter
has been dismissed will also be "swallowed."
the by-name function to execute
Wait for an exception to be produced by the by-name passed to apply
, or the specified
number of dismissals, timing out after the specified timeout and sleeping an interval between checks configured
by an implicit PatienceConfig
.
Wait for an exception to be produced by the by-name passed to apply
, or the specified
number of dismissals, timing out after the specified timeout and sleeping an interval between checks configured
by an implicit PatienceConfig
.
This method may only be invoked by the thread that created the Waiter
.
Each time this method completes, its internal dismissal count is reset to zero, so it can be invoked multiple times. However,
once await
has completed abruptly with an exception produced during a call to apply
, it will continue
to complete abruptly with that exception.
The timeout
parameter allows you to specify a timeout after which a
TestFailedException
will be thrown with a detail message indicating the await
call
timed out. If no calls to apply
have produced an exception and an insufficient number of
dismissals has been received by the time the timeout
has expired, await
will
complete abruptly with TestFailedException
.
As used here, a "check" is checking to see whether an exception has been thrown by a by-name passed
to apply
or the specified number of dismissals has occurred. The "interval" is the amount
of time the thread that calls await
will sleep between "checks."
Wait for an exception to be produced by the by-name passed to apply
, or the specified
number of dismissals, sleeping an interval between checks and timing out after a timeout, both configured
by an implicit PatienceConfig
.
Wait for an exception to be produced by the by-name passed to apply
, or the specified
number of dismissals, sleeping an interval between checks and timing out after a timeout, both configured
by an implicit PatienceConfig
.
This method may only be invoked by the thread that created the Waiter
.
Each time this method completes, its internal dismissal count is reset to zero, so it can be invoked multiple times. However,
once await
has completed abruptly with an exception produced during a call to apply
, it will continue
to complete abruptly with that exception.
The timeout
parameter allows you to specify a timeout after which a
TestFailedException
will be thrown with a detail message indicating the await
call
timed out. If no calls to apply
have produced an exception and an insufficient number of
dismissals has been received by the time the timeout
has expired, await
will
complete abruptly with TestFailedException
.
As used here, a "check" is checking to see whether an exception has been thrown by a by-name passed
to apply
or the specified number of dismissals has occurred. The "interval" is the amount
of time the thread that calls await
will sleep between "checks."
the PatienceConfig
object containing the timeout
parameter
Wait for an exception to be produced by the by-name passed to apply
, or one dismissal,
timing out after the specified timeout and sleeping an interval between checks configured
by an implicit PatienceConfig
.
Wait for an exception to be produced by the by-name passed to apply
, or one dismissal,
timing out after the specified timeout and sleeping an interval between checks configured
by an implicit PatienceConfig
.
This method may only be invoked by the thread that created the Waiter
.
Each time this method completes, its internal dismissal count is reset to zero, so it can be invoked multiple times. However,
once await
has completed abruptly with an exception produced during a call to apply
, it will continue
to complete abruptly with that exception.
The timeout
parameter allows you to specify a timeout after which a
TestFailedException
will be thrown with a detail message indicating the await
call
timed out. If no calls to apply
have produced an exception and an insufficient number of
dismissals has been received by the time the timeout
has expired, await
will
complete abruptly with TestFailedException
.
As used here, a "check" is checking to see whether an exception has been thrown by a by-name passed
to apply
or a dismissal has occurred. The "interval" is the amount
of time the thread that calls await
will sleep between "checks."
Wait for an exception to be produced by the by-name passed to apply
, or one dismissal,
sleeping an interval between checks and timing out after a timeout, both configured
by an implicit PatienceConfig
.
Wait for an exception to be produced by the by-name passed to apply
, or one dismissal,
sleeping an interval between checks and timing out after a timeout, both configured
by an implicit PatienceConfig
.
This method may only be invoked by the thread that created the Waiter
.
Each time this method completes, its internal dismissal count is reset to zero, so it can be invoked multiple times. However,
once await
has completed abruptly with an exception produced during a call to apply
, it will continue
to complete abruptly with that exception.
The timeout
parameter allows you to specify a timeout after which a
TestFailedException
will be thrown with a detail message indicating the await
call
timed out. If no calls to apply
have produced an exception and an insufficient number of
dismissals has been received by the time the timeout
has expired, await
will
complete abruptly with TestFailedException
.
As used here, a "check" is checking to see whether an exception has been thrown by a by-name passed
to apply
or a dismissal has occurred. The "interval" is the amount
of time the thread that calls await
will sleep between "checks."
the PatienceConfig
object containing the timeout
parameter
Increases the dismissal count by one.
Increases the dismissal count by one.
Once the dismissal count has reached the value passed to await
(and no prior invocations of apply
produced an exception), await
will return normally.
Class that facilitates performing assertions outside the main test thread, such as assertions in callback methods that are invoked asynchronously.
To use
Waiter
, create an instance of it in the main test thread:At some point later, call
await
on the waiter:w.await() // Call await() from the main test thread
The
await
call will block until it either receives a report of a failed assertion from a different thread, at which point it will complete abruptly with the same exception, or until it is dismissed by a different thread (or threads), at which point it will return normally. You can optionally specify a timeout and/or a number of dismissals to wait for. Here's an example:The default value for
timeout
, provided via an implicitPatienceConfig
parameter, is 150 milliseconds. The default value fordismissals
is 1. Theawait
method will block until either it is dismissed a sufficient number of times by other threads or an assertion fails in another thread. Thus if you just want to perform assertions in just one other thread, only that thread will be performing a dismissal, so you can use the default value of 1 fordismissals
.Waiter
contains four overloaded forms ofawait
, two of which take an implicitPatienceConfig
parameter. To change the default timeout configuration, override or hide (if you imported the members ofAsyncAssertions
companion object instead of mixing in the trait)patienceConfig
with a new one that returns your desired configuration.To dismiss a waiter, you just invoke
dismiss
on it:w.dismiss() // Call this from one or more other threads
You may want to put
dismiss
invocations in a finally clause to ensure they happen even if an exception is thrown. Otherwise if a dismissal is missed because of a thrown exception, anawait
call will wait until it times out.Finally, to perform an assertion in a different thread, you just apply the
Waiter
to the assertion code. Here are some examples:Here's a complete example: