Trait/Object

org.scalatest.concurrent

AsyncAssertions

Related Docs: object AsyncAssertions | package concurrent

Permalink

trait AsyncAssertions extends PatienceConfiguration

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 a 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 and/or a number of dismissals to wait for. Here's an example:

import org.scalatest.time.SpanSugar._

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

The default value for timeout, provided via an implicit PatienceConfig parameter, is 150 milliseconds. 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 four overloaded forms of await, two of which take an implicit PatienceConfig 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) 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, an await call will wait until it times out.

Note that if a Waiter receives more than the expected number of dismissals, it will not report this as an error: i.e., receiving greater than the number of expected dismissals without any failed assertion will simply cause the the test to complete, not to fail. The only way a Waiter will cause a test to fail is if one of the asynchronous assertions to which it is applied fails.

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 scala.actors.Actor

class ExampleSuite extends FunSuite with Matchers 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"
  }
}

Source
AsyncAssertions.scala
Linear Supertypes
Known Subclasses
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. AsyncAssertions
  2. PatienceConfiguration
  3. AbstractPatienceConfiguration
  4. ScaledTimeSpans
  5. AnyRef
  6. Any
  1. Hide All
  2. Show all
Visibility
  1. Public
  2. All

Type Members

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

    Permalink

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

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

    value

    the number of dismissals for which to wait

    Exceptions thrown

    IllegalArgumentException if specified value is less than or equal to zero.

  2. final case class PatienceConfig(timeout: Span = scaled(Span(150, Millis)), interval: Span = scaled(Span(15, Millis))) extends Product with Serializable

    Permalink

    Configuration object for asynchronous constructs, such as those provided by traits Eventually and AsyncAssertions.

    Configuration object for asynchronous constructs, such as those provided by traits Eventually and AsyncAssertions.

    The default values for the parameters are:

    Configuration ParameterDefault Value
    timeout scaled(150 milliseconds)
    interval scaled(15 milliseconds)

    timeout

    the maximum amount of time to wait for an asynchronous operation to complete before giving up and throwing TestFailedException.

    interval

    the amount of time to sleep between each check of the status of an asynchronous operation when polling

    Definition Classes
    AbstractPatienceConfiguration
  3. class Waiter extends AnyRef

    Permalink

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

    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:

    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 and/or a number of dismissals to wait for. Here's an example:

    import org.scalatest.time.SpanSugar._
    
    w.await(timeout(300 millis), dismissals(2))
    

    The default value for timeout, provided via an implicit PatienceConfig parameter, is 150 milliseconds. 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 four overloaded forms of await, two of which take an implicit PatienceConfig 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) 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, 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 scala.actors.Actor
    
    class ExampleSuite extends FunSuite with Matchers 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"
      }
    }
    

Value Members

  1. final def !=(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0

    Permalink
    Definition Classes
    Any
  5. def clone(): AnyRef

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

    Permalink

    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.

    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.

  7. final def eq(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  8. def equals(arg0: Any): Boolean

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

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  10. final def getClass(): Class[_]

    Permalink
    Definition Classes
    AnyRef → Any
  11. def hashCode(): Int

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

    Permalink

    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.

    Definition Classes
    PatienceConfiguration
  13. final def isInstanceOf[T0]: Boolean

    Permalink
    Definition Classes
    Any
  14. final def ne(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  15. final def notify(): Unit

    Permalink
    Definition Classes
    AnyRef
  16. final def notifyAll(): Unit

    Permalink
    Definition Classes
    AnyRef
  17. implicit def patienceConfig: PatienceConfig

    Permalink

    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.

    Definition Classes
    PatienceConfigurationAbstractPatienceConfiguration
  18. final def scaled(span: Span): Span

    Permalink

    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.

    Definition Classes
    ScaledTimeSpans
    Exceptions thrown

    IllegalArgumentException if the value returned from spanScaleFactor is less than zero

  19. def spanScaleFactor: Double

    Permalink

    The factor by which the scaled method will scale Spans.

    The factor by which the scaled method will scale Spans.

    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.

    Definition Classes
    ScaledTimeSpans
  20. final def synchronized[T0](arg0: ⇒ T0): T0

    Permalink
    Definition Classes
    AnyRef
  21. def timeout(value: Span): Timeout

    Permalink

    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.

    Definition Classes
    PatienceConfiguration
  22. def toString(): String

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

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

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

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from PatienceConfiguration

Inherited from ScaledTimeSpans

Inherited from AnyRef

Inherited from Any

Ungrouped