consortium-cfg-common 0.5.0

Schema and configuration types for Consortium
Documentation
use consortium_cfg_common::config::VisibleCore;
use consortium_cfg_common::database::{ChipDatabase, HardwareDoorbellPeripheralType};
use std::fs;
use std::path::PathBuf;

#[test]
fn loads_all_database_yaml_files() {
    for path in database_yaml_files() {
        let yaml = fs::read_to_string(&path).expect("database yaml should be readable");
        let _: ChipDatabase = serde_yaml::from_str(&yaml)
            .unwrap_or_else(|err| panic!("{} should match Rust schema: {err}", path.display()));
    }
}

#[test]
fn loads_stm32mp21_database_yaml() {
    let database: ChipDatabase = serde_yaml::from_str(include_str!(
        "../../consortium-data/database/memory/stm32mp21.yaml"
    ))
    .expect("stm32mp21 database should match Rust schema");

    assert_eq!(database.name, "STM32MP21");
    assert_eq!(
        database.memory.regions[0].visible,
        vec![VisibleCore::Ap, "cm33".parse().unwrap()]
    );
    assert_eq!(
        database.peripheral.doorbells[0].r#type,
        HardwareDoorbellPeripheralType::Ipcc
    );
}

#[test]
fn loads_stm32mp23_database_yaml() {
    let database: ChipDatabase = serde_yaml::from_str(include_str!(
        "../../consortium-data/database/memory/stm32mp23.yaml"
    ))
    .expect("stm32mp23 database should match Rust schema");

    assert_eq!(database.name, "STM32MP23");
    assert_eq!(
        database
            .peripheral
            .doorbells
            .iter()
            .map(|doorbell| doorbell.name.as_str())
            .collect::<Vec<_>>(),
        ["HSEM", "IPCC1"]
    );
    assert_eq!(database.memory.trm_page, vec![229]);
    assert_eq!(
        database.peripheral.doorbells[0].parties[0].memory,
        0x0624_0000
    );
    assert_eq!(database.peripheral.doorbells[0].page, 1306);
    assert_eq!(database.peripheral.doorbells[0].party_page, 1306);
    assert_eq!(database.peripheral.doorbells[0].channels, 16);
    assert_eq!(database.peripheral.doorbells[0].channel_page, 1306);
}

#[test]
fn loads_stm32mp25_database_yaml() {
    let database: ChipDatabase = serde_yaml::from_str(include_str!(
        "../../consortium-data/database/memory/stm32mp25.yaml"
    ))
    .expect("stm32mp25 database should match Rust schema");

    assert_eq!(database.name, "STM32MP25");
    assert_eq!(database.cp.len(), 2);
    assert!(
        database
            .memory
            .regions
            .iter()
            .any(|region| region.visible.contains(&"cm0p".parse().unwrap()))
    );
}

fn database_yaml_files() -> Vec<PathBuf> {
    let database_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .parent()
        .expect("cfg-common crate should live under crates/")
        .join("consortium-data/database/memory");

    let mut paths = fs::read_dir(database_dir)
        .expect("database directory should be readable")
        .map(|entry| entry.expect("database entry should be readable").path())
        .filter(|path| {
            path.extension()
                .is_some_and(|extension| extension == "yaml")
        })
        .collect::<Vec<_>>();
    paths.sort();
    paths
}