Support optional rule attributes in XML parser

Bug: 143697198
Test: atest FrameworksServicesTests:RuleXmlParserTest
Change-Id: Ib7118228f325f8fcb88fa27cf88d48af0319e320
This commit is contained in:
Khaled Abdelmohsen
2019-11-25 17:24:22 +00:00
parent 5809a5f286
commit e39fa0fd2f
2 changed files with 53 additions and 30 deletions

View File

@@ -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));
}
}

View File

@@ -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)),