diff options
| author | Botahamec <botahamec@outlook.com> | 2025-02-05 20:31:00 -0500 |
|---|---|---|
| committer | Botahamec <botahamec@outlook.com> | 2025-02-05 20:31:00 -0500 |
| commit | f6b38f7425a3183214dae79445446b042154688f (patch) | |
| tree | 1219d7cc4420ff4ad58a017c0f5861b7a2936f3b /tests | |
| parent | 280a61ad7b74019c7aad8b7306a0dd7cfb11359c (diff) | |
Tests and optimization
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/evil_mutex.rs | 26 | ||||
| -rw-r--r-- | tests/evil_rwlock.rs | 26 |
2 files changed, 50 insertions, 2 deletions
diff --git a/tests/evil_mutex.rs b/tests/evil_mutex.rs index 88bcbf6..361fe4c 100644 --- a/tests/evil_mutex.rs +++ b/tests/evil_mutex.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use happylock::collection::BoxedLockCollection; +use happylock::collection::{BoxedLockCollection, RetryingLockCollection}; use happylock::mutex::Mutex; use happylock::ThreadKey; use lock_api::{GuardNoSend, RawMutex}; @@ -52,3 +52,27 @@ fn boxed_mutexes() { assert!(evil_mutex.try_lock(&mut key).is_err()); assert!(useless_mutex.try_lock(&mut key).is_ok()); } + +#[test] +fn retrying_mutexes() { + let mut key = ThreadKey::get().unwrap(); + let good_mutex: Arc<Mutex<i32, parking_lot::RawMutex>> = Arc::new(Mutex::new(5)); + let evil_mutex: Arc<Mutex<i32, EvilMutex>> = Arc::new(Mutex::new(7)); + let useless_mutex: Arc<Mutex<i32, parking_lot::RawMutex>> = Arc::new(Mutex::new(10)); + let c_good = Arc::clone(&good_mutex); + let c_evil = Arc::clone(&evil_mutex); + let c_useless = Arc::clone(&useless_mutex); + + let r = std::thread::spawn(move || { + let mut key = ThreadKey::get().unwrap(); + let collection = + RetryingLockCollection::try_new((&*c_good, &*c_evil, &*c_useless)).unwrap(); + collection.lock(&mut key); + }) + .join(); + + assert!(r.is_err()); + assert!(good_mutex.try_lock(&mut key).is_ok()); + assert!(evil_mutex.try_lock(&mut key).is_err()); + assert!(useless_mutex.try_lock(&mut key).is_ok()); +} diff --git a/tests/evil_rwlock.rs b/tests/evil_rwlock.rs index a1cf0b3..234847c 100644 --- a/tests/evil_rwlock.rs +++ b/tests/evil_rwlock.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use happylock::collection::BoxedLockCollection; +use happylock::collection::{BoxedLockCollection, RetryingLockCollection}; use happylock::rwlock::RwLock; use happylock::ThreadKey; use lock_api::{GuardNoSend, RawRwLock}; @@ -64,3 +64,27 @@ fn boxed_rwlocks() { assert!(evil_mutex.try_write(&mut key).is_err()); assert!(useless_mutex.try_write(&mut key).is_ok()); } + +#[test] +fn retrying_rwlocks() { + let mut key = ThreadKey::get().unwrap(); + let good_mutex: Arc<RwLock<i32, parking_lot::RawRwLock>> = Arc::new(RwLock::new(5)); + let evil_mutex: Arc<RwLock<i32, EvilRwLock>> = Arc::new(RwLock::new(7)); + let useless_mutex: Arc<RwLock<i32, parking_lot::RawRwLock>> = Arc::new(RwLock::new(10)); + let c_good = Arc::clone(&good_mutex); + let c_evil = Arc::clone(&evil_mutex); + let c_useless = Arc::clone(&useless_mutex); + + let r = std::thread::spawn(move || { + let mut key = ThreadKey::get().unwrap(); + let collection = + RetryingLockCollection::try_new((&*c_good, &*c_evil, &*c_useless)).unwrap(); + collection.lock(&mut key); + }) + .join(); + + assert!(r.is_err()); + assert!(good_mutex.try_write(&mut key).is_ok()); + assert!(evil_mutex.try_write(&mut key).is_err()); + assert!(useless_mutex.try_write(&mut key).is_ok()); +} |
