summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Khaled Abdelmohsen <khelmy@google.com> 2019-11-25 17:24:22 +0000
committer Khaled Abdelmohsen <khelmy@google.com> 2019-11-26 15:36:14 +0000
commite39fa0fd2fddf0f1a9688d136a3b074e8d77af89 (patch)
treebaed9720b47f44fcee1045d2d9599bcf4f0761eb
parent5809a5f28644cf7adef5d2f83da62f68594e8d95 (diff)
Support optional rule attributes in XML parser
Bug: 143697198 Test: atest FrameworksServicesTests:RuleXmlParserTest Change-Id: Ib7118228f325f8fcb88fa27cf88d48af0319e320
-rw-r--r--services/core/java/com/android/server/integrity/parser/RuleXmlParser.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java60
2 files changed, 53 insertions, 30 deletions
diff --git a/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java b/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java
index 11a397948b14..5459a77705f2 100644
--- a/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java
+++ b/services/core/java/com/android/server/integrity/parser/RuleXmlParser.java
@@ -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));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java b/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java
index be6a31fa949e..eca1b8556496 100644
--- a/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java
+++ b/services/tests/servicestests/src/com/android/server/integrity/parser/RuleXmlParserTest.java
@@ -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,11 +388,53 @@ 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<>();
packageNameAttrs.put("K", String.valueOf(AtomicFormula.VERSION_CODE));
@@ -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)),