Merge "aosp: reenable the filtered out test point in atest" into main
diff --git a/tools/aconfig/aconfig_storage_file/Android.bp b/tools/aconfig/aconfig_storage_file/Android.bp
index ff284e6..8922ba4 100644
--- a/tools/aconfig/aconfig_storage_file/Android.bp
+++ b/tools/aconfig/aconfig_storage_file/Android.bp
@@ -47,38 +47,14 @@
     cmd: "rm -f $(out);cp -f $(in) $(out);chmod -w $(out)",
 }
 
-genrule {
-    name: "rw.package.map",
-    out: ["tests/tmp.rw.package.map"],
-    srcs: ["tests/package.map"],
-    cmd: "rm -f $(out);cp -f $(in) $(out);chmod +w $(out)",
-}
-
-genrule {
-    name: "rw.flag.map",
-    out: ["tests/tmp.rw.flag.map"],
-    srcs: ["tests/flag.map"],
-    cmd: "rm -f $(out);cp -f $(in) $(out);chmod +w $(out)",
-}
-
-genrule {
-    name: "rw.flag.val",
-    out: ["tests/tmp.rw.flag.val"],
-    srcs: ["tests/flag.val"],
-    cmd: "rm -f $(out);cp -f $(in) $(out);chmod +w $(out)",
-}
-
 rust_test_host {
     name: "aconfig_storage_file.test",
     test_suites: ["general-tests"],
     defaults: ["aconfig_storage_file.defaults"],
     data: [
-        ":ro.package.map",
-        ":ro.flag.map",
-        ":ro.flag.val",
-        ":rw.package.map",
-        ":rw.flag.map",
-        ":rw.flag.val",
+        "tests/package.map",
+        "tests/flag.map",
+        "tests/flag.val",
     ],
 }
 
