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

Commit 0df17f7c authored by Zhi Dou's avatar Zhi Dou Committed by Automerger Merge Worker
Browse files

Generate FakeFeatureFlagsImpl in test mode am: 5aaeee37 am: 96371255 am:...

Generate FakeFeatureFlagsImpl in test mode am: 5aaeee37 am: 96371255 am: 06d12428 am: 1cf978c9

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



Change-Id: I93306a963eb6b1ed7f19bff74dc32070f23f9e4f
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 80d56ffd 1cf978c9
Loading
Loading
Loading
Loading
+63 −8
Original line number Original line Diff line number Diff line
@@ -47,9 +47,13 @@ where
        "FeatureFlags.java",
        "FeatureFlags.java",
        include_str!("../templates/FeatureFlags.java.template"),
        include_str!("../templates/FeatureFlags.java.template"),
    )?;
    )?;
    template.add_template(
        "FakeFeatureFlagsImpl.java",
        include_str!("../templates/FakeFeatureFlagsImpl.java.template"),
    )?;


    let path: PathBuf = package.split('.').collect();
    let path: PathBuf = package.split('.').collect();
    ["Flags.java", "FeatureFlagsImpl.java", "FeatureFlags.java"]
    ["Flags.java", "FeatureFlags.java", "FeatureFlagsImpl.java", "FakeFeatureFlagsImpl.java"]
        .iter()
        .iter()
        .map(|file| {
        .map(|file| {
            Ok(OutputFile {
            Ok(OutputFile {
@@ -143,6 +147,29 @@ mod tests {
        }
        }
    "#;
    "#;


    const EXPECTED_METHOD_NOT_IMPL_COMMON_CONTENT: &str = r#"
        @Override
        public boolean disabledRo() {
            throw new UnsupportedOperationException(
                "Method is not implemented.");
        }
        @Override
        public boolean disabledRw() {
            throw new UnsupportedOperationException(
                "Method is not implemented.");
        }
        @Override
        public boolean enabledRo() {
            throw new UnsupportedOperationException(
                "Method is not implemented.");
        }
        @Override
        public boolean enabledRw() {
            throw new UnsupportedOperationException(
                "Method is not implemented.");
        }
    "#;

    #[test]
    #[test]
    fn test_generate_java_code_production() {
    fn test_generate_java_code_production() {
        let parsed_flags = crate::test::parse_test_flags();
        let parsed_flags = crate::test::parse_test_flags();
@@ -156,7 +183,15 @@ mod tests {
            + r#"
            + r#"
            private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl();
            private static FeatureFlags FEATURE_FLAGS = new FeatureFlagsImpl();
        }"#;
        }"#;
        let expected_featureflagsimpl_content = r#"
        let expect_fakefeatureflagsimpl_content = r#"
        package com.android.aconfig.test;
        public class FakeFeatureFlagsImpl implements FeatureFlags {"#
            .to_owned()
            + EXPECTED_METHOD_NOT_IMPL_COMMON_CONTENT
            + r#"
        }
        "#;
        let expect_featureflagsimpl_content = r#"
        package com.android.aconfig.test;
        package com.android.aconfig.test;
        import android.provider.DeviceConfig;
        import android.provider.DeviceConfig;
        public final class FeatureFlagsImpl implements FeatureFlags {
        public final class FeatureFlagsImpl implements FeatureFlags {
@@ -188,8 +223,12 @@ mod tests {
        "#;
        "#;
        let mut file_set = HashMap::from([
        let mut file_set = HashMap::from([
            ("com/android/aconfig/test/Flags.java", expect_flags_content.as_str()),
            ("com/android/aconfig/test/Flags.java", expect_flags_content.as_str()),
            ("com/android/aconfig/test/FeatureFlagsImpl.java", expected_featureflagsimpl_content),
            ("com/android/aconfig/test/FeatureFlagsImpl.java", expect_featureflagsimpl_content),
            ("com/android/aconfig/test/FeatureFlags.java", EXPECTED_FEATUREFLAGS_CONTENT),
            ("com/android/aconfig/test/FeatureFlags.java", EXPECTED_FEATUREFLAGS_CONTENT),
            (
                "com/android/aconfig/test/FakeFeatureFlagsImpl.java",
                expect_fakefeatureflagsimpl_content.as_str(),
            ),
        ]);
        ]);


        for file in generated_files {
        for file in generated_files {
@@ -221,22 +260,30 @@ mod tests {
        .unwrap();
        .unwrap();
        let expect_flags_content = EXPECTED_FLAG_COMMON_CONTENT.to_string()
        let expect_flags_content = EXPECTED_FLAG_COMMON_CONTENT.to_string()
            + r#"
            + r#"
            public static void setFeatureFlagsImpl(FeatureFlags featureFlags) {
            public static void setFeatureFlags(FeatureFlags featureFlags) {
                Flags.FEATURE_FLAGS = featureFlags;
                Flags.FEATURE_FLAGS = featureFlags;
            }
            }
            public static void unsetFeatureFlagsImpl() {
            public static void unsetFeatureFlags() {
                Flags.FEATURE_FLAGS = null;
                Flags.FEATURE_FLAGS = null;
            }
            }
            private static FeatureFlags FEATURE_FLAGS;
            private static FeatureFlags FEATURE_FLAGS;
        }
        }
        "#;
        "#;
        let expected_featureflagsimpl_content = r#"
        let expect_featureflagsimpl_content = r#"
        package com.android.aconfig.test;
        public final class FeatureFlagsImpl implements FeatureFlags {"#
            .to_owned()
            + EXPECTED_METHOD_NOT_IMPL_COMMON_CONTENT
            + r#"
        }
        "#;
        let expect_fakefeatureflagsimpl_content = r#"
        package com.android.aconfig.test;
        package com.android.aconfig.test;
        import static java.util.stream.Collectors.toMap;
        import static java.util.stream.Collectors.toMap;
        import java.util.HashMap;
        import java.util.HashMap;
        import java.util.Map;
        import java.util.Map;
        import java.util.stream.Stream;
        import java.util.stream.Stream;
        public final class FeatureFlagsImpl implements FeatureFlags {
        public class FakeFeatureFlagsImpl implements FeatureFlags {
            @Override
            @Override
            public boolean disabledRo() {
            public boolean disabledRo() {
                return getFlag(Flags.FLAG_DISABLED_RO);
                return getFlag(Flags.FLAG_DISABLED_RO);
@@ -284,10 +331,18 @@ mod tests {
                );
                );
        }
        }
        "#;
        "#;

        let mut file_set = HashMap::from([
        let mut file_set = HashMap::from([
            ("com/android/aconfig/test/Flags.java", expect_flags_content.as_str()),
            ("com/android/aconfig/test/Flags.java", expect_flags_content.as_str()),
            ("com/android/aconfig/test/FeatureFlagsImpl.java", expected_featureflagsimpl_content),
            ("com/android/aconfig/test/FeatureFlags.java", EXPECTED_FEATUREFLAGS_CONTENT),
            ("com/android/aconfig/test/FeatureFlags.java", EXPECTED_FEATUREFLAGS_CONTENT),
            (
                "com/android/aconfig/test/FeatureFlagsImpl.java",
                expect_featureflagsimpl_content.as_str(),
            ),
            (
                "com/android/aconfig/test/FakeFeatureFlagsImpl.java",
                expect_fakefeatureflagsimpl_content,
            ),
        ]);
        ]);


        for file in generated_files {
        for file in generated_files {
+59 −0
Original line number Original line Diff line number Diff line
package {package_name};
{{ if is_test_mode }}
import static java.util.stream.Collectors.toMap;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

public class FakeFeatureFlagsImpl implements FeatureFlags \{
{{ for item in class_elements}}
    @Override
    public boolean {item.method_name}() \{
        return getFlag(Flags.FLAG_{item.flag_name_constant_suffix});
    }
{{ endfor}}
    public void setFlag(String flagName, boolean value) \{
        if (!this.mFlagMap.containsKey(flagName)) \{
            throw new IllegalArgumentException("no such flag" + flagName);
        }
        this.mFlagMap.put(flagName, value);
    }

    public void resetAll() \{
        for (Map.Entry entry : mFlagMap.entrySet()) \{
            entry.setValue(null);
        }
    }

    private boolean getFlag(String flagName) \{
        Boolean value = this.mFlagMap.get(flagName);
        if (value == null) \{
            throw new IllegalArgumentException(flagName + " is not set");
        }
        return value;
    }

    private HashMap<String, Boolean> mFlagMap = Stream.of(
            {{-for item in class_elements}}
            Flags.FLAG_{item.flag_name_constant_suffix}{{ if not @last }},{{ endif }}
            {{ -endfor }}
        )
        .collect(
            HashMap::new,
            (map, elem) -> map.put(elem, null),
            HashMap::putAll
        );
}
{{ else }}
{#- Generate only stub if in prod mode #}
public class FakeFeatureFlagsImpl implements FeatureFlags \{
{{ for item in class_elements}}
    @Override
    public boolean {item.method_name}() \{
        throw new UnsupportedOperationException(
            "Method is not implemented.");
    }
{{ endfor}}
}
{{ endif }}
+15 −47
Original line number Original line Diff line number Diff line
package {package_name};
package {package_name};
{{ -if is_test_mode }}
{{ if not is_test_mode }}
import static java.util.stream.Collectors.toMap;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
{{ else}}
{{ if is_read_write- }}
{{ if is_read_write- }}
import android.provider.DeviceConfig;
import android.provider.DeviceConfig;
{{ -endif- }}
{{ endif }}
{{ endif }}
public final class FeatureFlagsImpl implements FeatureFlags \{
public final class FeatureFlagsImpl implements FeatureFlags \{
{{ for item in class_elements}}
{{ for item in class_elements}}
    @Override
    @Override
    public boolean {item.method_name}() \{
    public boolean {item.method_name}() \{
        {{ -if not is_test_mode- }}
    {{ -if item.is_read_write }}
        {{ if item.is_read_write }}
        return DeviceConfig.getBoolean(
        return DeviceConfig.getBoolean(
            "{item.device_config_namespace}",
            "{item.device_config_namespace}",
            "{item.device_config_flag}",
            "{item.device_config_flag}",
            {item.default_value}
            {item.default_value}
        );
        );
        {{ -else }}
        return {item.default_value};
        {{ -endif- }}
    {{ else }}
    {{ else }}
        return getFlag(Flags.FLAG_{item.flag_name_constant_suffix});
        return {item.default_value};
        {{ -endif }}
    {{ endif- }}
    }
    }
{{ endfor- }}
{{ endfor- }}
{{ if is_test_mode }}
    public void setFlag(String flagName, boolean value) \{
        if (!this.mFlagMap.containsKey(flagName)) \{
            throw new IllegalArgumentException("no such flag" + flagName);
        }
        this.mFlagMap.put(flagName, value);
}
}

{{ else }}
    public void resetAll() \{
{#- Generate only stub if in test mode #}
        for (Map.Entry entry : mFlagMap.entrySet()) \{
public final class FeatureFlagsImpl implements FeatureFlags \{
            entry.setValue(null);
{{ for item in class_elements}}
        }
    @Override
    }
    public boolean {item.method_name}() \{

        throw new UnsupportedOperationException(
    private boolean getFlag(String flagName) \{
            "Method is not implemented.");
        Boolean value = this.mFlagMap.get(flagName);
        if (value == null) \{
            throw new IllegalArgumentException(flagName + " is not set");
        }
        return value;
    }
    }

{{ endfor- }}
    private HashMap<String, Boolean> mFlagMap = Stream.of(
            {{-for item in class_elements}}
            Flags.FLAG_{item.flag_name_constant_suffix}{{ if not @last }},{{ endif }}
            {{ -endfor }}
        )
        .collect(
            HashMap::new,
            (map, elem) -> map.put(elem, null),
            HashMap::putAll
        );
{{ -endif }}
}
}
{{ endif }}
+2 −2
Original line number Original line Diff line number Diff line
@@ -10,11 +10,11 @@ public final class Flags \{
    }
    }
{{ endfor }}
{{ endfor }}
{{ -if is_test_mode }}
{{ -if is_test_mode }}
    public static void setFeatureFlagsImpl(FeatureFlags featureFlags) \{
    public static void setFeatureFlags(FeatureFlags featureFlags) \{
        Flags.FEATURE_FLAGS = featureFlags;
        Flags.FEATURE_FLAGS = featureFlags;
    }
    }


    public static void unsetFeatureFlagsImpl() \{
    public static void unsetFeatureFlags() \{
        Flags.FEATURE_FLAGS = null;
        Flags.FEATURE_FLAGS = null;
    }
    }
{{ endif}}
{{ endif}}