lesavka/tests/installer/scripts/install/install_version_path_contract.rs

112 lines
4.3 KiB
Rust
Raw Normal View History

// Installer contract for version reporting and launch paths.
//
// Scope: keep client/server install scripts aligned with Cargo package
// versions and the paths used by desktop/systemd launchers.
// Targets: install scripts plus the Linux desktop entry.
// Why: users should be able to rerun installers idempotently and see the same
// version that the installed binary was built from.
const CLIENT_INSTALL: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/scripts/install/client.sh"
));
const SERVER_INSTALL: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/scripts/install/server.sh"
));
const CLIENT_DESKTOP: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/client/assets/linux/lesavka.desktop"
));
const CLIENT_CARGO: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/client/Cargo.toml"));
const SERVER_CARGO: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/server/Cargo.toml"));
const COMMON_CARGO: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/common/Cargo.toml"));
fn package_version(manifest: &str) -> &str {
manifest
.lines()
.find_map(|line| {
let (key, value) = line.trim().split_once('=')?;
(key.trim() == "version").then(|| value.trim().trim_matches('"'))
})
.expect("package version")
}
#[test]
fn workspace_runtime_crates_share_one_release_version() {
let client_version = package_version(CLIENT_CARGO);
assert_eq!(client_version, package_version(SERVER_CARGO));
assert_eq!(client_version, package_version(COMMON_CARGO));
}
#[test]
fn client_install_reports_the_manifest_version_and_current_revision() {
for marker in [
"manifest_package_version \"$SRC/client/Cargo.toml\"",
"INSTALLED_SHA=$(source_revision \"$SRC\")",
"Installed: lesavka-client",
"Installed version: lesavka-client",
"Build source: $SRC/target/release/lesavka-client",
] {
assert!(
CLIENT_INSTALL.contains(marker),
"client installer should preserve version/reporting marker {marker}"
);
}
}
#[test]
fn server_install_reports_the_manifest_version_and_current_revision() {
for marker in [
"manifest_package_version \"$SRC_DIR/server/Cargo.toml\"",
"INSTALLED_SHA=$(git -C \"$SCRIPT_REPO_ROOT\" rev-parse --short HEAD",
"Installed: lesavka-server",
"Installed version: lesavka-server",
"Client install can use:",
] {
assert!(
SERVER_INSTALL.contains(marker),
"server installer should preserve version/reporting marker {marker}"
);
}
}
#[test]
fn desktop_and_terminal_launch_paths_point_at_the_installed_client_binary() {
for marker in [
"install_verified_executable \"$SRC/target/release/lesavka-client\" /usr/local/bin/lesavka-client",
"ln -sf /usr/local/bin/lesavka-client /usr/local/bin/lesavka",
"ln -sf /usr/local/bin/lesavka-client \"$USER_HOME/.local/bin/lesavka-client\"",
"Desktop entry: /usr/share/applications/lesavka.desktop",
] {
assert!(
CLIENT_INSTALL.contains(marker),
"client installer should preserve launch path marker {marker}"
);
}
assert!(CLIENT_DESKTOP.contains("Exec=/usr/local/bin/lesavka"));
assert!(CLIENT_DESKTOP.contains("Icon=lesavka"));
}
#[test]
fn server_installs_all_systemd_entrypoint_binaries_from_the_same_build() {
for marker in [
"install_verified_executable \"$SRC_DIR/target/release/lesavka-server\" /usr/local/bin/lesavka-server",
"install_verified_executable \"$SRC_DIR/target/release/lesavka-uvc\" /usr/local/bin/lesavka-uvc",
"install_verified_executable \"$SRC_DIR/scripts/daemon/lesavka-core.sh\" /usr/local/bin/lesavka-core.sh",
"install_verified_executable \"$SRC_DIR/scripts/daemon/lesavka-uvc.sh\" /usr/local/bin/lesavka-uvc.sh",
"install_verified_executable \"$SRC_DIR/scripts/daemon/lesavka-recovery-ladder.sh\" /usr/local/bin/lesavka-recovery-ladder",
"/usr/local/bin/lesavka-server",
"/usr/local/bin/lesavka-uvc",
"/usr/local/bin/lesavka-core.sh",
"/usr/local/bin/lesavka-uvc.sh",
"/usr/local/bin/lesavka-recovery-ladder",
] {
assert!(
SERVER_INSTALL.contains(marker),
"server installer should preserve binary path marker {marker}"
);
}
}