diff --git a/nexosim/src/model/context.rs b/nexosim/src/model/context.rs index 2d593e6..0555d99 100644 --- a/nexosim/src/model/context.rs +++ b/nexosim/src/model/context.rs @@ -8,6 +8,9 @@ use crate::time::{Deadline, MonotonicTime}; use super::{Model, ProtoModel}; +#[cfg(all(test, not(nexosim_loom)))] +use crate::channel::Receiver; + /// A local context for models. /// /// A `Context` is a handle to the global context associated to a model @@ -521,3 +524,16 @@ impl<'a, P: ProtoModel> BuildContext<'a, P> { ); } } + +#[cfg(all(test, not(nexosim_loom)))] +impl Context { + /// Creates a dummy context for testing purposes. + pub(crate) fn new_dummy() -> Self { + let dummy_address = Receiver::new(1).sender(); + Context::new( + String::new(), + GlobalScheduler::new_dummy(), + Address(dummy_address), + ) + } +} diff --git a/nexosim/src/ports/output/broadcaster.rs b/nexosim/src/ports/output/broadcaster.rs index 77db015..4da1d4a 100644 --- a/nexosim/src/ports/output/broadcaster.rs +++ b/nexosim/src/ports/output/broadcaster.rs @@ -503,17 +503,13 @@ fn recycle_vec(mut v: Vec) -> Vec { #[cfg(all(test, not(nexosim_loom)))] mod tests { - use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; - use std::sync::{Arc, Mutex}; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; use std::thread; use futures_executor::block_on; use crate::channel::Receiver; - use crate::simulation::{Address, GlobalScheduler}; - use crate::time::{MonotonicTime, TearableAtomicTime}; - use crate::util::priority_queue::PriorityQueue; - use crate::util::sync_cell::SyncCell; use super::super::sender::{ FilterMapInputSender, FilterMapReplierSender, InputSender, ReplierSender, @@ -574,16 +570,7 @@ mod tests { let mut sum_model = SumModel::new(sum.clone()); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(mailbox.recv(&mut sum_model, &mut dummy_cx)).unwrap(); } }) @@ -645,16 +632,7 @@ mod tests { let mut sum_model = SumModel::new(sum.clone()); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(async { mailbox.recv(&mut sum_model, &mut dummy_cx).await.unwrap(); mailbox.recv(&mut sum_model, &mut dummy_cx).await.unwrap(); @@ -706,16 +684,7 @@ mod tests { let mut double_model = DoubleModel::new(); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(mailbox.recv(&mut double_model, &mut dummy_cx)).unwrap(); thread::sleep(std::time::Duration::from_millis(100)); } @@ -792,16 +761,7 @@ mod tests { let mut double_model = DoubleModel::new(); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(async { mailbox diff --git a/nexosim/src/ports/source/broadcaster.rs b/nexosim/src/ports/source/broadcaster.rs index f221e63..69c91ed 100644 --- a/nexosim/src/ports/source/broadcaster.rs +++ b/nexosim/src/ports/source/broadcaster.rs @@ -398,17 +398,13 @@ impl Iterator for ReplyIterator { #[cfg(all(test, not(nexosim_loom)))] mod tests { - use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; - use std::sync::{Arc, Mutex}; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; use std::thread; use futures_executor::block_on; use crate::channel::Receiver; - use crate::simulation::{Address, GlobalScheduler}; - use crate::time::{MonotonicTime, TearableAtomicTime}; - use crate::util::priority_queue::PriorityQueue; - use crate::util::sync_cell::SyncCell; use super::super::sender::{ FilterMapInputSender, FilterMapReplierSender, InputSender, ReplierSender, @@ -469,16 +465,7 @@ mod tests { let mut sum_model = SumModel::new(sum.clone()); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(mailbox.recv(&mut sum_model, &mut dummy_cx)).unwrap(); } }) @@ -540,16 +527,7 @@ mod tests { let mut sum_model = SumModel::new(sum.clone()); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(async { mailbox.recv(&mut sum_model, &mut dummy_cx).await.unwrap(); mailbox.recv(&mut sum_model, &mut dummy_cx).await.unwrap(); @@ -601,16 +579,7 @@ mod tests { let mut double_model = DoubleModel::new(); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(mailbox.recv(&mut double_model, &mut dummy_cx)).unwrap(); thread::sleep(std::time::Duration::from_millis(100)); } @@ -687,16 +656,7 @@ mod tests { let mut double_model = DoubleModel::new(); move || { - let dummy_address = Receiver::new(1).sender(); - let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); - let dummy_time = - SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); - let dummy_halter = Arc::new(AtomicBool::new(false)); - let mut dummy_cx = Context::new( - String::new(), - GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter), - Address(dummy_address), - ); + let mut dummy_cx = Context::new_dummy(); block_on(async { mailbox diff --git a/nexosim/src/simulation/scheduler.rs b/nexosim/src/simulation/scheduler.rs index eaa90a4..e8c2073 100644 --- a/nexosim/src/simulation/scheduler.rs +++ b/nexosim/src/simulation/scheduler.rs @@ -20,6 +20,9 @@ use crate::simulation::Address; use crate::time::{AtomicTimeReader, Deadline, MonotonicTime}; use crate::util::priority_queue::PriorityQueue; +#[cfg(all(test, not(nexosim_loom)))] +use crate::{time::TearableAtomicTime, util::sync_cell::SyncCell}; + const GLOBAL_SCHEDULER_ORIGIN_ID: usize = 0; /// A global scheduler. @@ -834,3 +837,14 @@ pub(crate) async fn send_keyed_event( ) .await; } + +#[cfg(all(test, not(nexosim_loom)))] +impl GlobalScheduler { + /// Creates a dummy scheduler for testing purposes. + pub(crate) fn new_dummy() -> Self { + let dummy_priority_queue = Arc::new(Mutex::new(PriorityQueue::new())); + let dummy_time = SyncCell::new(TearableAtomicTime::new(MonotonicTime::EPOCH)).reader(); + let dummy_halter = Arc::new(AtomicBool::new(false)); + GlobalScheduler::new(dummy_priority_queue, dummy_time, dummy_halter) + } +}