i2pd-launch 0.5.0-beta.12

Launches i2pd with clean state
// src/sem_tests.rs

#![allow(unused_variables)]
#![allow(unused_imports)]
#![allow(dead_code)]

// Důležité: Importujeme všechny funkce a konstanty z nadřazeného modulu.

use super::{acquire, close, create, release};
use std::sync::Mutex;

// Globální mutex inicializovaný přímo při kompilaci
// od verze Rustu 1.63 použít přímou asociaci s const konstruktorem
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");
}