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