use easy_prefs::easy_prefs;
use std::sync::{Arc, Mutex};
use std::thread;
easy_prefs! {
struct ConcurrentPrefs {
pub counter: i32 = 0 => "counter",
pub name: String = String::new() => "name",
},
"concurrent-prefs"
}
#[test]
fn test_concurrent_access_with_mutex() {
let prefs = Arc::new(Mutex::new(ConcurrentPrefs::load_testing()));
let mut handles = vec![];
for i in 0..10 {
let prefs_clone = Arc::clone(&prefs);
let handle = thread::spawn(move || {
let mut prefs = prefs_clone.lock().unwrap();
let current = *prefs.get_counter();
prefs
.save_counter(current + 1)
.expect("Save should succeed");
prefs
.save_name(format!("thread-{}", i))
.expect("Save should succeed");
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let prefs = prefs.lock().unwrap();
assert_eq!(*prefs.get_counter(), 10);
assert!(prefs.get_name().starts_with("thread-"));
}
#[test]
fn test_edit_guard_thread_safety() {
let mut prefs = ConcurrentPrefs::load_testing();
let mut edit = prefs.edit();
edit.set_counter(42);
edit.set_name("test".to_string());
drop(edit);
assert_eq!(*prefs.get_counter(), 42);
assert_eq!(prefs.get_name(), "test");
}
#[test]
#[should_panic(expected = "load_default() has been removed in version 3.0.0")]
fn test_load_default_removed() {
let test_dir = format!("/tmp/easy_prefs_multi_{}", std::process::id());
#[allow(deprecated)]
let _prefs = ConcurrentPrefs::load_default(&test_dir);
}