Expand description
§Unit testing framework for async Rust
This crate implements a async unit testing framework, which is based on the MutithreadedTC developed by William Pugh and Nathaniel Ayewah at the University of Maryland.
§Example
use async_metronome::{assert_tick, await_tick};
#[async_metronome::test]
async fn test_send_receive() {
let (mut sender, mut receiver) = mpsc::channel::<usize>(1);
let sender = async move {
assert_tick!(0);
sender.send(42).await.unwrap();
sender.send(17).await.unwrap();
assert_tick!(1);
};
let receiver = async move {
assert_tick!(0);
await_tick!(1);
receiver.next().await;
receiver.next().await;
};
let sender = async_metronome::spawn(sender);
let receiver = async_metronome::spawn(receiver);
sender.await;
receiver.await;
}
§Explanation
async-metronome has an internal clock. The clock only advances to the next tick when all tasks are in a pending state.
The clock starts at tick 0
. In this example, the macro await_tick!(1)
makes
the receiver block until the clock reaches tick 1
before resuming.
Thread 1 is allowed to run freely in tick 0
, until it blocks on
the call to sender.send(17)
. At this point, all threads are blocked, and
the clock can advance to the next tick.
In tick 1
, the statement receiver.next(42)
in the receiver is executed,
and this frees up sender. The final statement in sender asserts that the
clock is in tick 1
, in effect asserting that the task blocked on the
call to sender.send(17)
.
Macros§
- assert_
tick - Asserts current tick counter value.
- await_
tick - Awaits for the tick counter reach the specified value.
Structs§
- Join
Handle - A future that awaits the result of a task.
- Options
- Options.
- Options
Builder - Builder for
Options
.
Enums§
- Options
Builder Error - Error type for OptionsBuilder
Functions§
- is_
context - Checks if context is set.
- run
- Same as run_opt but with default options.
- run_opt
- Runs the test case and blocks until it complets or panics.
- spawn
- Spawns a task
Attribute Macros§
- test
- Marks async test function.