Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0ed40a2 authored by Ted Bauer's avatar Ted Bauer Committed by Android (Google) Code Review
Browse files

Merge "aconfig: instrument actual flag read APIs" into main

parents 626f3abc 86bacb36
Loading
Loading
Loading
Loading
+15 −330
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ use log::{info, error, LevelFilter};

static STORAGE_MIGRATION_MARKER_FILE: &str =
    "/metadata/aconfig/storage_test_mission_1";
static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";

/// flag provider
pub struct FlagProvider;
@@ -517,7 +517,7 @@ use log::{info, error, LevelFilter};

static STORAGE_MIGRATION_MARKER_FILE: &str =
    "/metadata/aconfig/storage_test_mission_1";
static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";

/// flag provider
pub struct FlagProvider;
@@ -546,20 +546,17 @@ lazy_static::lazy_static! {
impl FlagProvider {
    /// query flag disabled_rw_exported
    pub fn disabled_rw_exported(&self) -> bool {
        let result = *CACHED_disabled_rw_exported;
        result
        *CACHED_disabled_rw_exported
    }

    /// query flag enabled_fixed_ro_exported
    pub fn enabled_fixed_ro_exported(&self) -> bool {
        let result = *CACHED_enabled_fixed_ro_exported;
        result
        *CACHED_enabled_fixed_ro_exported
    }

    /// query flag enabled_ro_exported
    pub fn enabled_ro_exported(&self) -> bool {
        let result = *CACHED_enabled_ro_exported;
        result
        *CACHED_enabled_ro_exported
    }
}

@@ -594,7 +591,7 @@ use log::{info, error, LevelFilter};

static STORAGE_MIGRATION_MARKER_FILE: &str =
    "/metadata/aconfig/storage_test_mission_1";
static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";

/// flag provider
pub struct FlagProvider;
@@ -602,344 +599,32 @@ pub struct FlagProvider;
impl FlagProvider {
    /// query flag disabled_ro
    pub fn disabled_ro(&self) -> bool {
        let result = false;

        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
            return result;
        }

        // This will be called multiple times. Subsequent calls after the first
        // are noops.
        logger::init(
            logger::Config::default()
                .with_tag_on_device(MIGRATION_LOG_TAG)
                .with_max_level(LevelFilter::Info),
        );

        unsafe {
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
                Ok(file) => file,
                Err(err) => {
                    error!("failed to read flag 'disabled_ro': {}", err);
                    return result;
                }
            };
            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
                Ok(Some(offset)) => offset,
                Ok(None) => {
                    error!("failed to read flag 'disabled_ro', not found in package map");
                    return result;
                },
                Err(err) => {
                    error!("failed to read flag 'disabled_ro': {}", err);
                    return result;
                }
            };
            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
                Ok(val_map) => val_map,
                Err(err) => {
                    error!("failed to read flag 'disabled_ro': {}", err);
                    return result;
                }
            };
            let value = match get_boolean_flag_value(&flag_val_map, 0 + package_offset.boolean_offset) {
                Ok(val) => val,
                Err(err) => {
                    error!("failed to read flag 'disabled_ro': {}", err);
                    return result;
                }
            };
            if false != value {
                let default_value = false;
                error!("flag mismatch for 'disabled_ro'. Legacy storage was {default_value}, new storage was {value}")
            }
        }
        result
        false
    }

    /// query flag disabled_rw
    pub fn disabled_rw(&self) -> bool {
        let result = false;

        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
            return result;
        }

        // This will be called multiple times. Subsequent calls after the first
        // are noops.
        logger::init(
            logger::Config::default()
                .with_tag_on_device(MIGRATION_LOG_TAG)
                .with_max_level(LevelFilter::Info),
        );

        unsafe {
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
                Ok(file) => file,
                Err(err) => {
                    error!("failed to read flag 'disabled_rw': {}", err);
                    return result;
                }
            };
            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
                Ok(Some(offset)) => offset,
                Ok(None) => {
                    error!("failed to read flag 'disabled_rw', not found in package map");
                    return result;
                },
                Err(err) => {
                    error!("failed to read flag 'disabled_rw': {}", err);
                    return result;
                }
            };
            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
                Ok(val_map) => val_map,
                Err(err) => {
                    error!("failed to read flag 'disabled_rw': {}", err);
                    return result;
                }
            };
            let value = match get_boolean_flag_value(&flag_val_map, 1 + package_offset.boolean_offset) {
                Ok(val) => val,
                Err(err) => {
                    error!("failed to read flag 'disabled_rw': {}", err);
                    return result;
                }
            };
            if false != value {
                let default_value = false;
                error!("flag mismatch for 'disabled_rw'. Legacy storage was {default_value}, new storage was {value}")
            }
        }
        result
        false
    }

    /// query flag disabled_rw_in_other_namespace
    pub fn disabled_rw_in_other_namespace(&self) -> bool {
        let result = false;

        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
            return result;
        }

        // This will be called multiple times. Subsequent calls after the first
        // are noops.
        logger::init(
            logger::Config::default()
                .with_tag_on_device(MIGRATION_LOG_TAG)
                .with_max_level(LevelFilter::Info),
        );

        unsafe {
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
                Ok(file) => file,
                Err(err) => {
                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
                    return result;
                }
            };
            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
                Ok(Some(offset)) => offset,
                Ok(None) => {
                    error!("failed to read flag 'disabled_rw_in_other_namespace', not found in package map");
                    return result;
                },
                Err(err) => {
                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
                    return result;
                }
            };
            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
                Ok(val_map) => val_map,
                Err(err) => {
                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
                    return result;
                }
            };
            let value = match get_boolean_flag_value(&flag_val_map, 2 + package_offset.boolean_offset) {
                Ok(val) => val,
                Err(err) => {
                    error!("failed to read flag 'disabled_rw_in_other_namespace': {}", err);
                    return result;
                }
            };
            if false != value {
                let default_value = false;
                error!("flag mismatch for 'disabled_rw_in_other_namespace'. Legacy storage was {default_value}, new storage was {value}")
            }
        }
        result
        false
    }

    /// query flag enabled_fixed_ro
    pub fn enabled_fixed_ro(&self) -> bool {
        let result = true;

        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
            return result;
        }

        // This will be called multiple times. Subsequent calls after the first
        // are noops.
        logger::init(
            logger::Config::default()
                .with_tag_on_device(MIGRATION_LOG_TAG)
                .with_max_level(LevelFilter::Info),
        );

        unsafe {
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
                Ok(file) => file,
                Err(err) => {
                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
                    return result;
                }
            };
            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
                Ok(Some(offset)) => offset,
                Ok(None) => {
                    error!("failed to read flag 'enabled_fixed_ro', not found in package map");
                    return result;
                },
                Err(err) => {
                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
                    return result;
                }
            };
            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
                Ok(val_map) => val_map,
                Err(err) => {
                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
                    return result;
                }
            };
            let value = match get_boolean_flag_value(&flag_val_map, 3 + package_offset.boolean_offset) {
                Ok(val) => val,
                Err(err) => {
                    error!("failed to read flag 'enabled_fixed_ro': {}", err);
                    return result;
                }
            };
            if true != value {
                let default_value = true;
                error!("flag mismatch for 'enabled_fixed_ro'. Legacy storage was {default_value}, new storage was {value}")
            }
        }
        result
        true
    }

    /// query flag enabled_ro
    pub fn enabled_ro(&self) -> bool {
        let result = true;

        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
            return result;
        }

        // This will be called multiple times. Subsequent calls after the first
        // are noops.
        logger::init(
            logger::Config::default()
                .with_tag_on_device(MIGRATION_LOG_TAG)
                .with_max_level(LevelFilter::Info),
        );

        unsafe {
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
                Ok(file) => file,
                Err(err) => {
                    error!("failed to read flag 'enabled_ro': {}", err);
                    return result;
                }
            };
            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
                Ok(Some(offset)) => offset,
                Ok(None) => {
                    error!("failed to read flag 'enabled_ro', not found in package map");
                    return result;
                },
                Err(err) => {
                    error!("failed to read flag 'enabled_ro': {}", err);
                    return result;
                }
            };
            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
                Ok(val_map) => val_map,
                Err(err) => {
                    error!("failed to read flag 'enabled_ro': {}", err);
                    return result;
                }
            };
            let value = match get_boolean_flag_value(&flag_val_map, 4 + package_offset.boolean_offset) {
                Ok(val) => val,
                Err(err) => {
                    error!("failed to read flag 'enabled_ro': {}", err);
                    return result;
                }
            };
            if true != value {
                let default_value = true;
                error!("flag mismatch for 'enabled_ro'. Legacy storage was {default_value}, new storage was {value}")
            }
        }
        result
        true
    }

    /// query flag enabled_rw
    pub fn enabled_rw(&self) -> bool {
        let result = true;

        if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() {
            return result;
        }

        // This will be called multiple times. Subsequent calls after the first
        // are noops.
        logger::init(
            logger::Config::default()
                .with_tag_on_device(MIGRATION_LOG_TAG)
                .with_max_level(LevelFilter::Info),
        );

        unsafe {
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) {
                Ok(file) => file,
                Err(err) => {
                    error!("failed to read flag 'enabled_rw': {}", err);
                    return result;
                }
            };
            let package_offset = match get_package_offset(&package_map, "com.android.aconfig.test") {
                Ok(Some(offset)) => offset,
                Ok(None) => {
                    error!("failed to read flag 'enabled_rw', not found in package map");
                    return result;
                },
                Err(err) => {
                    error!("failed to read flag 'enabled_rw': {}", err);
                    return result;
                }
            };
            let flag_val_map = match get_mapped_storage_file("system", StorageFileType::FlagVal) {
                Ok(val_map) => val_map,
                Err(err) => {
                    error!("failed to read flag 'enabled_rw': {}", err);
                    return result;
                }
            };
            let value = match get_boolean_flag_value(&flag_val_map, 5 + package_offset.boolean_offset) {
                Ok(val) => val,
                Err(err) => {
                    error!("failed to read flag 'enabled_rw': {}", err);
                    return result;
                }
            };
            if true != value {
                let default_value = true;
                error!("flag mismatch for 'enabled_rw'. Legacy storage was {default_value}, new storage was {value}")
            }
        }
        result
        true
    }
}

