eta_obj_pool 1.1.0

Thread safe object pool
Documentation
use std::thread;
use std::thread::sleep;
use eta_obj_pool::traits::{Pool, PoolElementProxy};

#[test]
fn acquire_release() {
    let pool = match eta_obj_pool::pool::FixedPool::new(vec![1, 2, 3]) {
        Ok(pool) => pool,
        Err(e) => return assert!(false, "Failed to init pool {}", e),
    };
    let val = Pool::acquire(pool.clone()).unwrap();
    let inner = *val.get();
    assert_eq!(pool.len(), 2, "Invalid pool len");
    assert_eq!(inner, 1, "Failed to get element");
    drop(val);
    assert_eq!(pool.len(), 3, "Invalid pool len");
}
#[test]
fn pool_acquire_till_empty() {
    let pool = match eta_obj_pool::pool::FixedPool::new(vec![1, 2, 3]) {
        Ok(pool) => pool,
        Err(e) => return assert!(false, "Failed to init pool {}", e),
    };
    assert_eq!(pool.len(), 3, "Invalid pool len");
    for i in 0..3 {
        let val = Pool::acquire(pool.clone()).unwrap();
        let inner = *val.get();
        assert_eq!(inner, i + 1, "Failed to get element");
    }
    assert_eq!(pool.len(), 3, "Invalid pool len");
}
#[test]
fn pool_release_invalid() {
    let pool = match eta_obj_pool::pool::FixedPool::new(vec![1, 2, 3]) {
        Ok(pool) => pool,
        Err(e) => return assert!(false, "Failed to init pool {}", e),
    };
    let val = 5;
    match pool.push_element(val) {
        Ok(_) => assert!(false, "Failed to release element"),
        Err(e) => assert_eq!(e, "Failed to push element".to_string()),
    }
}

#[test]
fn pool_release_parallel() {
    let pool = match eta_obj_pool::pool::FixedPool::new(vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) {
        Ok(pool) => pool,
        Err(e) => return assert!(false, "Failed to init pool {}", e),
    };
    let thread1_pool = pool.clone();
    thread::spawn(move || {
        let val = Pool::acquire(thread1_pool).unwrap();
        let inner = *val.get();
        assert_eq!(inner, inner, "Failed to get element");
        sleep(std::time::Duration::from_millis(10000));
        drop(val);
    });
    let thread2_pool = pool.clone();
    let res = thread::spawn(move || {
        let val = Pool::acquire(thread2_pool).unwrap();
        let inner = *val.get();
        assert_eq!(inner, inner, "Failed to get element");
        sleep(std::time::Duration::from_millis(10000));
        drop(val);
    });
    drop(pool);
    res.join().unwrap();
}

#[test]
fn pool_forget() {
    let pool = match eta_obj_pool::pool::FixedPool::new(vec![1, 2, 3]) {
        Ok(pool) => pool,
        Err(e) => return assert!(false, "Failed to init pool {}", e),
    };
    let val = Pool::acquire(pool.clone()).unwrap();
    let inner = *val.get();
    assert_eq!(pool.len(), 2, "Invalid pool len");
    assert_eq!(inner, 1, "Failed to get element");
    val.forget();
    assert_eq!(pool.len(), 2, "Invalid pool len");
}