axbuild 0.4.22

An OS build lib toolkit used by arceos
use std::{fs, path::PathBuf};

use ostool::board::{RunBoardOptions, config::BoardRunConfig};
use serde::Serialize;
use tempfile::tempdir;

use super::board_run_request;

#[derive(Serialize)]
struct LegacyBoardConfigFixture {
    board_type: String,
}

#[test]
fn session_files_round_trip_as_typed_toml() {
    let config = BoardRunConfig {
        board_type: "OrangePi-5-Plus".to_string(),
        session_files: vec![
            PathBuf::from("iperf-smoke.sh"),
            PathBuf::from("tools/network/probe.sh"),
        ],
        ..Default::default()
    };

    let encoded = toml::to_string(&config).unwrap();
    let decoded: BoardRunConfig = toml::from_str(&encoded).unwrap();

    assert_eq!(decoded, config);
}

#[test]
fn legacy_board_config_defaults_to_empty_session_files() {
    let fixture = LegacyBoardConfigFixture {
        board_type: "OrangePi-5-Plus".to_string(),
    };
    let encoded = toml::to_string(&fixture).unwrap();

    let decoded: BoardRunConfig = toml::from_str(&encoded).unwrap();

    assert!(decoded.session_files.is_empty());
}

#[test]
fn board_request_resolves_nested_files_from_config_directory() {
    let root = tempdir().unwrap();
    let case_dir = root.path().join("iperf-smoke");
    fs::create_dir_all(case_dir.join("tools/network")).unwrap();
    fs::write(case_dir.join("tools/network/probe.sh"), b"probe").unwrap();
    let config_path = case_dir.join("board-orangepi-5-plus.toml");
    let config = BoardRunConfig {
        board_type: "OrangePi-5-Plus".to_string(),
        session_files: vec![PathBuf::from("tools/network/probe.sh")],
        ..Default::default()
    };
    fs::write(&config_path, toml::to_string(&config).unwrap()).unwrap();

    board_run_request(&config_path, config, RunBoardOptions::default()).unwrap();
}

#[test]
fn board_request_rejects_invalid_duplicate_and_missing_files() {
    let root = tempdir().unwrap();
    let case_dir = root.path().join("iperf-smoke");
    fs::create_dir_all(&case_dir).unwrap();
    fs::write(case_dir.join("iperf-smoke.sh"), b"probe").unwrap();
    let config_path = case_dir.join("board-orangepi-5-plus.toml");

    for session_files in [
        vec![PathBuf::from("../escape.sh")],
        vec![case_dir.join("iperf-smoke.sh")],
        vec![
            PathBuf::from("iperf-smoke.sh"),
            PathBuf::from("iperf-smoke.sh"),
        ],
        vec![PathBuf::from("missing.sh")],
    ] {
        let config = BoardRunConfig {
            board_type: "OrangePi-5-Plus".to_string(),
            session_files,
            ..Default::default()
        };
        assert!(board_run_request(&config_path, config, RunBoardOptions::default()).is_err());
    }
}