@@ -1020,16 +705,16 @@ pub fn enabled_rw() -> bool {

    #[test]
    fn test_generate_rust_code_for_test() {
        test_generate_rust_code(CodegenMode::Test, true);
        test_generate_rust_code(CodegenMode::Test, false);
    }

    #[test]
    fn test_generate_rust_code_for_exported() {
        test_generate_rust_code(CodegenMode::Exported, true);
        test_generate_rust_code(CodegenMode::Exported, false);
    }

    #[test]
    fn test_generate_rust_code_for_force_read_only() {
        test_generate_rust_code(CodegenMode::ForceReadOnly, true);
        test_generate_rust_code(CodegenMode::ForceReadOnly, false);
    }
}
+61 −66
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ use log::\{info, error, LevelFilter};

static STORAGE_MIGRATION_MARKER_FILE: &str =
    "/metadata/aconfig/storage_test_mission_1";
static MIGRATION_LOG_TAG: &str = "AconfigStorageTestMission1";
static MIGRATION_LOG_TAG: &str = "AconfigTestMission1";

/// flag provider
pub struct FlagProvider;
@@ -31,21 +31,32 @@ impl FlagProvider \{
{{ for flag in template_flags }}
    /// query flag {flag.name}
    pub fn {flag.name}(&self) -> bool \{
        {{ if not allow_instrumentation }}

        {{ -if flag.readwrite }}
        *CACHED_{flag.name}
        {{ -else }}
        {flag.default_value}
        {{ -endif }}
    }
{{ endfor }}

        {{ else }}
        let result = {{ -if flag.readwrite }} *CACHED_{flag.name}{{ else }} {flag.default_value} {{ -endif }};
}

        {{ if flag.readwrite }}
        result
