summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Max Loh <mloh@google.com> 2024-04-10 08:35:40 -0700
committer Max Loh <mloh@google.com> 2024-04-11 23:38:40 +0000
commit789a16bae7b6ac9fd1fa5873be038f38cdb28e2b (patch)
tree319a4bce5c0949d005b96c534234f6099f6862e5
parent764be7d29c047c7eb824492d1b146bb1fce2b45c (diff)
aslgen additional on-device to human-readable implementation
Bug: 329902686 Test: Unit tests. Change-Id: I56f60a8eb5771db78e42f1b7662bcdee59a67dcb
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java12
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java13
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java26
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java51
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java55
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java4
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java4
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java27
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java42
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java14
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java33
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java9
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java11
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java5
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java10
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java4
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java11
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java9
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java19
-rw-r--r--tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java86
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java33
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java25
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java59
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java6
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java4
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java44
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java24
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java28
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java22
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java22
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java18
-rw-r--r--tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java14
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/missing-version.xml2
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/missing-version.xml2
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-url.xml2
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/missing-url.xml2
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml2
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml1
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml6
-rw-r--r--tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml1
40 files changed, 661 insertions, 101 deletions
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
index b98161dd26fb..191f38d3df80 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/AslConverter.java
@@ -65,8 +65,10 @@ public class AslConverter {
return new AndroidSafetyLabelFactory()
.createFromHrElements(XmlUtils.listOf(appMetadataBundles));
case ON_DEVICE:
- throw new IllegalArgumentException(
- "Parsing from on-device format is not supported at this time.");
+ Element bundleEle =
+ XmlUtils.getSingleChildElement(document, XmlUtils.OD_TAG_BUNDLE, true);
+ return new AndroidSafetyLabelFactory()
+ .createFromOdElements(XmlUtils.listOf(bundleEle));
default:
throw new IllegalStateException("Unrecognized input format.");
}
@@ -89,8 +91,10 @@ public class AslConverter {
switch (format) {
case HUMAN_READABLE:
- throw new IllegalArgumentException(
- "Outputting human-readable format is not supported at this time.");
+ for (var child : asl.toHrDomElements(document)) {
+ document.appendChild(child);
+ }
+ break;
case ON_DEVICE:
for (var child : asl.toOdDomElements(document)) {
document.appendChild(child);
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java
index ecfad91a378f..72140a17297c 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabel.java
@@ -65,6 +65,17 @@ public class AndroidSafetyLabel implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element aslEle = doc.createElement(XmlUtils.HR_TAG_APP_METADATA_BUNDLES);
+ aslEle.setAttribute(XmlUtils.HR_ATTR_VERSION, String.valueOf(mVersion));
+ if (mSafetyLabels != null) {
+ XmlUtils.appendChildren(aslEle, mSafetyLabels.toHrDomElements(doc));
+ }
+ if (mSystemAppSafetyLabel != null) {
+ XmlUtils.appendChildren(aslEle, mSystemAppSafetyLabel.toHrDomElements(doc));
+ }
+ if (mTransparencyInfo != null) {
+ XmlUtils.appendChildren(aslEle, mTransparencyInfo.toHrDomElements(doc));
+ }
+ return XmlUtils.listOf(aslEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java
index 41ce6e55e989..c53cbbf99a46 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AndroidSafetyLabelFactory.java
@@ -56,10 +56,32 @@ public class AndroidSafetyLabelFactory implements AslMarshallableFactory<Android
version, systemAppSafetyLabel, safetyLabels, transparencyInfo);
}
- /** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
+ /** Creates an {@link AndroidSafetyLabel} from on-device DOM elements */
@Override
public AndroidSafetyLabel createFromOdElements(List<Element> elements)
throws MalformedXmlException {
- return null;
+ Element bundleEle = XmlUtils.getSingleElement(elements);
+ Long version = XmlUtils.getOdLongEle(bundleEle, XmlUtils.OD_NAME_VERSION, true);
+
+ Element safetyLabelsEle =
+ XmlUtils.getOdPbundleWithName(bundleEle, XmlUtils.OD_NAME_SAFETY_LABELS, false);
+ SafetyLabels safetyLabels =
+ new SafetyLabelsFactory().createFromOdElements(XmlUtils.listOf(safetyLabelsEle));
+
+ Element systemAppSafetyLabelEle =
+ XmlUtils.getOdPbundleWithName(
+ bundleEle, XmlUtils.OD_NAME_SYSTEM_APP_SAFETY_LABEL, false);
+ SystemAppSafetyLabel systemAppSafetyLabel =
+ new SystemAppSafetyLabelFactory()
+ .createFromOdElements(XmlUtils.listOf(systemAppSafetyLabelEle));
+
+ Element transparencyInfoEle =
+ XmlUtils.getOdPbundleWithName(bundleEle, XmlUtils.OD_NAME_TRANSPARENCY_INFO, false);
+ TransparencyInfo transparencyInfo =
+ new TransparencyInfoFactory()
+ .createFromOdElements(XmlUtils.listOf(transparencyInfoEle));
+
+ return new AndroidSafetyLabel(
+ version, systemAppSafetyLabel, safetyLabels, transparencyInfo);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java
index 21f328d8e2d0..129733ebc1b6 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfo.java
@@ -146,6 +146,55 @@ public class AppInfo implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element appInfoEle = doc.createElement(XmlUtils.HR_TAG_APP_INFO);
+ if (this.mTitle != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_TITLE, this.mTitle);
+ }
+ if (this.mDescription != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_DESCRIPTION, this.mDescription);
+ }
+ if (this.mContainsAds != null) {
+ appInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_CONTAINS_ADS, String.valueOf(this.mContainsAds));
+ }
+ if (this.mObeyAps != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_OBEY_APS, String.valueOf(this.mObeyAps));
+ }
+ if (this.mAdsFingerprinting != null) {
+ appInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_ADS_FINGERPRINTING, String.valueOf(this.mAdsFingerprinting));
+ }
+ if (this.mSecurityFingerprinting != null) {
+ appInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_SECURITY_FINGERPRINTING,
+ String.valueOf(this.mSecurityFingerprinting));
+ }
+ if (this.mPrivacyPolicy != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_PRIVACY_POLICY, this.mPrivacyPolicy);
+ }
+ if (this.mSecurityEndpoints != null) {
+ appInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_SECURITY_ENDPOINTS, String.join("|", this.mSecurityEndpoints));
+ }
+ if (this.mFirstPartyEndpoints != null) {
+ appInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_FIRST_PARTY_ENDPOINTS,
+ String.join("|", this.mFirstPartyEndpoints));
+ }
+ if (this.mServiceProviderEndpoints != null) {
+ appInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_SERVICE_PROVIDER_ENDPOINTS,
+ String.join("|", this.mServiceProviderEndpoints));
+ }
+ if (this.mCategory != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_CATEGORY, this.mCategory);
+ }
+ if (this.mEmail != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_EMAIL, this.mEmail);
+ }
+ if (this.mWebsite != null) {
+ appInfoEle.setAttribute(XmlUtils.HR_ATTR_WEBSITE, this.mWebsite);
+ }
+ return XmlUtils.listOf(appInfoEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java
index 6fcf637fe069..c5069619e069 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/AppInfoFactory.java
@@ -35,15 +35,16 @@ public class AppInfoFactory implements AslMarshallableFactory<AppInfo> {
return null;
}
- String title = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_TITLE);
- String description = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_DESCRIPTION);
+ String title = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_TITLE, true);
+ String description = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_DESCRIPTION, true);
Boolean containsAds = XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_CONTAINS_ADS, true);
Boolean obeyAps = XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_OBEY_APS, true);
Boolean adsFingerprinting =
XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_ADS_FINGERPRINTING, true);
Boolean securityFingerprinting =
XmlUtils.getBoolAttr(appInfoEle, XmlUtils.HR_ATTR_SECURITY_FINGERPRINTING, true);
- String privacyPolicy = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_PRIVACY_POLICY);
+ String privacyPolicy =
+ XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_PRIVACY_POLICY, true);
List<String> securityEndpoints =
XmlUtils.getPipelineSplitAttr(
appInfoEle, XmlUtils.HR_ATTR_SECURITY_ENDPOINTS, true);
@@ -53,8 +54,8 @@ public class AppInfoFactory implements AslMarshallableFactory<AppInfo> {
List<String> serviceProviderEndpoints =
XmlUtils.getPipelineSplitAttr(
appInfoEle, XmlUtils.HR_ATTR_SERVICE_PROVIDER_ENDPOINTS, true);
- String category = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_CATEGORY);
- String email = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_EMAIL);
+ String category = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_CATEGORY, true);
+ String email = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_EMAIL, true);
String website = XmlUtils.getStringAttr(appInfoEle, XmlUtils.HR_ATTR_WEBSITE, false);
return new AppInfo(
@@ -76,6 +77,48 @@ public class AppInfoFactory implements AslMarshallableFactory<AppInfo> {
/** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
@Override
public AppInfo createFromOdElements(List<Element> elements) throws MalformedXmlException {
- return null;
+ Element appInfoEle = XmlUtils.getSingleElement(elements);
+ if (appInfoEle == null) {
+ AslgenUtil.logI("No AppInfo found in od format.");
+ return null;
+ }
+
+ String title = XmlUtils.getOdStringEle(appInfoEle, XmlUtils.OD_NAME_TITLE, true);
+ String description =
+ XmlUtils.getOdStringEle(appInfoEle, XmlUtils.OD_NAME_DESCRIPTION, true);
+ Boolean containsAds =
+ XmlUtils.getOdBoolEle(appInfoEle, XmlUtils.OD_NAME_CONTAINS_ADS, true);
+ Boolean obeyAps = XmlUtils.getOdBoolEle(appInfoEle, XmlUtils.OD_NAME_OBEY_APS, true);
+ Boolean adsFingerprinting =
+ XmlUtils.getOdBoolEle(appInfoEle, XmlUtils.OD_NAME_ADS_FINGERPRINTING, true);
+ Boolean securityFingerprinting =
+ XmlUtils.getOdBoolEle(appInfoEle, XmlUtils.OD_NAME_SECURITY_FINGERPRINTING, true);
+ String privacyPolicy =
+ XmlUtils.getOdStringEle(appInfoEle, XmlUtils.OD_NAME_PRIVACY_POLICY, true);
+ List<String> securityEndpoints =
+ XmlUtils.getOdStringArray(appInfoEle, XmlUtils.OD_NAME_SECURITY_ENDPOINT, true);
+ List<String> firstPartyEndpoints =
+ XmlUtils.getOdStringArray(appInfoEle, XmlUtils.OD_NAME_FIRST_PARTY_ENDPOINT, true);
+ List<String> serviceProviderEndpoints =
+ XmlUtils.getOdStringArray(
+ appInfoEle, XmlUtils.OD_NAME_SERVICE_PROVIDER_ENDPOINT, true);
+ String category = XmlUtils.getOdStringEle(appInfoEle, XmlUtils.OD_NAME_CATEGORY, true);
+ String email = XmlUtils.getOdStringEle(appInfoEle, XmlUtils.OD_NAME_EMAIL, true);
+ String website = XmlUtils.getOdStringEle(appInfoEle, XmlUtils.OD_NAME_WEBSITE, false);
+
+ return new AppInfo(
+ title,
+ description,
+ containsAds,
+ obeyAps,
+ adsFingerprinting,
+ securityFingerprinting,
+ privacyPolicy,
+ securityEndpoints,
+ firstPartyEndpoints,
+ serviceProviderEndpoints,
+ category,
+ email,
+ website);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
index eb975540ce70..d551953477d8 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataCategory.java
@@ -63,6 +63,8 @@ public class DataCategory implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ throw new IllegalStateException(
+ "Turning DataCategory or DataType into human-readable DOM elements requires"
+ + " visibility into parent elements. The logic resides in DataLabels.");
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java
index 02b7189c09ba..97304cb36081 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DataType.java
@@ -163,7 +163,9 @@ public class DataType implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ throw new IllegalStateException(
+ "Turning DataCategory or DataType into human-readable DOM elements requires"
+ + " visibility into parent elements. The logic resides in DataLabels.");
}
private static void maybeAddBoolToOdElement(
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java
index efdc8d0a5f11..94fad9607880 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfo.java
@@ -143,6 +143,31 @@ public class DeveloperInfo implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element developerInfoEle = doc.createElement(XmlUtils.HR_TAG_DEVELOPER_INFO);
+ if (mName != null) {
+ developerInfoEle.setAttribute(XmlUtils.HR_ATTR_NAME, mName);
+ }
+ if (mEmail != null) {
+ developerInfoEle.setAttribute(XmlUtils.HR_ATTR_EMAIL, mEmail);
+ }
+ if (mAddress != null) {
+ developerInfoEle.setAttribute(XmlUtils.HR_ATTR_ADDRESS, mAddress);
+ }
+ if (mCountryRegion != null) {
+ developerInfoEle.setAttribute(XmlUtils.HR_ATTR_COUNTRY_REGION, mCountryRegion);
+ }
+ if (mDeveloperRelationship != null) {
+ developerInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_DEVELOPER_RELATIONSHIP, mDeveloperRelationship.toString());
+ }
+ if (mWebsite != null) {
+ developerInfoEle.setAttribute(XmlUtils.HR_ATTR_WEBSITE, mWebsite);
+ }
+ if (mAppDeveloperRegistryId != null) {
+ developerInfoEle.setAttribute(
+ XmlUtils.HR_ATTR_APP_DEVELOPER_REGISTRY_ID, mAppDeveloperRegistryId);
+ }
+
+ return XmlUtils.listOf(developerInfoEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java
index c3e7ac35c545..0f3b41cd5d1a 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/DeveloperInfoFactory.java
@@ -34,15 +34,15 @@ public class DeveloperInfoFactory implements AslMarshallableFactory<DeveloperInf
AslgenUtil.logI("No DeveloperInfo found in hr format.");
return null;
}
- String name = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_NAME);
- String email = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_EMAIL);
- String address = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_ADDRESS);
+ String name = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_NAME, true);
+ String email = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_EMAIL, true);
+ String address = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_ADDRESS, true);
String countryRegion =
- XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_COUNTRY_REGION);
+ XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_COUNTRY_REGION, true);
DeveloperInfo.DeveloperRelationship developerRelationship =
DeveloperInfo.DeveloperRelationship.forString(
XmlUtils.getStringAttr(
- developerInfoEle, XmlUtils.HR_ATTR_DEVELOPER_RELATIONSHIP));
+ developerInfoEle, XmlUtils.HR_ATTR_DEVELOPER_RELATIONSHIP, true));
String website = XmlUtils.getStringAttr(developerInfoEle, XmlUtils.HR_ATTR_WEBSITE, false);
String appDeveloperRegistryId =
XmlUtils.getStringAttr(
@@ -61,6 +61,36 @@ public class DeveloperInfoFactory implements AslMarshallableFactory<DeveloperInf
/** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
@Override
public DeveloperInfo createFromOdElements(List<Element> elements) throws MalformedXmlException {
- return null;
+ Element developerInfoEle = XmlUtils.getSingleElement(elements);
+ if (developerInfoEle == null) {
+ AslgenUtil.logI("No DeveloperInfo found in od format.");
+ return null;
+ }
+ String name = XmlUtils.getOdStringEle(developerInfoEle, XmlUtils.OD_NAME_NAME, true);
+ String email = XmlUtils.getOdStringEle(developerInfoEle, XmlUtils.OD_NAME_EMAIL, true);
+ String address = XmlUtils.getOdStringEle(developerInfoEle, XmlUtils.OD_NAME_ADDRESS, true);
+ String countryRegion =
+ XmlUtils.getOdStringEle(developerInfoEle, XmlUtils.OD_NAME_COUNTRY_REGION, true);
+ DeveloperInfo.DeveloperRelationship developerRelationship =
+ DeveloperInfo.DeveloperRelationship.forValue(
+ (int)
+ (long)
+ XmlUtils.getOdLongEle(
+ developerInfoEle,
+ XmlUtils.OD_NAME_DEVELOPER_RELATIONSHIP,
+ true));
+ String website = XmlUtils.getOdStringEle(developerInfoEle, XmlUtils.OD_NAME_WEBSITE, false);
+ String appDeveloperRegistryId =
+ XmlUtils.getOdStringEle(
+ developerInfoEle, XmlUtils.OD_NAME_APP_DEVELOPER_REGISTRY_ID, false);
+
+ return new DeveloperInfo(
+ name,
+ email,
+ address,
+ countryRegion,
+ developerRelationship,
+ website,
+ appDeveloperRegistryId);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java
index 576820dac6c6..6af80715f7c1 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabels.java
@@ -74,6 +74,18 @@ public class SafetyLabels implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element safetyLabelsEle = doc.createElement(XmlUtils.HR_TAG_SAFETY_LABELS);
+ safetyLabelsEle.setAttribute(XmlUtils.HR_ATTR_VERSION, String.valueOf(mVersion));
+
+ if (mDataLabels != null) {
+ XmlUtils.appendChildren(safetyLabelsEle, mDataLabels.toHrDomElements(doc));
+ }
+ if (mSecurityLabels != null) {
+ XmlUtils.appendChildren(safetyLabelsEle, mSecurityLabels.toHrDomElements(doc));
+ }
+ if (mThirdPartyVerification != null) {
+ XmlUtils.appendChildren(safetyLabelsEle, mThirdPartyVerification.toHrDomElements(doc));
+ }
+ return XmlUtils.listOf(safetyLabelsEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java
index 7e1838f40680..2644b435311b 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SafetyLabelsFactory.java
@@ -66,6 +66,37 @@ public class SafetyLabelsFactory implements AslMarshallableFactory<SafetyLabels>
/** Creates an {@link AslMarshallableFactory} from on-device DOM elements */
@Override
public SafetyLabels createFromOdElements(List<Element> elements) throws MalformedXmlException {
- return null;
+ Element safetyLabelsEle = XmlUtils.getSingleElement(elements);
+ if (safetyLabelsEle == null) {
+ AslgenUtil.logI("No SafetyLabels found in od format.");
+ return null;
+ }
+ Long version = XmlUtils.getOdLongEle(safetyLabelsEle, XmlUtils.OD_NAME_VERSION, true);
+
+ DataLabels dataLabels =
+ new DataLabelsFactory()
+ .createFromOdElements(
+ XmlUtils.listOf(
+ XmlUtils.getOdPbundleWithName(
+ safetyLabelsEle,
+ XmlUtils.OD_NAME_DATA_LABELS,
+ false)));
+ SecurityLabels securityLabels =
+ new SecurityLabelsFactory()
+ .createFromOdElements(
+ XmlUtils.listOf(
+ XmlUtils.getOdPbundleWithName(
+ safetyLabelsEle,
+ XmlUtils.OD_NAME_SECURITY_LABELS,
+ false)));
+ ThirdPartyVerification thirdPartyVerification =
+ new ThirdPartyVerificationFactory()
+ .createFromOdElements(
+ XmlUtils.listOf(
+ XmlUtils.getOdPbundleWithName(
+ safetyLabelsEle,
+ XmlUtils.OD_NAME_THIRD_PARTY_VERIFICATION,
+ false)));
+ return new SafetyLabels(version, dataLabels, securityLabels, thirdPartyVerification);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java
index 437343b14605..48643ba0e3ab 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java
@@ -54,6 +54,13 @@ public class SecurityLabels implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element ele = doc.createElement(XmlUtils.HR_TAG_SECURITY_LABELS);
+ if (mIsDataDeletable != null) {
+ ele.setAttribute(XmlUtils.HR_ATTR_IS_DATA_DELETABLE, String.valueOf(mIsDataDeletable));
+ }
+ if (mIsDataEncrypted != null) {
+ ele.setAttribute(XmlUtils.HR_ATTR_IS_DATA_ENCRYPTED, String.valueOf(mIsDataEncrypted));
+ }
+ return XmlUtils.listOf(ele);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java
index 9dc4712c33b0..525a80388261 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java
@@ -46,6 +46,15 @@ public class SecurityLabelsFactory implements AslMarshallableFactory<SecurityLab
@Override
public SecurityLabels createFromOdElements(List<Element> elements)
throws MalformedXmlException {
- return null;
+ Element ele = XmlUtils.getSingleElement(elements);
+ if (ele == null) {
+ AslgenUtil.logI("No SecurityLabels found in od format.");
+ return null;
+ }
+ Boolean isDataDeletable =
+ XmlUtils.getOdBoolEle(ele, XmlUtils.OD_NAME_IS_DATA_DELETABLE, false);
+ Boolean isDataEncrypted =
+ XmlUtils.getOdBoolEle(ele, XmlUtils.OD_NAME_IS_DATA_ENCRYPTED, false);
+ return new SecurityLabels(isDataDeletable, isDataEncrypted);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
index f0ecf93f2805..854c0d0ac3e1 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabel.java
@@ -50,6 +50,9 @@ public class SystemAppSafetyLabel implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element systemAppSafetyLabelEle =
+ doc.createElement(XmlUtils.HR_TAG_SYSTEM_APP_SAFETY_LABEL);
+ systemAppSafetyLabelEle.setAttribute(XmlUtils.HR_ATTR_URL, mUrl);
+ return XmlUtils.listOf(systemAppSafetyLabelEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
index 5b7fe32f2735..c8e22b6c42cd 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SystemAppSafetyLabelFactory.java
@@ -36,7 +36,7 @@ public class SystemAppSafetyLabelFactory implements AslMarshallableFactory<Syste
return null;
}
- String url = XmlUtils.getStringAttr(systemAppSafetyLabelEle, XmlUtils.HR_ATTR_URL);
+ String url = XmlUtils.getStringAttr(systemAppSafetyLabelEle, XmlUtils.HR_ATTR_URL, true);
return new SystemAppSafetyLabel(url);
}
@@ -44,6 +44,12 @@ public class SystemAppSafetyLabelFactory implements AslMarshallableFactory<Syste
@Override
public SystemAppSafetyLabel createFromOdElements(List<Element> elements)
throws MalformedXmlException {
- return null;
+ Element systemAppSafetyLabelEle = XmlUtils.getSingleElement(elements);
+ if (systemAppSafetyLabelEle == null) {
+ AslgenUtil.logI("No SystemAppSafetyLabel found in od format.");
+ return null;
+ }
+ String url = XmlUtils.getOdStringEle(systemAppSafetyLabelEle, XmlUtils.OD_NAME_URL, true);
+ return new SystemAppSafetyLabel(url);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java
index 229b00243e0a..d74f3f062513 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java
@@ -44,6 +44,8 @@ public class ThirdPartyVerification implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element ele = doc.createElement(XmlUtils.HR_TAG_THIRD_PARTY_VERIFICATION);
+ ele.setAttribute(XmlUtils.HR_ATTR_URL, mUrl);
+ return XmlUtils.listOf(ele);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java
index ac4d3836bcbd..197e7aa77743 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java
@@ -37,7 +37,7 @@ public class ThirdPartyVerificationFactory
return null;
}
- String url = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_URL);
+ String url = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_URL, true);
return new ThirdPartyVerification(url);
}
@@ -45,6 +45,13 @@ public class ThirdPartyVerificationFactory
@Override
public ThirdPartyVerification createFromOdElements(List<Element> elements)
throws MalformedXmlException {
- return null;
+ Element ele = XmlUtils.getSingleElement(elements);
+ if (ele == null) {
+ AslgenUtil.logI("No ThirdPartyVerification found in od format.");
+ return null;
+ }
+
+ String url = XmlUtils.getOdStringEle(ele, XmlUtils.OD_NAME_URL, true);
+ return new ThirdPartyVerification(url);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java
index ce7ef16ea54e..6a8700a10d3f 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfo.java
@@ -61,6 +61,13 @@ public class TransparencyInfo implements AslMarshallable {
/** Creates the human-readable DOM elements from the AslMarshallable Java Object. */
@Override
public List<Element> toHrDomElements(Document doc) {
- return List.of();
+ Element transparencyInfoEle = doc.createElement(XmlUtils.HR_TAG_TRANSPARENCY_INFO);
+ if (mDeveloperInfo != null) {
+ XmlUtils.appendChildren(transparencyInfoEle, mDeveloperInfo.toHrDomElements(doc));
+ }
+ if (mAppInfo != null) {
+ XmlUtils.appendChildren(transparencyInfoEle, mAppInfo.toHrDomElements(doc));
+ }
+ return XmlUtils.listOf(transparencyInfoEle);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java
index 123de01e57ba..94c564087918 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/TransparencyInfoFactory.java
@@ -54,6 +54,23 @@ public class TransparencyInfoFactory implements AslMarshallableFactory<Transpare
@Override
public TransparencyInfo createFromOdElements(List<Element> elements)
throws MalformedXmlException {
- return null;
+ Element transparencyInfoEle = XmlUtils.getSingleElement(elements);
+ if (transparencyInfoEle == null) {
+ AslgenUtil.logI("No TransparencyInfo found in od format.");
+ return null;
+ }
+
+ Element developerInfoEle =
+ XmlUtils.getOdPbundleWithName(
+ transparencyInfoEle, XmlUtils.OD_NAME_DEVELOPER_INFO, false);
+ DeveloperInfo developerInfo =
+ new DeveloperInfoFactory().createFromOdElements(XmlUtils.listOf(developerInfoEle));
+
+ Element appInfoEle =
+ XmlUtils.getOdPbundleWithName(
+ transparencyInfoEle, XmlUtils.OD_NAME_APP_INFO, false);
+ AppInfo appInfo = new AppInfoFactory().createFromOdElements(XmlUtils.listOf(appInfoEle));
+
+ return new TransparencyInfo(developerInfo, appInfo);
}
}
diff --git a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
index 4f21b0c0ffad..1d54ead0a28d 100644
--- a/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
+++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/util/XmlUtils.java
@@ -320,6 +320,63 @@ public class XmlUtils {
return b;
}
+ /** Gets an on-device Long attribute. */
+ public static Long getOdLongEle(Element ele, String nameName, boolean required)
+ throws MalformedXmlException {
+ List<Element> longEles =
+ XmlUtils.getChildrenByTagName(ele, XmlUtils.OD_TAG_LONG).stream()
+ .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(nameName))
+ .toList();
+ if (longEles.size() > 1) {
+ throw new MalformedXmlException(
+ String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ }
+ if (longEles.isEmpty()) {
+ if (required) {
+ throw new MalformedXmlException(
+ String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ }
+ return null;
+ }
+ Element longEle = longEles.get(0);
+ Long l = null;
+ try {
+ l = Long.parseLong(longEle.getAttribute(XmlUtils.OD_ATTR_VALUE));
+ } catch (NumberFormatException e) {
+ throw new MalformedXmlException(
+ String.format(
+ "%s in %s was not formatted as long", nameName, ele.getTagName()));
+ }
+ return l;
+ }
+
+ /** Gets an on-device String attribute. */
+ public static String getOdStringEle(Element ele, String nameName, boolean required)
+ throws MalformedXmlException {
+ List<Element> eles =
+ XmlUtils.getChildrenByTagName(ele, XmlUtils.OD_TAG_STRING).stream()
+ .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(nameName))
+ .toList();
+ if (eles.size() > 1) {
+ throw new MalformedXmlException(
+ String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ }
+ if (eles.isEmpty()) {
+ if (required) {
+ throw new MalformedXmlException(
+ String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ }
+ return null;
+ }
+ String str = eles.get(0).getAttribute(XmlUtils.OD_ATTR_VALUE);
+ if (XmlUtils.isNullOrEmpty(str) && required) {
+ throw new MalformedXmlException(
+ String.format(
+ "%s in %s was empty or missing value", nameName, ele.getTagName()));
+ }
+ return str;
+ }
+
/** Gets a OD Pbundle Element attribute with the specified name. */
public static Element getOdPbundleWithName(Element ele, String nameName, boolean required)
throws MalformedXmlException {
@@ -379,7 +436,7 @@ public class XmlUtils {
throw new MalformedXmlException(
String.format("Found no %s in %s.", nameName, ele.getTagName()));
}
- return List.of();
+ return null;
}
Element intArrayEle = intArrayEles.get(0);
List<Element> itemEles = XmlUtils.getChildrenByTagName(intArrayEle, XmlUtils.OD_TAG_ITEM);
@@ -390,6 +447,33 @@ public class XmlUtils {
return ints;
}
+ /** Gets on-device style String array. */
+ public static List<String> getOdStringArray(Element ele, String nameName, boolean required)
+ throws MalformedXmlException {
+ List<Element> arrayEles =
+ XmlUtils.getChildrenByTagName(ele, XmlUtils.OD_TAG_STRING_ARRAY).stream()
+ .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(nameName))
+ .toList();
+ if (arrayEles.size() > 1) {
+ throw new MalformedXmlException(
+ String.format("Found more than one %s in %s.", nameName, ele.getTagName()));
+ }
+ if (arrayEles.isEmpty()) {
+ if (required) {
+ throw new MalformedXmlException(
+ String.format("Found no %s in %s.", nameName, ele.getTagName()));
+ }
+ return null;
+ }
+ Element arrayEle = arrayEles.get(0);
+ List<Element> itemEles = XmlUtils.getChildrenByTagName(arrayEle, XmlUtils.OD_TAG_ITEM);
+ List<String> strs = new ArrayList<String>();
+ for (Element itemEle : itemEles) {
+ strs.add(XmlUtils.getStringAttr(itemEle, XmlUtils.OD_ATTR_VALUE, true));
+ }
+ return strs;
+ }
+
/**
* Utility method for making a List from one element, to support easier refactoring if needed.
* For example, List.of() doesn't support null elements.
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
index e2588d7bb3e7..d2e0fc338243 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AslgenTests.java
@@ -56,18 +56,35 @@ public class AslgenTests {
InputStream hrStream =
getClass().getClassLoader().getResourceAsStream(hrPath.toString());
- String hrContents = new String(hrStream.readAllBytes(), StandardCharsets.UTF_8);
+ String hrContents =
+ TestUtils.getFormattedXml(
+ new String(hrStream.readAllBytes(), StandardCharsets.UTF_8), false);
InputStream odStream =
getClass().getClassLoader().getResourceAsStream(odPath.toString());
- String odContents = new String(odStream.readAllBytes(), StandardCharsets.UTF_8);
- AndroidSafetyLabel asl =
+ String odContents =
+ TestUtils.getFormattedXml(
+ new String(odStream.readAllBytes(), StandardCharsets.UTF_8), false);
+ AndroidSafetyLabel aslFromHr =
AslConverter.readFromString(hrContents, AslConverter.Format.HUMAN_READABLE);
- String out = AslConverter.getXmlAsString(asl, AslConverter.Format.ON_DEVICE);
- System.out.println("out: " + out);
+ String aslToOdStr =
+ TestUtils.getFormattedXml(
+ AslConverter.getXmlAsString(aslFromHr, AslConverter.Format.ON_DEVICE),
+ false);
+ AndroidSafetyLabel aslFromOd =
+ AslConverter.readFromString(odContents, AslConverter.Format.ON_DEVICE);
+ String aslToHrStr =
+ TestUtils.getFormattedXml(
+ AslConverter.getXmlAsString(
+ aslFromOd, AslConverter.Format.HUMAN_READABLE),
+ false);
- assertEquals(
- TestUtils.getFormattedXml(out, false),
- TestUtils.getFormattedXml(odContents, false));
+ System.out.println("od expected: " + odContents);
+ System.out.println("asl to od: " + aslToOdStr);
+ assertEquals(odContents, aslToOdStr);
+
+ System.out.println("hr expected: " + hrContents);
+ System.out.println("asl to hr: " + aslToHrStr);
+ assertEquals(hrContents, aslToHrStr);
}
}
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java
index 013700728e50..61a78232801c 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AndroidSafetyLabelTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class AndroidSafetyLabelTest {
@@ -38,12 +37,9 @@ public class AndroidSafetyLabelTest {
"with-system-app-safety-label.xml";
private static final String WITH_TRANSPARENCY_INFO_FILE_NAME = "with-transparency-info.xml";
- private Document mDoc = null;
-
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for android safety label missing version. */
@@ -51,6 +47,7 @@ public class AndroidSafetyLabelTest {
public void testAndroidSafetyLabelMissingVersion() throws Exception {
System.out.println("starting testAndroidSafetyLabelMissingVersion.");
hrToOdExpectException(MISSING_VERSION_FILE_NAME);
+ odToHrExpectException(MISSING_VERSION_FILE_NAME);
}
/** Test for android safety label valid empty. */
@@ -58,6 +55,7 @@ public class AndroidSafetyLabelTest {
public void testAndroidSafetyLabelValidEmptyFile() throws Exception {
System.out.println("starting testAndroidSafetyLabelValidEmptyFile.");
testHrToOdAndroidSafetyLabel(VALID_EMPTY_FILE_NAME);
+ testOdToHrAndroidSafetyLabel(VALID_EMPTY_FILE_NAME);
}
/** Test for android safety label with safety labels. */
@@ -65,6 +63,7 @@ public class AndroidSafetyLabelTest {
public void testAndroidSafetyLabelWithSafetyLabels() throws Exception {
System.out.println("starting testAndroidSafetyLabelWithSafetyLabels.");
testHrToOdAndroidSafetyLabel(WITH_SAFETY_LABELS_FILE_NAME);
+ testOdToHrAndroidSafetyLabel(WITH_SAFETY_LABELS_FILE_NAME);
}
/** Test for android safety label with system app safety label. */
@@ -72,6 +71,7 @@ public class AndroidSafetyLabelTest {
public void testAndroidSafetyLabelWithSystemAppSafetyLabel() throws Exception {
System.out.println("starting testAndroidSafetyLabelWithSystemAppSafetyLabel.");
testHrToOdAndroidSafetyLabel(WITH_SYSTEM_APP_SAFETY_LABEL_FILE_NAME);
+ testOdToHrAndroidSafetyLabel(WITH_SYSTEM_APP_SAFETY_LABEL_FILE_NAME);
}
/** Test for android safety label with transparency info. */
@@ -79,6 +79,7 @@ public class AndroidSafetyLabelTest {
public void testAndroidSafetyLabelWithTransparencyInfo() throws Exception {
System.out.println("starting testAndroidSafetyLabelWithTransparencyInfo.");
testHrToOdAndroidSafetyLabel(WITH_TRANSPARENCY_INFO_FILE_NAME);
+ testOdToHrAndroidSafetyLabel(WITH_TRANSPARENCY_INFO_FILE_NAME);
}
private void hrToOdExpectException(String fileName) {
@@ -86,12 +87,26 @@ public class AndroidSafetyLabelTest {
new AndroidSafetyLabelFactory(), ANDROID_SAFETY_LABEL_HR_PATH, fileName);
}
+ private void odToHrExpectException(String fileName) {
+ TestUtils.odToHrExpectException(
+ new AndroidSafetyLabelFactory(), ANDROID_SAFETY_LABEL_OD_PATH, fileName);
+ }
+
private void testHrToOdAndroidSafetyLabel(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new AndroidSafetyLabelFactory(),
ANDROID_SAFETY_LABEL_HR_PATH,
ANDROID_SAFETY_LABEL_OD_PATH,
fileName);
}
+
+ private void testOdToHrAndroidSafetyLabel(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new AndroidSafetyLabelFactory(),
+ ANDROID_SAFETY_LABEL_OD_PATH,
+ ANDROID_SAFETY_LABEL_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java
index a015e2eacac5..9e91c6f22641 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/AppInfoTest.java
@@ -25,7 +25,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
import java.nio.file.Paths;
import java.util.List;
@@ -48,19 +47,31 @@ public class AppInfoTest {
"serviceProviderEndpoints",
"category",
"email");
+ public static final List<String> REQUIRED_FIELD_NAMES_OD =
+ List.of(
+ "title",
+ "description",
+ "contains_ads",
+ "obey_aps",
+ "ads_fingerprinting",
+ "security_fingerprinting",
+ "privacy_policy",
+ "security_endpoint",
+ "first_party_endpoint",
+ "service_provider_endpoint",
+ "category",
+ "email");
public static final List<String> OPTIONAL_FIELD_NAMES = List.of("website");
+ public static final List<String> OPTIONAL_FIELD_NAMES_OD = List.of("website");
private static final String ALL_FIELDS_VALID_FILE_NAME = "all-fields-valid.xml";
- private Document mDoc = null;
-
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for all fields valid. */
@@ -68,6 +79,7 @@ public class AppInfoTest {
public void testAllFieldsValid() throws Exception {
System.out.println("starting testAllFieldsValid.");
testHrToOdAppInfo(ALL_FIELDS_VALID_FILE_NAME);
+ testOdToHrAppInfo(ALL_FIELDS_VALID_FILE_NAME);
}
/** Tests missing required fields fails. */
@@ -75,7 +87,7 @@ public class AppInfoTest {
public void testMissingRequiredFields() throws Exception {
System.out.println("Starting testMissingRequiredFields");
for (String reqField : REQUIRED_FIELD_NAMES) {
- System.out.println("testing missing required field: " + reqField);
+ System.out.println("testing missing required field hr: " + reqField);
var appInfoEle =
TestUtils.getElementsFromResource(
Paths.get(APP_INFO_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
@@ -85,6 +97,17 @@ public class AppInfoTest {
MalformedXmlException.class,
() -> new AppInfoFactory().createFromHrElements(appInfoEle));
}
+
+ for (String reqField : REQUIRED_FIELD_NAMES_OD) {
+ System.out.println("testing missing required field od: " + reqField);
+ var appInfoEle =
+ TestUtils.getElementsFromResource(
+ Paths.get(APP_INFO_OD_PATH, ALL_FIELDS_VALID_FILE_NAME));
+ TestUtils.removeOdChildEleWithName(appInfoEle.get(0), reqField);
+ assertThrows(
+ MalformedXmlException.class,
+ () -> new AppInfoFactory().createFromOdElements(appInfoEle));
+ }
}
/** Tests missing optional fields passes. */
@@ -96,12 +119,34 @@ public class AppInfoTest {
Paths.get(APP_INFO_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
ele.get(0).removeAttribute(optField);
AppInfo appInfo = new AppInfoFactory().createFromHrElements(ele);
- appInfo.toOdDomElements(mDoc);
+ appInfo.toOdDomElements(TestUtils.document());
+ }
+
+ for (String optField : OPTIONAL_FIELD_NAMES_OD) {
+ var ele =
+ TestUtils.getElementsFromResource(
+ Paths.get(APP_INFO_OD_PATH, ALL_FIELDS_VALID_FILE_NAME));
+ TestUtils.removeOdChildEleWithName(ele.get(0), optField);
+ AppInfo appInfo = new AppInfoFactory().createFromOdElements(ele);
+ appInfo.toHrDomElements(TestUtils.document());
}
}
private void testHrToOdAppInfo(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc, new AppInfoFactory(), APP_INFO_HR_PATH, APP_INFO_OD_PATH, fileName);
+ TestUtils.document(),
+ new AppInfoFactory(),
+ APP_INFO_HR_PATH,
+ APP_INFO_OD_PATH,
+ fileName);
+ }
+
+ private void testOdToHrAppInfo(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new AppInfoFactory(),
+ APP_INFO_OD_PATH,
+ APP_INFO_HR_PATH,
+ fileName);
}
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
index 822f1753f662..ebb31865843f 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataCategoryTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class DataCategoryTest {
@@ -57,15 +56,12 @@ public class DataCategoryTest {
"data-category-personal-unrecognized-type.xml";
private static final String UNRECOGNIZED_CATEGORY_FILE_NAME = "data-category-unrecognized.xml";
- private Document mDoc = null;
-
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for data category personal. */
@@ -207,7 +203,7 @@ public class DataCategoryTest {
private void testHrToOdDataCategory(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new DataCategoryFactory(),
DATA_CATEGORY_HR_PATH,
DATA_CATEGORY_OD_PATH,
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
index 6f6f2545a5d2..26617264b2e9 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DataLabelsTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class DataLabelsTest {
@@ -65,12 +64,9 @@ public class DataLabelsTest {
private static final String UNRECOGNIZED_FILE_NAME = "data-category-unrecognized.xml";
private static final String UNRECOGNIZED_TYPE_FILE_NAME = "data-category-unrecognized-type.xml";
- private Document mDoc = null;
-
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for data labels accessed valid bool. */
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java
index ff8346a526ad..72e8d654b542 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/DeveloperInfoTest.java
@@ -25,7 +25,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
import java.nio.file.Paths;
import java.util.List;
@@ -36,19 +35,20 @@ public class DeveloperInfoTest {
private static final String DEVELOPER_INFO_OD_PATH = "com/android/asllib/developerinfo/od";
public static final List<String> REQUIRED_FIELD_NAMES =
List.of("address", "countryRegion", "email", "name", "relationship");
+ public static final List<String> REQUIRED_FIELD_NAMES_OD =
+ List.of("address", "country_region", "email", "name", "relationship");
public static final List<String> OPTIONAL_FIELD_NAMES = List.of("website", "registryId");
+ public static final List<String> OPTIONAL_FIELD_NAMES_OD =
+ List.of("website", "app_developer_registry_id");
private static final String ALL_FIELDS_VALID_FILE_NAME = "all-fields-valid.xml";
- private Document mDoc = null;
-
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for all fields valid. */
@@ -56,6 +56,7 @@ public class DeveloperInfoTest {
public void testAllFieldsValid() throws Exception {
System.out.println("starting testAllFieldsValid.");
testHrToOdDeveloperInfo(ALL_FIELDS_VALID_FILE_NAME);
+ testOdToHrDeveloperInfo(ALL_FIELDS_VALID_FILE_NAME);
}
/** Tests missing required fields fails. */
@@ -73,6 +74,18 @@ public class DeveloperInfoTest {
MalformedXmlException.class,
() -> new DeveloperInfoFactory().createFromHrElements(developerInfoEle));
}
+
+ for (String reqField : REQUIRED_FIELD_NAMES_OD) {
+ System.out.println("testing missing required field od: " + reqField);
+ var developerInfoEle =
+ TestUtils.getElementsFromResource(
+ Paths.get(DEVELOPER_INFO_OD_PATH, ALL_FIELDS_VALID_FILE_NAME));
+ TestUtils.removeOdChildEleWithName(developerInfoEle.get(0), reqField);
+
+ assertThrows(
+ MalformedXmlException.class,
+ () -> new DeveloperInfoFactory().createFromOdElements(developerInfoEle));
+ }
}
/** Tests missing optional fields passes. */
@@ -85,16 +98,35 @@ public class DeveloperInfoTest {
developerInfoEle.get(0).removeAttribute(optField);
DeveloperInfo developerInfo =
new DeveloperInfoFactory().createFromHrElements(developerInfoEle);
- developerInfo.toOdDomElements(mDoc);
+ developerInfo.toOdDomElements(TestUtils.document());
+ }
+
+ for (String optField : OPTIONAL_FIELD_NAMES_OD) {
+ var developerInfoEle =
+ TestUtils.getElementsFromResource(
+ Paths.get(DEVELOPER_INFO_OD_PATH, ALL_FIELDS_VALID_FILE_NAME));
+ TestUtils.removeOdChildEleWithName(developerInfoEle.get(0), optField);
+ DeveloperInfo developerInfo =
+ new DeveloperInfoFactory().createFromOdElements(developerInfoEle);
+ developerInfo.toHrDomElements(TestUtils.document());
}
}
private void testHrToOdDeveloperInfo(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new DeveloperInfoFactory(),
DEVELOPER_INFO_HR_PATH,
DEVELOPER_INFO_OD_PATH,
fileName);
}
+
+ private void testOdToHrDeveloperInfo(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new DeveloperInfoFactory(),
+ DEVELOPER_INFO_OD_PATH,
+ DEVELOPER_INFO_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java
index c52d6c873646..bba6b548beaf 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SafetyLabelsTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class SafetyLabelsTest {
@@ -36,12 +35,9 @@ public class SafetyLabelsTest {
private static final String WITH_THIRD_PARTY_VERIFICATION_FILE_NAME =
"with-third-party-verification.xml";
- private Document mDoc = null;
-
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for safety labels missing version. */
@@ -49,6 +45,7 @@ public class SafetyLabelsTest {
public void testSafetyLabelsMissingVersion() throws Exception {
System.out.println("starting testSafetyLabelsMissingVersion.");
hrToOdExpectException(MISSING_VERSION_FILE_NAME);
+ odToHrExpectException(MISSING_VERSION_FILE_NAME);
}
/** Test for safety labels valid empty. */
@@ -56,6 +53,7 @@ public class SafetyLabelsTest {
public void testSafetyLabelsValidEmptyFile() throws Exception {
System.out.println("starting testSafetyLabelsValidEmptyFile.");
testHrToOdSafetyLabels(VALID_EMPTY_FILE_NAME);
+ testOdToHrSafetyLabels(VALID_EMPTY_FILE_NAME);
}
/** Test for safety labels with data labels. */
@@ -63,6 +61,7 @@ public class SafetyLabelsTest {
public void testSafetyLabelsWithDataLabels() throws Exception {
System.out.println("starting testSafetyLabelsWithDataLabels.");
testHrToOdSafetyLabels(WITH_DATA_LABELS_FILE_NAME);
+ testOdToHrSafetyLabels(WITH_DATA_LABELS_FILE_NAME);
}
/** Test for safety labels with security labels. */
@@ -70,6 +69,7 @@ public class SafetyLabelsTest {
public void testSafetyLabelsWithSecurityLabels() throws Exception {
System.out.println("starting testSafetyLabelsWithSecurityLabels.");
testHrToOdSafetyLabels(WITH_SECURITY_LABELS_FILE_NAME);
+ testOdToHrSafetyLabels(WITH_SECURITY_LABELS_FILE_NAME);
}
/** Test for safety labels with third party verification. */
@@ -77,18 +77,32 @@ public class SafetyLabelsTest {
public void testSafetyLabelsWithThirdPartyVerification() throws Exception {
System.out.println("starting testSafetyLabelsWithThirdPartyVerification.");
testHrToOdSafetyLabels(WITH_THIRD_PARTY_VERIFICATION_FILE_NAME);
+ testOdToHrSafetyLabels(WITH_THIRD_PARTY_VERIFICATION_FILE_NAME);
}
private void hrToOdExpectException(String fileName) {
TestUtils.hrToOdExpectException(new SafetyLabelsFactory(), SAFETY_LABELS_HR_PATH, fileName);
}
+ private void odToHrExpectException(String fileName) {
+ TestUtils.odToHrExpectException(new SafetyLabelsFactory(), SAFETY_LABELS_OD_PATH, fileName);
+ }
+
private void testHrToOdSafetyLabels(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new SafetyLabelsFactory(),
SAFETY_LABELS_HR_PATH,
SAFETY_LABELS_OD_PATH,
fileName);
}
+
+ private void testOdToHrSafetyLabels(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new SafetyLabelsFactory(),
+ SAFETY_LABELS_OD_PATH,
+ SAFETY_LABELS_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java
index c0d0d728f762..a940bc63c685 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java
@@ -23,7 +23,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
import java.nio.file.Paths;
import java.util.List;
@@ -35,18 +34,17 @@ public class SecurityLabelsTest {
public static final List<String> OPTIONAL_FIELD_NAMES =
List.of("isDataDeletable", "isDataEncrypted");
+ public static final List<String> OPTIONAL_FIELD_NAMES_OD =
+ List.of("is_data_deletable", "is_data_encrypted");
private static final String ALL_FIELDS_VALID_FILE_NAME = "all-fields-valid.xml";
- private Document mDoc = null;
-
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for all fields valid. */
@@ -54,6 +52,7 @@ public class SecurityLabelsTest {
public void testAllFieldsValid() throws Exception {
System.out.println("starting testAllFieldsValid.");
testHrToOdSecurityLabels(ALL_FIELDS_VALID_FILE_NAME);
+ testOdToHrSecurityLabels(ALL_FIELDS_VALID_FILE_NAME);
}
/** Tests missing optional fields passes. */
@@ -65,16 +64,33 @@ public class SecurityLabelsTest {
Paths.get(SECURITY_LABELS_HR_PATH, ALL_FIELDS_VALID_FILE_NAME));
ele.get(0).removeAttribute(optField);
SecurityLabels securityLabels = new SecurityLabelsFactory().createFromHrElements(ele);
- securityLabels.toOdDomElements(mDoc);
+ securityLabels.toOdDomElements(TestUtils.document());
+ }
+ for (String optField : OPTIONAL_FIELD_NAMES_OD) {
+ var ele =
+ TestUtils.getElementsFromResource(
+ Paths.get(SECURITY_LABELS_OD_PATH, ALL_FIELDS_VALID_FILE_NAME));
+ TestUtils.removeOdChildEleWithName(ele.get(0), optField);
+ SecurityLabels securityLabels = new SecurityLabelsFactory().createFromOdElements(ele);
+ securityLabels.toHrDomElements(TestUtils.document());
}
}
private void testHrToOdSecurityLabels(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new SecurityLabelsFactory(),
SECURITY_LABELS_HR_PATH,
SECURITY_LABELS_OD_PATH,
fileName);
}
+
+ private void testOdToHrSecurityLabels(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new SecurityLabelsFactory(),
+ SECURITY_LABELS_OD_PATH,
+ SECURITY_LABELS_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
index 191091a9e187..33c276487c64 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SystemAppSafetyLabelTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class SystemAppSafetyLabelTest {
@@ -34,15 +33,12 @@ public class SystemAppSafetyLabelTest {
private static final String VALID_FILE_NAME = "valid.xml";
private static final String MISSING_URL_FILE_NAME = "missing-url.xml";
- private Document mDoc = null;
-
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for valid. */
@@ -50,6 +46,7 @@ public class SystemAppSafetyLabelTest {
public void testValid() throws Exception {
System.out.println("starting testValid.");
testHrToOdSystemAppSafetyLabel(VALID_FILE_NAME);
+ testOdToHrSystemAppSafetyLabel(VALID_FILE_NAME);
}
/** Tests missing url. */
@@ -57,6 +54,7 @@ public class SystemAppSafetyLabelTest {
public void testMissingUrl() throws Exception {
System.out.println("starting testMissingUrl.");
hrToOdExpectException(MISSING_URL_FILE_NAME);
+ odToHrExpectException(MISSING_URL_FILE_NAME);
}
private void hrToOdExpectException(String fileName) {
@@ -64,12 +62,26 @@ public class SystemAppSafetyLabelTest {
new SystemAppSafetyLabelFactory(), SYSTEM_APP_SAFETY_LABEL_HR_PATH, fileName);
}
+ private void odToHrExpectException(String fileName) {
+ TestUtils.odToHrExpectException(
+ new SystemAppSafetyLabelFactory(), SYSTEM_APP_SAFETY_LABEL_OD_PATH, fileName);
+ }
+
private void testHrToOdSystemAppSafetyLabel(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new SystemAppSafetyLabelFactory(),
SYSTEM_APP_SAFETY_LABEL_HR_PATH,
SYSTEM_APP_SAFETY_LABEL_OD_PATH,
fileName);
}
+
+ private void testOdToHrSystemAppSafetyLabel(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new SystemAppSafetyLabelFactory(),
+ SYSTEM_APP_SAFETY_LABEL_OD_PATH,
+ SYSTEM_APP_SAFETY_LABEL_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java
index ab8e85cd022b..ec86d0f863af 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class ThirdPartyVerificationTest {
@@ -34,15 +33,12 @@ public class ThirdPartyVerificationTest {
private static final String VALID_FILE_NAME = "valid.xml";
private static final String MISSING_URL_FILE_NAME = "missing-url.xml";
- private Document mDoc = null;
-
/** Logic for setting up tests (empty if not yet needed). */
public static void main(String[] params) throws Exception {}
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for valid. */
@@ -50,6 +46,7 @@ public class ThirdPartyVerificationTest {
public void testValid() throws Exception {
System.out.println("starting testValid.");
testHrToOdThirdPartyVerification(VALID_FILE_NAME);
+ testOdToHrThirdPartyVerification(VALID_FILE_NAME);
}
/** Tests missing url. */
@@ -57,6 +54,7 @@ public class ThirdPartyVerificationTest {
public void testMissingUrl() throws Exception {
System.out.println("starting testMissingUrl.");
hrToOdExpectException(MISSING_URL_FILE_NAME);
+ odToHrExpectException(MISSING_URL_FILE_NAME);
}
private void hrToOdExpectException(String fileName) {
@@ -64,12 +62,26 @@ public class ThirdPartyVerificationTest {
new ThirdPartyVerificationFactory(), THIRD_PARTY_VERIFICATION_HR_PATH, fileName);
}
+ private void odToHrExpectException(String fileName) {
+ TestUtils.odToHrExpectException(
+ new ThirdPartyVerificationFactory(), THIRD_PARTY_VERIFICATION_OD_PATH, fileName);
+ }
+
private void testHrToOdThirdPartyVerification(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new ThirdPartyVerificationFactory(),
THIRD_PARTY_VERIFICATION_HR_PATH,
THIRD_PARTY_VERIFICATION_OD_PATH,
fileName);
}
+
+ private void testOdToHrThirdPartyVerification(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new ThirdPartyVerificationFactory(),
+ THIRD_PARTY_VERIFICATION_OD_PATH,
+ THIRD_PARTY_VERIFICATION_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java
index 56503f7d6c6b..f49424061427 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/TransparencyInfoTest.java
@@ -22,7 +22,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.w3c.dom.Document;
@RunWith(JUnit4.class)
public class TransparencyInfoTest {
@@ -35,12 +34,9 @@ public class TransparencyInfoTest {
private static final String WITH_DEVELOPER_INFO_FILE_NAME = "with-developer-info.xml";
private static final String WITH_APP_INFO_FILE_NAME = "with-app-info.xml";
- private Document mDoc = null;
-
@Before
public void setUp() throws Exception {
System.out.println("set up.");
- mDoc = TestUtils.document();
}
/** Test for transparency info valid empty. */
@@ -48,6 +44,7 @@ public class TransparencyInfoTest {
public void testTransparencyInfoValidEmptyFile() throws Exception {
System.out.println("starting testTransparencyInfoValidEmptyFile.");
testHrToOdTransparencyInfo(VALID_EMPTY_FILE_NAME);
+ testOdToHrTransparencyInfo(VALID_EMPTY_FILE_NAME);
}
/** Test for transparency info with developer info. */
@@ -55,6 +52,7 @@ public class TransparencyInfoTest {
public void testTransparencyInfoWithDeveloperInfo() throws Exception {
System.out.println("starting testTransparencyInfoWithDeveloperInfo.");
testHrToOdTransparencyInfo(WITH_DEVELOPER_INFO_FILE_NAME);
+ testOdToHrTransparencyInfo(WITH_DEVELOPER_INFO_FILE_NAME);
}
/** Test for transparency info with app info. */
@@ -62,14 +60,24 @@ public class TransparencyInfoTest {
public void testTransparencyInfoWithAppInfo() throws Exception {
System.out.println("starting testTransparencyInfoWithAppInfo.");
testHrToOdTransparencyInfo(WITH_APP_INFO_FILE_NAME);
+ testOdToHrTransparencyInfo(WITH_APP_INFO_FILE_NAME);
}
private void testHrToOdTransparencyInfo(String fileName) throws Exception {
TestUtils.testHrToOd(
- mDoc,
+ TestUtils.document(),
new TransparencyInfoFactory(),
TRANSPARENCY_INFO_HR_PATH,
TRANSPARENCY_INFO_OD_PATH,
fileName);
}
+
+ private void testOdToHrTransparencyInfo(String fileName) throws Exception {
+ TestUtils.testOdToHr(
+ TestUtils.document(),
+ new TransparencyInfoFactory(),
+ TRANSPARENCY_INFO_OD_PATH,
+ TRANSPARENCY_INFO_HR_PATH,
+ fileName);
+ }
}
diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java
index 6a29b869be43..ea90993e0785 100644
--- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java
+++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/testutils/TestUtils.java
@@ -38,6 +38,7 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
+import java.util.Optional;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -98,6 +99,19 @@ public class TestUtils {
return outStream.toString(StandardCharsets.UTF_8);
}
+ /** Removes on-device style child with the corresponding name */
+ public static void removeOdChildEleWithName(Element ele, String childNameName) {
+ Optional<Element> childEle =
+ XmlUtils.asElementList(ele.getChildNodes()).stream()
+ .filter(e -> e.getAttribute(XmlUtils.OD_ATTR_NAME).equals(childNameName))
+ .findFirst();
+ if (childEle.isEmpty()) {
+ throw new IllegalStateException(
+ String.format("%s was not found in %s", childNameName, ele.getTagName()));
+ }
+ ele.removeChild(childEle.get());
+ }
+
/**
* Gets formatted XML for slightly more robust comparison checking than naive string comparison.
*/
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/missing-version.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/missing-version.xml
new file mode 100644
index 000000000000..1aa3aa94ca6d
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/androidsafetylabel/od/missing-version.xml
@@ -0,0 +1,2 @@
+<bundle>
+</bundle> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/missing-version.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/missing-version.xml
new file mode 100644
index 000000000000..3fbe3599cd82
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/missing-version.xml
@@ -0,0 +1,2 @@
+<pbundle_as_map name="safety_labels">
+</pbundle_as_map> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-url.xml
new file mode 100644
index 000000000000..33b796552463
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/systemappsafetylabel/od/missing-url.xml
@@ -0,0 +1,2 @@
+<pbundle_as_map name="system_app_safety_label">
+</pbundle_as_map> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/missing-url.xml
new file mode 100644
index 000000000000..0b5a46f904e4
--- /dev/null
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/missing-url.xml
@@ -0,0 +1,2 @@
+<pbundle_as_map name="third_party_verification">
+</pbundle_as_map> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml
index 862bda465b25..d16caaea320f 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/hr/with-developer-info.xml
@@ -7,5 +7,5 @@
countryRegion="US"
relationship="aosp"
website="example.com"
- appDeveloperRegistryId="registry_id" />
+ registryId="registry_id" />
</transparency-info> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml
index 101c98bd8e60..d7a4e1a959b7 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/transparencyinfo/od/with-developer-info.xml
@@ -7,5 +7,6 @@
<string name="country_region" value="US"/>
<long name="relationship" value="5"/>
<string name="website" value="example.com"/>
+ <string name="app_developer_registry_id" value="registry_id"/>
</pbundle_as_map>
</pbundle_as_map> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
index 36beb93319cd..8f854ad1107e 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml
@@ -1,6 +1,4 @@
<app-metadata-bundles version="123">
- <system-app-safety-label url="www.example.com">
- </system-app-safety-label>
<safety-labels version="12345">
<data-labels>
<data-shared dataCategory="location"
@@ -21,6 +19,8 @@
<third-party-verification url="www.example.com">
</third-party-verification>
</safety-labels>
+ <system-app-safety-label url="www.example.com">
+ </system-app-safety-label>
<transparency-info>
<developer-info
name="max"
@@ -29,7 +29,7 @@
countryRegion="US"
relationship="aosp"
website="example.com"
- appDeveloperRegistryId="registry_id" />
+ registryId="registry_id" />
<app-info title="beervision" description="a beer app" containsAds="true" obeyAps="false" adsFingerprinting="false" securityFingerprinting="false" privacyPolicy="www.example.com" securityEndpoints="url1|url2|url3" firstPartyEndpoints="url1" serviceProviderEndpoints="url55|url56" category="Food and drink" email="max@maxloh.com" />
</transparency-info>
</app-metadata-bundles> \ No newline at end of file
diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
index db21280ad61b..8f1dc6475b78 100644
--- a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
+++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml
@@ -42,6 +42,7 @@
<string name="country_region" value="US"/>
<long name="relationship" value="5"/>
<string name="website" value="example.com"/>
+ <string name="app_developer_registry_id" value="registry_id"/>
</pbundle_as_map>
<pbundle_as_map name="app_info">
<string name="title" value="beervision"/>