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