Skip to main content

flowey_lib_hvlite/_jobs/
local_run_cca_test.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Run OpenVMM CCA tests. Now we run them using emulator, code can be tweaked
5//! to support running tests on native hardware platform.
6use crate::common::CommonArch;
7use crate::common::CommonPlatform;
8use crate::common::CommonProfile;
9use crate::common::CommonTriple;
10use flowey::node::prelude::*;
11
12flowey_request! {
13    pub struct Params {
14        pub test_root: PathBuf,
15        pub build_only: bool,
16        pub done: WriteVar<SideEffect>,
17    }
18}
19
20new_simple_flow_node!(struct Node);
21
22const ENV_CCA_TEST_ROOT: &str = "OPENVMM_CCA_TEST_ROOT";
23const ENV_CCA_TMK_VMM: &str = "OPENVMM_CCA_TMK_VMM";
24const ENV_CCA_SIMPLE_TMK: &str = "OPENVMM_CCA_SIMPLE_TMK";
25
26impl SimpleFlowNode for Node {
27    type Request = Params;
28
29    fn imports(ctx: &mut ImportCtx<'_>) {
30        ctx.import::<crate::build_tmk_vmm::Node>();
31        ctx.import::<crate::build_tmks::Node>();
32    }
33
34    fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
35        let Params {
36            test_root,
37            build_only,
38            done,
39        } = request;
40
41        // Generate request to build tmk_vmm
42        let tmk_vmm_output = ctx.reqv(|v| crate::build_tmk_vmm::Request {
43            target: CommonTriple::Common {
44                arch: CommonArch::Aarch64,
45                platform: CommonPlatform::LinuxGnu,
46            },
47            profile: CommonProfile::Debug,
48            tmk_vmm: v,
49        });
50
51        // Generate request to build simple_tmk
52        let simple_tmk_output = ctx.reqv(|v| crate::build_tmks::Request {
53            arch: CommonArch::Aarch64,
54            profile: CommonProfile::Debug,
55            tmks: v,
56        });
57
58        ctx.emit_rust_step("running cca tests", |ctx| {
59            done.claim(ctx);
60            let tmk_vmm_output = tmk_vmm_output.claim(ctx);
61            let simple_tmk_output = simple_tmk_output.claim(ctx);
62            move |rt| {
63                let tmk_vmm_output = rt.read(tmk_vmm_output);
64                let crate::build_tmk_vmm::TmkVmmOutput::LinuxBin {
65                    bin: tmk_vmm_bin, ..
66                } = tmk_vmm_output
67                else {
68                    anyhow::bail!("expect Linux tmk_vmm only");
69                };
70
71                let simple_tmk_output = rt.read(simple_tmk_output);
72                let simple_tmk_bin = simple_tmk_output.bin;
73
74                if build_only {
75                    log::info!("CCA test artifacts built; skipping Petri test because --build-only was specified");
76                    log::info!("tmk_vmm: {}", tmk_vmm_bin.display());
77                    log::info!("simple_tmk: {}", simple_tmk_bin.display());
78                    return Ok(());
79                }
80
81                flowey::shell_cmd!(rt, "cargo test -p cca_tests --test cca")
82                .env(ENV_CCA_TEST_ROOT, &test_root)
83                .env(ENV_CCA_TMK_VMM, &tmk_vmm_bin)
84                .env(ENV_CCA_SIMPLE_TMK, &simple_tmk_bin)
85                .run()
86                .with_context(|| "failed to run CCA runtime Petri test")?;
87
88                Ok(())
89            }
90        });
91
92        Ok(())
93    }
94}