1*5225e6b1SAndroid Build Coastguard Worker // Copyright 2024, The Android Open Source Project 2*5225e6b1SAndroid Build Coastguard Worker // 3*5225e6b1SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*5225e6b1SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*5225e6b1SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*5225e6b1SAndroid Build Coastguard Worker // 7*5225e6b1SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*5225e6b1SAndroid Build Coastguard Worker // 9*5225e6b1SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*5225e6b1SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*5225e6b1SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*5225e6b1SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*5225e6b1SAndroid Build Coastguard Worker // limitations under the License. 14*5225e6b1SAndroid Build Coastguard Worker 15*5225e6b1SAndroid Build Coastguard Worker //! Mock protocols. 16*5225e6b1SAndroid Build Coastguard Worker //! 17*5225e6b1SAndroid Build Coastguard Worker //! The structure of these sub-modules must match the libefi structure so that the code can refer 18*5225e6b1SAndroid Build Coastguard Worker //! to either one using the same path. 19*5225e6b1SAndroid Build Coastguard Worker 20*5225e6b1SAndroid Build Coastguard Worker use crate::{DeviceHandle, MOCK_EFI}; 21*5225e6b1SAndroid Build Coastguard Worker use core::ffi::CStr; 22*5225e6b1SAndroid Build Coastguard Worker use core::fmt::Write; 23*5225e6b1SAndroid Build Coastguard Worker use efi::protocol::gbl_efi_image_loading::EfiImageBuffer; 24*5225e6b1SAndroid Build Coastguard Worker use efi_types::{ 25*5225e6b1SAndroid Build Coastguard Worker EfiInputKey, GblEfiAvbKeyValidationStatus, GblEfiAvbVerificationResult, GblEfiImageInfo, 26*5225e6b1SAndroid Build Coastguard Worker GblEfiPartitionName, GblEfiVerifiedDeviceTree, 27*5225e6b1SAndroid Build Coastguard Worker }; 28*5225e6b1SAndroid Build Coastguard Worker use liberror::Result; 29*5225e6b1SAndroid Build Coastguard Worker use mockall::mock; 30*5225e6b1SAndroid Build Coastguard Worker 31*5225e6b1SAndroid Build Coastguard Worker /// Mock device_path module. 32*5225e6b1SAndroid Build Coastguard Worker pub mod device_path { 33*5225e6b1SAndroid Build Coastguard Worker use super::*; 34*5225e6b1SAndroid Build Coastguard Worker 35*5225e6b1SAndroid Build Coastguard Worker mock! { 36*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::DevicePathProtocol]. 37*5225e6b1SAndroid Build Coastguard Worker pub DevicePathProtocol {} 38*5225e6b1SAndroid Build Coastguard Worker } 39*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 40*5225e6b1SAndroid Build Coastguard Worker pub type DevicePathProtocol = MockDevicePathProtocol; 41*5225e6b1SAndroid Build Coastguard Worker 42*5225e6b1SAndroid Build Coastguard Worker mock! { 43*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::DevicePathToTextProtocol]. 44*5225e6b1SAndroid Build Coastguard Worker pub DevicePathToTextProtocol { 45*5225e6b1SAndroid Build Coastguard Worker /// Returns a [MockDevicePathText]. 46*5225e6b1SAndroid Build Coastguard Worker /// 47*5225e6b1SAndroid Build Coastguard Worker /// Lifetimes are a little difficult to mock perfectly, so here we can only allow a 48*5225e6b1SAndroid Build Coastguard Worker /// `'static` return value. 49*5225e6b1SAndroid Build Coastguard Worker pub fn convert_device_path_to_text( 50*5225e6b1SAndroid Build Coastguard Worker &self, 51*5225e6b1SAndroid Build Coastguard Worker device_path: &MockDevicePathProtocol, 52*5225e6b1SAndroid Build Coastguard Worker display_only: bool, 53*5225e6b1SAndroid Build Coastguard Worker allow_shortcuts: bool, 54*5225e6b1SAndroid Build Coastguard Worker ) -> Result<MockDevicePathText<'static>>; 55*5225e6b1SAndroid Build Coastguard Worker } 56*5225e6b1SAndroid Build Coastguard Worker } 57*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 58*5225e6b1SAndroid Build Coastguard Worker pub type DevicePathToTextProtocol = MockDevicePathToTextProtocol; 59*5225e6b1SAndroid Build Coastguard Worker 60*5225e6b1SAndroid Build Coastguard Worker mock! { 61*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::DevicePathText]. 62*5225e6b1SAndroid Build Coastguard Worker pub DevicePathText<'a> { 63*5225e6b1SAndroid Build Coastguard Worker /// Returns the text, which is data-only so isn't mocked. 64*5225e6b1SAndroid Build Coastguard Worker pub fn text(&self) -> Option<&'a [u16]>; 65*5225e6b1SAndroid Build Coastguard Worker } 66*5225e6b1SAndroid Build Coastguard Worker } 67*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 68*5225e6b1SAndroid Build Coastguard Worker pub type DevicePathText<'a> = MockDevicePathText<'a>; 69*5225e6b1SAndroid Build Coastguard Worker } 70*5225e6b1SAndroid Build Coastguard Worker 71*5225e6b1SAndroid Build Coastguard Worker /// Mock loaded_image protocol. 72*5225e6b1SAndroid Build Coastguard Worker pub mod loaded_image { 73*5225e6b1SAndroid Build Coastguard Worker use super::*; 74*5225e6b1SAndroid Build Coastguard Worker 75*5225e6b1SAndroid Build Coastguard Worker mock! { 76*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::LoadedImageProtocol]. 77*5225e6b1SAndroid Build Coastguard Worker pub LoadedImageProtocol { 78*5225e6b1SAndroid Build Coastguard Worker /// Returns a real [efi::DeviceHandle], which is data-only so isn't mocked. 79*5225e6b1SAndroid Build Coastguard Worker pub fn device_handle(&self) -> Result<DeviceHandle>; 80*5225e6b1SAndroid Build Coastguard Worker } 81*5225e6b1SAndroid Build Coastguard Worker } 82*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 83*5225e6b1SAndroid Build Coastguard Worker pub type LoadedImageProtocol = MockLoadedImageProtocol; 84*5225e6b1SAndroid Build Coastguard Worker } 85*5225e6b1SAndroid Build Coastguard Worker 86*5225e6b1SAndroid Build Coastguard Worker /// Mock simple_text_input module. 87*5225e6b1SAndroid Build Coastguard Worker pub mod simple_text_input { 88*5225e6b1SAndroid Build Coastguard Worker use super::*; 89*5225e6b1SAndroid Build Coastguard Worker 90*5225e6b1SAndroid Build Coastguard Worker mock! { 91*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::SimpleTextInputProtocol]. 92*5225e6b1SAndroid Build Coastguard Worker pub SimpleTextInputProtocol { 93*5225e6b1SAndroid Build Coastguard Worker /// Returns an [EfiInputKey], which is data-only so isn't mocked. 94*5225e6b1SAndroid Build Coastguard Worker pub fn read_key_stroke(&self) -> Result<Option<EfiInputKey>>; 95*5225e6b1SAndroid Build Coastguard Worker } 96*5225e6b1SAndroid Build Coastguard Worker } 97*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 98*5225e6b1SAndroid Build Coastguard Worker pub type SimpleTextInputProtocol = MockSimpleTextInputProtocol; 99*5225e6b1SAndroid Build Coastguard Worker } 100*5225e6b1SAndroid Build Coastguard Worker 101*5225e6b1SAndroid Build Coastguard Worker /// Mock simple_text_output module. 102*5225e6b1SAndroid Build Coastguard Worker pub mod simple_text_output { 103*5225e6b1SAndroid Build Coastguard Worker use super::*; 104*5225e6b1SAndroid Build Coastguard Worker 105*5225e6b1SAndroid Build Coastguard Worker mock! { 106*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::SimpleTextOutputProtocol]. 107*5225e6b1SAndroid Build Coastguard Worker pub SimpleTextOutputProtocol {} 108*5225e6b1SAndroid Build Coastguard Worker 109*5225e6b1SAndroid Build Coastguard Worker impl Write for SimpleTextOutputProtocol { 110*5225e6b1SAndroid Build Coastguard Worker fn write_str(&mut self, s: &str) -> core::fmt::Result; 111*5225e6b1SAndroid Build Coastguard Worker } 112*5225e6b1SAndroid Build Coastguard Worker } 113*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 114*5225e6b1SAndroid Build Coastguard Worker pub type SimpleTextOutputProtocol = MockSimpleTextOutputProtocol; 115*5225e6b1SAndroid Build Coastguard Worker 116*5225e6b1SAndroid Build Coastguard Worker /// Returns a [MockSimpleTextOutputProtocol] that forwards all calls to `MOCK_EFI`. passthrough_con_out() -> MockSimpleTextOutputProtocol117*5225e6b1SAndroid Build Coastguard Worker pub fn passthrough_con_out() -> MockSimpleTextOutputProtocol { 118*5225e6b1SAndroid Build Coastguard Worker let mut con_out = MockSimpleTextOutputProtocol::default(); 119*5225e6b1SAndroid Build Coastguard Worker con_out.expect_write_str().returning(|s| { 120*5225e6b1SAndroid Build Coastguard Worker MOCK_EFI.with_borrow_mut(|efi| efi.as_mut().unwrap().con_out.write_str(s)) 121*5225e6b1SAndroid Build Coastguard Worker }); 122*5225e6b1SAndroid Build Coastguard Worker con_out 123*5225e6b1SAndroid Build Coastguard Worker } 124*5225e6b1SAndroid Build Coastguard Worker 125*5225e6b1SAndroid Build Coastguard Worker /// While this mock itself isn't necessarily thread-local, passing through to the thread-local 126*5225e6b1SAndroid Build Coastguard Worker /// state is our primary use case, so we just disallow [Send] entirely. 127*5225e6b1SAndroid Build Coastguard Worker impl !Send for MockSimpleTextOutputProtocol {} 128*5225e6b1SAndroid Build Coastguard Worker } 129*5225e6b1SAndroid Build Coastguard Worker 130*5225e6b1SAndroid Build Coastguard Worker /// Mock image_loading protocol. 131*5225e6b1SAndroid Build Coastguard Worker pub mod gbl_efi_image_loading { 132*5225e6b1SAndroid Build Coastguard Worker use super::*; 133*5225e6b1SAndroid Build Coastguard Worker 134*5225e6b1SAndroid Build Coastguard Worker mock! { 135*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::ImageLoadingProtocol]. 136*5225e6b1SAndroid Build Coastguard Worker pub GblImageLoadingProtocol { 137*5225e6b1SAndroid Build Coastguard Worker /// Returns [EfiImageBuffer] matching `gbl_image_info` 138*5225e6b1SAndroid Build Coastguard Worker pub fn get_buffer(&self, gbl_image_info: &GblEfiImageInfo) -> Result<EfiImageBuffer>; 139*5225e6b1SAndroid Build Coastguard Worker 140*5225e6b1SAndroid Build Coastguard Worker /// Returns number of partitions to be provided via `get_verify_partitions()`, and thus 141*5225e6b1SAndroid Build Coastguard Worker /// expected size of `partition_name` slice. 142*5225e6b1SAndroid Build Coastguard Worker pub fn get_verify_partitions_count(&self) -> Result<usize>; 143*5225e6b1SAndroid Build Coastguard Worker 144*5225e6b1SAndroid Build Coastguard Worker /// Returns number of partition names written to `partition_name` slice. 145*5225e6b1SAndroid Build Coastguard Worker pub fn get_verify_partitions( 146*5225e6b1SAndroid Build Coastguard Worker &self, 147*5225e6b1SAndroid Build Coastguard Worker partition_names: &mut [GblEfiPartitionName] 148*5225e6b1SAndroid Build Coastguard Worker ) -> Result<usize>; 149*5225e6b1SAndroid Build Coastguard Worker } 150*5225e6b1SAndroid Build Coastguard Worker } 151*5225e6b1SAndroid Build Coastguard Worker 152*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 153*5225e6b1SAndroid Build Coastguard Worker pub type GblImageLoadingProtocol = MockGblImageLoadingProtocol; 154*5225e6b1SAndroid Build Coastguard Worker } 155*5225e6b1SAndroid Build Coastguard Worker 156*5225e6b1SAndroid Build Coastguard Worker /// Mock os_configuration protocol. 157*5225e6b1SAndroid Build Coastguard Worker pub mod gbl_efi_os_configuration { 158*5225e6b1SAndroid Build Coastguard Worker use super::*; 159*5225e6b1SAndroid Build Coastguard Worker 160*5225e6b1SAndroid Build Coastguard Worker mock! { 161*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::OsConfigurationProtocol]. 162*5225e6b1SAndroid Build Coastguard Worker pub GblOsConfigurationProtocol { 163*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_OS_CONFIGURATION_PROTOCOL.fixup_kernel_commandline()` 164*5225e6b1SAndroid Build Coastguard Worker pub fn fixup_kernel_commandline( 165*5225e6b1SAndroid Build Coastguard Worker &self, 166*5225e6b1SAndroid Build Coastguard Worker commandline: &CStr, 167*5225e6b1SAndroid Build Coastguard Worker fixup: &[u8], 168*5225e6b1SAndroid Build Coastguard Worker ) -> Result<()>; 169*5225e6b1SAndroid Build Coastguard Worker 170*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_OS_CONFIGURATION_PROTOCOL.fixup_bootconfig()` 171*5225e6b1SAndroid Build Coastguard Worker pub fn fixup_bootconfig( 172*5225e6b1SAndroid Build Coastguard Worker &self, 173*5225e6b1SAndroid Build Coastguard Worker bootconfig: &[u8], 174*5225e6b1SAndroid Build Coastguard Worker fixup: &mut [u8], 175*5225e6b1SAndroid Build Coastguard Worker ) -> Result<usize>; 176*5225e6b1SAndroid Build Coastguard Worker 177*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_OS_CONFIGURATION_PROTOCOL.select_device_trees()` 178*5225e6b1SAndroid Build Coastguard Worker pub fn select_device_trees( 179*5225e6b1SAndroid Build Coastguard Worker &self, 180*5225e6b1SAndroid Build Coastguard Worker components: &mut [GblEfiVerifiedDeviceTree], 181*5225e6b1SAndroid Build Coastguard Worker ) -> Result<()>; 182*5225e6b1SAndroid Build Coastguard Worker } 183*5225e6b1SAndroid Build Coastguard Worker } 184*5225e6b1SAndroid Build Coastguard Worker 185*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 186*5225e6b1SAndroid Build Coastguard Worker pub type GblOsConfigurationProtocol = MockGblOsConfigurationProtocol; 187*5225e6b1SAndroid Build Coastguard Worker } 188*5225e6b1SAndroid Build Coastguard Worker 189*5225e6b1SAndroid Build Coastguard Worker /// Mock dt_fixup protocol. 190*5225e6b1SAndroid Build Coastguard Worker pub mod dt_fixup { 191*5225e6b1SAndroid Build Coastguard Worker use super::*; 192*5225e6b1SAndroid Build Coastguard Worker 193*5225e6b1SAndroid Build Coastguard Worker mock! { 194*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::DtFixupProtocol]. 195*5225e6b1SAndroid Build Coastguard Worker pub DtFixupProtocol { 196*5225e6b1SAndroid Build Coastguard Worker /// Wraps `EFI_DT_FIXUP_PROTOCOL.fixup()` 197*5225e6b1SAndroid Build Coastguard Worker pub fn fixup(&self, device_tree: &mut [u8]) -> Result<()>; 198*5225e6b1SAndroid Build Coastguard Worker } 199*5225e6b1SAndroid Build Coastguard Worker } 200*5225e6b1SAndroid Build Coastguard Worker 201*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 202*5225e6b1SAndroid Build Coastguard Worker pub type DtFixupProtocol = MockDtFixupProtocol; 203*5225e6b1SAndroid Build Coastguard Worker } 204*5225e6b1SAndroid Build Coastguard Worker 205*5225e6b1SAndroid Build Coastguard Worker /// Mock avb protocol. 206*5225e6b1SAndroid Build Coastguard Worker pub mod gbl_efi_avb { 207*5225e6b1SAndroid Build Coastguard Worker use super::*; 208*5225e6b1SAndroid Build Coastguard Worker 209*5225e6b1SAndroid Build Coastguard Worker /// Mock implementation of `GBL_EFI_AVB_PROTOCOL`. 210*5225e6b1SAndroid Build Coastguard Worker /// We use a custom mock implementation instead of relying on `mockall` due to its limitations 211*5225e6b1SAndroid Build Coastguard Worker /// regarding argument lifetimes. Specifically, in this case, `mockall` requires the 212*5225e6b1SAndroid Build Coastguard Worker /// `validate_vbmeta_public_key.public_key_metadata` argument to have a `'static` lifetime, 213*5225e6b1SAndroid Build Coastguard Worker /// which is not practical for our use case. 214*5225e6b1SAndroid Build Coastguard Worker #[derive(Clone, Default)] 215*5225e6b1SAndroid Build Coastguard Worker pub struct GblAvbProtocol { 216*5225e6b1SAndroid Build Coastguard Worker /// Expected return value from `validate_vbmeta_public_key`. 217*5225e6b1SAndroid Build Coastguard Worker pub validate_vbmeta_public_key_result: Option<Result<GblEfiAvbKeyValidationStatus>>, 218*5225e6b1SAndroid Build Coastguard Worker /// Expected return value from `read_is_device_unlocked`. 219*5225e6b1SAndroid Build Coastguard Worker pub read_is_device_unlocked_result: Option<Result<bool>>, 220*5225e6b1SAndroid Build Coastguard Worker /// Expected return value from `read_rollback_index`. 221*5225e6b1SAndroid Build Coastguard Worker pub read_rollback_index_result: Option<Result<u64>>, 222*5225e6b1SAndroid Build Coastguard Worker /// Expected return value from `write_rollback_index`. 223*5225e6b1SAndroid Build Coastguard Worker pub write_rollback_index_result: Option<Result<()>>, 224*5225e6b1SAndroid Build Coastguard Worker /// Expected return value from `read_persistent_value`. 225*5225e6b1SAndroid Build Coastguard Worker pub read_persistent_value_result: Option<Result<usize>>, 226*5225e6b1SAndroid Build Coastguard Worker /// Expected return value from `write_persistent_value`. 227*5225e6b1SAndroid Build Coastguard Worker pub write_persistent_value_result: Option<Result<()>>, 228*5225e6b1SAndroid Build Coastguard Worker } 229*5225e6b1SAndroid Build Coastguard Worker 230*5225e6b1SAndroid Build Coastguard Worker impl GblAvbProtocol { 231*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.validate_vbmeta_public_key()`. validate_vbmeta_public_key( &self, _public_key: &[u8], _public_key_metadata: Option<&[u8]>, ) -> Result<GblEfiAvbKeyValidationStatus>232*5225e6b1SAndroid Build Coastguard Worker pub fn validate_vbmeta_public_key( 233*5225e6b1SAndroid Build Coastguard Worker &self, 234*5225e6b1SAndroid Build Coastguard Worker _public_key: &[u8], 235*5225e6b1SAndroid Build Coastguard Worker _public_key_metadata: Option<&[u8]>, 236*5225e6b1SAndroid Build Coastguard Worker ) -> Result<GblEfiAvbKeyValidationStatus> { 237*5225e6b1SAndroid Build Coastguard Worker self.validate_vbmeta_public_key_result.unwrap() 238*5225e6b1SAndroid Build Coastguard Worker } 239*5225e6b1SAndroid Build Coastguard Worker 240*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.read_is_device_unlocked()`. read_is_device_unlocked(&self) -> Result<bool>241*5225e6b1SAndroid Build Coastguard Worker pub fn read_is_device_unlocked(&self) -> Result<bool> { 242*5225e6b1SAndroid Build Coastguard Worker self.read_is_device_unlocked_result.unwrap() 243*5225e6b1SAndroid Build Coastguard Worker } 244*5225e6b1SAndroid Build Coastguard Worker 245*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.read_rollback_index()`. read_rollback_index(&self, _index_location: usize) -> Result<u64>246*5225e6b1SAndroid Build Coastguard Worker pub fn read_rollback_index(&self, _index_location: usize) -> Result<u64> { 247*5225e6b1SAndroid Build Coastguard Worker self.read_rollback_index_result.unwrap() 248*5225e6b1SAndroid Build Coastguard Worker } 249*5225e6b1SAndroid Build Coastguard Worker 250*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.write_rollback_index()`. write_rollback_index( &self, _index_location: usize, _rollback_index: u64, ) -> Result<()>251*5225e6b1SAndroid Build Coastguard Worker pub fn write_rollback_index( 252*5225e6b1SAndroid Build Coastguard Worker &self, 253*5225e6b1SAndroid Build Coastguard Worker _index_location: usize, 254*5225e6b1SAndroid Build Coastguard Worker _rollback_index: u64, 255*5225e6b1SAndroid Build Coastguard Worker ) -> Result<()> { 256*5225e6b1SAndroid Build Coastguard Worker self.write_rollback_index_result.unwrap() 257*5225e6b1SAndroid Build Coastguard Worker } 258*5225e6b1SAndroid Build Coastguard Worker 259*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.read_persistent_value()`. read_persistent_value(&self, _name: &CStr, _value: &mut [u8]) -> Result<usize>260*5225e6b1SAndroid Build Coastguard Worker pub fn read_persistent_value(&self, _name: &CStr, _value: &mut [u8]) -> Result<usize> { 261*5225e6b1SAndroid Build Coastguard Worker self.read_persistent_value_result.unwrap() 262*5225e6b1SAndroid Build Coastguard Worker } 263*5225e6b1SAndroid Build Coastguard Worker 264*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.write_persistent_value()`. write_persistent_value(&self, _name: &CStr, _value: Option<&[u8]>) -> Result<()>265*5225e6b1SAndroid Build Coastguard Worker pub fn write_persistent_value(&self, _name: &CStr, _value: Option<&[u8]>) -> Result<()> { 266*5225e6b1SAndroid Build Coastguard Worker self.write_persistent_value_result.unwrap() 267*5225e6b1SAndroid Build Coastguard Worker } 268*5225e6b1SAndroid Build Coastguard Worker 269*5225e6b1SAndroid Build Coastguard Worker /// Wraps `GBL_EFI_AVB_PROTOCOL.handle_verification_result()`. handle_verification_result( &self, _verification_result: &GblEfiAvbVerificationResult, ) -> Result<()>270*5225e6b1SAndroid Build Coastguard Worker pub fn handle_verification_result( 271*5225e6b1SAndroid Build Coastguard Worker &self, 272*5225e6b1SAndroid Build Coastguard Worker _verification_result: &GblEfiAvbVerificationResult, 273*5225e6b1SAndroid Build Coastguard Worker ) -> Result<()> { 274*5225e6b1SAndroid Build Coastguard Worker unimplemented!(); 275*5225e6b1SAndroid Build Coastguard Worker } 276*5225e6b1SAndroid Build Coastguard Worker } 277*5225e6b1SAndroid Build Coastguard Worker } 278*5225e6b1SAndroid Build Coastguard Worker 279*5225e6b1SAndroid Build Coastguard Worker /// Mock gbl_efi_fastboot protocol. 280*5225e6b1SAndroid Build Coastguard Worker pub mod gbl_efi_fastboot { 281*5225e6b1SAndroid Build Coastguard Worker use super::*; 282*5225e6b1SAndroid Build Coastguard Worker 283*5225e6b1SAndroid Build Coastguard Worker mock! { 284*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::protocol::gbl_efi_fastboot::Var]. 285*5225e6b1SAndroid Build Coastguard Worker pub Var { 286*5225e6b1SAndroid Build Coastguard Worker /// Get name, arguments and corresponding value. 287*5225e6b1SAndroid Build Coastguard Worker pub fn get<'s>(&self, out: &mut [u8]) 288*5225e6b1SAndroid Build Coastguard Worker -> Result<(&'static str, [&'static str; 1], &'static str)>; 289*5225e6b1SAndroid Build Coastguard Worker } 290*5225e6b1SAndroid Build Coastguard Worker } 291*5225e6b1SAndroid Build Coastguard Worker 292*5225e6b1SAndroid Build Coastguard Worker /// Mock [efi::GblFastbootProtocol]. 293*5225e6b1SAndroid Build Coastguard Worker pub struct GblFastbootProtocol {} 294*5225e6b1SAndroid Build Coastguard Worker 295*5225e6b1SAndroid Build Coastguard Worker impl GblFastbootProtocol { 296*5225e6b1SAndroid Build Coastguard Worker /// Protocol<'_, GblFastbootProtocol>::get_var. get_var<'a>( &self, _: &CStr, _: impl Iterator<Item = &'a CStr> + Clone, _: &mut [u8], ) -> Result<usize>297*5225e6b1SAndroid Build Coastguard Worker pub fn get_var<'a>( 298*5225e6b1SAndroid Build Coastguard Worker &self, 299*5225e6b1SAndroid Build Coastguard Worker _: &CStr, 300*5225e6b1SAndroid Build Coastguard Worker _: impl Iterator<Item = &'a CStr> + Clone, 301*5225e6b1SAndroid Build Coastguard Worker _: &mut [u8], 302*5225e6b1SAndroid Build Coastguard Worker ) -> Result<usize> { 303*5225e6b1SAndroid Build Coastguard Worker unimplemented!() 304*5225e6b1SAndroid Build Coastguard Worker } 305*5225e6b1SAndroid Build Coastguard Worker 306*5225e6b1SAndroid Build Coastguard Worker /// Protocol<'_, GblFastbootProtocol>::get_var_all. get_var_all(&self, _: impl FnMut(&[&CStr], &CStr)) -> Result<()>307*5225e6b1SAndroid Build Coastguard Worker pub fn get_var_all(&self, _: impl FnMut(&[&CStr], &CStr)) -> Result<()> { 308*5225e6b1SAndroid Build Coastguard Worker unimplemented!() 309*5225e6b1SAndroid Build Coastguard Worker } 310*5225e6b1SAndroid Build Coastguard Worker } 311*5225e6b1SAndroid Build Coastguard Worker 312*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 313*5225e6b1SAndroid Build Coastguard Worker pub type Var = MockVar; 314*5225e6b1SAndroid Build Coastguard Worker } 315*5225e6b1SAndroid Build Coastguard Worker 316*5225e6b1SAndroid Build Coastguard Worker /// Mock gbl_efi_ab_slot 317*5225e6b1SAndroid Build Coastguard Worker pub mod gbl_efi_ab_slot { 318*5225e6b1SAndroid Build Coastguard Worker use super::*; 319*5225e6b1SAndroid Build Coastguard Worker use efi::protocol::gbl_efi_ab_slot::GblSlot; 320*5225e6b1SAndroid Build Coastguard Worker use efi_types::{GblEfiBootReason, GblEfiSlotMetadataBlock}; 321*5225e6b1SAndroid Build Coastguard Worker 322*5225e6b1SAndroid Build Coastguard Worker mock! { 323*5225e6b1SAndroid Build Coastguard Worker /// Mock of [GblSlotProtocol] 324*5225e6b1SAndroid Build Coastguard Worker pub GblSlotProtocol { 325*5225e6b1SAndroid Build Coastguard Worker /// Mock of GblSlotProtocol::get_current_slot. 326*5225e6b1SAndroid Build Coastguard Worker pub fn get_current_slot(&self) -> Result<GblSlot>; 327*5225e6b1SAndroid Build Coastguard Worker 328*5225e6b1SAndroid Build Coastguard Worker /// Mock of GblSlotProtocol::get_next_slot. 329*5225e6b1SAndroid Build Coastguard Worker pub fn get_next_slot(&self, mark_boot_attempt: bool) -> Result<GblSlot>; 330*5225e6b1SAndroid Build Coastguard Worker 331*5225e6b1SAndroid Build Coastguard Worker /// Mock of GblSlotProtocol::load_boot_data. 332*5225e6b1SAndroid Build Coastguard Worker pub fn load_boot_data(&self) -> Result<GblEfiSlotMetadataBlock>; 333*5225e6b1SAndroid Build Coastguard Worker 334*5225e6b1SAndroid Build Coastguard Worker /// Mock of GblSlotProtocol::set_active_slot. 335*5225e6b1SAndroid Build Coastguard Worker pub fn set_active_slot(&self, idx: u8) -> Result<()>; 336*5225e6b1SAndroid Build Coastguard Worker 337*5225e6b1SAndroid Build Coastguard Worker /// Mock of GblSlotProtocol::set_boot_reason. 338*5225e6b1SAndroid Build Coastguard Worker pub fn set_boot_reason(&self, reason: GblEfiBootReason, subreason: &[u8]) -> Result<()>; 339*5225e6b1SAndroid Build Coastguard Worker 340*5225e6b1SAndroid Build Coastguard Worker /// Mock of GblSlotProtocol::get_boot_reason. 341*5225e6b1SAndroid Build Coastguard Worker pub fn get_boot_reason(&self, subreason: &mut [u8]) -> Result<(GblEfiBootReason, usize)>; 342*5225e6b1SAndroid Build Coastguard Worker } 343*5225e6b1SAndroid Build Coastguard Worker } 344*5225e6b1SAndroid Build Coastguard Worker 345*5225e6b1SAndroid Build Coastguard Worker /// Map to the libefi name so code under test can just use one name. 346*5225e6b1SAndroid Build Coastguard Worker pub type GblSlotProtocol = MockGblSlotProtocol; 347*5225e6b1SAndroid Build Coastguard Worker } 348