Implement OSDK functionalities and opt-in OSDK for asterinas

This commit is contained in:
Zhang Junyang
2024-02-21 16:58:40 +08:00
committed by Tate, Hongliang Tian
parent bc9bce9dea
commit f97d0f1260
103 changed files with 1663 additions and 1295 deletions

70
osdk/src/commands/test.rs Normal file
View File

@ -0,0 +1,70 @@
// SPDX-License-Identifier: MPL-2.0
use std::fs;
use crate::base_crate::new_base_crate;
use crate::config_manager::{BuildConfig, RunConfig, TestConfig};
use crate::utils::{get_current_crate_info, get_target_directory};
use super::build::do_build;
use super::utils::DEFAULT_TARGET_RELPATH;
pub fn execute_test_command(config: &TestConfig) {
let current_crate = get_current_crate_info();
let osdk_target_directory = get_target_directory().join(DEFAULT_TARGET_RELPATH);
let target_crate_dir = osdk_target_directory.join("base");
new_base_crate(&target_crate_dir, &current_crate.name, &current_crate.path);
let main_rs_path = target_crate_dir.join("src").join("main.rs");
let ktest_test_whitelist = match &config.test_name {
Some(name) => format!(r#"Some(&["{}"])"#, name),
None => format!(r#"None"#),
};
let mut ktest_crate_whitelist = vec![current_crate.name];
if let Some(name) = &config.test_name {
ktest_crate_whitelist.push(name.clone());
}
let ktest_static_var = format!(
r#"
#[no_mangle]
pub static KTEST_TEST_WHITELIST: Option<&[&str]> = {};
#[no_mangle]
pub static KTEST_CRATE_WHITELIST: Option<&[&str]> = Some(&{:#?});
"#,
ktest_test_whitelist, ktest_crate_whitelist,
);
// Append the ktest static variable to the main.rs file
let mut main_rs_content = fs::read_to_string(&main_rs_path).unwrap();
main_rs_content.push_str(&ktest_static_var);
fs::write(&main_rs_path, main_rs_content).unwrap();
// Build the kernel with the given base crate
let target_name = get_current_crate_info().name;
let default_bundle_directory = osdk_target_directory.join(target_name);
let required_build_config = BuildConfig {
manifest: config.manifest.clone(),
cargo_args: config.cargo_args.clone(),
};
let original_dir = std::env::current_dir().unwrap();
std::env::set_current_dir(&target_crate_dir).unwrap();
// Add `--cfg ktest` to RUSTFLAGS
std::env::set_var("RUSTFLAGS", "--cfg ktest");
let bundle = do_build(
&default_bundle_directory,
&osdk_target_directory,
&required_build_config,
);
std::env::remove_var("RUSTFLAGS");
std::env::set_current_dir(&original_dir).unwrap();
let required_run_config = RunConfig {
manifest: required_build_config.manifest.clone(),
cargo_args: required_build_config.cargo_args.clone(),
};
bundle.run(&required_run_config);
}