use std::ops::Add;
use std::sync::Arc;
use std::thread;
use std::time::{Duration, Instant};
use rayon;
use rayon::prelude::*;
use memory_cache_rust::cache::{Cache};
const ITER: u64 = 32 * 1024;
#[test]
fn test_cache_key_to_hash() {
let _key_to_hash_count = 0;
let cache = Cache::new();
let guard = cache.guard();
cache.set(1, 2, 1, &guard);
cache.set(2, 2, 1, &guard);
println!("{:?}", cache.get(&1, &guard));
println!("{:?}", cache.get(&2, &guard));
}
#[test]
fn test_cache_key_to_hash_thread() {
let _key_to_hash_count = 0;
let cache = Arc::new(Cache::new());
let handles: Vec<_> = (0..3).map(|_| {
let map1 = cache.clone();
thread::spawn(move || {
let guard = map1.guard();
for i in 0..ITER {
map1.set(i, i + 7, 1, &guard);
}
})
}).collect();
for h in handles {
h.join().unwrap();
}
let c4 = Arc::clone(&cache);
let guard = c4.guard();
for i in 0..ITER {
if let Some(v) = c4.get(&i, &guard) {
assert_eq!(v,(&(i +7)));
}else {
}
}
}
#[test]
fn test_cache_with_ttl2() {
let _key_to_hash_count = 0;
let cache = Cache::new();
(0..ITER).into_par_iter().for_each(|i| {
let guard = cache.guard();
cache.set(i, i + 7, 1, &guard);
});
}
#[test]
fn test_cache_with_ttl() {
let _key_to_hash_count = 0;
let cache = Cache::new();
let timer = timer::Timer::new();
let guard = cache.guard();
let key = 1;
let value = 1;
let _cost = 1;
let _ttl = Duration::from_millis(0);
loop {
if !cache.set_with_ttl(1, 1, 1, Duration::from_millis(0), &guard) {
thread::sleep(Duration::from_millis(10));
continue;
}
thread::sleep(Duration::from_millis(50));
match cache.get(&key, &guard) {
None => {
assert!(false)
}
Some(v) => {
assert_eq!(v, &value)
}
}
break;
}
let cache = Arc::new(Cache::new());
let c1 = Arc::clone(&cache);
let _t1 = thread::spawn(move || {
let guard = c1.guard();
for i in 0..ITER {
c1.set_with_ttl(i, i, 1, Duration::from_millis(1000), &guard);
}
});
let g = {
let c2 = Arc::clone(&cache);
timer.schedule_repeating(chrono::Duration::milliseconds(2000), move || {
let guard = c2.guard();
c2.clean_up(&guard)
})
};
thread::sleep(std::time::Duration::from_secs(5));
drop(g);
for i in 0..ITER {
assert_eq!(cache.get(&i, &guard), None)
}
}
#[test]
fn test_cache_with_ttl_without_timmer() {
let cache = Arc::new(Cache::new());
let c1 = Arc::clone(&cache);
let t1 = thread::spawn(move || {
let guard = c1.guard();
for i in 0..ITER {
let now = Instant::now().add(Duration::from_secs(200));
c1.set_with_ttl(i, i+7, 0, now.elapsed(), &guard);
}
});
t1.join().unwrap();
thread::sleep(Duration::from_millis(2000));
let guard = cache.guard();
for i in 0..ITER {
assert_eq!(cache.get(&i, &guard), Some(&(i+7)));
}
}