Loading tools/aconfig/aconfig_storage_file/aconfig_storage_file.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,29 @@ using namespace android::base; namespace aconfig_storage { Result<std::vector<FlagValueSummary>> list_flags( const std::string& package_map, const std::string& flag_map, const std::string& flag_val) { auto flag_list_cxx = list_flags_cxx(rust::Str(package_map.c_str()), rust::Str(flag_map.c_str()), rust::Str(flag_val.c_str())); if (flag_list_cxx.query_success) { auto flag_list = std::vector<FlagValueSummary>(); for (const auto& flag_cxx : flag_list_cxx.flags) { auto flag = FlagValueSummary(); flag.package_name = std::string(flag_cxx.package_name); flag.flag_name = std::string(flag_cxx.flag_name); flag.flag_value = std::string(flag_cxx.flag_value); flag.value_type = std::string(flag_cxx.value_type); flag_list.push_back(flag); } return flag_list; } else { return Error() << flag_list_cxx.error_message; } } Result<std::vector<FlagValueAndInfoSummary>> list_flags_with_info( const std::string& package_map, const std::string& flag_map, Loading tools/aconfig/aconfig_storage_file/include/aconfig_storage/aconfig_storage_file.hpp +17 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,23 @@ namespace aconfig_storage { /// Flag value summary for a flag struct FlagValueSummary { std::string package_name; std::string flag_name; std::string flag_value; std::string value_type; }; /// List all flag values /// \input package_map: package map file /// \input flag_map: flag map file /// \input flag_val: flag value file android::base::Result<std::vector<FlagValueSummary>> list_flags( const std::string& package_map, const std::string& flag_map, const std::string& flag_val); /// Flag value and info summary for a flag struct FlagValueAndInfoSummary { std::string package_name; Loading tools/aconfig/aconfig_storage_file/src/lib.rs +53 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,14 @@ pub fn list_flags_with_info( // Exported rust data structure and methods, c++ code will be generated #[cxx::bridge] mod ffi { /// flag value summary cxx return pub struct FlagValueSummaryCXX { pub package_name: String, pub flag_name: String, pub flag_value: String, pub value_type: String, } /// flag value and info summary cxx return pub struct FlagValueAndInfoSummaryCXX { pub package_name: String, Loading @@ -394,6 +402,13 @@ mod ffi { } /// list flag result cxx return pub struct ListFlagValueResultCXX { pub query_success: bool, pub error_message: String, pub flags: Vec<FlagValueSummaryCXX>, } /// list flag with info result cxx return pub struct ListFlagValueAndInfoResultCXX { pub query_success: bool, pub error_message: String, Loading @@ -402,6 +417,12 @@ mod ffi { // Rust export to c++ extern "Rust" { pub fn list_flags_cxx( package_map: &str, flag_map: &str, flag_val: &str, ) -> ListFlagValueResultCXX; pub fn list_flags_with_info_cxx( package_map: &str, flag_map: &str, Loading @@ -411,6 +432,18 @@ mod ffi { } } /// implement flag value summary cxx return type impl ffi::FlagValueSummaryCXX { pub(crate) fn new(summary: FlagValueSummary) -> Self { Self { package_name: summary.package_name, flag_name: summary.flag_name, flag_value: summary.flag_value, value_type: format!("{:?}", summary.value_type), } } } /// implement flag value and info summary cxx return type impl ffi::FlagValueAndInfoSummaryCXX { pub(crate) fn new(summary: FlagValueAndInfoSummary) -> Self { Loading @@ -426,6 +459,26 @@ impl ffi::FlagValueAndInfoSummaryCXX { } } /// implement list flag cxx interlop pub fn list_flags_cxx( package_map: &str, flag_map: &str, flag_val: &str, ) -> ffi::ListFlagValueResultCXX { match list_flags(package_map, flag_map, flag_val) { Ok(summary) => ffi::ListFlagValueResultCXX { query_success: true, error_message: String::new(), flags: summary.into_iter().map(ffi::FlagValueSummaryCXX::new).collect(), }, Err(errmsg) => ffi::ListFlagValueResultCXX { query_success: false, error_message: format!("{:?}", errmsg), flags: Vec::new(), }, } } /// implement list flag with info cxx interlop pub fn list_flags_with_info_cxx( package_map: &str, Loading tools/aconfig/aconfig_storage_file/tests/storage_file_test.cpp +63 −24 Original line number Diff line number Diff line Loading @@ -24,8 +24,18 @@ using namespace android::base; using namespace aconfig_storage; void verify_value(const FlagValueSummary& flag, const std::string& package_name, const std::string& flag_name, const std::string& flag_val, const std::string& value_type) { ASSERT_EQ(flag.package_name, package_name); ASSERT_EQ(flag.flag_name, flag_name); ASSERT_EQ(flag.flag_value, flag_val); ASSERT_EQ(flag.value_type, value_type); } void verify_flag(const FlagValueAndInfoSummary& flag, void verify_value_info(const FlagValueAndInfoSummary& flag, const std::string& package_name, const std::string& flag_name, const std::string& flag_val, Loading @@ -42,6 +52,35 @@ void verify_flag(const FlagValueAndInfoSummary& flag, ASSERT_EQ(flag.has_local_override, has_local_override); } TEST(AconfigStorageFileTest, test_list_flag) { auto const test_dir = GetExecutableDirectory(); auto const package_map = test_dir + "/package.map"; auto const flag_map = test_dir + "/flag.map"; auto const flag_val = test_dir + "/flag.val"; auto flag_list_result = aconfig_storage::list_flags( package_map, flag_map, flag_val); ASSERT_TRUE(flag_list_result.ok()); auto const& flag_list = *flag_list_result; ASSERT_EQ(flag_list.size(), 8); verify_value(flag_list[0], "com.android.aconfig.storage.test_1", "disabled_rw", "false", "ReadWriteBoolean"); verify_value(flag_list[1], "com.android.aconfig.storage.test_1", "enabled_ro", "true", "ReadOnlyBoolean"); verify_value(flag_list[2], "com.android.aconfig.storage.test_1", "enabled_rw", "true", "ReadWriteBoolean"); verify_value(flag_list[3], "com.android.aconfig.storage.test_2", "disabled_rw", "false", "ReadWriteBoolean"); verify_value(flag_list[4], "com.android.aconfig.storage.test_2", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean"); verify_value(flag_list[5], "com.android.aconfig.storage.test_2", "enabled_ro", "true", "ReadOnlyBoolean"); verify_value(flag_list[6], "com.android.aconfig.storage.test_4", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean"); verify_value(flag_list[7], "com.android.aconfig.storage.test_4", "enabled_rw", "true", "ReadWriteBoolean"); } TEST(AconfigStorageFileTest, test_list_flag_with_info) { auto const test_dir = GetExecutableDirectory(); auto const package_map = test_dir + "/package.map"; Loading @@ -54,20 +93,20 @@ TEST(AconfigStorageFileTest, test_list_flag_with_info) { auto const& flag_list = *flag_list_result; ASSERT_EQ(flag_list.size(), 8); verify_flag(flag_list[0], "com.android.aconfig.storage.test_1", "disabled_rw", verify_value_info(flag_list[0], "com.android.aconfig.storage.test_1", "disabled_rw", "false", "ReadWriteBoolean", true, false, false); verify_flag(flag_list[1], "com.android.aconfig.storage.test_1", "enabled_ro", verify_value_info(flag_list[1], "com.android.aconfig.storage.test_1", "enabled_ro", "true", "ReadOnlyBoolean", false, false, false); verify_flag(flag_list[2], "com.android.aconfig.storage.test_1", "enabled_rw", verify_value_info(flag_list[2], "com.android.aconfig.storage.test_1", "enabled_rw", "true", "ReadWriteBoolean", true, false, false); verify_flag(flag_list[3], "com.android.aconfig.storage.test_2", "disabled_rw", verify_value_info(flag_list[3], "com.android.aconfig.storage.test_2", "disabled_rw", "false", "ReadWriteBoolean", true, false, false); verify_flag(flag_list[4], "com.android.aconfig.storage.test_2", "enabled_fixed_ro", verify_value_info(flag_list[4], "com.android.aconfig.storage.test_2", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean", false, false, false); verify_flag(flag_list[5], "com.android.aconfig.storage.test_2", "enabled_ro", verify_value_info(flag_list[5], "com.android.aconfig.storage.test_2", "enabled_ro", "true", "ReadOnlyBoolean", false, false, false); verify_flag(flag_list[6], "com.android.aconfig.storage.test_4", "enabled_fixed_ro", verify_value_info(flag_list[6], "com.android.aconfig.storage.test_4", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean", false, false, false); verify_flag(flag_list[7], "com.android.aconfig.storage.test_4", "enabled_rw", verify_value_info(flag_list[7], "com.android.aconfig.storage.test_4", "enabled_rw", "true", "ReadWriteBoolean", true, false, false); } Loading
tools/aconfig/aconfig_storage_file/aconfig_storage_file.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,29 @@ using namespace android::base; namespace aconfig_storage { Result<std::vector<FlagValueSummary>> list_flags( const std::string& package_map, const std::string& flag_map, const std::string& flag_val) { auto flag_list_cxx = list_flags_cxx(rust::Str(package_map.c_str()), rust::Str(flag_map.c_str()), rust::Str(flag_val.c_str())); if (flag_list_cxx.query_success) { auto flag_list = std::vector<FlagValueSummary>(); for (const auto& flag_cxx : flag_list_cxx.flags) { auto flag = FlagValueSummary(); flag.package_name = std::string(flag_cxx.package_name); flag.flag_name = std::string(flag_cxx.flag_name); flag.flag_value = std::string(flag_cxx.flag_value); flag.value_type = std::string(flag_cxx.value_type); flag_list.push_back(flag); } return flag_list; } else { return Error() << flag_list_cxx.error_message; } } Result<std::vector<FlagValueAndInfoSummary>> list_flags_with_info( const std::string& package_map, const std::string& flag_map, Loading
tools/aconfig/aconfig_storage_file/include/aconfig_storage/aconfig_storage_file.hpp +17 −0 Original line number Diff line number Diff line Loading @@ -6,6 +6,23 @@ namespace aconfig_storage { /// Flag value summary for a flag struct FlagValueSummary { std::string package_name; std::string flag_name; std::string flag_value; std::string value_type; }; /// List all flag values /// \input package_map: package map file /// \input flag_map: flag map file /// \input flag_val: flag value file android::base::Result<std::vector<FlagValueSummary>> list_flags( const std::string& package_map, const std::string& flag_map, const std::string& flag_val); /// Flag value and info summary for a flag struct FlagValueAndInfoSummary { std::string package_name; Loading
tools/aconfig/aconfig_storage_file/src/lib.rs +53 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,14 @@ pub fn list_flags_with_info( // Exported rust data structure and methods, c++ code will be generated #[cxx::bridge] mod ffi { /// flag value summary cxx return pub struct FlagValueSummaryCXX { pub package_name: String, pub flag_name: String, pub flag_value: String, pub value_type: String, } /// flag value and info summary cxx return pub struct FlagValueAndInfoSummaryCXX { pub package_name: String, Loading @@ -394,6 +402,13 @@ mod ffi { } /// list flag result cxx return pub struct ListFlagValueResultCXX { pub query_success: bool, pub error_message: String, pub flags: Vec<FlagValueSummaryCXX>, } /// list flag with info result cxx return pub struct ListFlagValueAndInfoResultCXX { pub query_success: bool, pub error_message: String, Loading @@ -402,6 +417,12 @@ mod ffi { // Rust export to c++ extern "Rust" { pub fn list_flags_cxx( package_map: &str, flag_map: &str, flag_val: &str, ) -> ListFlagValueResultCXX; pub fn list_flags_with_info_cxx( package_map: &str, flag_map: &str, Loading @@ -411,6 +432,18 @@ mod ffi { } } /// implement flag value summary cxx return type impl ffi::FlagValueSummaryCXX { pub(crate) fn new(summary: FlagValueSummary) -> Self { Self { package_name: summary.package_name, flag_name: summary.flag_name, flag_value: summary.flag_value, value_type: format!("{:?}", summary.value_type), } } } /// implement flag value and info summary cxx return type impl ffi::FlagValueAndInfoSummaryCXX { pub(crate) fn new(summary: FlagValueAndInfoSummary) -> Self { Loading @@ -426,6 +459,26 @@ impl ffi::FlagValueAndInfoSummaryCXX { } } /// implement list flag cxx interlop pub fn list_flags_cxx( package_map: &str, flag_map: &str, flag_val: &str, ) -> ffi::ListFlagValueResultCXX { match list_flags(package_map, flag_map, flag_val) { Ok(summary) => ffi::ListFlagValueResultCXX { query_success: true, error_message: String::new(), flags: summary.into_iter().map(ffi::FlagValueSummaryCXX::new).collect(), }, Err(errmsg) => ffi::ListFlagValueResultCXX { query_success: false, error_message: format!("{:?}", errmsg), flags: Vec::new(), }, } } /// implement list flag with info cxx interlop pub fn list_flags_with_info_cxx( package_map: &str, Loading
tools/aconfig/aconfig_storage_file/tests/storage_file_test.cpp +63 −24 Original line number Diff line number Diff line Loading @@ -24,8 +24,18 @@ using namespace android::base; using namespace aconfig_storage; void verify_value(const FlagValueSummary& flag, const std::string& package_name, const std::string& flag_name, const std::string& flag_val, const std::string& value_type) { ASSERT_EQ(flag.package_name, package_name); ASSERT_EQ(flag.flag_name, flag_name); ASSERT_EQ(flag.flag_value, flag_val); ASSERT_EQ(flag.value_type, value_type); } void verify_flag(const FlagValueAndInfoSummary& flag, void verify_value_info(const FlagValueAndInfoSummary& flag, const std::string& package_name, const std::string& flag_name, const std::string& flag_val, Loading @@ -42,6 +52,35 @@ void verify_flag(const FlagValueAndInfoSummary& flag, ASSERT_EQ(flag.has_local_override, has_local_override); } TEST(AconfigStorageFileTest, test_list_flag) { auto const test_dir = GetExecutableDirectory(); auto const package_map = test_dir + "/package.map"; auto const flag_map = test_dir + "/flag.map"; auto const flag_val = test_dir + "/flag.val"; auto flag_list_result = aconfig_storage::list_flags( package_map, flag_map, flag_val); ASSERT_TRUE(flag_list_result.ok()); auto const& flag_list = *flag_list_result; ASSERT_EQ(flag_list.size(), 8); verify_value(flag_list[0], "com.android.aconfig.storage.test_1", "disabled_rw", "false", "ReadWriteBoolean"); verify_value(flag_list[1], "com.android.aconfig.storage.test_1", "enabled_ro", "true", "ReadOnlyBoolean"); verify_value(flag_list[2], "com.android.aconfig.storage.test_1", "enabled_rw", "true", "ReadWriteBoolean"); verify_value(flag_list[3], "com.android.aconfig.storage.test_2", "disabled_rw", "false", "ReadWriteBoolean"); verify_value(flag_list[4], "com.android.aconfig.storage.test_2", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean"); verify_value(flag_list[5], "com.android.aconfig.storage.test_2", "enabled_ro", "true", "ReadOnlyBoolean"); verify_value(flag_list[6], "com.android.aconfig.storage.test_4", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean"); verify_value(flag_list[7], "com.android.aconfig.storage.test_4", "enabled_rw", "true", "ReadWriteBoolean"); } TEST(AconfigStorageFileTest, test_list_flag_with_info) { auto const test_dir = GetExecutableDirectory(); auto const package_map = test_dir + "/package.map"; Loading @@ -54,20 +93,20 @@ TEST(AconfigStorageFileTest, test_list_flag_with_info) { auto const& flag_list = *flag_list_result; ASSERT_EQ(flag_list.size(), 8); verify_flag(flag_list[0], "com.android.aconfig.storage.test_1", "disabled_rw", verify_value_info(flag_list[0], "com.android.aconfig.storage.test_1", "disabled_rw", "false", "ReadWriteBoolean", true, false, false); verify_flag(flag_list[1], "com.android.aconfig.storage.test_1", "enabled_ro", verify_value_info(flag_list[1], "com.android.aconfig.storage.test_1", "enabled_ro", "true", "ReadOnlyBoolean", false, false, false); verify_flag(flag_list[2], "com.android.aconfig.storage.test_1", "enabled_rw", verify_value_info(flag_list[2], "com.android.aconfig.storage.test_1", "enabled_rw", "true", "ReadWriteBoolean", true, false, false); verify_flag(flag_list[3], "com.android.aconfig.storage.test_2", "disabled_rw", verify_value_info(flag_list[3], "com.android.aconfig.storage.test_2", "disabled_rw", "false", "ReadWriteBoolean", true, false, false); verify_flag(flag_list[4], "com.android.aconfig.storage.test_2", "enabled_fixed_ro", verify_value_info(flag_list[4], "com.android.aconfig.storage.test_2", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean", false, false, false); verify_flag(flag_list[5], "com.android.aconfig.storage.test_2", "enabled_ro", verify_value_info(flag_list[5], "com.android.aconfig.storage.test_2", "enabled_ro", "true", "ReadOnlyBoolean", false, false, false); verify_flag(flag_list[6], "com.android.aconfig.storage.test_4", "enabled_fixed_ro", verify_value_info(flag_list[6], "com.android.aconfig.storage.test_4", "enabled_fixed_ro", "true", "FixedReadOnlyBoolean", false, false, false); verify_flag(flag_list[7], "com.android.aconfig.storage.test_4", "enabled_rw", verify_value_info(flag_list[7], "com.android.aconfig.storage.test_4", "enabled_rw", "true", "ReadWriteBoolean", true, false, false); }