/// flag provider
pub static PROVIDER: FlagProvider = FlagProvider;

{{ for flag in template_flags }}
/// query flag {flag.name}
#[inline(always)]
{{ -if flag.readwrite }}
pub fn {flag.name}() -> bool \{
    PROVIDER.{flag.name}()
{{ -else }}
pub fn {flag.name}() -> bool \{
    {{ if not allow_instrumentation }}
    {flag.default_value}
    {{ else }}

    let result = {flag.default_value};
    if !Path::new(STORAGE_MIGRATION_MARKER_FILE).exists() \{
        return result;
    }
@@ -59,7 +70,7 @@ impl FlagProvider \{
    );

    unsafe \{
            let package_map = match get_mapped_storage_file("system", StorageFileType::PackageMap) \{
        let package_map = match get_mapped_storage_file("{flag.container}", StorageFileType::PackageMap) \{
            Ok(file) => file,
            Err(err) => \{
                error!("failed to read flag '{flag.name}': \{}", err);
@@ -92,32 +103,16 @@ impl FlagProvider \{
            }
        };

            if {flag.default_value} != value \{
        if result != value \{
            error!("error: flag mismatch for '{flag.name}'. Legacy storage was \{result}, new storage was \{value}")
        } else \{
            let default_value = {flag.default_value};
                error!("flag mismatch for '{flag.name}'. Legacy storage was \{default_value}, new storage was \{value}")
            info!("success! flag '{flag.name}' contained correct value. Legacy storage was \{default_value}, new storage was \{value}")
        }
    }

    result
    {{ endif }}
        {{ endif }}
    }
{{ endfor }}

}

/// flag provider
pub static PROVIDER: FlagProvider = FlagProvider;

{{ for flag in template_flags }}
/// query flag {flag.name}
#[inline(always)]
{{ -if flag.readwrite }}
pub fn {flag.name}() -> bool \{
    PROVIDER.{flag.name}()
{{ -else }}
pub fn {flag.name}() -> bool \{
    {flag.default_value}
{{ -endif }}
}
{{ endfor }}