Concept trait for futures, instances of which are passed to the whenReady
methods of trait Futures
.
Configuration object for asynchronous constructs, such as those provided by traits Eventually
and
AsyncAssertions
.
Returns an Interval
configuration parameter containing the passed value, which
specifies the amount of time to sleep after a retry.
Returns an Interval
configuration parameter containing the passed value, which
specifies the amount of time to sleep after a retry.
Implicit PatienceConfig
value providing default configuration values.
Implicit PatienceConfig
value providing default configuration values.
To change the default configuration, override or hide this def
with another implicit
PatienceConfig
containing your desired default configuration values.
Scales the passed Span
by the Double
factor returned
by spanScaleFactor
.
Scales the passed Span
by the Double
factor returned
by spanScaleFactor
.
The Span
is scaled by invoking its scaledBy
method,
thus this method has the same behavior:
The value returned by spanScaleFactor
can be any positive number or zero,
including a fractional number. A number greater than one will scale the Span
up to a larger value. A fractional number will scale it down to a smaller value. A
factor of 1.0 will cause the exact same Span
to be returned. A
factor of zero will cause Span.ZeroLength
to be returned.
If overflow occurs, Span.Max
will be returned. If underflow occurs,
Span.ZeroLength
will be returned.
if the value returned from spanScaleFactor
is less than zero
The factor by which the scaled
method will scale Span
s.
The factor by which the scaled
method will scale Span
s.
The default implementation of this method will return the span scale factor that
was specified for the run, or 1.0 if no factor was specified. For example, you can specify a span scale factor when invoking ScalaTest
via the command line by passing a -F
argument to Runner
.
Returns a Timeout
configuration parameter containing the passed value, which
specifies the maximum amount to wait for an asynchronous operation to complete.
Returns a Timeout
configuration parameter containing the passed value, which
specifies the maximum amount to wait for an asynchronous operation to complete.
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
The maximum amount of time in milliseconds to tolerate unsuccessful attempts before giving up is configured by the timeout
field of
the PatienceConfig
passed implicitly as the last parameter.
The interval to sleep between attempts is configured by the interval
field of
the PatienceConfig
passed implicitly as the last parameter.
If the eitherValue
method of the underlying Scala future returns a scala.Some
containing a
scala.util.Failure
containing a java.util.concurrent.ExecutionException
, and this
exception contains a non-null
cause, that cause will be included in the TestFailedException
as its cause. The
ExecutionException
will be be included as the TestFailedException
's cause only if the
ExecutionException
's cause is null
.
the future to query
the function to which pass the future's value when it is ready
an PatienceConfig
object containing timeout
and
interval
parameters that are unused by this method
the result of invoking the fun
parameter
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
The maximum amount of time in milliseconds to tolerate unsuccessful attempts before giving up is configured by the timeout
field of
the PatienceConfig
passed implicitly as the last parameter.
The interval to sleep between attempts is configured by the value contained in the passed
interval
parameter.
the future to query
the Interval
configuration parameter
the function to which pass the future's value when it is ready
an PatienceConfig
object containing timeout
and
interval
parameters that are unused by this method
the result of invoking the fun
parameter
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
The maximum amount of time in milliseconds to tolerate unsuccessful queries before giving up and throwing
TestFailedException
is configured by the value contained in the passed
timeout
parameter.
The interval to sleep between attempts is configured by the interval
field of
the PatienceConfig
passed implicitly as the last parameter.
If the eitherValue
method of the underlying Scala future returns a scala.Some
containing a
scala.util.Failure
containing a java.util.concurrent.ExecutionException
, and this
exception contains a non-null
cause, that cause will be included in the TestFailedException
as its cause. The
ExecutionException
will be be included as the TestFailedException
's cause only if the
ExecutionException
's cause is null
.
the future to query
the Timeout
configuration parameter
the function to which pass the future's value when it is ready
an PatienceConfig
object containing timeout
and
interval
parameters that are unused by this method
the result of invoking the fun
parameter
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
Queries the passed future repeatedly until it either is ready, or a configured maximum amount of time has passed, sleeping a configured interval between attempts; and when ready, passes the future's value to the passed function.
The maximum amount of time to tolerate unsuccessful queries before giving up and throwing
TestFailedException
is configured by the value contained in the passed
timeout
parameter.
The interval to sleep between attempts is configured by the value contained in the passed
interval
parameter.
If the eitherValue
method of the underlying Scala future returns a scala.Some
containing a
scala.util.Failure
containing a java.util.concurrent.ExecutionException
, and this
exception contains a non-null
cause, that cause will be included in the TestFailedException
as its cause. The
ExecutionException
will be be included as the TestFailedException
's cause only if the
ExecutionException
's cause is null
.
the future to query
the Timeout
configuration parameter
the Interval
configuration parameter
the function to which pass the future's value when it is ready
an PatienceConfig
object containing timeout
and
interval
parameters that are unused by this method
the result of invoking the fun
parameter
Trait that facilitates testing with futures.
This trait defines a
FutureConcept
trait that can be used to implicitly wrap different kinds of futures, thereby providing a uniform testing API for futures. The three ways this trait enables you to test futures are:1. Invoking
isReadyWithin
, to assert that a future is ready within a a specified time period. Here's an example:assert(result.isReadyWithin(100 millis))
2. Invoking
futureValue
, to obtain a futures result within a specified or implicit time period, like this:assert(result.futureValue === 7)
3. Passing the future to
whenReady
, and performing assertions on the result value passed to the given function, as in:whenReady(result) { s => s should be ("hello") }
The
whenReady
construct periodically inspects the passed future, until it is either ready or the configured timeout has been surpassed. If the future becomes ready before the timeout,whenReady
passes the future's value to the specified function.To make
whenReady
more broadly applicable, the type of future it accepts is aFutureConcept[T]
, whereT
is the type of value promised by the future. Passing a future towhenReady
requires an implicit conversion from the type of future you wish to pass (the modeled type) toFutureConcept[T]
. SubtraitJavaFutures
provides an implicit conversion fromjava.util.concurrent.Future[T]
toFutureConcept[T]
.For example, the following invocation of
whenReady
would succeed (not throw an exception):However, because the default timeout is 150 milliseconds, the following invocation of
whenReady
would ultimately produce aTestFailedException
:Assuming the default configuration parameters, a
timeout
of 150 milliseconds and aninterval
of 15 milliseconds, were passed implicitly towhenReady
, the detail message of the thrownTestFailedException
would look like:The future passed to whenReady was never ready, so whenReady timed out. Queried 95 times, sleeping 10 milliseconds between each query.
Configuration of
whenReady
The
whenReady
methods of this trait can be flexibly configured. The two configuration parameters forwhenReady
along with their default values and meanings are described in the following table:TestFailedException
The default values of both timeout and interval are passed to the
scaled
method, inherited fromScaledTimeSpans
, so that the defaults can be scaled up or down together with other scaled time spans. See the documentation for traitScaledTimeSpans
for more information.The
whenReady
methods of traitFutures
each take aPatienceConfig
object as an implicit parameter. This object provides values for the two configuration parameters. TraitFutures
provides an implicitval
nameddefaultPatience
with each configuration parameter set to its default value. If you want to set one or more configuration parameters to a different value for all invocations ofwhenReady
in a suite you can override this val (or hide it, for example, if you are importing the members of theFutures
companion object rather than mixing in the trait). For example, if you always want the defaulttimeout
to be 2 seconds and the defaultinterval
to be 5 milliseconds, you can overridedefaultPatience
, like this:Or, hide it by declaring a variable of the same name in whatever scope you want the changed values to be in effect:
In addition to taking a
PatienceConfig
object as an implicit parameter, thewhenReady
methods of traitFutures
include overloaded forms that take one or twoPatienceConfigParam
objects that you can use to override the values provided by the implicitPatienceConfig
for a singlewhenReady
invocation. For example, if you want to settimeout
to 6 seconds for just one particularwhenReady
invocation, you can do so like this:This invocation of
eventually
will use 6000 fortimeout
and whatever value is specified by the implicitly passedPatienceConfig
object for theinterval
configuration parameter. If you want to set both configuration parameters in this way, just list them separated by commas:You can also import or mix in the members of
SpanSugar
if you want a more concise DSL for expressing time spans:Note: The
whenReady
construct was in part inspired by thewhenDelivered
matcher of the BlueEyes project, a lightweight, asynchronous web framework for Scala.