diff --git a/tools/aconfig/aconfig_storage_file/src/lib.rs b/tools/aconfig/aconfig_storage_file/src/lib.rs
index c238f24..84e0e90 100644
--- a/tools/aconfig/aconfig_storage_file/src/lib.rs
+++ b/tools/aconfig/aconfig_storage_file/src/lib.rs
@@ -438,32 +438,38 @@
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::test_utils::{
-        create_temp_storage_files_for_test, get_binary_storage_proto_bytes,
-        set_temp_storage_files_to_read_only, write_bytes_to_temp_file,
-    };
+    use crate::test_utils::{write_storage_text_to_temp_file, TestStorageFileSet};
+
+    fn create_test_storage_files(read_only: bool) -> TestStorageFileSet {
+        TestStorageFileSet::new(
+            "./tests/package.map",
+            "./tests/flag.map",
+            "./tests/flag.val",
+            read_only,
+        )
+        .unwrap()
+    }
 
     #[test]
     // this test point locks down flag package offset query
     fn test_package_offset_query() {
-        #[cfg(feature = "cargo")]
-        create_temp_storage_files_for_test();
-
-        set_temp_storage_files_to_read_only();
-        let text_proto = r#"
-files {
+        let ro_files = create_test_storage_files(true);
+        let text_proto = format!(
+            r#"
+files {{
     version: 0
     container: "system"
-    package_map: "./tests/tmp.ro.package.map"
-    flag_map: "./tests/tmp.ro.flag.map"
-    flag_val: "./tests/tmp.ro.flag.val"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
     timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
-        let file_full_path = file.path().display().to_string();
+}}
+"#,
+            ro_files.package_map.name, ro_files.flag_map.name, ro_files.flag_val.name
+        );
 
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
+        let file_full_path = file.path().display().to_string();
         let package_offset = get_package_offset_impl(
             &file_full_path,
             "system",
@@ -498,24 +504,23 @@
     #[test]
     // this test point locks down flag offset query
     fn test_flag_offset_query() {
-        #[cfg(feature = "cargo")]
-        create_temp_storage_files_for_test();
-
-        set_temp_storage_files_to_read_only();
-        let text_proto = r#"
-files {
+        let ro_files = create_test_storage_files(true);
+        let text_proto = format!(
+            r#"
+files {{
     version: 0
     container: "system"
-    package_map: "./tests/tmp.ro.package.map"
-    flag_map: "./tests/tmp.ro.flag.map"
-    flag_val: "./tests/tmp.ro.flag.val"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
     timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
-        let file_full_path = file.path().display().to_string();
+}}
+"#,
+            ro_files.package_map.name, ro_files.flag_map.name, ro_files.flag_val.name
+        );
 
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
+        let file_full_path = file.path().display().to_string();
         let baseline = vec![
             (0, "enabled_ro", 1u16),
             (0, "enabled_rw", 2u16),
@@ -538,24 +543,23 @@
     #[test]
     // this test point locks down flag offset query
     fn test_flag_value_query() {
-        #[cfg(feature = "cargo")]
-        create_temp_storage_files_for_test();
-
-        set_temp_storage_files_to_read_only();
-        let text_proto = r#"
-files {
+        let ro_files = create_test_storage_files(true);
+        let text_proto = format!(
+            r#"
+files {{
     version: 0
     container: "system"
-    package_map: "./tests/tmp.ro.package.map"
-    flag_map: "./tests/tmp.ro.flag.map"
-    flag_val: "./tests/tmp.ro.flag.val"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
     timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
-        let file_full_path = file.path().display().to_string();
+}}
+"#,
+            ro_files.package_map.name, ro_files.flag_map.name, ro_files.flag_val.name
+        );
 
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
+        let file_full_path = file.path().display().to_string();
         let baseline: Vec<bool> = vec![false; 8];
         for (offset, expected_value) in baseline.into_iter().enumerate() {
             let flag_value =
diff --git a/tools/aconfig/aconfig_storage_file/src/mapped_file.rs b/tools/aconfig/aconfig_storage_file/src/mapped_file.rs
index 3929dbd..d8f2570 100644
--- a/tools/aconfig/aconfig_storage_file/src/mapped_file.rs
+++ b/tools/aconfig/aconfig_storage_file/src/mapped_file.rs
@@ -148,10 +148,7 @@
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::test_utils::{
-        create_temp_storage_files_for_test, get_binary_storage_proto_bytes,
-        set_temp_storage_files_to_read_only, write_bytes_to_temp_file,
-    };
+    use crate::test_utils::{write_storage_text_to_temp_file, TestStorageFileSet};
 
     #[test]
     fn test_find_storage_file_location() {
@@ -173,10 +170,8 @@
     timestamp: 54321
 }
 "#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
+        let file = write_storage_text_to_temp_file(text_proto).unwrap();
         let file_full_path = file.path().display().to_string();
-
         let file_info = find_container_storage_location(&file_full_path, "system").unwrap();
         assert_eq!(file_info.version(), 0);
         assert_eq!(file_info.container(), "system");
@@ -213,100 +208,121 @@
         assert_eq!(mmaped_file[..], content[..]);
     }
 
-    #[test]
-    fn test_mapped_file_contents() {
-        #[cfg(feature = "cargo")]
-        create_temp_storage_files_for_test();
-
-        set_temp_storage_files_to_read_only();
-        let text_proto = r#"
-files {
-    version: 0
-    container: "system"
-    package_map: "./tests/tmp.ro.package.map"
-    flag_map: "./tests/tmp.ro.flag.map"
-    flag_val: "./tests/tmp.ro.flag.val"
-    timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
-        let file_full_path = file.path().display().to_string();
-
-        map_and_verify(
-            &file_full_path,
-            StorageFileSelection::PackageMap,
-            "./tests/tmp.ro.package.map",
-        );
-        map_and_verify(&file_full_path, StorageFileSelection::FlagMap, "./tests/tmp.ro.flag.map");
-        map_and_verify(&file_full_path, StorageFileSelection::FlagVal, "./tests/tmp.ro.flag.val");
+    fn create_test_storage_files(read_only: bool) -> TestStorageFileSet {
+        TestStorageFileSet::new(
+            "./tests/package.map",
+            "./tests/flag.map",
+            "./tests/flag.val",
+            read_only,
+        )
+        .unwrap()
     }
 
     #[test]
-    #[cfg(feature = "cargo")]
+    fn test_mapped_file_contents() {
+        let ro_files = create_test_storage_files(true);
+        let text_proto = format!(
+            r#"
+files {{
+    version: 0
+    container: "system"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
+    timestamp: 12345
+}}
+"#,
+            ro_files.package_map.name, ro_files.flag_map.name, ro_files.flag_val.name
+        );
+
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
+        let file_full_path = file.path().display().to_string();
+        map_and_verify(
+            &file_full_path,
+            StorageFileSelection::PackageMap,
+            &ro_files.package_map.name,
+        );
+        map_and_verify(&file_full_path, StorageFileSelection::FlagMap, &ro_files.flag_map.name);
+        map_and_verify(&file_full_path, StorageFileSelection::FlagVal, &ro_files.flag_val.name);
+    }
+
+    #[test]
     fn test_map_non_read_only_file() {
-        #[cfg(feature = "cargo")]
-        create_temp_storage_files_for_test();
-
-        set_temp_storage_files_to_read_only();
-        let text_proto = r#"
-files {
+        let ro_files = create_test_storage_files(true);
+        let rw_files = create_test_storage_files(false);
+        let text_proto = format!(
+            r#"
+files {{
     version: 0
     container: "system"
-    package_map: "./tests/tmp.rw.package.map"
-    flag_map: "./tests/tmp.rw.flag.map"
-    flag_val: "./tests/tmp.rw.flag.val"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
     timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
-        let file_full_path = file.path().display().to_string();
-
-        let error = map_container_storage_files(&file_full_path, "system").unwrap_err();
-        assert_eq!(
-            format!("{:?}", error),
-            "MapFileFail(fail to map non read only storage file ./tests/tmp.rw.package.map)"
+}}
+"#,
+            rw_files.package_map.name, ro_files.flag_map.name, ro_files.flag_val.name
         );
 
-        let text_proto = r#"
-files {
-    version: 0
-    container: "system"
-    package_map: "./tests/tmp.ro.package.map"
-    flag_map: "./tests/tmp.rw.flag.map"
-    flag_val: "./tests/tmp.rw.flag.val"
-    timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
         let file_full_path = file.path().display().to_string();
-
         let error = map_container_storage_files(&file_full_path, "system").unwrap_err();
         assert_eq!(
             format!("{:?}", error),
-            "MapFileFail(fail to map non read only storage file ./tests/tmp.rw.flag.map)"
+            format!(
+                "MapFileFail(fail to map non read only storage file {})",
+                rw_files.package_map.name
+            )
         );
 
-        let text_proto = r#"
-files {
+        let text_proto = format!(
+            r#"
+files {{
     version: 0
     container: "system"
-    package_map: "./tests/tmp.ro.package.map"
-    flag_map: "./tests/tmp.ro.flag.map"
-    flag_val: "./tests/tmp.rw.flag.val"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
     timestamp: 12345
-}
-"#;
-        let binary_proto_bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
-        let file = write_bytes_to_temp_file(&binary_proto_bytes).unwrap();
-        let file_full_path = file.path().display().to_string();
+}}
+"#,
+            ro_files.package_map.name, rw_files.flag_map.name, ro_files.flag_val.name
+        );
 
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
+        let file_full_path = file.path().display().to_string();
         let error = map_container_storage_files(&file_full_path, "system").unwrap_err();
         assert_eq!(
             format!("{:?}", error),
-            "MapFileFail(fail to map non read only storage file ./tests/tmp.rw.flag.val)"
+            format!(
+                "MapFileFail(fail to map non read only storage file {})",
+                rw_files.flag_map.name
+            )
+        );
+
+        let text_proto = format!(
+            r#"
+files {{
+    version: 0
+    container: "system"
+    package_map: "{}"
+    flag_map: "{}"
+    flag_val: "{}"
+    timestamp: 12345
+}}
+"#,
+            ro_files.package_map.name, ro_files.flag_map.name, rw_files.flag_val.name
+        );
+
+        let file = write_storage_text_to_temp_file(&text_proto).unwrap();
+        let file_full_path = file.path().display().to_string();
+        let error = map_container_storage_files(&file_full_path, "system").unwrap_err();
+        assert_eq!(
+            format!("{:?}", error),
+            format!(
+                "MapFileFail(fail to map non read only storage file {})",
+                rw_files.flag_val.name
+            )
         );
     }
 }
diff --git a/tools/aconfig/aconfig_storage_file/src/test_utils.rs b/tools/aconfig/aconfig_storage_file/src/test_utils.rs
index 6fe5a27..7905d51 100644
--- a/tools/aconfig/aconfig_storage_file/src/test_utils.rs
+++ b/tools/aconfig/aconfig_storage_file/src/test_utils.rs
@@ -19,12 +19,8 @@
 use protobuf::Message;
 use std::fs;
 use std::io::Write;
-use std::path::Path;
-use std::sync::Once;
 use tempfile::NamedTempFile;
 
-static INIT: Once = Once::new();
-
 pub(crate) fn get_binary_storage_proto_bytes(text_proto: &str) -> Result<Vec<u8>> {
     let storage_files: ProtoStorageFiles = protobuf::text_format::parse_from_str(text_proto)?;
     let mut binary_proto = Vec::new();
@@ -32,59 +28,65 @@
     Ok(binary_proto)
 }
 
-pub(crate) fn write_bytes_to_temp_file(bytes: &[u8]) -> Result<NamedTempFile> {
+pub(crate) fn write_storage_text_to_temp_file(text_proto: &str) -> Result<NamedTempFile> {
+    let bytes = get_binary_storage_proto_bytes(text_proto).unwrap();
     let mut file = NamedTempFile::new()?;
     let _ = file.write_all(&bytes);
     Ok(file)
 }
 
-fn has_same_content(file1: &Path, file2: &Path) -> Result<bool> {
-    let bytes1 = fs::read(file1)?;
-    let bytes2 = fs::read(file2)?;
-    if bytes1.len() != bytes2.len() {
-        return Ok(false);
+fn set_file_read_only(file: &NamedTempFile) {
+    let mut perms = fs::metadata(file.path()).unwrap().permissions();
+    if !perms.readonly() {
+        perms.set_readonly(true);
+        fs::set_permissions(file.path(), perms).unwrap();
     }
-    for (i, &b1) in bytes1.iter().enumerate() {
-        if b1 != bytes2[i] {
-            return Ok(false);
-        }
-    }
-    Ok(true)
 }
 
-pub(crate) fn create_temp_storage_files_for_test() {
-    INIT.call_once(|| {
-        let file_paths = [
-            ("./tests/package.map", "./tests/tmp.ro.package.map"),
-            ("./tests/flag.map", "./tests/tmp.ro.flag.map"),
-            ("./tests/flag.val", "./tests/tmp.ro.flag.val"),
-            ("./tests/package.map", "./tests/tmp.rw.package.map"),
-            ("./tests/flag.map", "./tests/tmp.rw.flag.map"),
-            ("./tests/flag.val", "./tests/tmp.rw.flag.val"),
-        ];
-        for (file_path, copied_file_path) in file_paths.into_iter() {
-            let file_path = Path::new(&file_path);
-            let copied_file_path = Path::new(&copied_file_path);
-            if copied_file_path.exists() && !has_same_content(file_path, copied_file_path).unwrap()
-            {
-                fs::remove_file(copied_file_path).unwrap();
-            }
-            if !copied_file_path.exists() {
-                fs::copy(file_path, copied_file_path).unwrap();
-            }
-        }
-    });
+fn set_file_read_write(file: &NamedTempFile) {
+    let mut perms = fs::metadata(file.path()).unwrap().permissions();
+    if perms.readonly() {
+        perms.set_readonly(false);
+        fs::set_permissions(file.path(), perms).unwrap();
+    }
 }
 
-pub(crate) fn set_temp_storage_files_to_read_only() {
-    let file_paths =
-        ["./tests/tmp.ro.package.map", "./tests/tmp.ro.flag.map", "./tests/tmp.ro.flag.val"];
-    for file_path in file_paths.into_iter() {
-        let file_path = Path::new(&file_path);
-        let mut perms = fs::metadata(file_path).unwrap().permissions();
-        if !perms.readonly() {
-            perms.set_readonly(true);
-            fs::set_permissions(file_path, perms).unwrap();
+pub(crate) struct TestStorageFile {
+    pub file: NamedTempFile,
+    pub name: String,
+}
+
+impl TestStorageFile {
+    pub(crate) fn new(source_file: &str, read_only: bool) -> Result<Self> {
+        let file = NamedTempFile::new()?;
+        fs::copy(source_file, file.path())?;
+        if read_only {
+            set_file_read_only(&file);
+        } else {
+            set_file_read_write(&file);
         }
+        let name = file.path().display().to_string();
+        Ok(Self { file, name })
+    }
+}
+
+pub(crate) struct TestStorageFileSet {
+    pub package_map: TestStorageFile,
+    pub flag_map: TestStorageFile,
+    pub flag_val: TestStorageFile,
+}
+
+impl TestStorageFileSet {
+    pub(crate) fn new(
+        package_map_path: &str,
+        flag_map_path: &str,
+        flag_val_path: &str,
+        read_only: bool,
+    ) -> Result<Self> {
+        Ok(Self {
+            package_map: TestStorageFile::new(package_map_path, read_only)?,
+            flag_map: TestStorageFile::new(flag_map_path, read_only)?,
+            flag_val: TestStorageFile::new(flag_val_path, read_only)?,
+        })
     }
 }