112 lines
4.3 KiB
Rust
112 lines
4.3 KiB
Rust
|
|
// 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}"
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|