1 #![feature(cfg_version)] 2 // C string literals were stabilized in Rust 1.77 3 #![cfg_attr(not(version("1.77")), feature(c_str_literals))] 4 5 #[cfg(test)] 6 mod unittests; 7 8 #[cfg(test)] 9 mod tests { 10 use crate::define_tests_for; 11 use android_hardware_security_see_storage::aidl::android::hardware::security::see::storage::{ 12 Availability::Availability, Filesystem::Filesystem, ISecureStorage::ISecureStorage, 13 IStorageSession::IStorageSession, Integrity::Integrity, 14 }; 15 use binder::{Status, StatusCode, Strong}; 16 use core::ffi::CStr; 17 use rpcbinder::RpcSession; 18 use test::assert_ok; 19 20 //This line is needed in order to run the unit tests in Trusty 21 test::init!(); 22 connect() -> Result<Strong<dyn ISecureStorage>, StatusCode>23 fn connect() -> Result<Strong<dyn ISecureStorage>, StatusCode> { 24 const STORAGE_AIDL_PORT_NAME: &CStr = c"com.android.hardware.security.see.storage"; 25 26 RpcSession::new().setup_trusty_client(STORAGE_AIDL_PORT_NAME) 27 } 28 start_session(properties: &Filesystem) -> Result<Strong<dyn IStorageSession>, Status>29 fn start_session(properties: &Filesystem) -> Result<Strong<dyn IStorageSession>, Status> { 30 connect()?.startSession(properties) 31 } 32 33 #[test] ping()34 fn ping() { 35 use binder::IBinder as _; 36 37 let secure_storage = assert_ok!(connect()); 38 assert_ok!(secure_storage.as_binder().ping_binder()); 39 } 40 41 const TP: &'static Filesystem = &Filesystem { 42 integrity: Integrity::TAMPER_PROOF_AT_REST, 43 availability: Availability::AFTER_USERDATA, 44 persistent: false, 45 }; 46 const TDEA: &'static Filesystem = &Filesystem { 47 integrity: Integrity::TAMPER_DETECT, 48 availability: Availability::BEFORE_USERDATA, 49 persistent: false, 50 }; 51 #[cfg(feature = "has_ns")] 52 const TDP: &'static Filesystem = &Filesystem { 53 integrity: Integrity::TAMPER_DETECT, 54 availability: Availability::AFTER_USERDATA, 55 persistent: true, 56 }; 57 #[cfg(feature = "has_ns")] 58 const TD: &'static Filesystem = &Filesystem { 59 integrity: Integrity::TAMPER_DETECT, 60 availability: Availability::AFTER_USERDATA, 61 persistent: false, 62 }; 63 64 define_tests_for!(tp, TP); 65 define_tests_for!(tdea, TDEA); 66 #[cfg(feature = "has_ns")] 67 define_tests_for!(tdp, TDP); 68 #[cfg(feature = "has_ns")] 69 define_tests_for!(td, TD); 70 71 #[macro_export] 72 macro_rules! define_tests_for { 73 ($mod_name:ident, $file_properties:ident) => { 74 mod $mod_name { 75 use super::$file_properties; 76 use test::assert_ok; 77 use $crate::{tests::start_session, unittests}; 78 79 #[test] 80 fn create_delete() { 81 let ss = assert_ok!(start_session($file_properties)); 82 unittests::create_delete(&*ss); 83 } 84 #[test] 85 fn create_move_delete() { 86 let ss = assert_ok!(start_session($file_properties)); 87 unittests::create_move_delete(&*ss); 88 } 89 #[test] 90 fn file_list() { 91 let ss = assert_ok!(start_session($file_properties)); 92 unittests::file_list(&*ss); 93 } 94 #[test] 95 fn write_read_sequential() { 96 let ss = assert_ok!(start_session($file_properties)); 97 unittests::write_read_sequential(&*ss); 98 } 99 } 100 }; 101 } 102 } 103