aconfigd: allow test to run as root and added test points

Bug: 378079539
Change-Id: Id216959dac49a55db6fa735701b2dc60047e6402
diff --git a/aconfigd/Android.bp b/aconfigd/Android.bp
index 0f06088..b73d9c4 100644
--- a/aconfigd/Android.bp
+++ b/aconfigd/Android.bp
@@ -57,7 +57,9 @@
 rust_test {
     name: "libaconfigd_rust.test",
     team: "trendy_team_android_core_experiments",
-    test_suites: ["general-tests"],
+    test_suites: [
+        "general-tests",
+    ],
     defaults: ["aconfigd_rust.defaults"],
     srcs: ["src/lib.rs"],
     rustlibs: [
@@ -73,4 +75,5 @@
         "./tests/data/container_with_more_flags.flag.val",
         "./tests/data/container_with_more_flags.flag.info",
     ],
+    require_root: true
 }
diff --git a/aconfigd/src/aconfigd.rs b/aconfigd/src/aconfigd.rs
index 2935dc6..d2b8d94 100644
--- a/aconfigd/src/aconfigd.rs
+++ b/aconfigd/src/aconfigd.rs
@@ -23,7 +23,7 @@
     ProtoOTAFlagStagingMessage, ProtoPersistStorageRecords, ProtoRemoveLocalOverrideMessage,
     ProtoStorageRequestMessage, ProtoStorageRequestMessageMsg, ProtoStorageReturnMessage,
 };
-use log::{error, warn};
+use log::{debug, error, warn};
 use std::io::{Read, Write};
 use std::os::unix::net::UnixStream;
 use std::path::{Path, PathBuf};
@@ -71,10 +71,11 @@
             let default_flag_info = aconfig_dir.join("flag.info");
 
             if !default_package_map.exists()
-                || !default_flag_val.exists()
-                || !default_flag_val.exists()
                 || !default_flag_map.exists()
+                || !default_flag_val.exists()
+                || !default_flag_info.exists()
             {
+                debug!("skip {} initialization due to missing storage files", container);
                 continue;
             }
 
@@ -86,6 +87,7 @@
                 .len()
                 == 0
             {
+                debug!("skip {} initialization due to zero sized storage files", container);
                 continue;
             }
 
@@ -1015,4 +1017,69 @@
             assert_eq!("fail to parse to protobuf from bytes for socket request: Error(WireError(UnexpectedWireType(EndGroup)))", format!("{}", errmsg));
         }
     }
+
+    #[test]
+    fn test_initialize_platform_storage_fresh_install() {
+        let root_dir = StorageRootDirMock::new();
+        let mut aconfigd = create_mock_aconfigd(&root_dir);
+        aconfigd.initialize_platform_storage().unwrap();
+        assert!(aconfigd.persist_storage_records.exists());
+        let pb = read_pb_from_file::<ProtoPersistStorageRecords>(&aconfigd.persist_storage_records)
+            .unwrap();
+        assert_eq!(pb.records.len(), 3);
+
+        for container in ["system", "product", "vendor"] {
+            let aconfig_dir = PathBuf::from("/".to_string() + container + "/etc/aconfig");
+            let default_package_map = aconfig_dir.join("package.map");
+            let default_flag_map = aconfig_dir.join("flag.map");
+            let default_flag_val = aconfig_dir.join("flag.val");
+            let default_flag_info = aconfig_dir.join("flag.info");
+
+            let persist_package_map =
+                root_dir.maps_dir.join(container.to_string() + ".package.map");
+            let persist_flag_map = root_dir.maps_dir.join(container.to_string() + ".flag.map");
+            let persist_flag_val = root_dir.flags_dir.join(container.to_string() + ".val");
+            let persist_flag_info = root_dir.flags_dir.join(container.to_string() + ".info");
+            let boot_flag_val = root_dir.boot_dir.join(container.to_string() + ".val");
+            let boot_flag_info = root_dir.boot_dir.join(container.to_string() + ".info");
+            let local_overrides =
+                root_dir.flags_dir.join(container.to_string() + "_local_overrides.pb");
+
+            assert!(has_same_content(&persist_package_map, &default_package_map));
+            assert!(has_same_content(&persist_flag_map, &default_flag_map));
+            assert!(has_same_content(&persist_flag_val, &default_flag_val));
+            assert!(has_same_content(&persist_flag_info, &default_flag_info));
+            assert!(has_same_content(&boot_flag_val, &default_flag_val));
+            assert!(has_same_content(&boot_flag_info, &default_flag_info));
+            assert!(local_overrides.exists());
+
+            let mut entry = ProtoPersistStorageRecord::new();
+            entry.set_version(1);
+            entry.set_container(container.to_string());
+            entry.set_package_map(default_package_map.display().to_string());
+            entry.set_flag_map(default_flag_map.display().to_string());
+            entry.set_flag_val(default_flag_val.display().to_string());
+            entry.set_flag_info(default_flag_info.display().to_string());
+            let digest = get_files_digest(
+                &[
+                    default_package_map.as_path(),
+                    default_flag_map.as_path(),
+                    default_flag_val.as_path(),
+                    default_flag_info.as_path(),
+                ][..],
+            )
+            .unwrap();
+            entry.set_digest(digest);
+            assert!(pb.records.iter().any(|x| *x == entry));
+        }
+    }
+
+    #[test]
+    fn test_initialize_mainline_storage() {
+        let root_dir = StorageRootDirMock::new();
+        let mut aconfigd = create_mock_aconfigd(&root_dir);
+        aconfigd.initialize_mainline_storage().unwrap();
+        let entries: Vec<_> = std::fs::read_dir(&root_dir.flags_dir).into_iter().collect();
+        assert!(entries.len() > 0);
+    }
 }