Add tests for the provisioning DPM APIs admin extras parameters.

Bug: 215145532
Test: atest DevicePolicyManagerTest
Change-Id: I2fc0c93c2330b14b57f695ee3a0fb7002cd72310
diff --git a/tests/devicepolicy/src/android/devicepolicy/cts/DevicePolicyManagerTest.java b/tests/devicepolicy/src/android/devicepolicy/cts/DevicePolicyManagerTest.java
index b4db967..2393f49 100644
--- a/tests/devicepolicy/src/android/devicepolicy/cts/DevicePolicyManagerTest.java
+++ b/tests/devicepolicy/src/android/devicepolicy/cts/DevicePolicyManagerTest.java
@@ -52,8 +52,10 @@
 import android.content.pm.PackageManager;
 import android.nfc.NdefMessage;
 import android.nfc.NdefRecord;
+import android.os.BaseBundle;
 import android.os.Bundle;
 import android.os.Parcelable;
+import android.os.PersistableBundle;
 import android.os.UserHandle;
 import android.os.UserManager;
 
@@ -93,6 +95,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -158,6 +161,10 @@
     @Rule
     public static final DeviceState sDeviceState = new DeviceState();
 
+    private static final PersistableBundle ADMIN_EXTRAS_BUNDLE = createAdminExtrasBundle();
+    private static final String TEST_KEY = "test_key";
+    private static final String TEST_VALUE = "test_value";
+
     @RequireRunOnPrimaryUser
     @EnsureHasNoDpc
     @RequireFeature(FEATURE_DEVICE_ADMIN)
@@ -1211,4 +1218,140 @@
         assertThat(sDevicePolicyManager.getUserProvisioningState())
                 .isEqualTo(DevicePolicyManager.STATE_USER_PROFILE_FINALIZED);
     }
+
+    @Test
+    public void setAdminExtras_managedProfileParams_works() {
+        ManagedProfileProvisioningParams params =
+                createManagedProfileProvisioningParamsBuilder()
+                        .setAdminExtras(ADMIN_EXTRAS_BUNDLE)
+                        .build();
+
+        assertBundlesEqual(params.getAdminExtras(), ADMIN_EXTRAS_BUNDLE);
+    }
+
+    @Test
+    public void setAdminExtras_managedProfileParams_modifyBundle_internalBundleNotModified() {
+        PersistableBundle adminExtrasBundle = new PersistableBundle(ADMIN_EXTRAS_BUNDLE);
+        ManagedProfileProvisioningParams params =
+                createManagedProfileProvisioningParamsBuilder()
+                        .setAdminExtras(adminExtrasBundle)
+                        .build();
+
+        adminExtrasBundle.putString(TEST_KEY, TEST_VALUE);
+
+        assertBundlesEqual(params.getAdminExtras(), ADMIN_EXTRAS_BUNDLE);
+    }
+
+    @Test
+    public void getAdminExtras_managedProfileParams_modifyResult_internalBundleNotModified() {
+        PersistableBundle adminExtrasBundle = new PersistableBundle(ADMIN_EXTRAS_BUNDLE);
+        ManagedProfileProvisioningParams params =
+                createManagedProfileProvisioningParamsBuilder()
+                        .setAdminExtras(adminExtrasBundle)
+                        .build();
+
+        params.getAdminExtras().putString(TEST_KEY, TEST_VALUE);
+
+        assertBundlesEqual(params.getAdminExtras(), ADMIN_EXTRAS_BUNDLE);
+    }
+
+    @Test
+    public void setAdminExtras_managedProfileParams_emptyBundle_works() {
+        ManagedProfileProvisioningParams params =
+                createManagedProfileProvisioningParamsBuilder()
+                        .setAdminExtras(new PersistableBundle())
+                        .build();
+
+        assertThat(params.getAdminExtras().isEmpty()).isTrue();
+    }
+
+    @Test
+    public void setAdminExtras_managedProfileParams_nullBundle_works() {
+        ManagedProfileProvisioningParams params =
+                createManagedProfileProvisioningParamsBuilder()
+                        .setAdminExtras(null)
+                        .build();
+
+        assertThat(params.getAdminExtras().isEmpty()).isTrue();
+    }
+
+    @Test
+    public void setAdminExtras_fullyManagedParams_works() {
+        FullyManagedDeviceProvisioningParams params =
+                createDefaultManagedDeviceProvisioningParamsBuilder()
+                        .setAdminExtras(ADMIN_EXTRAS_BUNDLE)
+                        .build();
+
+        assertBundlesEqual(params.getAdminExtras(), ADMIN_EXTRAS_BUNDLE);
+    }
+
+    @Test
+    public void setAdminExtras_fullyManagedParams_modifyBundle_internalBundleNotModified() {
+        PersistableBundle adminExtrasBundle = new PersistableBundle(ADMIN_EXTRAS_BUNDLE);
+        FullyManagedDeviceProvisioningParams params =
+                createDefaultManagedDeviceProvisioningParamsBuilder()
+                        .setAdminExtras(adminExtrasBundle)
+                        .build();
+
+        adminExtrasBundle.putString(TEST_KEY, TEST_VALUE);
+
+        assertBundlesEqual(params.getAdminExtras(), ADMIN_EXTRAS_BUNDLE);
+    }
+
+    @Test
+    public void getAdminExtras_fullyManagedParams_modifyResult_internalBundleNotModified() {
+        PersistableBundle adminExtrasBundle = new PersistableBundle(ADMIN_EXTRAS_BUNDLE);
+        FullyManagedDeviceProvisioningParams params =
+                createDefaultManagedDeviceProvisioningParamsBuilder()
+                        .setAdminExtras(adminExtrasBundle)
+                        .build();
+
+        params.getAdminExtras().putString(TEST_KEY, TEST_VALUE);
+
+        assertBundlesEqual(params.getAdminExtras(), ADMIN_EXTRAS_BUNDLE);
+    }
+
+    @Test
+    public void setAdminExtras_fullyManagedParams_emptyBundle_works() {
+        FullyManagedDeviceProvisioningParams params =
+                createDefaultManagedDeviceProvisioningParamsBuilder()
+                        .setAdminExtras(new PersistableBundle())
+                        .build();
+
+        assertThat(params.getAdminExtras().isEmpty()).isTrue();
+    }
+
+    @Test
+    public void setAdminExtras_fullyManagedParams_nullBundle_works() {
+        FullyManagedDeviceProvisioningParams params =
+                createDefaultManagedDeviceProvisioningParamsBuilder()
+                        .setAdminExtras(null)
+                        .build();
+
+        assertThat(params.getAdminExtras().isEmpty()).isTrue();
+    }
+
+    private static PersistableBundle createAdminExtrasBundle() {
+        PersistableBundle result = new PersistableBundle();
+        result.putString("key1", "value1");
+        result.putInt("key2", 2);
+        result.putBoolean("key3", true);
+        return result;
+    }
+
+    private static void assertBundlesEqual(BaseBundle bundle1, BaseBundle bundle2) {
+        if (bundle1 != null) {
+            assertWithMessage("Intent bundles are not equal")
+                    .that(bundle2).isNotNull();
+            assertWithMessage("Intent bundles are not equal")
+                    .that(bundle1.keySet().size()).isEqualTo(bundle2.keySet().size());
+            for (String key : bundle1.keySet()) {
+                assertWithMessage("Intent bundles are not equal")
+                        .that(bundle1.get(key))
+                        .isEqualTo(bundle2.get(key));
+            }
+        } else {
+            assertWithMessage("Intent bundles are not equal").that(bundle2).isNull();
+        }
+    }
 }