rust/pv*: Unit test flag parsing

Add a unit test for flag parsing.

In order to ease this test, add derive Eq to ControlFlags and
Msb0Flags64. For the same test, add derive Default to
CreateBootImageArgs and the structs used in it. The latter can be
limited to only derive when testing to avoid confusion with any
user-level default.

Acked-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Signed-off-by: Jakob Naucke <naucke@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
Jakob Naucke
2025-01-15 16:39:13 +01:00
committed by Jan Höppner
parent ec10654c35
commit efdadfcdb9
4 changed files with 28 additions and 2 deletions

View File

@@ -34,7 +34,7 @@ pub trait Flags<T>: From<T> + for<'a> From<&'a T> {
///
/// Wraps an u64 to set/get individual bits
#[repr(C)]
#[derive(Debug, Clone, Copy, Default, AsBytes, FromZeroes, FromBytes)]
#[derive(Debug, Clone, Copy, Default, AsBytes, FromZeroes, FromBytes, Eq, PartialEq)]
pub struct Msb0Flags64(U64<BigEndian>);
impl Flags<u64> for Msb0Flags64 {
#[track_caller]

View File

@@ -72,6 +72,7 @@ pub fn validate_cli(opts: &CliOptions) -> Result<(), clap::error::Error> {
/// CLI Argument collection for handling input components.
#[derive(Args, Debug)]
#[cfg_attr(test, derive(Default))]
pub struct ComponentPaths {
/// Use the content of FILE as a raw binary Linux kernel.
///
@@ -93,6 +94,7 @@ pub struct ComponentPaths {
}
#[derive(Args, Debug)]
#[cfg_attr(test, derive(Default))]
#[command(group(ArgGroup::new("header-flags").multiple(true).conflicts_with_all(["x_pcf", "x_scf"])))]
pub struct CreateBootImageLegacyFlags {
/// Enable Secure Execution guest dump support. This option requires the
@@ -306,6 +308,7 @@ impl GenprotimgCliOptions {
}
#[derive(Parser, Debug)]
#[cfg_attr(test, derive(Default))]
pub struct CreateBootImageArgs {
#[clap(flatten)]
pub component_paths: ComponentPaths,
@@ -352,6 +355,7 @@ pub struct CreateBootImageArgs {
/// Experimental options
#[derive(Args, Debug)]
#[cfg_attr(test, derive(Default))]
pub struct CreateBootImageExperimentalArgs {
/// Manually set the directory used to load the Secure Execution bootloaders
/// (stage3a and stage3b) (experimental option).

View File

@@ -213,3 +213,25 @@ pub fn create(opt: &CreateBootImageArgs) -> Result<OwnExitCode> {
warn!("Successfully generated the Secure Execution image.");
Ok(OwnExitCode::Success)
}
#[cfg(test)]
mod test {
use super::*;
use crate::cli::CreateBootImageLegacyFlags;
#[test]
fn parse_flags() {
let args = CreateBootImageArgs {
legacy_flags: CreateBootImageLegacyFlags {
enable_dump: Some(true),
..Default::default()
},
..Default::default()
};
let parsed_flags = super::parse_flags(&args).expect("Failed to parse flags {args:?}");
let mut exp_flags = Vec::from(PlaintextControlFlagsV1::PCKMO);
exp_flags.push(PcfV1::AllowDumping);
let pcf = PlaintextControlFlagsV1::from_flags(PcfV1::all_enabled(exp_flags));
assert_eq!(parsed_flags.0, pcf);
}
}

View File

@@ -85,7 +85,7 @@ pub trait ControlFlagsTrait: Display {
/// Bitflags as used by the Secure Execution in MSB0 ordering
///
/// Wraps an u64 to set/get individual bits
#[derive(Clone, Copy, Debug)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ControlFlags<T: ControlFlagTrait> {
flags: Msb0Flags64,
t: PhantomData<T>,