xref: /aosp_15_r20/build/make/tools/aconfig/aconfig_storage_write_api/tests/storage_write_api_test.rs (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1 #[cfg(not(feature = "cargo"))]
2 mod aconfig_storage_write_api_test {
3     use aconfig_storage_file::{FlagInfoBit, FlagValueType};
4     use aconfig_storage_read_api::flag_info_query::find_flag_attribute;
5     use aconfig_storage_read_api::flag_value_query::find_boolean_flag_value;
6     use aconfig_storage_write_api::{
7         map_mutable_storage_file, set_boolean_flag_value, set_flag_has_local_override,
8         set_flag_has_server_override,
9     };
10 
11     use std::fs::{self, File};
12     use std::io::Read;
13     use tempfile::NamedTempFile;
14 
15     /// Create temp file copy
copy_to_temp_rw_file(source_file: &str) -> NamedTempFile16     fn copy_to_temp_rw_file(source_file: &str) -> NamedTempFile {
17         let file = NamedTempFile::new().unwrap();
18         fs::copy(source_file, file.path()).unwrap();
19         file
20     }
21 
22     /// Get boolean flag value from offset
get_boolean_flag_value_at_offset(file: &str, offset: u32) -> bool23     fn get_boolean_flag_value_at_offset(file: &str, offset: u32) -> bool {
24         let mut f = File::open(file).unwrap();
25         let mut bytes = Vec::new();
26         f.read_to_end(&mut bytes).unwrap();
27         find_boolean_flag_value(&bytes, offset).unwrap()
28     }
29 
30     /// Get flag attribute at offset
get_flag_attribute_at_offset(file: &str, value_type: FlagValueType, offset: u32) -> u831     fn get_flag_attribute_at_offset(file: &str, value_type: FlagValueType, offset: u32) -> u8 {
32         let mut f = File::open(file).unwrap();
33         let mut bytes = Vec::new();
34         f.read_to_end(&mut bytes).unwrap();
35         find_flag_attribute(&bytes, value_type, offset).unwrap()
36     }
37 
38     #[test]
39     /// Test to lock down flag value update api
test_boolean_flag_value_update()40     fn test_boolean_flag_value_update() {
41         let flag_value_file = copy_to_temp_rw_file("./flag.val");
42         let flag_value_path = flag_value_file.path().display().to_string();
43 
44         // SAFETY:
45         // The safety here is ensured as only this single threaded test process will
46         // write to this file
47         let mut file = unsafe { map_mutable_storage_file(&flag_value_path).unwrap() };
48         for i in 0..8 {
49             set_boolean_flag_value(&mut file, i, true).unwrap();
50             let value = get_boolean_flag_value_at_offset(&flag_value_path, i);
51             assert!(value);
52 
53             set_boolean_flag_value(&mut file, i, false).unwrap();
54             let value = get_boolean_flag_value_at_offset(&flag_value_path, i);
55             assert!(!value);
56         }
57     }
58 
59     #[test]
60     /// Test to lock down flag has server override update api
test_set_flag_has_server_override()61     fn test_set_flag_has_server_override() {
62         let flag_info_file = copy_to_temp_rw_file("./flag.info");
63         let flag_info_path = flag_info_file.path().display().to_string();
64 
65         // SAFETY:
66         // The safety here is ensured as only this single threaded test process will
67         // write to this file
68         let mut file = unsafe { map_mutable_storage_file(&flag_info_path).unwrap() };
69         for i in 0..8 {
70             set_flag_has_server_override(&mut file, FlagValueType::Boolean, i, true).unwrap();
71             let attribute =
72                 get_flag_attribute_at_offset(&flag_info_path, FlagValueType::Boolean, i);
73             assert!((attribute & (FlagInfoBit::HasServerOverride as u8)) != 0);
74             set_flag_has_server_override(&mut file, FlagValueType::Boolean, i, false).unwrap();
75             let attribute =
76                 get_flag_attribute_at_offset(&flag_info_path, FlagValueType::Boolean, i);
77             assert!((attribute & (FlagInfoBit::HasServerOverride as u8)) == 0);
78         }
79     }
80 
81     #[test]
82     /// Test to lock down flag has local override update api
test_set_flag_has_local_override()83     fn test_set_flag_has_local_override() {
84         let flag_info_file = copy_to_temp_rw_file("./flag.info");
85         let flag_info_path = flag_info_file.path().display().to_string();
86 
87         // SAFETY:
88         // The safety here is ensured as only this single threaded test process will
89         // write to this file
90         let mut file = unsafe { map_mutable_storage_file(&flag_info_path).unwrap() };
91         for i in 0..8 {
92             set_flag_has_local_override(&mut file, FlagValueType::Boolean, i, true).unwrap();
93             let attribute =
94                 get_flag_attribute_at_offset(&flag_info_path, FlagValueType::Boolean, i);
95             assert!((attribute & (FlagInfoBit::HasLocalOverride as u8)) != 0);
96             set_flag_has_local_override(&mut file, FlagValueType::Boolean, i, false).unwrap();
97             let attribute =
98                 get_flag_attribute_at_offset(&flag_info_path, FlagValueType::Boolean, i);
99             assert!((attribute & (FlagInfoBit::HasLocalOverride as u8)) == 0);
100         }
101     }
102 }
103