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

Commit e39fa0fd authored by Khaled Abdelmohsen's avatar Khaled Abdelmohsen
Browse files

Support optional rule attributes in XML parser

Bug: 143697198
Test: atest FrameworksServicesTests:RuleXmlParserTest
Change-Id: Ib7118228f325f8fcb88fa27cf88d48af0319e320
parent 5809a5f2
Loading
Loading
Loading
Loading
+10 −13
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * A helper class to parse rules into the {@link Rule} model from Xml representation.
@@ -106,7 +107,7 @@ public final class RuleXmlParser implements RuleParser {

    private static Rule parseRule(XmlPullParser parser) throws IOException, XmlPullParserException {
        Formula formula = null;
        @Rule.Effect int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE));
        int effect = Integer.parseInt(extractAttributeValue(parser, EFFECT_ATTRIBUTE).orElse("-1"));

        int eventType;
        while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -139,8 +140,8 @@ public final class RuleXmlParser implements RuleParser {

    private static Formula parseOpenFormula(XmlPullParser parser)
            throws IOException, XmlPullParserException {
        @OpenFormula.Connector int connector = Integer.parseInt(
                extractAttributeValue(parser, CONNECTOR_ATTRIBUTE));
        int connector = Integer.parseInt(
                extractAttributeValue(parser, CONNECTOR_ATTRIBUTE).orElse("-1"));
        List<Formula> formulas = new ArrayList<>();

        int eventType;
@@ -174,10 +175,10 @@ public final class RuleXmlParser implements RuleParser {

    private static Formula parseAtomicFormula(XmlPullParser parser)
            throws IOException, XmlPullParserException {
        @AtomicFormula.Key int key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE));
        @AtomicFormula.Operator int operator = Integer.parseInt(
                extractAttributeValue(parser, OPERATOR_ATTRIBUTE));
        String value = extractAttributeValue(parser, VALUE_ATTRIBUTE);
        int key = Integer.parseInt(extractAttributeValue(parser, KEY_ATTRIBUTE).orElse("-1"));
        int operator = Integer.parseInt(
                extractAttributeValue(parser, OPERATOR_ATTRIBUTE).orElse("-1"));
        String value = extractAttributeValue(parser, VALUE_ATTRIBUTE).orElse(null);

        int eventType;
        while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -205,11 +206,7 @@ public final class RuleXmlParser implements RuleParser {
        }
    }

    private static String extractAttributeValue(XmlPullParser parser, String attribute) {
        String attributeValue = parser.getAttributeValue(NAMESPACE, attribute);
        if (attributeValue == null) {
            throw new RuntimeException(String.format("Attribute not found: %s", attribute));
        }
        return attributeValue;
    private static Optional<String> extractAttributeValue(XmlPullParser parser, String attribute) {
        return Optional.ofNullable(parser.getAttributeValue(NAMESPACE, attribute));
    }
}
+43 −17
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@ public class RuleXmlParserTest {
    public void testXmlStream_validOpenFormula() throws Exception {
        Map<String, String> atomicFormulaAttrs = new HashMap<>();
        atomicFormulaAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        atomicFormulaAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        atomicFormulaAttrs.put("V", "com.app.test");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -71,7 +70,6 @@ public class RuleXmlParserTest {
    public void testXmlString_validOpenFormula_notConnector() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -98,11 +96,9 @@ public class RuleXmlParserTest {
    public void testXmlString_validOpenFormula_andConnector() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        Map<String, String> appCertificateAttrs = new HashMap<>();
        appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE));
        appCertificateAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        appCertificateAttrs.put("V", "test_cert");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -131,11 +127,9 @@ public class RuleXmlParserTest {
    public void testXmlString_validOpenFormula_orConnector() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        Map<String, String> appCertificateAttrs = new HashMap<>();
        appCertificateAttrs.put("K", String.valueOf(AtomicFormula.APP_CERTIFICATE));
        appCertificateAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        appCertificateAttrs.put("V", "test_cert");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -165,7 +159,6 @@ public class RuleXmlParserTest {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("V", "com.app.test");
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
                    Collections.singletonMap("E", String.valueOf(Rule.DENY)),
@@ -191,7 +184,6 @@ public class RuleXmlParserTest {
    public void testXmlString_invalidOpenFormula_invalidNumberOfFormulas() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        Map<String, String> versionCodeAttrs = new HashMap<>();
        versionCodeAttrs.put("K", String.valueOf(AtomicFormula.VERSION_CODE));
@@ -246,7 +238,6 @@ public class RuleXmlParserTest {
    public void testXmlString_invalidOpenFormula_invalidEffect() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -271,7 +262,6 @@ public class RuleXmlParserTest {
    public void testXmlString_invalidOpenFormula_invalidTags() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -297,7 +287,6 @@ public class RuleXmlParserTest {
    public void testXmlString_validAtomicFormula_stringValue() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlAtomicFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -343,7 +332,6 @@ public class RuleXmlParserTest {
    public void testXmlString_validAtomicFormula_booleanValue() throws Exception {
        Map<String, String> preInstalledAttrs = new HashMap<>();
        preInstalledAttrs.put("K", String.valueOf(AtomicFormula.PRE_INSTALLED));
        preInstalledAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        preInstalledAttrs.put("V", "true");
        String ruleXmlAtomicFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -367,7 +355,6 @@ public class RuleXmlParserTest {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("V", "com.app.test");
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        String ruleXmlAtomicFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
                    Collections.singletonMap("E", String.valueOf(Rule.DENY)),
@@ -389,7 +376,6 @@ public class RuleXmlParserTest {
    public void testXmlString_invalidAtomicFormula_invalidAttribute() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("BadKey", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlAtomicFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
@@ -402,10 +388,52 @@ public class RuleXmlParserTest {

        assertExpectException(
                RuleParseException.class,
                /* expectedExceptionMessageRegex */ "Attribute not found: K",
                /* expectedExceptionMessageRegex */ "Found unexpected key: -1",
                () -> xmlParser.parse(ruleXmlAtomicFormula));
    }

    @Test
    public void testXmlString_invalidRule_invalidAttribute() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlAtomicFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
                    Collections.singletonMap("BadEffect", String.valueOf(Rule.DENY)),
                        /* closed= */ false)
                + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true)
                + "</R>"
                + "</RL>";
        RuleParser xmlParser = new RuleXmlParser();
        assertExpectException(
                RuleParseException.class,
                /* expectedExceptionMessageRegex */ "Unknown effect: -1",
                () -> xmlParser.parse(ruleXmlAtomicFormula));
    }

    @Test
    public void testXmlString_invalidOpenFormula_invalidAttribute() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
        packageNameAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        packageNameAttrs.put("V", "com.app.test");
        String ruleXmlOpenFormula = "<RL>"
                + generateTagWithAttribute(/* tag= */ "R",
                    Collections.singletonMap("E", String.valueOf(Rule.DENY)),
                        /* closed= */ false)
                + generateTagWithAttribute(/* tag= */ "OF",
                    Collections.singletonMap("BadConnector", String.valueOf(OpenFormula.NOT)),
                        /* closed= */ false)
                + generateTagWithAttribute(/* tag= */ "AF", packageNameAttrs, /* closed= */ true)
                + "</OF>"
                + "</R>"
                + "</RL>";
        RuleParser xmlParser = new RuleXmlParser();
        assertExpectException(
                RuleParseException.class,
                /* expectedExceptionMessageRegex */ "Unknown connector: -1",
                () -> xmlParser.parse(ruleXmlOpenFormula));
    }

    @Test
    public void testXmlString_invalidAtomicFormula() throws Exception {
        Map<String, String> packageNameAttrs = new HashMap<>();
@@ -431,7 +459,6 @@ public class RuleXmlParserTest {
    public void testXmlString_withNoRuleList() {
        Map<String, String> atomicFormulaAttrs = new HashMap<>();
        atomicFormulaAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        atomicFormulaAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        atomicFormulaAttrs.put("V", "com.app.test");
        String ruleXmlWithNoRuleList = generateTagWithAttribute(/* tag= */ "R",
                    Collections.singletonMap("E", String.valueOf(Rule.DENY)),
@@ -454,7 +481,6 @@ public class RuleXmlParserTest {
    public void testXmlStream_withNoRuleList() {
        Map<String, String> atomicFormulaAttrs = new HashMap<>();
        atomicFormulaAttrs.put("K", String.valueOf(AtomicFormula.PACKAGE_NAME));
        atomicFormulaAttrs.put("O", String.valueOf(AtomicFormula.EQ));
        atomicFormulaAttrs.put("V", "com.app.test");
        String ruleXmlWithNoRuleList = generateTagWithAttribute(/* tag= */ "R",
                    Collections.singletonMap("E", String.valueOf(Rule.DENY)),