kernel-builder 0.7.2

Select, build and install kernel version from local sources.
Documentation
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;

fn get_package_version() -> String {
    let manifest_dir = env!("CARGO_MANIFEST_DIR");
    let cargo_toml = fs::read_to_string(format!("{manifest_dir}/Cargo.toml"))
        .expect("Failed to read Cargo.toml");

    for line in cargo_toml.lines() {
        let line = line.trim();
        if line.starts_with("version = \"") {
            let version = line
                .trim_start_matches("version = \"")
                .trim_end_matches('"');
            return version.to_string();
        }
    }
    panic!("Could not find version in Cargo.toml");
}

#[test]
fn test_cli_help() {
    let mut cmd = Command::cargo_bin("kernel-builder").unwrap();
    cmd.arg("--help")
        .assert()
        .success()
        .stdout(predicate::str::contains("kernel-builder"));
}

#[test]
fn test_cli_version() {
    let expected_version = get_package_version();
    let mut cmd = Command::cargo_bin("kernel-builder").unwrap();
    cmd.arg("--version")
        .assert()
        .success()
        .stdout(predicate::str::contains(&expected_version));
}

mod kernel_paths_tests {
    use kernel_builder::consts::KernelPaths;

    #[test]
    fn test_kernel_paths_backup_path() {
        let paths = KernelPaths::new(
            std::path::PathBuf::from("/boot/vmlinuz-linux"),
            None,
            std::path::PathBuf::from("/usr/src/.config"),
            std::path::PathBuf::from("/usr/src"),
        );

        let backup = paths.backup_path(&paths.kernel_image, "-prev");
        assert_eq!(backup.to_string_lossy(), "/boot/vmlinuz-linux-prev");
    }

    #[test]
    fn test_kernel_paths_backup_path_initramfs() {
        let paths = KernelPaths::new(
            std::path::PathBuf::from("/boot/vmlinuz-linux"),
            Some(std::path::PathBuf::from("/boot/initramfs-linux.img")),
            std::path::PathBuf::from("/usr/src/.config"),
            std::path::PathBuf::from("/usr/src"),
        );

        let backup = paths.backup_path(paths.initramfs.as_ref().unwrap(), "-prev.img");
        assert_eq!(
            backup.to_string_lossy(),
            "/boot/initramfs-linux.img-prev.img"
        );
    }
}

mod config_validation_tests {
    use kernel_builder::KBConfig;
    use std::path::PathBuf;
    use tempfile::TempDir;

    #[test]
    fn test_config_validates_missing_source_dir() {
        let config = KBConfig {
            kernel_file_path: PathBuf::from("/boot/vmlinuz-linux"),
            initramfs_file_path: None,
            kernel_config_file_path: PathBuf::from("/usr/src/.config"),
            kernel_src: PathBuf::from("/nonexistent/path"),
            keep_last_kernel: false,
            last_kernel_suffix: None,
            cleanup_keep_count: None,
        };

        let result = config.validate();
        assert!(result.is_err());
        assert!(result.unwrap_err().to_string().contains("does not exist"));
    }

    #[test]
    fn test_config_validates_existing_source_dir() {
        let temp_dir = TempDir::new().unwrap();
        let config = KBConfig {
            kernel_file_path: PathBuf::from("/boot/vmlinuz-linux"),
            initramfs_file_path: None,
            kernel_config_file_path: PathBuf::from("/usr/src/.config"),
            kernel_src: temp_dir.path().to_path_buf(),
            keep_last_kernel: false,
            last_kernel_suffix: None,
            cleanup_keep_count: None,
        };

        let result = config.validate();
        assert!(result.is_ok());
    }
}