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

Commit 3dbe3117 authored by Marybeth Fair's avatar Marybeth Fair
Browse files

Write fingerprint to package map.

Write fingerprint to package.map fingerprint field. This involves some
re-work of how the fingerprint is calculated. Guard the write with a
new arg in create-storage, enable-fingerprint. The default value for
enable-fingerprint is false, and I haven't updated the build code to
pass in anything, so none of this code should run right now. Next step
is to create a build flag and use that to set enable-fingerprint so we
can roll out this change. Then, I will use the fingerprint in codegen as
well.

Bug: 316357686
Test: atest
Change-Id: Ie3a290864d4f971a3f1d070edb4dcefec36f05b6
parent 03b57b0f
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -427,14 +427,14 @@ where
                    // protect hardcoded offset reads.
                    // Creates a fingerprint of the flag names (which requires sorting the vector).
                    // Fingerprint is used by both codegen and storage files.
pub fn compute_flags_fingerprint(flag_names: &mut Vec<String>) -> Result<u64> {
pub fn compute_flags_fingerprint(flag_names: &mut Vec<String>) -> u64 {
    flag_names.sort();

    let mut hasher = SipHasher13::new();
    for flag in flag_names {
        hasher.write(flag.as_bytes());
    }
    Ok(hasher.finish())
    hasher.finish()
}

#[allow(dead_code)] // TODO: b/316357686 - Use fingerprint in codegen to
@@ -466,7 +466,7 @@ mod tests {
        let mut extracted_flags = extract_flag_names(parsed_flags).unwrap();
        let hash_result = compute_flags_fingerprint(&mut extracted_flags);

        assert_eq!(hash_result.unwrap(), expected_fingerprint);
        assert_eq!(hash_result, expected_fingerprint);
    }

    #[test]
@@ -487,7 +487,7 @@ mod tests {
        let result_from_names = compute_flags_fingerprint(&mut flag_names_vec);

        // Assert the same hash is generated for each case.
        assert_eq!(result_from_parsed_flags.unwrap(), result_from_names.unwrap());
        assert_eq!(result_from_parsed_flags, result_from_names);
    }

    #[test]
@@ -497,9 +497,9 @@ mod tests {
        let second_parsed_flags = crate::test::parse_second_package_flags();

        let mut extracted_flags = extract_flag_names(parsed_flags).unwrap();
        let result_from_parsed_flags = compute_flags_fingerprint(&mut extracted_flags).unwrap();
        let result_from_parsed_flags = compute_flags_fingerprint(&mut extracted_flags);
        let mut second_extracted_flags = extract_flag_names(second_parsed_flags).unwrap();
        let second_result = compute_flags_fingerprint(&mut second_extracted_flags).unwrap();
        let second_result = compute_flags_fingerprint(&mut second_extracted_flags);

        // Different flags should have a different fingerprint.
        assert_ne!(result_from_parsed_flags, second_result);
+1 −1
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ mod tests {

    pub fn create_test_flag_info_list_from_source() -> Result<FlagInfoList> {
        let caches = parse_all_test_flags();
        let packages = group_flags_by_package(caches.iter());
        let packages = group_flags_by_package(caches.iter(), DEFAULT_FILE_VERSION);
        create_flag_info("mockup", &packages, DEFAULT_FILE_VERSION)
    }

+1 −1
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ mod tests {

    fn create_test_flag_table_from_source() -> Result<FlagTable> {
        let caches = parse_all_test_flags();
        let packages = group_flags_by_package(caches.iter());
        let packages = group_flags_by_package(caches.iter(), DEFAULT_FILE_VERSION);
        create_flag_table("mockup", &packages, DEFAULT_FILE_VERSION)
    }

+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ mod tests {

    pub fn create_test_flag_value_list_from_source() -> Result<FlagValueList> {
        let caches = parse_all_test_flags();
        let packages = group_flags_by_package(caches.iter());
        let packages = group_flags_by_package(caches.iter(), DEFAULT_FILE_VERSION);
        create_flag_value("mockup", &packages, DEFAULT_FILE_VERSION)
    }

+13 −5
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ pub mod package_table;
use anyhow::Result;
use std::collections::{HashMap, HashSet};

use crate::commands::compute_flags_fingerprint;
use crate::storage::{
    flag_info::create_flag_info, flag_table::create_flag_table, flag_value::create_flag_value,
    package_table::create_package_table,
@@ -59,7 +60,7 @@ impl<'a> FlagPackage<'a> {
    }
}

pub fn group_flags_by_package<'a, I>(parsed_flags_vec_iter: I) -> Vec<FlagPackage<'a>>
pub fn group_flags_by_package<'a, I>(parsed_flags_vec_iter: I, version: u32) -> Vec<FlagPackage<'a>>
where
    I: Iterator<Item = &'a ProtoParsedFlags>,
{
@@ -76,13 +77,18 @@ where
        }
    }

    // cacluate boolean flag start index for each package
    // Calculate boolean flag start index for each package
    let mut boolean_start_index = 0;
    for p in packages.iter_mut() {
        p.boolean_start_index = boolean_start_index;
        boolean_start_index += p.boolean_flags.len() as u32;

        // TODO: b/316357686 - Calculate fingerprint and add to package.
        if version > 2 {
            let mut flag_names_vec =
                p.flag_names.clone().into_iter().map(String::from).collect::<Vec<_>>();
            let fingerprint = compute_flags_fingerprint(&mut flag_names_vec);
            p.fingerprint = fingerprint;
        }
    }

    packages
@@ -97,7 +103,7 @@ pub fn generate_storage_file<'a, I>(
where
    I: Iterator<Item = &'a ProtoParsedFlags>,
{
    let packages = group_flags_by_package(parsed_flags_vec_iter);
    let packages = group_flags_by_package(parsed_flags_vec_iter, version);

    match file {
        StorageFileType::PackageMap => {
@@ -121,6 +127,8 @@ where

#[cfg(test)]
mod tests {
    use aconfig_storage_file::DEFAULT_FILE_VERSION;

    use super::*;
    use crate::Input;

@@ -173,7 +181,7 @@ mod tests {
    #[test]
    fn test_flag_package() {
        let caches = parse_all_test_flags();
        let packages = group_flags_by_package(caches.iter());
        let packages = group_flags_by_package(caches.iter(), DEFAULT_FILE_VERSION);

        for pkg in packages.iter() {
            let pkg_name = pkg.package_name;
Loading