874b6f20c2
Основа — Horizon (MIT). История апстрима не переносится: этот репозиторий ведёт свою.
56 lines
2.0 KiB
Rust
56 lines
2.0 KiB
Rust
//! Distributor wrappers must survive disabling and re-enabling menu integration.
|
|
#![cfg(target_os = "linux")]
|
|
|
|
use std::path::Path;
|
|
use std::process::Command;
|
|
|
|
fn desktop_entry(home: &Path, wrapper: Option<&str>, args: &[&str]) {
|
|
let mut command = Command::new(env!("CARGO_BIN_EXE_horizon-launcher"));
|
|
command
|
|
.arg("desktop-entry")
|
|
.args(args)
|
|
.env("HORIZON_LAUNCHER_HOME", home.join("launcher"))
|
|
.env("XDG_DATA_HOME", home.join("data"))
|
|
.env("HORIZON_LAUNCHER_NO_SELF_UPDATE", "1")
|
|
.env_remove("HORIZON_LAUNCHER_DESKTOP_EXEC");
|
|
if let Some(wrapper) = wrapper {
|
|
command.env("HORIZON_LAUNCHER_DESKTOP_EXEC", wrapper);
|
|
}
|
|
let output = command.output().unwrap();
|
|
assert!(
|
|
output.status.success(),
|
|
"{}",
|
|
String::from_utf8_lossy(&output.stderr)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn menu_registration_preserves_the_package_wrapper() {
|
|
let home = std::env::temp_dir().join(format!("horizon-desktop-wrapper-{}", std::process::id()));
|
|
let _ = std::fs::remove_dir_all(&home);
|
|
let entry = home.join("data/applications/horizon-launcher.desktop");
|
|
|
|
// Migrate a registration that pointed at the private executable.
|
|
desktop_entry(&home, None, &[]);
|
|
let original = std::fs::read_to_string(&entry).unwrap();
|
|
assert!(original.contains(&format!(
|
|
"Exec=\"{}\"\n",
|
|
env!("CARGO_BIN_EXE_horizon-launcher")
|
|
)));
|
|
|
|
let wrapper = "/usr/bin/horizon-launcher";
|
|
for _ in 0..2 {
|
|
desktop_entry(&home, Some(wrapper), &[]);
|
|
let text = std::fs::read_to_string(&entry).unwrap();
|
|
assert!(text.contains(&format!("Exec=\"{wrapper}\"\n")));
|
|
assert!(text.contains(&format!("TryExec={wrapper}\n")));
|
|
desktop_entry(&home, Some(wrapper), &["--remove"]);
|
|
assert!(!entry.exists());
|
|
}
|
|
|
|
// An unset or empty override keeps standalone installations working.
|
|
desktop_entry(&home, Some(""), &[]);
|
|
assert_eq!(std::fs::read_to_string(&entry).unwrap(), original);
|
|
std::fs::remove_dir_all(&home).unwrap();
|
|
}
|