#![allow(unused_variables)]
#![allow(unused_imports)]
#![allow(dead_code)]
use super::{acquire, close, create, release};
use std::sync::Mutex;
static LOCK: Mutex<i32> = Mutex::new(0);
#[test]
fn make_semaphore() {
let guard = LOCK.lock();
let s = create(1, 1);
let result = s.is_ok();
let s = s.and_then(|h| close(h));
let close_result = s.is_ok();
assert!(result, "Can not create sem");
assert!(close_result, "Can not close sem");
}
#[test]
fn acq_semaphore() {
let guard = LOCK.lock();
let s = create(1, 1);
let result = s.is_ok();
let s = s.and_then(|h| acquire(h, 500));
let acq_result = s.is_ok();
let s = s.and_then(|h| close(h));
let close_result = s.is_ok();
assert!(result, "Can not create sem");
assert!(acq_result, "Can not acq sem");
assert!(close_result, "Can not close sem");
}
#[test]
fn acqrel_semaphore() {
let guard = LOCK.lock();
let s = create(1, 1);
let result = s.is_ok();
let s = s.and_then(|h| acquire(h, 500));
let acq_result = s.is_ok();
let s = s.and_then(|h| release(h));
let rel_result = s.is_ok();
let s = s.and_then(|h| close(h));
let close_result = s.is_ok();
assert!(result, "Can not create sem");
assert!(acq_result, "Can not acq sem");
assert!(rel_result, "Can not rel sem");
assert!(close_result, "Can not close sem");
}
#[test]
fn double_acq_semaphore() {
let guard = LOCK.lock();
let mut handle = super::NULL_HANDLE;
let s = create(1, 1).map(|h| {
handle = h;
h
});
let result = s.is_ok();
let s2 = s.and_then(|h| acquire(h, 100));
let acq1_result = s2.is_ok();
let s3 = s2.and_then(|h| acquire(h, 500));
let acq2_result = s3.is_ok();
let s4 = close(handle);
let close_result = s4.is_ok();
assert!(result, "Can not create sem");
assert!(acq1_result, "Can not acq sem for 1st time");
assert!(acq2_result == false, "Should fail on 2nd acq of sem");
assert!(close_result, "Can not close sem");
}