extern crate shine_store;
extern crate shine_testutils;
#[macro_use]
extern crate log;
extern crate env_logger;
use std::env;
use std::sync::*;
use std::thread;
use std::time::*;
use shine_store::threadid;
use shine_testutils::*;
#[test]
fn thread_count() {
init_test_logger(module_path!());
assert!(
threadid::get_max_thread_count() >= threadid::get_preferred_thread_count(),
"Maximum thread count cannt be less than the preferred count"
);
}
#[test]
fn alloc_free() {
init_test_logger(module_path!());
assert!(
env::var("RUST_TEST_THREADS").unwrap_or("0".to_string()) == "1",
"This test shall run in single threaded test environment: RUST_TEST_THREADS=1"
);
let max_thread_count = threadid::get_max_thread_count();
info!("number of threads: {}", max_thread_count);
for len in 1..max_thread_count {
info!("testing thread count: {}", len);
assert!(threadid::get() == 0);
let mut array = Arc::new(Mutex::new(Vec::new()));
let mut threads = Vec::new();
for _ in 0..len {
let array = array.clone();
threads.push(thread::spawn(move || {
thread::sleep(Duration::from_millis(100));
{
let mut array = array.lock().unwrap();
array.push(threadid::get());
}
thread::sleep(Duration::from_millis(100));
}));
}
for th in threads.drain(..) {
th.join().unwrap();
}
{
let mut raw_array = array.lock().unwrap();
let mut array = raw_array.clone();
array.sort();
array.dedup();
assert!(array.len() == len, "There is a thread id duplication: {:?}", *raw_array);
assert!(
array[len - 1] <= max_thread_count,
"Thread id exceeds the maximum thread id: {:?}, len: {}",
*raw_array,
max_thread_count
);
}
}
}