use semka::Sem; use std::time; #[test] fn should_init_after_close() { let sem = Sem::new(0).unwrap(); assert!(sem.is_init()); assert!(!sem.init(0)); unsafe { sem.close(); sem.close(); } assert!(sem.init(0)); assert!(!sem.init(0)); assert!(!sem.try_wait()); sem.signal(); sem.signal(); assert!(sem.try_wait()); assert!(sem.try_wait()); assert!(!sem.try_wait()); unsafe { sem.close(); sem.close(); } } #[test] fn should_fail_init_twice() { let sem = unsafe { Sem::new_uninit() }; assert!(!sem.is_init()); assert!(sem.init(0)); assert!(!sem.init(0)); assert!(sem.is_init()); assert!(!sem.try_wait()); sem.signal(); sem.signal(); assert!(sem.try_wait()); assert!(sem.try_wait()); assert!(!sem.try_wait()); } #[test] fn should_return_when_signaled_counting() { let sem = Sem::new(0).unwrap(); assert!(!sem.try_wait()); sem.signal(); sem.signal(); assert!(sem.try_wait()); assert!(sem.try_wait()); assert!(!sem.try_wait()); } #[test] fn should_timeout_on_wait() { let sem = Sem::new(0).unwrap(); assert!(!sem.try_wait()); let before = time::Instant::now(); assert!(!sem.wait_timeout(time::Duration::from_millis(2500))); let after = time::Instant::now(); let duration = after.duration_since(before); println!("duration={:?}", duration); assert!(duration.as_millis() > 2000 && duration.as_millis() < 3000); }