proc-heim 0.1.5

Library for running and managing short-lived and long-lived processes using asynchronous API
Documentation
use std::time::Duration;

use sysinfo::{Pid, System};
use test_utils::cmd_collection::{hanging_forever_cmd, std_io::echo_cmd};

use crate::common::create_process_manager;

mod common;

#[tokio::test]
async fn should_get_data_of_not_completed_process() {
    let (_dir, handle) = create_process_manager();
    let process_id = handle.spawn(hanging_forever_cmd()).await.unwrap();
    tokio::time::sleep(Duration::from_secs(1)).await;

    let process_data = handle.get_process_info(process_id).await.unwrap();

    assert!(process_data.is_running());
    assert!(process_data.exit_status().is_none());
    assert!(process_data.pid().is_some());
}

#[tokio::test]
async fn should_get_data_of_completed_process() {
    let (_dir, handle) = create_process_manager();
    let process_id = handle.spawn(echo_cmd("msg")).await.unwrap();

    tokio::time::sleep(Duration::from_secs(1)).await;

    let process_data = handle.get_process_info(process_id).await.unwrap();

    assert!(!process_data.is_running());
    assert!(process_data.exit_status().unwrap().success());
    assert!(process_data.pid().is_some());
}

#[tokio::test]
async fn should_release_pid_after_process_completion() {
    let (_dir, handle) = create_process_manager();
    let process_id = handle.spawn(echo_cmd("msg")).await.unwrap();

    tokio::time::sleep(Duration::from_secs(1)).await;

    let process_data = handle.get_process_info(process_id).await.unwrap();
    assert!(!process_data.is_running());
    let pid = process_data.pid().unwrap();
    let pid = Pid::from_u32(pid);
    let sys = System::new_all();
    assert!(sys.process(pid).is_none());
}