Merge "aconfig: add exported mode in rust codegen" into main am: 0f1b9da4d9

Original change: https://android-review.googlesource.com/c/platform/build/+/2881246

Change-Id: I64338cd4e7593ce1e0dc635c4f143974d6142044
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Zhi Dou
2023-12-19 19:06:05 +00:00
committed by Automerger Merge Worker
5 changed files with 142 additions and 14 deletions

View File

@@ -259,3 +259,21 @@ rust_test {
],
test_suites: ["general-tests"],
}
rust_aconfig_library {
name: "libaconfig_test_rust_library_with_exported_mode",
crate_name: "aconfig_test_rust_library",
aconfig_declarations: "aconfig.test.flags",
mode: "exported",
}
rust_test {
name: "aconfig.exported_mode.test.rust",
srcs: [
"tests/aconfig_exported_mode_test.rs"
],
rustlibs: [
"libaconfig_test_rust_library_with_exported_mode",
],
test_suites: ["general-tests"],
}

View File

@@ -45,9 +45,7 @@ where
match codegen_mode {
CodegenMode::Production => include_str!("../../templates/rust_prod.template"),
CodegenMode::Test => include_str!("../../templates/rust_test.template"),
CodegenMode::Exported => {
todo!("exported mode not yet supported for rust, see b/313894653.")
}
CodegenMode::Exported => include_str!("../../templates/rust_exported.template"),
},
)?;
let contents = template.render("rust_code_gen", &context)?;
@@ -487,16 +485,81 @@ pub fn set_enabled_rw(val: bool) {
pub fn reset_flags() {
PROVIDER.lock().unwrap().reset_flags()
}
"#;
const EXPORTED_EXPECTED: &str = r#"
//! codegenerated rust flag lib
/// flag provider
pub struct FlagProvider;
lazy_static::lazy_static! {
/// flag value cache for disabled_rw_exported
static ref CACHED_disabled_rw_exported: bool = flags_rust::GetServerConfigurableFlag(
"aconfig_flags.aconfig_test",
"com.android.aconfig.test.disabled_rw_exported",
"false") == "true";
/// flag value cache for enabled_fixed_ro_exported
static ref CACHED_enabled_fixed_ro_exported: bool = flags_rust::GetServerConfigurableFlag(
"aconfig_flags.aconfig_test",
"com.android.aconfig.test.enabled_fixed_ro_exported",
"false") == "true";
/// flag value cache for enabled_ro_exported
static ref CACHED_enabled_ro_exported: bool = flags_rust::GetServerConfigurableFlag(
"aconfig_flags.aconfig_test",
"com.android.aconfig.test.enabled_ro_exported",
"false") == "true";
}
impl FlagProvider {
/// query flag disabled_rw_exported
pub fn disabled_rw_exported(&self) -> bool {
*CACHED_disabled_rw_exported
}
/// query flag enabled_fixed_ro_exported
pub fn enabled_fixed_ro_exported(&self) -> bool {
*CACHED_enabled_fixed_ro_exported
}
/// query flag enabled_ro_exported
pub fn enabled_ro_exported(&self) -> bool {
*CACHED_enabled_ro_exported
}
}
/// flag provider
pub static PROVIDER: FlagProvider = FlagProvider;
/// query flag disabled_rw_exported
#[inline(always)]
pub fn disabled_rw_exported() -> bool {
PROVIDER.disabled_rw_exported()
}
/// query flag enabled_fixed_ro_exported
#[inline(always)]
pub fn enabled_fixed_ro_exported() -> bool {
PROVIDER.enabled_fixed_ro_exported()
}
/// query flag enabled_ro_exported
#[inline(always)]
pub fn enabled_ro_exported() -> bool {
PROVIDER.enabled_ro_exported()
}
"#;
fn test_generate_rust_code(mode: CodegenMode) {
let parsed_flags = crate::test::parse_test_flags();
let generated = generate_rust_code(
crate::test::TEST_PACKAGE,
parsed_flags.parsed_flag.into_iter(),
mode,
)
.unwrap();
let modified_parsed_flags =
crate::commands::modify_parsed_flags_based_on_mode(parsed_flags, mode);
let generated =
generate_rust_code(crate::test::TEST_PACKAGE, modified_parsed_flags.into_iter(), mode)
.unwrap();
assert_eq!("src/lib.rs", format!("{}", generated.path.display()));
assert_eq!(
None,
@@ -504,8 +567,7 @@ pub fn reset_flags() {
match mode {
CodegenMode::Production => PROD_EXPECTED,
CodegenMode::Test => TEST_EXPECTED,
CodegenMode::Exported =>
todo!("exported mode not yet supported for rust, see b/313894653."),
CodegenMode::Exported => EXPORTED_EXPECTED,
},
&String::from_utf8(generated.contents).unwrap()
)
@@ -521,4 +583,9 @@ pub fn reset_flags() {
fn test_generate_rust_code_for_test() {
test_generate_rust_code(CodegenMode::Test);
}
#[test]
fn test_generate_rust_code_for_exported() {
test_generate_rust_code(CodegenMode::Exported);
}
}

View File

@@ -217,12 +217,12 @@ pub fn create_cpp_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<Vec
pub fn create_rust_lib(mut input: Input, codegen_mode: CodegenMode) -> Result<OutputFile> {
let parsed_flags = input.try_parse_flags()?;
let filtered_parsed_flags = filter_parsed_flags(parsed_flags, codegen_mode);
let Some(package) = find_unique_package(&filtered_parsed_flags) else {
let modified_parsed_flags = modify_parsed_flags_based_on_mode(parsed_flags, codegen_mode);
let Some(package) = find_unique_package(&modified_parsed_flags) else {
bail!("no parsed flags, or the parsed flags use different packages");
};
let package = package.to_string();
generate_rust_code(&package, filtered_parsed_flags.into_iter(), codegen_mode)
generate_rust_code(&package, modified_parsed_flags.into_iter(), codegen_mode)
}
pub fn create_storage(caches: Vec<Input>, container: &str) -> Result<Vec<OutputFile>> {

View File

@@ -0,0 +1,36 @@
//! codegenerated rust flag lib
/// flag provider
pub struct FlagProvider;
lazy_static::lazy_static! \{
{{ for flag in template_flags }}
/// flag value cache for {flag.name}
static ref CACHED_{flag.name}: bool = flags_rust::GetServerConfigurableFlag(
"aconfig_flags.{flag.device_config_namespace}",
"{flag.device_config_flag}",
"false") == "true";
{{ endfor }}
}
impl FlagProvider \{
{{ for flag in template_flags }}
/// query flag {flag.name}
pub fn {flag.name}(&self) -> bool \{
*CACHED_{flag.name}
}
{{ endfor }}
}
/// flag provider
pub static PROVIDER: FlagProvider = FlagProvider;
{{ for flag in template_flags }}
/// query flag {flag.name}
#[inline(always)]
pub fn {flag.name}() -> bool \{
PROVIDER.{flag.name}()
}
{{ endfor }}

View File

@@ -0,0 +1,7 @@
#[cfg(not(feature = "cargo"))]
#[test]
fn test_flags() {
assert!(!aconfig_test_rust_library::disabled_rw_exported());
assert!(!aconfig_test_rust_library::enabled_fixed_ro_exported());
assert!(!aconfig_test_rust_library::enabled_ro_exported());
}