Merge "aconfig: update c/c++ codegen" into main
diff --git a/tools/aconfig/src/codegen_cpp.rs b/tools/aconfig/src/codegen_cpp.rs
index 979b8ad..ff9e8ef 100644
--- a/tools/aconfig/src/codegen_cpp.rs
+++ b/tools/aconfig/src/codegen_cpp.rs
@@ -42,7 +42,7 @@
         cpp_namespace,
         package: package.to_string(),
         readwrite,
-        for_prod: codegen_mode == CodegenMode::Production,
+        for_test: codegen_mode == CodegenMode::Test,
         class_elements,
     };
 
@@ -102,7 +102,7 @@
     pub cpp_namespace: String,
     pub package: String,
     pub readwrite: bool,
-    pub for_prod: bool,
+    pub for_test: bool,
     pub class_elements: Vec<ClassElement>,
 }
 
@@ -111,7 +111,6 @@
     pub readwrite: bool,
     pub default_value: String,
     pub flag_name: String,
-    pub uppercase_flag_name: String,
     pub device_config_namespace: String,
     pub device_config_flag: String,
 }
@@ -125,7 +124,6 @@
             "false".to_string()
         },
         flag_name: pf.name().to_string(),
-        uppercase_flag_name: pf.name().to_string().to_ascii_uppercase(),
         device_config_namespace: pf.namespace().to_string(),
         device_config_flag: codegen::create_device_config_ident(package, pf.name())
             .expect("values checked at flag parse time"),
@@ -157,19 +155,10 @@
     virtual bool enabled_ro() = 0;
 
     virtual bool enabled_rw() = 0;
-
-    virtual void override_flag(std::string const&, bool) {}
-
-    virtual void reset_overrides() {}
 };
 
 extern std::unique_ptr<flag_provider_interface> provider_;
 
-extern std::string const DISABLED_RO;
-extern std::string const DISABLED_RW;
-extern std::string const ENABLED_RO;
-extern std::string const ENABLED_RW;
-
 inline bool disabled_ro() {
     return false;
 }
@@ -186,14 +175,6 @@
     return provider_->enabled_rw();
 }
 
-inline void override_flag(std::string const& name, bool val) {
-    return provider_->override_flag(name, val);
-}
-
-inline void reset_overrides() {
-    return provider_->reset_overrides();
-}
-
 }
 #endif
 "#;
@@ -213,46 +194,59 @@
 
     virtual bool disabled_ro() = 0;
 
+    virtual void disabled_ro(bool val) = 0;
+
     virtual bool disabled_rw() = 0;
 
+    virtual void disabled_rw(bool val) = 0;
+
     virtual bool enabled_ro() = 0;
 
+    virtual void enabled_ro(bool val) = 0;
+
     virtual bool enabled_rw() = 0;
 
-    virtual void override_flag(std::string const&, bool) {}
+    virtual void enabled_rw(bool val) = 0;
 
-    virtual void reset_overrides() {}
+    virtual void reset_flags() {}
 };
 
 extern std::unique_ptr<flag_provider_interface> provider_;
 
-extern std::string const DISABLED_RO;
-extern std::string const DISABLED_RW;
-extern std::string const ENABLED_RO;
-extern std::string const ENABLED_RW;
-
 inline bool disabled_ro() {
     return provider_->disabled_ro();
 }
 
+inline void disabled_ro(bool val) {
+    provider_->disabled_ro(val);
+}
+
 inline bool disabled_rw() {
     return provider_->disabled_rw();
 }
 
+inline void disabled_rw(bool val) {
+    provider_->disabled_rw(val);
+}
+
 inline bool enabled_ro() {
     return provider_->enabled_ro();
 }
 
+inline void enabled_ro(bool val) {
+    provider_->enabled_ro(val);
+}
+
 inline bool enabled_rw() {
     return provider_->enabled_rw();
 }
 
