From 58f7d34bfe90cf78f37f0e776a423924c86ca4d9 Mon Sep 17 00:00:00 2001 From: Max Loh <mloh@google.com> Date: Wed, 3 Apr 2024 11:53:30 -0700 Subject: [PATCH] aslgen implement security labels and third party verification Bug: 329902686 Test: Unit tests. Change-Id: I2affaa81cad77ceb8a8ccf4418fb511e9340aa6f --- .../asllib/marshallable/SafetyLabels.java | 16 +++- .../marshallable/SafetyLabelsFactory.java | 18 ++++- .../asllib/marshallable/SecurityLabels.java | 53 ++++++++++++ .../marshallable/SecurityLabelsFactory.java | 44 ++++++++++ .../marshallable/ThirdPartyVerification.java | 43 ++++++++++ .../ThirdPartyVerificationFactory.java | 43 ++++++++++ .../com/android/asllib/util/XmlUtils.java | 8 ++ .../java/com/android/asllib/AllTests.java | 14 +++- .../java/com/android/asllib/AslgenTests.java | 3 +- .../asllib/marshallable/SafetyLabelsTest.java | 17 ++++ .../marshallable/SecurityLabelsTest.java | 80 +++++++++++++++++++ .../ThirdPartyVerificationTest.java | 75 +++++++++++++++++ .../safetylabels/hr/with-security-labels.xml | 6 ++ .../hr/with-third-party-verification.xml | 4 + .../safetylabels/od/with-security-labels.xml | 7 ++ .../od/with-third-party-verification.xml | 6 ++ .../securitylabels/hr/all-fields-valid.xml | 4 + .../securitylabels/od/all-fields-valid.xml | 4 + .../thirdpartyverification/hr/missing-url.xml | 1 + .../thirdpartyverification/hr/valid.xml | 1 + .../thirdpartyverification/od/valid.xml | 3 + .../asllib/validmappings/general/hr.xml | 35 ++++++++ .../asllib/validmappings/general/od.xml | 70 ++++++++++++++++ 23 files changed, 551 insertions(+), 4 deletions(-) create mode 100644 tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java create mode 100644 tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java create mode 100644 tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java create mode 100644 tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java create mode 100644 tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java create mode 100644 tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-third-party-verification.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/hr/all-fields-valid.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml create mode 100644 tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml 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 22c3fd8f2a1c..8c2186a628e3 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 @@ -28,10 +28,18 @@ public class SafetyLabels implements AslMarshallable { private final Long mVersion; private final DataLabels mDataLabels; + private final SecurityLabels mSecurityLabels; + private final ThirdPartyVerification mThirdPartyVerification; - public SafetyLabels(Long version, DataLabels dataLabels) { + public SafetyLabels( + Long version, + DataLabels dataLabels, + SecurityLabels securityLabels, + ThirdPartyVerification thirdPartyVerification) { this.mVersion = version; this.mDataLabels = dataLabels; + this.mSecurityLabels = securityLabels; + this.mThirdPartyVerification = thirdPartyVerification; } /** Returns the data label for the safety label */ @@ -54,6 +62,12 @@ public class SafetyLabels implements AslMarshallable { if (mDataLabels != null) { XmlUtils.appendChildren(safetyLabelsEle, mDataLabels.toOdDomElements(doc)); } + if (mSecurityLabels != null) { + XmlUtils.appendChildren(safetyLabelsEle, mSecurityLabels.toOdDomElements(doc)); + } + if (mThirdPartyVerification != null) { + XmlUtils.appendChildren(safetyLabelsEle, mThirdPartyVerification.toOdDomElements(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 6bf8ef3df32d..0f7aa8161c64 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 @@ -44,6 +44,22 @@ public class SafetyLabelsFactory implements AslMarshallableFactory<SafetyLabels> safetyLabelsEle, XmlUtils.HR_TAG_DATA_LABELS, false))); - return new SafetyLabels(version, dataLabels); + SecurityLabels securityLabels = + new SecurityLabelsFactory() + .createFromHrElements( + XmlUtils.listOf( + XmlUtils.getSingleChildElement( + safetyLabelsEle, + XmlUtils.HR_TAG_SECURITY_LABELS, + false))); + ThirdPartyVerification thirdPartyVerification = + new ThirdPartyVerificationFactory() + .createFromHrElements( + XmlUtils.listOf( + XmlUtils.getSingleChildElement( + safetyLabelsEle, + XmlUtils.HR_TAG_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 new file mode 100644 index 000000000000..529b50364255 --- /dev/null +++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabels.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.asllib.marshallable; + +import com.android.asllib.util.XmlUtils; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.util.List; + +/** Security Labels representation */ +public class SecurityLabels implements AslMarshallable { + + private final Boolean mIsDataDeletable; + private final Boolean mIsDataEncrypted; + + public SecurityLabels(Boolean isDataDeletable, Boolean isDataEncrypted) { + this.mIsDataDeletable = isDataDeletable; + this.mIsDataEncrypted = isDataEncrypted; + } + + /** Creates an on-device DOM element from the {@link SecurityLabels}. */ + @Override + public List<Element> toOdDomElements(Document doc) { + Element ele = XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_SECURITY_LABELS); + if (mIsDataDeletable != null) { + ele.appendChild( + XmlUtils.createOdBooleanEle( + doc, XmlUtils.OD_NAME_IS_DATA_DELETABLE, mIsDataDeletable)); + } + if (mIsDataEncrypted != null) { + ele.appendChild( + XmlUtils.createOdBooleanEle( + doc, XmlUtils.OD_NAME_IS_DATA_ENCRYPTED, 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 new file mode 100644 index 000000000000..84024520035e --- /dev/null +++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/SecurityLabelsFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.asllib.marshallable; + +import com.android.asllib.util.AslgenUtil; +import com.android.asllib.util.MalformedXmlException; +import com.android.asllib.util.XmlUtils; + +import org.w3c.dom.Element; + +import java.util.List; + +public class SecurityLabelsFactory implements AslMarshallableFactory<SecurityLabels> { + + /** Creates a {@link SecurityLabels} from the human-readable DOM element. */ + @Override + public SecurityLabels createFromHrElements(List<Element> elements) + throws MalformedXmlException { + Element ele = XmlUtils.getSingleElement(elements); + if (ele == null) { + AslgenUtil.logI("No SecurityLabels found in hr format."); + return null; + } + Boolean isDataDeletable = + XmlUtils.getBoolAttr(ele, XmlUtils.HR_ATTR_IS_DATA_DELETABLE, false); + Boolean isDataEncrypted = + XmlUtils.getBoolAttr(ele, XmlUtils.HR_ATTR_IS_DATA_ENCRYPTED, false); + return new SecurityLabels(isDataDeletable, isDataEncrypted); + } +} 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 new file mode 100644 index 000000000000..a1b22f885fe6 --- /dev/null +++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerification.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.asllib.marshallable; + +import com.android.asllib.util.XmlUtils; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.util.List; + +/** ThirdPartyVerification representation. */ +public class ThirdPartyVerification implements AslMarshallable { + + private final String mUrl; + + public ThirdPartyVerification(String url) { + this.mUrl = url; + } + + /** Creates an on-device DOM element from the {@link ThirdPartyVerification}. */ + @Override + public List<Element> toOdDomElements(Document doc) { + Element ele = + XmlUtils.createPbundleEleWithName(doc, XmlUtils.OD_NAME_THIRD_PARTY_VERIFICATION); + ele.appendChild(XmlUtils.createOdStringEle(doc, XmlUtils.OD_NAME_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 new file mode 100644 index 000000000000..c3e4964c0b9d --- /dev/null +++ b/tools/app_metadata_bundles/src/lib/java/com/android/asllib/marshallable/ThirdPartyVerificationFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.asllib.marshallable; + +import com.android.asllib.util.AslgenUtil; +import com.android.asllib.util.MalformedXmlException; +import com.android.asllib.util.XmlUtils; + +import org.w3c.dom.Element; + +import java.util.List; + +public class ThirdPartyVerificationFactory + implements AslMarshallableFactory<ThirdPartyVerification> { + + /** Creates a {@link ThirdPartyVerification} from the human-readable DOM element. */ + @Override + public ThirdPartyVerification createFromHrElements(List<Element> elements) + throws MalformedXmlException { + Element ele = XmlUtils.getSingleElement(elements); + if (ele == null) { + AslgenUtil.logI("No ThirdPartyVerification found in hr format."); + return null; + } + + String url = XmlUtils.getStringAttr(ele, XmlUtils.HR_ATTR_URL); + return new ThirdPartyVerification(url); + } +} 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 691f92fca54b..ed3d7f8372d6 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 @@ -32,6 +32,8 @@ public class XmlUtils { public static final String HR_TAG_DEVELOPER_INFO = "developer-info"; public static final String HR_TAG_APP_INFO = "app-info"; public static final String HR_TAG_DATA_LABELS = "data-labels"; + public static final String HR_TAG_SECURITY_LABELS = "security-labels"; + public static final String HR_TAG_THIRD_PARTY_VERIFICATION = "third-party-verification"; public static final String HR_TAG_DATA_ACCESSED = "data-accessed"; public static final String HR_TAG_DATA_COLLECTED = "data-collected"; public static final String HR_TAG_DATA_SHARED = "data-shared"; @@ -46,6 +48,8 @@ public class XmlUtils { public static final String HR_ATTR_DATA_TYPE = "dataType"; public static final String HR_ATTR_IS_COLLECTION_OPTIONAL = "isCollectionOptional"; public static final String HR_ATTR_IS_SHARING_OPTIONAL = "isSharingOptional"; + public static final String HR_ATTR_IS_DATA_DELETABLE = "isDataDeletable"; + public static final String HR_ATTR_IS_DATA_ENCRYPTED = "isDataEncrypted"; public static final String HR_ATTR_EPHEMERAL = "ephemeral"; public static final String HR_ATTR_PURPOSES = "purposes"; public static final String HR_ATTR_VERSION = "version"; @@ -98,6 +102,8 @@ public class XmlUtils { public static final String OD_NAME_VERSION = "version"; public static final String OD_NAME_URL = "url"; public static final String OD_NAME_SYSTEM_APP_SAFETY_LABEL = "system_app_safety_label"; + public static final String OD_NAME_SECURITY_LABELS = "security_labels"; + public static final String OD_NAME_THIRD_PARTY_VERIFICATION = "third_party_verification"; public static final String OD_NAME_DATA_LABELS = "data_labels"; public static final String OD_NAME_DATA_ACCESSED = "data_accessed"; public static final String OD_NAME_DATA_COLLECTED = "data_collected"; @@ -105,6 +111,8 @@ public class XmlUtils { public static final String OD_NAME_PURPOSES = "purposes"; public static final String OD_NAME_IS_COLLECTION_OPTIONAL = "is_collection_optional"; public static final String OD_NAME_IS_SHARING_OPTIONAL = "is_sharing_optional"; + public static final String OD_NAME_IS_DATA_DELETABLE = "is_data_deletable"; + public static final String OD_NAME_IS_DATA_ENCRYPTED = "is_data_encrypted"; public static final String OD_NAME_EPHEMERAL = "ephemeral"; public static final String TRUE_STR = "true"; diff --git a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java index 03e8ac6d11c0..54c80f6f7345 100644 --- a/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java +++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/AllTests.java @@ -17,9 +17,15 @@ package com.android.asllib; import com.android.asllib.marshallable.AndroidSafetyLabelTest; +import com.android.asllib.marshallable.AppInfoTest; import com.android.asllib.marshallable.DataCategoryTest; import com.android.asllib.marshallable.DataLabelsTest; import com.android.asllib.marshallable.DeveloperInfoTest; +import com.android.asllib.marshallable.SafetyLabelsTest; +import com.android.asllib.marshallable.SecurityLabelsTest; +import com.android.asllib.marshallable.SystemAppSafetyLabelTest; +import com.android.asllib.marshallable.ThirdPartyVerificationTest; +import com.android.asllib.marshallable.TransparencyInfoTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -28,8 +34,14 @@ import org.junit.runners.Suite; @Suite.SuiteClasses({ AslgenTests.class, AndroidSafetyLabelTest.class, - DeveloperInfoTest.class, + AppInfoTest.class, DataCategoryTest.class, DataLabelsTest.class, + DeveloperInfoTest.class, + SafetyLabelsTest.class, + SecurityLabelsTest.class, + SystemAppSafetyLabelTest.class, + ThirdPartyVerificationTest.class, + TransparencyInfoTest.class }) public class AllTests {} 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 5f43008d3dc6..e2588d7bb3e7 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 @@ -34,7 +34,8 @@ import java.util.List; @RunWith(JUnit4.class) public class AslgenTests { private static final String VALID_MAPPINGS_PATH = "com/android/asllib/validmappings"; - private static final List<String> VALID_MAPPINGS_SUBDIRS = List.of("location", "contacts"); + private static final List<String> VALID_MAPPINGS_SUBDIRS = + List.of("location", "contacts", "general"); private static final String HR_XML_FILENAME = "hr.xml"; private static final String OD_XML_FILENAME = "od.xml"; 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 b62620ef417e..c52d6c873646 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 @@ -32,6 +32,9 @@ public class SafetyLabelsTest { private static final String MISSING_VERSION_FILE_NAME = "missing-version.xml"; private static final String VALID_EMPTY_FILE_NAME = "valid-empty.xml"; private static final String WITH_DATA_LABELS_FILE_NAME = "with-data-labels.xml"; + private static final String WITH_SECURITY_LABELS_FILE_NAME = "with-security-labels.xml"; + private static final String WITH_THIRD_PARTY_VERIFICATION_FILE_NAME = + "with-third-party-verification.xml"; private Document mDoc = null; @@ -62,6 +65,20 @@ public class SafetyLabelsTest { testHrToOdSafetyLabels(WITH_DATA_LABELS_FILE_NAME); } + /** Test for safety labels with security labels. */ + @Test + public void testSafetyLabelsWithSecurityLabels() throws Exception { + System.out.println("starting testSafetyLabelsWithSecurityLabels."); + testHrToOdSafetyLabels(WITH_SECURITY_LABELS_FILE_NAME); + } + + /** Test for safety labels with third party verification. */ + @Test + public void testSafetyLabelsWithThirdPartyVerification() throws Exception { + System.out.println("starting testSafetyLabelsWithThirdPartyVerification."); + testHrToOdSafetyLabels(WITH_THIRD_PARTY_VERIFICATION_FILE_NAME); + } + private void hrToOdExpectException(String fileName) { TestUtils.hrToOdExpectException(new SafetyLabelsFactory(), 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 new file mode 100644 index 000000000000..c0d0d728f762 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/SecurityLabelsTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.asllib.marshallable; + + +import com.android.asllib.testutils.TestUtils; + +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; + +@RunWith(JUnit4.class) +public class SecurityLabelsTest { + private static final String SECURITY_LABELS_HR_PATH = "com/android/asllib/securitylabels/hr"; + private static final String SECURITY_LABELS_OD_PATH = "com/android/asllib/securitylabels/od"; + + public static final List<String> OPTIONAL_FIELD_NAMES = + List.of("isDataDeletable", "isDataEncrypted"); + + 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. */ + @Test + public void testAllFieldsValid() throws Exception { + System.out.println("starting testAllFieldsValid."); + testHrToOdSecurityLabels(ALL_FIELDS_VALID_FILE_NAME); + } + + /** Tests missing optional fields passes. */ + @Test + public void testMissingOptionalFields() throws Exception { + for (String optField : OPTIONAL_FIELD_NAMES) { + var ele = + TestUtils.getElementsFromResource( + 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); + } + } + + private void testHrToOdSecurityLabels(String fileName) throws Exception { + TestUtils.testHrToOd( + mDoc, + new SecurityLabelsFactory(), + SECURITY_LABELS_HR_PATH, + SECURITY_LABELS_OD_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 new file mode 100644 index 000000000000..ab8e85cd022b --- /dev/null +++ b/tools/app_metadata_bundles/src/test/java/com/android/asllib/marshallable/ThirdPartyVerificationTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.asllib.marshallable; + +import com.android.asllib.testutils.TestUtils; + +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 { + private static final String THIRD_PARTY_VERIFICATION_HR_PATH = + "com/android/asllib/thirdpartyverification/hr"; + private static final String THIRD_PARTY_VERIFICATION_OD_PATH = + "com/android/asllib/thirdpartyverification/od"; + + 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. */ + @Test + public void testValid() throws Exception { + System.out.println("starting testValid."); + testHrToOdThirdPartyVerification(VALID_FILE_NAME); + } + + /** Tests missing url. */ + @Test + public void testMissingUrl() throws Exception { + System.out.println("starting testMissingUrl."); + hrToOdExpectException(MISSING_URL_FILE_NAME); + } + + private void hrToOdExpectException(String fileName) { + TestUtils.hrToOdExpectException( + new ThirdPartyVerificationFactory(), THIRD_PARTY_VERIFICATION_HR_PATH, fileName); + } + + private void testHrToOdThirdPartyVerification(String fileName) throws Exception { + TestUtils.testHrToOd( + mDoc, + new ThirdPartyVerificationFactory(), + THIRD_PARTY_VERIFICATION_HR_PATH, + THIRD_PARTY_VERIFICATION_OD_PATH, + fileName); + } +} diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml new file mode 100644 index 000000000000..940e48a68ce8 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-security-labels.xml @@ -0,0 +1,6 @@ +<safety-labels version="12345"> + <security-labels + isDataDeletable="true" + isDataEncrypted="false" + /> +</safety-labels> \ No newline at end of file diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml new file mode 100644 index 000000000000..bfbc5ae70974 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/hr/with-third-party-verification.xml @@ -0,0 +1,4 @@ +<safety-labels version="12345"> +<third-party-verification url="www.example.com"> + </third-party-verification> +</safety-labels> \ No newline at end of file diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml new file mode 100644 index 000000000000..b39c562b30d0 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-security-labels.xml @@ -0,0 +1,7 @@ +<pbundle_as_map name="safety_labels"> + <long name="version" value="12345"/> + <pbundle_as_map name="security_labels"> + <boolean name="is_data_deletable" value="true" /> + <boolean name="is_data_encrypted" value="false" /> + </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/safetylabels/od/with-third-party-verification.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-third-party-verification.xml new file mode 100644 index 000000000000..10653ff5027b --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/safetylabels/od/with-third-party-verification.xml @@ -0,0 +1,6 @@ +<pbundle_as_map name="safety_labels"> + <long name="version" value="12345"/> + <pbundle_as_map name="third_party_verification"> + <string name="url" value="www.example.com"/> + </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/securitylabels/hr/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/hr/all-fields-valid.xml new file mode 100644 index 000000000000..e2fb592cba07 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/hr/all-fields-valid.xml @@ -0,0 +1,4 @@ +<security-labels + isDataDeletable="true" + isDataEncrypted="false"> +</security-labels> \ No newline at end of file diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml new file mode 100644 index 000000000000..7b2f656ec832 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/securitylabels/od/all-fields-valid.xml @@ -0,0 +1,4 @@ +<pbundle_as_map name="security_labels"> + <boolean name="is_data_deletable" value="true" /> + <boolean name="is_data_encrypted" value="false" /> +</pbundle_as_map> \ No newline at end of file diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml new file mode 100644 index 000000000000..6738ac2f2446 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/missing-url.xml @@ -0,0 +1 @@ +<third-party-verification></third-party-verification> \ No newline at end of file diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml new file mode 100644 index 000000000000..2a664f22b916 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/hr/valid.xml @@ -0,0 +1 @@ +<third-party-verification url="www.example.com"></third-party-verification> \ No newline at end of file diff --git a/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml new file mode 100644 index 000000000000..dbeb592d7e88 --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/thirdpartyverification/od/valid.xml @@ -0,0 +1,3 @@ +<pbundle_as_map name="third_party_verification"> + <string name="url" value="www.example.com"/> +</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 new file mode 100644 index 000000000000..36beb93319cd --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/hr.xml @@ -0,0 +1,35 @@ +<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" + dataType="approx_location" + isSharingOptional="false" + ephemeral="false" + purposes="app_functionality" /> + <data-shared dataCategory="location" + dataType="precise_location" + isSharingOptional="true" + ephemeral="true" + purposes="app_functionality|analytics" /> + </data-labels> + <security-labels + isDataDeletable="true" + isDataEncrypted="false" + /> + <third-party-verification url="www.example.com"> + </third-party-verification> + </safety-labels> + <transparency-info> + <developer-info + name="max" + email="max@example.com" + address="111 blah lane" + countryRegion="US" + relationship="aosp" + website="example.com" + appDeveloperRegistryId="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 new file mode 100644 index 000000000000..db21280ad61b --- /dev/null +++ b/tools/app_metadata_bundles/src/test/resources/com/android/asllib/validmappings/general/od.xml @@ -0,0 +1,70 @@ +<bundle> + <long name="version" value="123"/> + <pbundle_as_map name="safety_labels"> + <long name="version" value="12345"/> + <pbundle_as_map name="data_labels"> + <pbundle_as_map name="data_shared"> + <pbundle_as_map name="location"> + <pbundle_as_map name="approx_location"> + <int-array name="purposes" num="1"> + <item value="1"/> + </int-array> + <boolean name="is_sharing_optional" value="false"/> + <boolean name="ephemeral" value="false"/> + </pbundle_as_map> + <pbundle_as_map name="precise_location"> + <int-array name="purposes" num="2"> + <item value="1"/> + <item value="2"/> + </int-array> + <boolean name="is_sharing_optional" value="true"/> + <boolean name="ephemeral" value="true"/> + </pbundle_as_map> + </pbundle_as_map> + </pbundle_as_map> + </pbundle_as_map> + <pbundle_as_map name="security_labels"> + <boolean name="is_data_deletable" value="true"/> + <boolean name="is_data_encrypted" value="false"/> + </pbundle_as_map> + <pbundle_as_map name="third_party_verification"> + <string name="url" value="www.example.com"/> + </pbundle_as_map> + </pbundle_as_map> + <pbundle_as_map name="system_app_safety_label"> + <string name="url" value="www.example.com"/> + </pbundle_as_map> + <pbundle_as_map name="transparency_info"> + <pbundle_as_map name="developer_info"> + <string name="name" value="max"/> + <string name="email" value="max@example.com"/> + <string name="address" value="111 blah lane"/> + <string name="country_region" value="US"/> + <long name="relationship" value="5"/> + <string name="website" value="example.com"/> + </pbundle_as_map> + <pbundle_as_map name="app_info"> + <string name="title" value="beervision"/> + <string name="description" value="a beer app"/> + <boolean name="contains_ads" value="true"/> + <boolean name="obey_aps" value="false"/> + <boolean name="ads_fingerprinting" value="false"/> + <boolean name="security_fingerprinting" value="false"/> + <string name="privacy_policy" value="www.example.com"/> + <string-array name="security_endpoint" num="3"> + <item value="url1"/> + <item value="url2"/> + <item value="url3"/> + </string-array> + <string-array name="first_party_endpoint" num="1"> + <item value="url1"/> + </string-array> + <string-array name="service_provider_endpoint" num="2"> + <item value="url55"/> + <item value="url56"/> + </string-array> + <string name="category" value="Food and drink"/> + <string name="email" value="max@maxloh.com"/> + </pbundle_as_map> + </pbundle_as_map> +</bundle> \ No newline at end of file -- GitLab