org.scalatest.concurrent

AsyncAssertions

trait AsyncAssertions extends TimeoutConfiguration

Trait that facilitates performing assertions outside the main test thread, such as assertions in callback methods that are invoked asynchronously.

Trait AsyncAssertions provides a Waiter class that you can use to orchestrate the inter-thread communication required to perform assertions outside the main test thread, and means to configure it.

To use Waiter, create an instance of it in the main test thread:

val w = new Waiter // Do this 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, interval (the time await sleeps between checks), and/or a number of dismissals to wait for. Here's an example:

import org.scalatest.time.SpanSugar._

w.await(timeout(10 millis), dismissals(2))

The default value for timeout, provided via an implicit TimeoutConfig parameter, is 1 second. The default value for dismissals is 1. The await 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 for dismissals.

Waiter contains several overloaded forms of await, most of which take an implicit TimeoutConfig parameter. To change the default timeout configuration, override or hide (if you imported the members of AsyncAssertions companion object instead of mixing in the trait) timeoutConfig 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, an await 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:

w { assert(1 + 1 === 3) }    // Can use assertions
w { 1 + 1 should equal (3) } // Or matchers
w { "hi".charAt(-1) }        // Any exceptions will be forwarded to await

Here's a complete example:

import org.scalatest._
import concurrent.AsyncAssertions
import matchers.ShouldMatchers
import scala.actors.Actor

class ExampleSuite extends FunSuite with ShouldMatchers with AsyncAssertions {

case class Message(text: String)

class Publisher extends Actor {

@volatile private var handle: Message => Unit = { (msg) => }

def registerHandler(f: Message => Unit) { handle = f }

def act() { var done = false while (!done) { react { case msg: Message => handle(msg) case "Exit" => done = true } } } }

test("example one") {

val publisher = new Publisher val message = new Message("hi") val w = new Waiter

publisher.start()

publisher.registerHandler { msg => w { msg should equal (message) } w.dismiss() }

publisher ! message w.await() publisher ! "Exit" } }

Linear Supertypes
Known Subclasses
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. Hide All
  2. Show all
  1. AsyncAssertions
  2. TimeoutConfiguration
  3. AnyRef
  4. Any
Visibility
  1. Public
  2. All

Type Members

  1. case class Dismissals (value: Int) extends Product with Serializable

    A configuration parameter that specifies the number of dismissals to wait for before returning normally from an await call on a Waiter.

  2. case class Interval (value: Span) extends TimeoutConfigParam with Product with Serializable

    A TimeoutConfigParam that specifies the amount of time to sleep after each retry: each unsuccessful invocation of the by-name parameter passed to eventually or each query of a future passed to whenReady.

  3. case class Timeout (value: Span) extends TimeoutConfigParam with Product with Serializable

    A TimeoutConfigParam that specifies the maximum amount of time to allow retries: either invocations of the by-name parameter passed to eventually that give an unsuccessful result, or futures passed to whenReady that are canceled, or expired, or not ready.

  4. case class TimeoutConfig (timeout: Span, interval: Span) extends Product with Serializable

    Configuration object for traits Eventually and Futures.

  5. class TimeoutConfigParam extends AnyRef

    Abstract class defining a family of configuration parameters for traits Eventually and Futures.

  6. class Waiter extends AnyRef

    Class that facilitates performing assertions outside the main test thread, such as assertions in callback methods that are invoked asynchronously.

Value Members

  1. def != (arg0: AnyRef): Boolean

    Attributes
    final
    Definition Classes
    AnyRef
  2. def != (arg0: Any): Boolean

    Attributes
    final
    Definition Classes
    Any
  3. def ## (): Int

    Attributes
    final
    Definition Classes
    AnyRef → Any
  4. def == (arg0: AnyRef): Boolean

    Attributes
    final
    Definition Classes
    AnyRef
  5. def == (arg0: Any): Boolean

    Attributes
    final
    Definition Classes
    Any
  6. def asInstanceOf [T0] : T0

    Attributes
    final
    Definition Classes
    Any
  7. def clone (): AnyRef

    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws()
  8. def dismissals (value: Int): Dismissals

    Returns a Dismissals configuration parameter containing the passed value, which specifies the number of dismissals to wait for before returning normally from an await call on a Waiter.

  9. def eq (arg0: AnyRef): Boolean

    Attributes
    final
    Definition Classes
    AnyRef
  10. def equals (arg0: Any): Boolean

    Definition Classes
    AnyRef → Any
  11. def finalize (): Unit

    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws()
  12. def getClass (): java.lang.Class[_]

    Attributes
    final
    Definition Classes
    AnyRef
  13. def hashCode (): Int

    Definition Classes
    AnyRef → Any
  14. def interval (value: Span): Interval

    Returns an Interval configuration parameter containing the passed value, which specifies the amount of time to sleep after each retry: each unsuccessful invocation of the by-name parameter passed to eventually or each query of a non-ready, canceled, or expired future passed to whenReady.

    Returns an Interval configuration parameter containing the passed value, which specifies the amount of time to sleep after each retry: each unsuccessful invocation of the by-name parameter passed to eventually or each query of a non-ready, canceled, or expired future passed to whenReady.

    Definition Classes
    TimeoutConfiguration
  15. def isInstanceOf [T0] : Boolean

    Attributes
    final
    Definition Classes
    Any
  16. def ne (arg0: AnyRef): Boolean

    Attributes
    final
    Definition Classes
    AnyRef
  17. def notify (): Unit

    Attributes
    final
    Definition Classes
    AnyRef
  18. def notifyAll (): Unit

    Attributes
    final
    Definition Classes
    AnyRef
  19. def synchronized [T0] (arg0: ⇒ T0): T0

    Attributes
    final
    Definition Classes
    AnyRef
  20. def timeout (value: Span): Timeout

    Returns a Timeout configuration parameter containing the passed value, which specifies the maximum amount of time to retry: to allow invocations of the by-name parameter passed to eventually to give an unsuccessful result, or to allow a future passed to whenReady to be canceled, or expired, or not ready.

    Returns a Timeout configuration parameter containing the passed value, which specifies the maximum amount of time to retry: to allow invocations of the by-name parameter passed to eventually to give an unsuccessful result, or to allow a future passed to whenReady to be canceled, or expired, or not ready.

    Definition Classes
    TimeoutConfiguration
  21. implicit val timeoutConfig : TimeoutConfig

    Implicit TimeoutConfig value providing default configuration values.

    Implicit TimeoutConfig value providing default configuration values.

    To change the default configuration, override or hide this val with another implicit TimeoutConfig containing your desired default configuration values.

    Attributes
    implicit
    Definition Classes
    TimeoutConfiguration
  22. def toString (): String

    Definition Classes
    AnyRef → Any
  23. def wait (): Unit

    Attributes
    final
    Definition Classes
    AnyRef
    Annotations
    @throws()
  24. def wait (arg0: Long, arg1: Int): Unit

    Attributes
    final
    Definition Classes
    AnyRef
    Annotations
    @throws()
  25. def wait (arg0: Long): Unit

    Attributes
    final
    Definition Classes
    AnyRef
    Annotations
    @throws()

Inherited from TimeoutConfiguration

Inherited from AnyRef

Inherited from Any