xref: /aosp_15_r20/bootable/libbootloader/gbl/libefi/mocks/protocol.rs (revision 5225e6b173e52d2efc6bcf950c27374fd72adabc)
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