-inline void override_flag(std::string const& name, bool val) {
-    return provider_->override_flag(name, val);
+inline void enabled_rw(bool val) {
+    provider_->enabled_rw(val);
 }
 
-inline void reset_overrides() {
-    return provider_->reset_overrides();
+inline void reset_flags() {
+    return provider_->reset_flags();
 }
 
 }
@@ -306,28 +300,20 @@
 using namespace server_configurable_flags;
 
 #include <unordered_map>
-#include <unordered_set>
-#include <cassert>
 
 namespace com::android::aconfig::test {
 class flag_provider : public flag_provider_interface {
 private:
     std::unordered_map<std::string, bool> overrides_;
-    std::unordered_set<std::string> flag_names_;
 
 public:
 
     flag_provider()
-        : overrides_(),
-          flag_names_() {
-        flag_names_.insert(DISABLED_RO);
-        flag_names_.insert(DISABLED_RW);
-        flag_names_.insert(ENABLED_RO);
-        flag_names_.insert(ENABLED_RW);
-    }
+        : overrides_()
+    {}
 
     virtual bool disabled_ro() override {
-        auto it = overrides_.find(DISABLED_RO);
+        auto it = overrides_.find("disabled_ro");
         if (it != overrides_.end()) {
             return it->second;
         } else {
@@ -335,8 +321,12 @@
         }
     }
 
+    virtual void disabled_ro(bool val) override {
+        overrides_["disabled_ro"] = val;
+    }
+
     virtual bool disabled_rw() override {
-        auto it = overrides_.find(DISABLED_RW);
+        auto it = overrides_.find("disabled_rw");
         if (it != overrides_.end()) {
             return it->second;
         } else {
@@ -347,8 +337,12 @@
         }
     }
 
+    virtual void disabled_rw(bool val) override {
+        overrides_["disabled_rw"] = val;
+    }
+
     virtual bool enabled_ro() override {
-        auto it = overrides_.find(ENABLED_RO);
+        auto it = overrides_.find("enabled_ro");
         if (it != overrides_.end()) {
             return it->second;
         } else {
@@ -356,8 +350,12 @@
         }
     }
 
+    virtual void enabled_ro(bool val) override {
+        overrides_["enabled_ro"] = val;
+    }
+
     virtual bool enabled_rw() override {
-        auto it = overrides_.find(ENABLED_RW);
+        auto it = overrides_.find("enabled_rw");
         if (it != overrides_.end()) {
             return it->second;
         } else {
@@ -368,12 +366,11 @@
         }
     }
 
-    virtual void override_flag(std::string const& flag, bool val) override {
-        assert(flag_names_.count(flag));
-        overrides_[flag] = val;
+    virtual void enabled_rw(bool val) override {
+        overrides_["enabled_rw"] = val;
     }
 
-    virtual void reset_overrides() override {
+    virtual void reset_flags() override {
         overrides_.clear();
     }
 };
@@ -386,18 +383,12 @@
 #include "com_android_aconfig_test_flag_provider.h"
 
 namespace com::android::aconfig::test {
-
-    std::string const DISABLED_RO = "com.android.aconfig.test.disabled_ro";
-    std::string const DISABLED_RW = "com.android.aconfig.test.disabled_rw";
-    std::string const ENABLED_RO = "com.android.aconfig.test.enabled_ro";
-    std::string const ENABLED_RW = "com.android.aconfig.test.enabled_rw";
-
     std::unique_ptr<flag_provider_interface> provider_ =
         std::make_unique<flag_provider>();
 }
 "#;
 
-    const C_EXPORTED_HEADER_EXPECTED: &str = r#"
+    const C_EXPORTED_PROD_HEADER_EXPECTED: &str = r#"
 #ifndef com_android_aconfig_test_c_HEADER_H
 #define com_android_aconfig_test_c_HEADER_H
 
@@ -405,11 +396,6 @@
 extern "C" {
 #endif
 
-extern const char* com_android_aconfig_test_DISABLED_RO;
-extern const char* com_android_aconfig_test_DISABLED_RW;
-extern const char* com_android_aconfig_test_ENABLED_RO;
-extern const char* com_android_aconfig_test_ENABLED_RW;
-
 bool com_android_aconfig_test_disabled_ro();
 
 bool com_android_aconfig_test_disabled_rw();
@@ -418,9 +404,37 @@
 
 bool com_android_aconfig_test_enabled_rw();
 
-void com_android_aconfig_test_override_flag(const char* name, bool val);
+#ifdef __cplusplus
+}
+#endif
+#endif
+"#;
 
-void com_android_aconfig_test_reset_overrides();
+    const C_EXPORTED_TEST_HEADER_EXPECTED: &str = r#"
+#ifndef com_android_aconfig_test_c_HEADER_H
+#define com_android_aconfig_test_c_HEADER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool com_android_aconfig_test_disabled_ro();
+
+void set_com_android_aconfig_test_disabled_ro(bool val);
+
+bool com_android_aconfig_test_disabled_rw();
+
+void set_com_android_aconfig_test_disabled_rw(bool val);
+
+bool com_android_aconfig_test_enabled_ro();
+
+void set_com_android_aconfig_test_enabled_ro(bool val);
+
+bool com_android_aconfig_test_enabled_rw();
+
+void set_com_android_aconfig_test_enabled_rw(bool val);
+
+void com_android_aconfig_test_reset_flags();
 
 #ifdef __cplusplus
 }
@@ -428,15 +442,9 @@
 #endif
 "#;
 
-    const C_SOURCE_FILE_EXPECTED: &str = r#"
+    const C_PROD_SOURCE_FILE_EXPECTED: &str = r#"
 #include "com_android_aconfig_test_c.h"
 #include "com_android_aconfig_test.h"
-#include <string>
-
-const char* com_android_aconfig_test_DISABLED_RO = "com.android.aconfig.test.disabled_ro";
-const char* com_android_aconfig_test_DISABLED_RW = "com.android.aconfig.test.disabled_rw";
-const char* com_android_aconfig_test_ENABLED_RO = "com.android.aconfig.test.enabled_ro";
-const char* com_android_aconfig_test_ENABLED_RW = "com.android.aconfig.test.enabled_rw";
 
 bool com_android_aconfig_test_disabled_ro() {
     return com::android::aconfig::test::disabled_ro();
@@ -453,13 +461,46 @@
 bool com_android_aconfig_test_enabled_rw() {
     return com::android::aconfig::test::enabled_rw();
 }
+"#;
 
-void com_android_aconfig_test_override_flag(const char* name, bool val) {
-    com::android::aconfig::test::override_flag(std::string(name), val);
+    const C_TEST_SOURCE_FILE_EXPECTED: &str = r#"
+#include "com_android_aconfig_test_c.h"
+#include "com_android_aconfig_test.h"
+
+bool com_android_aconfig_test_disabled_ro() {
+    return com::android::aconfig::test::disabled_ro();
 }
 
-void com_android_aconfig_test_reset_overrides() {
-    com::android::aconfig::test::reset_overrides();
+void set_com_android_aconfig_test_disabled_ro(bool val) {
+    com::android::aconfig::test::disabled_ro(val);
+}
+
+bool com_android_aconfig_test_disabled_rw() {
+    return com::android::aconfig::test::disabled_rw();
+}
+
+void set_com_android_aconfig_test_disabled_rw(bool val) {
+    com::android::aconfig::test::disabled_rw(val);
+}
+
+bool com_android_aconfig_test_enabled_ro() {
+    return com::android::aconfig::test::enabled_ro();
+}
+
+void set_com_android_aconfig_test_enabled_ro(bool val) {
+    com::android::aconfig::test::enabled_ro(val);
+}
+
+bool com_android_aconfig_test_enabled_rw() {
+    return com::android::aconfig::test::enabled_rw();
+}
+
+void set_com_android_aconfig_test_enabled_rw(bool val) {
+    com::android::aconfig::test::enabled_rw(val);
+}
+
+void com_android_aconfig_test_reset_flags() {
+    com::android::aconfig::test::reset_flags();
 }
 "#;
     fn test_generate_cpp_code(mode: CodegenMode) {
@@ -516,7 +557,10 @@
         assert_eq!(
             None,
             crate::test::first_significant_code_diff(
-                C_EXPORTED_HEADER_EXPECTED,
+                match mode {
+                    CodegenMode::Production => C_EXPORTED_PROD_HEADER_EXPECTED,
+                    CodegenMode::Test => C_EXPORTED_TEST_HEADER_EXPECTED,
+                },
                 generated_files_map.get(&target_file_path).unwrap()
             )
         );
@@ -526,7 +570,10 @@
         assert_eq!(
             None,
             crate::test::first_significant_code_diff(
-                C_SOURCE_FILE_EXPECTED,
+                match mode {
+                    CodegenMode::Production => C_PROD_SOURCE_FILE_EXPECTED,
+                    CodegenMode::Test => C_TEST_SOURCE_FILE_EXPECTED,
+                },
                 generated_files_map.get(&target_file_path).unwrap()
             )
         );
diff --git a/tools/aconfig/templates/c_exported_header.template b/tools/aconfig/templates/c_exported_header.template
index 08af860..c22b048 100644
--- a/tools/aconfig/templates/c_exported_header.template
+++ b/tools/aconfig/templates/c_exported_header.template
@@ -5,16 +5,17 @@
 extern "C" \{
 #endif
 
-{{ for item in class_elements}}
-extern const char* {header}_{item.uppercase_flag_name};
-{{ endfor -}}
+{{ for item in class_elements }}
+bool {header}_{item.flag_name}();
 
-{{ for item in class_elements}}
-bool {header}_{item.flag_name}();{{ endfor }}
+{{ if for_test }}
+void set_{header}_{item.flag_name}(bool val);
+{{ -endif }}
+{{ endfor - }}
 
-void {header}_override_flag(const char* name, bool val);
-
-void {header}_reset_overrides();
+{{ if for_test }}
+void {header}_reset_flags();
+{{ -endif }}
 
 #ifdef __cplusplus
 }
diff --git a/tools/aconfig/templates/c_source_file.template b/tools/aconfig/templates/c_source_file.template
index 18da299..3d2482d 100644
--- a/tools/aconfig/templates/c_source_file.template
+++ b/tools/aconfig/templates/c_source_file.template
@@ -1,21 +1,20 @@
 #include "{header}_c.h"
 #include "{header}.h"
-#include <string>
-
-{{ for item in class_elements}}
-const char* {header}_{item.uppercase_flag_name} = "{item.device_config_flag}";
-{{ endfor - }}
 
 {{ for item in class_elements}}
 bool {header}_{item.flag_name}() \{
     return {cpp_namespace}::{item.flag_name}();
 }
-{{ endfor }}
 
-void {header}_override_flag(const char* name, bool val) \{
-     {cpp_namespace}::override_flag(std::string(name), val);
+{{ if for_test }}
+void set_{header}_{item.flag_name}(bool val) \{
+    {cpp_namespace}::{item.flag_name}(val);
 }
+{{ -endif }}
+{{ endfor -}}
 
-void {header}_reset_overrides() \{
-     {cpp_namespace}::reset_overrides();
+{{ if for_test }}
+void {header}_reset_flags() \{
+     {cpp_namespace}::reset_flags();
 }
+{{ -endif }}
diff --git a/tools/aconfig/templates/cpp_exported_header.template b/tools/aconfig/templates/cpp_exported_header.template
index ee8f0dd..e45548e 100644
--- a/tools/aconfig/templates/cpp_exported_header.template
+++ b/tools/aconfig/templates/cpp_exported_header.template
@@ -11,35 +11,43 @@
     virtual ~flag_provider_interface() = default;
     {{ for item in class_elements}}
     virtual bool {item.flag_name}() = 0;
-    {{ endfor }}
-    virtual void override_flag(std::string const&, bool) \{}
 
-    virtual void reset_overrides() \{}
+    {{ if for_test }}
+    virtual void {item.flag_name}(bool val) = 0;
+    {{ -endif }}
+    {{ endfor }}
+
+    {{ if for_test }}
+    virtual void reset_flags() \{}
+    {{ -endif }}
 };
 
 extern std::unique_ptr<flag_provider_interface> provider_;
-{{ for item in class_elements}}
-extern std::string const {item.uppercase_flag_name};{{ endfor }}
+
 {{ for item in class_elements}}
 inline bool {item.flag_name}() \{
-    {{ if for_prod }}
+    {{ if for_test }}
+    return provider_->{item.flag_name}();
+    {{ -else- }}
     {{ if not item.readwrite- }}
     return {item.default_value};
     {{ -else- }}
     return provider_->{item.flag_name}();
     {{ -endif }}
-    {{ -else- }}
-    return provider_->{item.flag_name}();
     {{ -endif }}
 }
+
+{{ if for_test }}
+inline void {item.flag_name}(bool val) \{
+    provider_->{item.flag_name}(val);
+}
+{{ -endif }}
 {{ endfor }}
-inline void override_flag(std::string const& name, bool val) \{
-    return provider_->override_flag(name, val);
-}
 
-inline void reset_overrides() \{
-    return provider_->reset_overrides();
+{{ if for_test }}
+inline void reset_flags() \{
+    return provider_->reset_flags();
 }
-
+{{ -endif }}
 }
 #endif
diff --git a/tools/aconfig/templates/cpp_source_file.template b/tools/aconfig/templates/cpp_source_file.template
index 1b4f336..d267f03 100644
--- a/tools/aconfig/templates/cpp_source_file.template
+++ b/tools/aconfig/templates/cpp_source_file.template
@@ -3,8 +3,6 @@
 #include "{header}_flag_provider.h"
 
 namespace {cpp_namespace} \{
-{{ for item in class_elements}}
-std::string const {item.uppercase_flag_name} = "{item.device_config_flag}";{{ endfor }}
 std::unique_ptr<flag_provider_interface> provider_ =
     std::make_unique<flag_provider>();
 }
diff --git a/tools/aconfig/templates/cpp_test_flag_provider.template b/tools/aconfig/templates/cpp_test_flag_provider.template
index a24116b..afa56cf 100644
--- a/tools/aconfig/templates/cpp_test_flag_provider.template
+++ b/tools/aconfig/templates/cpp_test_flag_provider.template
@@ -8,25 +8,20 @@
 {{ endif }}
 
 #include <unordered_map>
-#include <unordered_set>
-#include <cassert>
 
 namespace {cpp_namespace} \{
 class flag_provider : public flag_provider_interface \{
 private:
     std::unordered_map<std::string, bool> overrides_;
-    std::unordered_set<std::string> flag_names_;
 
 public:
     flag_provider()
-        : overrides_(),
-        flag_names_() \{
-        {{ for item in class_elements}}
-        flag_names_.insert({item.uppercase_flag_name});{{ endfor }}
-    }
+        : overrides_()
+    \{}
+
     {{ for item in class_elements}}
     virtual bool {item.flag_name}() override \{
-        auto it = overrides_.find({item.uppercase_flag_name});
+        auto it = overrides_.find("{item.flag_name}");
 	      if (it != overrides_.end()) \{
 	          return it->second;
         } else \{
@@ -40,13 +35,13 @@
           {{ -endif }}
         }
     }
-    {{ endfor }}
-    virtual void override_flag(std::string const& flag, bool val) override \{
-        assert(flag_names_.count(flag));
-        overrides_[flag] = val;
-    }
 
-    virtual void reset_overrides() override \{
+    virtual void {item.flag_name}(bool val) override \{
+        overrides_["{item.flag_name}"] = val;
+    }
+    {{ endfor }}
+
+    virtual void reset_flags() override \{
         overrides_.clear();
     }
 };