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 b98161dd26fb9d85a49ba0dadfa9b7eda09f7d47..191f38d3df809531d6379bee8dd0053beb5b06b8 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 ecfad91a378fce318e8ce1f95996a2f0b919b8af..72140a17297c4e34f31ca5175356df0bf36c384f 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 41ce6e55e989a8a01ff00dc4ee9290afc76c437d..c53cbbf99a46d86e6cd56018c6636e9cb2681e10 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 21f328d8e2d03a12324a9efa9c37d251cfb1e171..129733ebc1b6910711873b98a6aaf453ca8a2eb9 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 6fcf637fe069586bfd4f254644a23facd09d1527..c5069619e0698a28419bcefb868632ae12bf35c5 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 eb975540ce70a09630ca48cd9e37f576b999e484..d551953477d877f228a3eb9eefb6369a7fa073d0 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 02b7189c09ba7dd032f84b0615924f1b2cedaa24..97304cb360814a7d66c3830bc62f00dc6249224d 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 efdc8d0a5f11dd05ab6ba4793799b23cbb377802..94fad96078801aa250e9ba954066e558b199226c 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 c3e7ac35c5451f0ff446460eb5a00fd94dfa8990..0f3b41cd5d1ad91ac0e413ec591647f4e23b0bc6 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 576820dac6c6980920d512a61da1110afe5c2432..6af80715f7c1a80500feb5d52da4432e49baebb8 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 7e1838f40680488aa4e8bc2a10e540bbaa36fa41..2644b435311b3b3fcda33942888997ea8838b20e 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 437343b1460546bd78a2e6a7be8eab42a92e3911..48643ba0e3abb6a45504d0f5eae648afcfc8b3e5 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 9dc4712c33b09a95b2d4a9e31a388cd8e19b301b..525a803882611d18cf942c06cf05a7cf547a9837 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 f0ecf93f28052e3a01417045496313f2fc789ab5..854c0d0ac3e11f67d6dff2bdb55401d63e187535 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 5b7fe32f2735d97f8f21fc3d5a8efc42c2715b60..c8e22b6c42cdc3a716eb3cb6196d62f22f874906 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 229b00243e0a95b1b939953fb882993dfba6d595..d74f3f062513fd7a8a2621cdde5973b67fdb489b 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 ac4d3836bcbdbbcdd93d3b95aec4e52c61cd4489..197e7aa77743f20fca73c2a8367b8f14ec024515 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 ce7ef16ea54e723d5fef47b2252babdf8ccc72f1..6a8700a10d3f5ae944fa850217c6b3aefe68aa22 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 123de01e57ba1ecc00baaa3c93c6d383bd5342fc..94c56408791879c6eb54100eae5c4ce51f554ebe 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 4f21b0c0ffadddb8b829bd36115a3fa14e845167..1d54ead0a28ded5972d81a0ccc88df595dfde706 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 e2588d7bb3e728095a8828703139a8b9e2590be2..d2e0fc338243aba279ea7d25c99dbc8b285fa514 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 013700728e50cb4a44d72cfa23f1c9c8ca5470ff..61a78232801ccfc8d94e6476f46af150936c9484 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 a015e2eacac539bc7412f0b3fa57fab8ff0495e9..9e91c6f22641912d32963d08c2d93192515335e5 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 822f1753f662c664786fcea6bd418a9299f8e5e5..ebb31865843fbb32a4cb999ed0f8fae380661102 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 6f6f2545a5d2377268bff5db9924580b2447c4f1..26617264b2e94cf9c701b6140e2e2c3738306013 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 ff8346a526ad7972690635e40ab66680b4e7a500..72e8d654b54281ab8458fd17aad0ae4f5cdec446 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 c52d6c873646a241d05b46b1ab0e8950f2ad0c8d..bba6b548beafc7d2b3b2c1410898a833be6f97a0 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 c0d0d728f762a166516b6696696408d40fdbcbd8..a940bc63c6851827c8d00c87a95232c949ea2023 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 191091a9e187ea8415bbcdfb443c92005c31f6ec..33c276487c641cc19c20e845bc59c35d2545fc8a 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 ab8e85cd022b60e4c3acd057ca369dafae0efc48..ec86d0f863afa7ae9c3afd1ac241e49ac40135f7 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 56503f7d6c6baa4170fc41a035187c633e250dd4..f494240614275b9a65327da7d9bc5fc277824d78 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 6a29b869be4364c27f1f7171e00013fc5455eecb..ea90993e07854ace9f287d11df17bc6ba0289a45 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 0000000000000000000000000000000000000000..1aa3aa94ca6d51f619585fc319033669f153721f --- /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 0000000000000000000000000000000000000000..3fbe3599cd824f6c0c74dfaab229330261555bcb --- /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 0000000000000000000000000000000000000000..33b7965524632ed21912254ab2c79c7b7ce3e39e --- /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 0000000000000000000000000000000000000000..0b5a46f904e488222b82736b073b859c067b2dad --- /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 862bda465b2571a52df4d69dc316fccf15b8de84..d16caaea320fdb3f4c067ce6f2f9aadce46e84fe 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 101c98bd8e60ac406cc00eb3c44e48431f915865..d7a4e1a959b7bd67203bad3cda2dada1ec28f449 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 36beb93319cd05e6d0c26f850e226e3443119beb..8f854ad1107e33121381cacb3509ad11ed06bfcb 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 db21280ad61b566d57d4e7eb03a3e011dde4ed54..8f1dc6475b78dc9ad4c2bd004d46a160b60cd420 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"/>