diff --git a/osdk/tests/cli/mod.rs b/osdk/tests/cli/mod.rs index 4a7fbc1fd..6a45f9571 100644 --- a/osdk/tests/cli/mod.rs +++ b/osdk/tests/cli/mod.rs @@ -60,5 +60,5 @@ fn cli_new_crate_with_hyphen() { .unwrap(); assert_success(&output); assert!(fs::metadata("my-first-os").is_ok()); - fs::remove_dir_all("my-first-os"); + let _ = fs::remove_dir_all("my-first-os"); } diff --git a/osdk/tests/commands/run.rs b/osdk/tests/commands/run.rs index ce60c5338..693f68e9c 100644 --- a/osdk/tests/commands/run.rs +++ b/osdk/tests/commands/run.rs @@ -2,6 +2,8 @@ //! Test the `run` command +use crate::util::is_tdx_enabled; + const WORKSPACE: &str = "/tmp/kernel_test_workspace/run_command"; mod workspace { @@ -67,6 +69,10 @@ mod qemu_gdb_feature { #[test] fn basic_debug() { + // Test skipped because TDX is enabled. + if is_tdx_enabled() { + return; + } let workspace = workspace::WorkSpace::new(WORKSPACE, "basic_debug"); let unix_socket = { let path = Path::new(&workspace.os_dir()).join("qemu-gdb-sock"); @@ -109,6 +115,10 @@ mod qemu_gdb_feature { #[test] fn vsc_launch_file() { + // Test skipped because TDX is enabled. + if is_tdx_enabled() { + return; + } let kernel_name = "vsc_launch_file"; let workspace = workspace::WorkSpace::new(WORKSPACE, kernel_name); let addr = ":50001"; diff --git a/osdk/tests/examples_in_book/test_and_run_projects.rs b/osdk/tests/examples_in_book/test_and_run_projects.rs index 8e4d82669..4cf30f2f3 100644 --- a/osdk/tests/examples_in_book/test_and_run_projects.rs +++ b/osdk/tests/examples_in_book/test_and_run_projects.rs @@ -2,7 +2,7 @@ use std::{fs, path::PathBuf}; -use crate::util::{cargo_osdk, depends_on_local_ostd}; +use crate::util::{cargo_osdk, edit_config_files}; #[test] fn create_and_run_kernel() { @@ -20,8 +20,7 @@ fn create_and_run_kernel() { command.ok().unwrap(); // Makes the kernel depend on local OSTD - let manifest_path = os_dir.join("Cargo.toml"); - depends_on_local_ostd(&manifest_path); + edit_config_files(&os_dir); let mut command = cargo_osdk(&["build"]); command.current_dir(&os_dir); @@ -52,8 +51,7 @@ fn create_and_test_library() { command.current_dir(work_dir); command.ok().unwrap(); - let manifest_path = module_dir.join("Cargo.toml"); - depends_on_local_ostd(manifest_path); + edit_config_files(&module_dir); let mut command = cargo_osdk(&["test"]); command.current_dir(&module_dir); diff --git a/osdk/tests/examples_in_book/work_in_workspace.rs b/osdk/tests/examples_in_book/work_in_workspace.rs index 3061c071b..fada3f241 100644 --- a/osdk/tests/examples_in_book/work_in_workspace.rs +++ b/osdk/tests/examples_in_book/work_in_workspace.rs @@ -6,7 +6,7 @@ use std::{ path::PathBuf, }; -use crate::util::{cargo_osdk, depends_on_local_ostd}; +use crate::util::{add_tdx_scheme, cargo_osdk, depends_on_local_ostd, is_tdx_enabled}; #[test] fn work_in_workspace() { @@ -58,6 +58,12 @@ fn work_in_workspace() { let kernel_manifest_path = workspace_dir.join(kernel).join("Cargo.toml"); assert!(kernel_manifest_path.is_file()); depends_on_local_ostd(&kernel_manifest_path); + + if is_tdx_enabled() { + add_tdx_scheme(workspace_dir.join("OSDK.toml")).unwrap(); + } + + let kernel_manifest_path = workspace_dir.join(kernel).join("Cargo.toml"); let mut kernel_manifest_file = OpenOptions::new() .append(true) .open(&kernel_manifest_path) diff --git a/osdk/tests/examples_in_book/write_a_kernel_in_100_lines.rs b/osdk/tests/examples_in_book/write_a_kernel_in_100_lines.rs index 9c41a6f98..a89a1f270 100644 --- a/osdk/tests/examples_in_book/write_a_kernel_in_100_lines.rs +++ b/osdk/tests/examples_in_book/write_a_kernel_in_100_lines.rs @@ -4,7 +4,7 @@ use std::{fs, path::PathBuf, process::Command}; use assert_cmd::output::OutputOkExt; -use crate::util::{cargo_osdk, depends_on_local_ostd}; +use crate::util::{cargo_osdk, edit_config_files}; #[test] fn write_a_kernel_in_100_lines() { @@ -23,9 +23,7 @@ fn write_a_kernel_in_100_lines() { .ok() .unwrap(); - // Depends on local OSTD - let manifest_path = os_dir.join("Cargo.toml"); - depends_on_local_ostd(manifest_path); + edit_config_files(&os_dir); // Copies the kernel content let kernel_contents = include_str!("write_a_kernel_in_100_lines_templates/lib.rs"); diff --git a/osdk/tests/util/mod.rs b/osdk/tests/util/mod.rs index 4f947ba48..b05589eb6 100644 --- a/osdk/tests/util/mod.rs +++ b/osdk/tests/util/mod.rs @@ -4,7 +4,8 @@ use std::{ ffi::OsStr, - fs::{self, create_dir_all}, + fs::{self, create_dir_all, OpenOptions}, + io::Write, path::{Path, PathBuf}, process::Output, }; @@ -12,13 +13,24 @@ use std::{ use assert_cmd::Command; use toml::{Table, Value}; -pub fn cargo_osdk, I: IntoIterator>(args: I) -> Command { +pub fn cargo_osdk, I: IntoIterator + Copy>(args: I) -> Command { let mut command = Command::cargo_bin("cargo-osdk").unwrap(); command.arg("osdk"); command.args(args); + conditionally_add_tdx_args(&mut command, args); command } +pub fn edit_config_files(dir: &Path) { + let manifest_path = dir.join("Cargo.toml"); + assert!(manifest_path.is_file()); + depends_on_local_ostd(manifest_path); + if is_tdx_enabled() { + let osdk_path = dir.join("OSDK.toml"); + add_tdx_scheme(osdk_path).unwrap(); + }; +} + pub fn assert_success(output: &Output) { assert!( output.status.success(), @@ -91,7 +103,7 @@ pub fn add_member_to_workspace(workspace: impl AsRef, new_member: &str) { /// instead of ostd from remote source(git repo/crates.io). /// /// Each crate created by `cargo ostd new` should add this patch. -pub fn depends_on_local_ostd(manifest_path: impl AsRef) { +pub(crate) fn depends_on_local_ostd(manifest_path: impl AsRef) { let crate_dir = env!("CARGO_MANIFEST_DIR"); let ostd_dir = PathBuf::from(crate_dir) .join("..") @@ -118,3 +130,40 @@ pub fn depends_on_local_ostd(manifest_path: impl AsRef) { fs::write(manifest_path, manifest.to_string().as_bytes()).unwrap(); } + +pub(crate) fn add_tdx_scheme(osdk_path: impl AsRef) -> std::io::Result<()> { + let template_path = Path::new(file!()) + .parent() + .unwrap() + .join("scheme.tdx.template"); + let mut file = OpenOptions::new() + .write(true) + .append(true) + .open(osdk_path)?; + let tdx_qemu_cfg = fs::read_to_string(template_path)?; + file.write_all(format!("\n\n{}", tdx_qemu_cfg).as_bytes())?; + Ok(()) +} + +pub(crate) fn is_tdx_enabled() -> bool { + std::env::var("INTEL_TDX").is_ok() +} + +fn conditionally_add_tdx_args, I: IntoIterator + Copy>( + command: &mut Command, + args: I, +) { + if is_tdx_enabled() && contains_build_run_or_test(args) { + command.args(&["--scheme", "tdx"]); + } +} + +fn contains_build_run_or_test, I: IntoIterator>(args: I) -> bool { + args.into_iter().any(|arg| { + if let Some(arg_str) = arg.as_ref().to_str() { + arg_str == "build" || arg_str == "run" || arg_str == "test" + } else { + false + } + }) +} diff --git a/osdk/tests/util/scheme.tdx.template b/osdk/tests/util/scheme.tdx.template new file mode 100644 index 000000000..42318e0a2 --- /dev/null +++ b/osdk/tests/util/scheme.tdx.template @@ -0,0 +1,26 @@ +[scheme."tdx"] +boot.method = "grub-qcow2" +grub.boot_protocol = "linux" +qemu.args = """ + -accel kvm \ + -name process=tdxvm,debug-threads=on \ + -m 8G \ + -smp 1 \ + -vga none \ + -nographic \ + -monitor pty \ + -no-hpet \ + -nodefaults \ + -bios /usr/share/qemu/OVMF.fd \ + -object tdx-guest,sept-ve-disable=on,id=tdx,quote-generation-service=vsock:2:4050 \ + -cpu host,-kvm-steal-time,pmu=off \ + -machine q35,kernel_irqchip=split,confidential-guest-support=tdx,memory-backend=ram1 \ + -object memory-backend-memfd-private,id=ram1,size=8G \ + -device virtio-keyboard-pci,disable-legacy=on,disable-modern=off \ + -chardev stdio,id=mux,mux=on,logfile=qemu.log \ + -device virtio-serial,romfile= \ + -device virtconsole,chardev=mux \ + -device isa-debug-exit,iobase=0xf4,iosize=0x04 \ + -monitor chardev:mux \ + -serial chardev:mux \ +""" \ No newline at end of file