Skip to content

Commit

Permalink
Fix test issue when checking environment on mac: if you run a "system…
Browse files Browse the repository at this point in the history
…" binary, you cannot access its environment, so better run a non-system one
  • Loading branch information
GuillaumeGomez committed Nov 4, 2023
1 parent fcdc427 commit f8ce20f
Showing 1 changed file with 44 additions and 23 deletions.
67 changes: 44 additions & 23 deletions tests/process.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Take a look at the license at the top of the repository in the LICENSE file.

use std::path::Path;
use sysinfo::{Pid, System};

#[test]
Expand Down Expand Up @@ -95,24 +96,51 @@ fn test_cmd() {
}
}

fn build_example() {
std::process::Command::new("cargo")
.arg("build")
.arg("--example")
.arg("simple")
.stdout(std::process::Stdio::null())
.spawn()
.unwrap()
.wait()
.unwrap();
}

fn find_executable<P: AsRef<Path>>(path: P) -> Option<String> {
let entries = std::fs::read_dir(path).unwrap();
for entry in entries {
let entry = entry.unwrap();
if entry.file_type().unwrap().is_dir() {
if let Some(path) = find_executable(&entry.path()) {
return Some(path);
}
}
if entry.file_name().into_string().unwrap().as_str() == "simple" {
return Some(entry.path().display().to_string());
}
}
None
}

#[test]
fn test_environ() {
if !sysinfo::IS_SUPPORTED || cfg!(feature = "apple-sandbox") {
return;
}
let mut p = if cfg!(target_os = "windows") {
std::process::Command::new("waitfor")
.arg("/t")
// For some reason, it doesn't work on freebsd so let's just use "sleep"...
let mut p = if cfg!(target_os = "freebsd") {
std::process::Command::new("sleep")
.arg("3")
.arg("EnvironSignal")
.stdout(std::process::Stdio::null())
.env("FOO", "BAR")
.env("OTHER", "VALUE")
.spawn()
.unwrap()
} else {
std::process::Command::new("sleep")
.arg("3")
build_example();
std::process::Command::new(find_executable("./target").unwrap())
.stdout(std::process::Stdio::null())
.env("FOO", "BAR")
.env("OTHER", "VALUE")
Expand All @@ -123,19 +151,16 @@ fn test_environ() {
let pid = Pid::from_u32(p.id() as _);
std::thread::sleep(std::time::Duration::from_secs(1));
let mut s = System::new();
s.refresh_processes();
s.refresh_process_specifics(pid, sysinfo::ProcessRefreshKind::everything());
p.kill().expect("Unable to kill process.");

let processes = s.processes();
let p = processes.get(&pid);

if let Some(p) = p {
assert_eq!(p.pid(), pid);
// FIXME: instead of ignoring the test on CI, try to find out what's wrong...
if std::env::var("APPLE_CI").is_err() {
assert!(p.environ().iter().any(|e| e == "FOO=BAR"));
assert!(p.environ().iter().any(|e| e == "OTHER=VALUE"));
}
assert!(p.environ().iter().any(|e| e == "FOO=BAR"));
assert!(p.environ().iter().any(|e| e == "OTHER=VALUE"));
} else {
panic!("Process not found!");
}
Expand All @@ -153,18 +178,17 @@ fn test_big_environ() {
for _ in 0..SIZE {
big_env.push('a');
}
let mut p = if cfg!(target_os = "windows") {
std::process::Command::new("waitfor")
.arg("/t")
// For some reason, it doesn't work on freebsd so let's just use "sleep"...
let mut p = if cfg!(target_os = "freebsd") {
std::process::Command::new("sleep")
.arg("3")
.arg("EnvironSignal")
.stdout(std::process::Stdio::null())
.env("FOO", &big_env)
.spawn()
.unwrap()
} else {
std::process::Command::new("sleep")
.arg("3")
build_example();
std::process::Command::new(find_executable("./target").unwrap())
.stdout(std::process::Stdio::null())
.env("FOO", &big_env)
.spawn()
Expand All @@ -182,11 +206,8 @@ fn test_big_environ() {

if let Some(p) = p {
assert_eq!(p.pid(), pid);
// FIXME: instead of ignoring the test on CI, try to find out what's wrong...
if std::env::var("APPLE_CI").is_err() {
let env = format!("FOO={big_env}");
assert!(p.environ().iter().any(|e| *e == env));
}
let env = format!("FOO={big_env}");
assert!(p.environ().iter().any(|e| *e == env));
} else {
panic!("Process not found!");
}
Expand Down

0 comments on commit f8ce20f

Please sign in to comment.