diff --git a/komorebi-recorder/tests/packaging.rs b/komorebi-recorder/tests/packaging.rs index d7bee2cf..6b94a03d 100644 --- a/komorebi-recorder/tests/packaging.rs +++ b/komorebi-recorder/tests/packaging.rs @@ -1,17 +1,10 @@ -//! The Windows installer (`wix/main.wxs`) has to ship every binary the crate builds and has to be -//! its own product: `WiX` itself only runs on Windows, so these checks are what a Mac or Linux +//! The recorder ships in the komorebi installer (`wix/main.wxs`), so that installer has to ship every +//! binary this crate builds: `WiX` itself only runs on Windows, so this check is what a Mac or Linux //! machine can say about the installer. use std::path::Path; use std::path::PathBuf; -/// komorebi's own installer: reusing its `UpgradeCode` would make the two products upgrade and -/// uninstall each other. -const KOMOREBI_UPGRADE_CODE: &str = "F8B967B5-7E7B-4E3A-895B-B789EC898B54"; - -/// komorebi's `PATH` component, which the installer tracks the `PATH` entry by. -const KOMOREBI_PATH_COMPONENT: &str = "6C6DF276-06C4-4675-BDED-48C5C2BC9BC5"; - fn repository() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")) .parent() @@ -23,28 +16,6 @@ fn installer() -> String { std::fs::read_to_string(repository().join("wix/main.wxs")).expect("wix/main.wxs") } -/// The value of attribute `name` on the first element of `tag` in the installer. -fn attribute(text: &str, tag: &str, name: &str) -> String { - let start = text - .find(&format!("<{tag} ")) - .unwrap_or_else(|| panic!("no <{tag}> in the installer")); - let element = &text[start..start + text[start..].find('>').expect("a closed tag")]; - let key = format!("{name}='"); - let value = element - .find(&key) - .unwrap_or_else(|| panic!("<{tag}> has no {name}")) - + key.len(); - element[value..][..element[value..].find('\'').expect("a closed value")].to_string() -} - -fn is_guid(text: &str) -> bool { - let parts: Vec<&str> = text.split('-').collect(); - parts.iter().map(|part| part.len()).collect::>() == [8, 4, 4, 4, 12] - && parts - .iter() - .all(|part| part.chars().all(|c| c.is_ascii_hexdigit())) -} - /// The binaries cargo builds for this crate: the package's own (`src/main.rs`) and one for each /// file in `src/bin`. fn binaries() -> Vec { @@ -68,7 +39,7 @@ fn binaries() -> Vec { } #[test] -fn every_binary_the_crate_builds_is_in_the_installer() { +fn every_binary_the_crate_builds_is_in_the_komorebi_installer() { let text = installer(); for name in binaries() { assert!( @@ -81,86 +52,3 @@ fn every_binary_the_crate_builds_is_in_the_installer() { ); } } - -#[test] -fn the_installer_installs_nothing_the_crate_does_not_build() { - let text = installer(); - let built = binaries(); - for piece in text.split("Name='").skip(1) { - let name = &piece[..piece.find('\'').expect("a closed value")]; - if let Some(binary) = name.strip_suffix(".exe") { - assert!( - built.iter().any(|built| built == binary), - "wix/main.wxs installs {name}, which this crate does not build" - ); - } - } -} - -#[test] -fn the_installer_is_its_own_product() { - let text = installer(); - - let upgrade_code = attribute(&text, "Product", "UpgradeCode"); - assert!( - is_guid(&upgrade_code), - "UpgradeCode is not a GUID: {upgrade_code}" - ); - assert!( - !upgrade_code.eq_ignore_ascii_case(KOMOREBI_UPGRADE_CODE), - "UpgradeCode is komorebi's: the two products would replace each other" - ); - assert_eq!(attribute(&text, "Product", "Name"), env!("CARGO_PKG_NAME")); - - assert!( - !text - .to_uppercase() - .contains(&KOMOREBI_PATH_COMPONENT.to_uppercase()), - "the PATH component has komorebi's GUID" - ); - let path_guid = attribute(&text, "Component Id='Path'", "Guid"); - assert!( - is_guid(&path_guid), - "the PATH component's Guid: {path_guid}" - ); -} - -#[test] -fn the_license_the_installer_shows_is_there_and_is_the_projects() { - let rtf = std::fs::read_to_string(repository().join("wix/License.rtf")).expect("License.rtf"); - assert!( - rtf.contains("Komorebi License"), - "not the project's license" - ); - assert!(rtf.contains("Version 2.0.0"), "not the project's license"); - assert!( - installer().contains("wix\\License.rtf"), - "main.wxs does not refer to wix\\License.rtf" - ); -} - -#[test] -fn the_installer_shows_the_icon_the_executables_carry() { - let text = installer(); - - let id = attribute(&text, "Icon", "Id"); - let source = attribute(&text, "Icon", "SourceFile"); - assert!( - text.contains(&format!(" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wix/main.wxs b/wix/main.wxs index 60f3deee..3a7a30ec 100644 --- a/wix/main.wxs +++ b/wix/main.wxs @@ -104,6 +104,12 @@ + + + + + + @@ -128,6 +134,10 @@ + + + +