diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java
index be05245..9660d6b 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyConstantsTest.java
@@ -15,33 +15,33 @@
  */
 package com.android.server.devicepolicy;
 
-import android.test.AndroidTestCase;
+import static com.google.common.truth.Truth.assertThat;
+
 import android.test.suitebuilder.annotation.SmallTest;
 
+import org.junit.Test;
+
 /**
  * Test for {@link DevicePolicyConstants}.
  *
- m FrameworksServicesTests &&
- adb install \
- -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
- adb shell am instrument -e class com.android.server.devicepolicy.DevicePolicyConstantsTest \
- -w com.android.frameworks.servicestests
-
-
- -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
+ * <p>Run this test with:
+ *
+ * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.DevicePolicyConstantsTest}
  */
 @SmallTest
-public class DevicePolicyConstantsTest extends AndroidTestCase {
+public class DevicePolicyConstantsTest {
     private static final String TAG = "DevicePolicyConstantsTest";
 
+    @Test
     public void testDefaultValues() throws Exception {
         final DevicePolicyConstants constants = DevicePolicyConstants.loadFromString("");
 
-        assertEquals(1 * 60 * 60, constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC);
-        assertEquals(24 * 60 * 60, constants.DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC);
-        assertEquals(2.0, constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC).isEqualTo(1 * 60 * 60);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC).isEqualTo(24 * 60 * 60);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE).isWithin(1.0e-10).of(2.0);
     }
 
+    @Test
     public void testCustomValues() throws Exception {
         final DevicePolicyConstants constants = DevicePolicyConstants.loadFromString(
                 "das_died_service_reconnect_backoff_sec=10,"
@@ -49,11 +49,13 @@
                 + "das_died_service_reconnect_max_backoff_sec=15"
         );
 
-        assertEquals(10, constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC);
-        assertEquals(15, constants.DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC);
-        assertEquals(1.25, constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC).isEqualTo(10);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC).isEqualTo(15);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE).isWithin(1.0e-10)
+                .of(1.25);
     }
 
+    @Test
     public void testMinMax() throws Exception {
         final DevicePolicyConstants constants = DevicePolicyConstants.loadFromString(
                 "das_died_service_reconnect_backoff_sec=3,"
@@ -61,8 +63,8 @@
                         + "das_died_service_reconnect_max_backoff_sec=1"
         );
 
-        assertEquals(5, constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC);
-        assertEquals(5, constants.DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC);
-        assertEquals(1.0, constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC).isEqualTo(5);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC).isEqualTo(5);
+        assertThat(constants.DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE).isWithin(1.0e-10).of(1.0);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyEventLoggerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyEventLoggerTest.java
index b24bca8..350b390 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyEventLoggerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyEventLoggerTest.java
@@ -46,8 +46,8 @@
                 .setTimePeriod(1234L);
         assertThat(eventLogger.getEventId()).isEqualTo(5);
         assertThat(eventLogger.getBoolean()).isTrue();
-        assertThat(eventLogger.getStringArray())
-                .isEqualTo(new String[] {"string1", "string2", "string3"});
+        assertThat(eventLogger.getStringArray()).asList()
+            .containsExactly("string1", "string2", "string3");
         assertThat(eventLogger.getAdminPackageName()).isEqualTo("com.test.package");
         assertThat(eventLogger.getInt()).isEqualTo(4321);
         assertThat(eventLogger.getTimePeriod()).isEqualTo(1234L);
@@ -57,23 +57,22 @@
     public void testStrings() {
         assertThat(DevicePolicyEventLogger
                 .createEvent(0)
-                .setStrings("string1", "string2", "string3").getStringArray())
-                .isEqualTo(new String[] {"string1", "string2", "string3"});
+                .setStrings("string1", "string2", "string3").getStringArray()).asList()
+                        .containsExactly("string1", "string2", "string3").inOrder();
 
         assertThat(DevicePolicyEventLogger
                 .createEvent(0)
                 .setStrings("string1", new String[] {"string2", "string3"}).getStringArray())
-                .isEqualTo(new String[] {"string1", "string2", "string3"});
+                        .asList().containsExactly("string1", "string2", "string3").inOrder();
 
         assertThat(DevicePolicyEventLogger
                 .createEvent(0)
                 .setStrings("string1", "string2", new String[] {"string3"}).getStringArray())
-                .isEqualTo(new String[] {"string1", "string2", "string3"});
-
+                        .asList().containsExactly("string1", "string2", "string3").inOrder();
         assertThat(DevicePolicyEventLogger
                 .createEvent(0)
-                .setStrings((String) null).getStringArray())
-                .isEqualTo(new String[] {null});
+                .setStrings((String) null).getStringArray()).asList()
+                        .containsExactly((String) null);
 
         assertThat(DevicePolicyEventLogger
                 .createEvent(0)
@@ -106,8 +105,8 @@
                 .createEvent(0);
         assertThat(eventLogger.getEventId()).isEqualTo(0);
         assertThat(eventLogger.getBoolean()).isFalse();
-        assertThat(eventLogger.getStringArray()).isEqualTo(null);
-        assertThat(eventLogger.getAdminPackageName()).isEqualTo(null);
+        assertThat(eventLogger.getStringArray()).isNull();
+        assertThat(eventLogger.getAdminPackageName()).isNull();
         assertThat(eventLogger.getInt()).isEqualTo(0);
         assertThat(eventLogger.getTimePeriod()).isEqualTo(0L);
     }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
index 3167820..fa3f45c 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java
@@ -20,7 +20,9 @@
 import static com.android.server.devicepolicy.DpmTestUtils.writeInputStreamToFile;
 import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
 
-import static org.junit.Assert.assertArrayEquals;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
@@ -43,17 +45,23 @@
 import android.provider.Settings;
 
 import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
 
 import com.android.frameworks.servicestests.R;
 import com.android.server.LocalServices;
 import com.android.server.SystemService;
 
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
 @Presubmit
+@RunWith(AndroidJUnit4.class)
 public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase {
 
     private static final String USER_TYPE_EMPTY = "";
@@ -63,9 +71,8 @@
 
     private DpmMockContext mContext;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
 
         mContext = getContext();
 
@@ -77,6 +84,7 @@
                 .thenReturn(true);
     }
 
+    @Test
     public void testMigration() throws Exception {
         final File user10dir = getServices().addUser(10, 0, USER_TYPE_EMPTY);
         final File user11dir = getServices().addUser(11, 0,
@@ -160,19 +168,19 @@
             mContext.binder.restoreCallingIdentity(ident);
         }
 
-        assertTrue(dpms.mOwners.hasDeviceOwner());
-        assertFalse(dpms.mOwners.hasProfileOwner(USER_SYSTEM));
-        assertTrue(dpms.mOwners.hasProfileOwner(10));
-        assertTrue(dpms.mOwners.hasProfileOwner(11));
-        assertFalse(dpms.mOwners.hasProfileOwner(12));
+        assertThat(dpms.mOwners.hasDeviceOwner()).isTrue();
+        assertThat(dpms.mOwners.hasProfileOwner(USER_SYSTEM)).isFalse();
+        assertThat(dpms.mOwners.hasProfileOwner(10)).isTrue();
+        assertThat(dpms.mOwners.hasProfileOwner(11)).isTrue();
+        assertThat(dpms.mOwners.hasProfileOwner(12)).isFalse();
 
         // Now all information should be migrated.
-        assertFalse(dpms.mOwners.getDeviceOwnerUserRestrictionsNeedsMigration());
-        assertFalse(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(
-                USER_SYSTEM));
-        assertFalse(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-        assertFalse(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-        assertFalse(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(12));
+        assertThat(dpms.mOwners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+        assertThat(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(USER_SYSTEM))
+            .isFalse();
+        assertThat(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+        assertThat(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+        assertThat(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(12)).isFalse();
 
         // Check the new base restrictions.
         DpmTestUtils.assertRestrictions(
@@ -221,6 +229,7 @@
                 dpms.getProfileOwnerAdminLocked(11).ensureUserRestrictions());
     }
 
+    @Test
     public void testMigration2_profileOwnerOnUser0() throws Exception {
         setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_SYSTEM_USER_UID);
 
@@ -271,13 +280,13 @@
         } finally {
             mContext.binder.restoreCallingIdentity(ident);
         }
-        assertFalse(dpms.mOwners.hasDeviceOwner());
-        assertTrue(dpms.mOwners.hasProfileOwner(USER_SYSTEM));
+        assertThat(dpms.mOwners.hasDeviceOwner()).isFalse();
+        assertThat(dpms.mOwners.hasProfileOwner(USER_SYSTEM)).isTrue();
 
         // Now all information should be migrated.
-        assertFalse(dpms.mOwners.getDeviceOwnerUserRestrictionsNeedsMigration());
-        assertFalse(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(
-                USER_SYSTEM));
+        assertThat(dpms.mOwners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+        assertThat(dpms.mOwners.getProfileOwnerUserRestrictionsNeedsMigration(USER_SYSTEM))
+            .isFalse();
 
         // Check the new base restrictions.
         DpmTestUtils.assertRestrictions(
@@ -297,6 +306,7 @@
     }
 
     // Test setting default restrictions for managed profile.
+    @Test
     public void testMigration3_managedProfileOwner() throws Exception {
         // Create a managed profile user.
         final File user10dir = getServices().addUser(10, 0,
@@ -339,8 +349,8 @@
             mContext.binder.restoreCallingIdentity(ident);
         }
 
-        assertFalse(dpms.mOwners.hasDeviceOwner());
-        assertTrue(dpms.mOwners.hasProfileOwner(10));
+        assertThat(dpms.mOwners.hasDeviceOwner()).isFalse();
+        assertThat(dpms.mOwners.hasProfileOwner(10)).isTrue();
 
         // Check that default restrictions were applied.
         DpmTestUtils.assertRestrictions(
@@ -352,11 +362,12 @@
 
         final Set<String> alreadySet =
                 dpms.getProfileOwnerAdminLocked(10).defaultEnabledRestrictionsAlreadySet;
-        assertEquals(alreadySet.size(), 1);
-        assertTrue(alreadySet.contains(UserManager.DISALLOW_BLUETOOTH_SHARING));
+        assertThat(alreadySet).hasSize(1);
+        assertThat(alreadySet.contains(UserManager.DISALLOW_BLUETOOTH_SHARING)).isTrue();
     }
 
     @SmallTest
+    @Test
     public void testCompMigrationUnAffiliated_skipped() throws Exception {
         prepareAdmin1AsDo();
         prepareAdminAnotherPackageAsPo(COPE_PROFILE_USER_ID);
@@ -364,10 +375,11 @@
         final DevicePolicyManagerServiceTestable dpms = bootDpmsUp();
 
         // DO should still be DO since no migration should happen.
-        assertTrue(dpms.mOwners.hasDeviceOwner());
+        assertThat(dpms.mOwners.hasDeviceOwner()).isTrue();
     }
 
     @SmallTest
+    @Test
     public void testCompMigrationAffiliated() throws Exception {
         prepareAdmin1AsDo();
         prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.R);
@@ -378,48 +390,54 @@
         final DevicePolicyManagerServiceTestable dpms = bootDpmsUp();
 
         // DO should cease to be DO.
-        assertFalse(dpms.mOwners.hasDeviceOwner());
+        assertThat(dpms.mOwners.hasDeviceOwner()).isFalse();
 
         final DpmMockContext poContext = new DpmMockContext(getServices(), mRealTestContext);
         poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID);
 
         runAsCaller(poContext, dpms, dpm -> {
-            assertEquals("Password history policy wasn't migrated to PO parent instance",
-                    33, dpm.getParentProfileInstance(admin1).getPasswordHistoryLength(admin1));
-            assertEquals("Password history policy was put into non-parent PO instance",
-                    0, dpm.getPasswordHistoryLength(admin1));
-            assertTrue("Screen capture restriction wasn't migrated to PO parent instance",
-                    dpm.getParentProfileInstance(admin1).getScreenCaptureDisabled(admin1));
+            assertWithMessage("Password history policy wasn't migrated to PO parent instance")
+                    .that(dpm.getParentProfileInstance(admin1).getPasswordHistoryLength(admin1))
+                    .isEqualTo(33);
+            assertWithMessage("Password history policy was put into non-parent PO instance")
+                    .that(dpm.getPasswordHistoryLength(admin1)).isEqualTo(0);
+            assertWithMessage("Screen capture restriction wasn't migrated to PO parent instance")
+                    .that(dpm.getParentProfileInstance(admin1).getScreenCaptureDisabled(admin1))
+                    .isTrue();
 
-            assertArrayEquals("Accounts with management disabled weren't migrated to PO parent",
-                    new String[] {"com.google-primary"},
-                    dpm.getParentProfileInstance(admin1).getAccountTypesWithManagementDisabled());
-            assertArrayEquals("Accounts with management disabled for profile were lost",
-                    new String[] {"com.google-profile"},
-                    dpm.getAccountTypesWithManagementDisabled());
+            assertWithMessage("Accounts with management disabled weren't migrated to PO parent")
+                    .that(dpm.getParentProfileInstance(admin1)
+                            .getAccountTypesWithManagementDisabled()).asList()
+                    .containsExactly("com.google-primary");
 
-            assertTrue("User restriction wasn't migrated to PO parent instance",
-                    dpm.getParentProfileInstance(admin1).getUserRestrictions(admin1)
-                            .containsKey(UserManager.DISALLOW_BLUETOOTH));
-            assertFalse("User restriction was put into non-parent PO instance",
-                    dpm.getUserRestrictions(admin1).containsKey(UserManager.DISALLOW_BLUETOOTH));
+            assertWithMessage("Accounts with management disabled for profile were lost")
+                    .that(dpm.getAccountTypesWithManagementDisabled()).asList()
+                    .containsExactly("com.google-profile");
 
-            assertTrue("User restriction wasn't migrated to PO parent instance",
-                    dpms.getProfileOwnerAdminLocked(COPE_PROFILE_USER_ID)
-                            .getParentActiveAdmin()
-                            .getEffectiveRestrictions()
-                            .containsKey(UserManager.DISALLOW_CONFIG_DATE_TIME));
-            assertFalse("User restriction was put into non-parent PO instance",
-                    dpms.getProfileOwnerAdminLocked(COPE_PROFILE_USER_ID)
-                            .getEffectiveRestrictions()
-                            .containsKey(UserManager.DISALLOW_CONFIG_DATE_TIME));
-            assertEquals("Personal apps suspension wasn't migrated",
-                    DevicePolicyManager.PERSONAL_APPS_NOT_SUSPENDED,
-                    dpm.getPersonalAppsSuspendedReasons(admin1));
+            assertWithMessage("User restriction wasn't migrated to PO parent instance")
+                    .that(dpm.getParentProfileInstance(admin1).getUserRestrictions(admin1).keySet())
+                    .contains(UserManager.DISALLOW_BLUETOOTH);
+
+            assertWithMessage("User restriction was put into non-parent PO instance").that(
+                    dpm.getUserRestrictions(admin1).keySet())
+                    .doesNotContain(UserManager.DISALLOW_BLUETOOTH);
+
+            assertWithMessage("User restriction wasn't migrated to PO parent instance")
+                    .that(dpms.getProfileOwnerAdminLocked(COPE_PROFILE_USER_ID)
+                            .getParentActiveAdmin().getEffectiveRestrictions().keySet())
+                    .contains(UserManager.DISALLOW_CONFIG_DATE_TIME);
+            assertWithMessage("User restriction was put into non-parent PO instance")
+                    .that(dpms.getProfileOwnerAdminLocked(COPE_PROFILE_USER_ID)
+                            .getEffectiveRestrictions().keySet())
+                    .doesNotContain(UserManager.DISALLOW_CONFIG_DATE_TIME);
+            assertWithMessage("Personal apps suspension wasn't migrated")
+                    .that(dpm.getPersonalAppsSuspendedReasons(admin1))
+                    .isEqualTo(DevicePolicyManager.PERSONAL_APPS_NOT_SUSPENDED);
         });
     }
 
     @SmallTest
+    @Test
     public void testCompMigration_keepSuspendedAppsWhenDpcIsRPlus() throws Exception {
         prepareAdmin1AsDo();
         prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.R);
@@ -445,13 +463,14 @@
         poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID);
 
         runAsCaller(poContext, dpms, dpm -> {
-            assertEquals("Personal apps suspension wasn't migrated",
-                    DevicePolicyManager.PERSONAL_APPS_SUSPENDED_EXPLICITLY,
-                    dpm.getPersonalAppsSuspendedReasons(admin1));
+            assertWithMessage("Personal apps suspension wasn't migrated")
+                    .that(dpm.getPersonalAppsSuspendedReasons(admin1))
+                    .isEqualTo(DevicePolicyManager.PERSONAL_APPS_SUSPENDED_EXPLICITLY);
         });
     }
 
     @SmallTest
+    @Test
     public void testCompMigration_unsuspendAppsWhenDpcNotRPlus() throws Exception {
         prepareAdmin1AsDo();
         prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.Q);
@@ -470,9 +489,9 @@
         poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID);
 
         runAsCaller(poContext, dpms, dpm -> {
-            assertEquals("Personal apps weren't unsuspended",
-                    DevicePolicyManager.PERSONAL_APPS_NOT_SUSPENDED,
-                    dpm.getPersonalAppsSuspendedReasons(admin1));
+            assertWithMessage("Personal apps weren't unsuspended")
+                    .that(dpm.getPersonalAppsSuspendedReasons(admin1))
+                    .isEqualTo(DevicePolicyManager.PERSONAL_APPS_NOT_SUSPENDED);
         });
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index c4f7b95..8d7bc16 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -39,7 +39,9 @@
 import static com.android.server.testutils.TestUtils.assertExpectException;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
+import static org.junit.Assert.fail;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyInt;
@@ -89,13 +91,14 @@
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.platform.test.annotations.FlakyTest;
 import android.platform.test.annotations.Presubmit;
 import android.provider.Settings;
 import android.security.KeyChain;
 import android.security.keystore.AttestationUtils;
 import android.telephony.TelephonyManager;
 import android.telephony.data.ApnSetting;
-import android.test.MoreAsserts;
+import android.test.MoreAsserts; // TODO(b/171932723): replace by Truth
 import android.util.ArraySet;
 import android.util.Pair;
 
@@ -111,6 +114,9 @@
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 import org.mockito.Mockito;
 import org.mockito.internal.util.collections.Sets;
 import org.mockito.stubbing.Answer;
@@ -127,17 +133,11 @@
 
 /**
  * Tests for DevicePolicyManager( and DevicePolicyManagerService).
- * You can run them via:
- m FrameworksServicesTests &&
- adb install \
-   -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
- adb shell am instrument -e class com.android.server.devicepolicy.DevicePolicyManagerTest \
-   -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
-
- (mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
  *
- * , or:
- * runtest -c com.android.server.devicepolicy.DevicePolicyManagerTest frameworks-services
+ * <p>Run this test with:
+ *
+ * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.DevicePolicyManagerTest}
+ *
  */
 @SmallTest
 @Presubmit
@@ -205,9 +205,8 @@
     private static final String PROFILE_OFF_SUSPENSION_TEXT = "suspension_text";
     private static final String PROFILE_OFF_SUSPENSION_SOON_TEXT = "suspension_tomorrow_text";
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
 
         mContext = getContext();
         mServiceContext = mContext;
@@ -251,11 +250,10 @@
         return dpms.mTransferOwnershipMetadataManager;
     }
 
-    @Override
-    protected void tearDown() throws Exception {
+    @After
+    public void tearDown() throws Exception {
         flushTasks(dpms);
         getMockTransferMetadataManager().deleteMetadataFile();
-        super.tearDown();
     }
 
     private void initializeDpms() {
@@ -336,14 +334,15 @@
             // PO needs to be a DA.
             dpm.setActiveAdmin(admin, /*replace=*/ false);
             // Fire!
-            assertTrue(dpm.setProfileOwner(admin, "owner-name", CALLER_USER_HANDLE));
+            assertThat(dpm.setProfileOwner(admin, "owner-name", CALLER_USER_HANDLE)).isTrue();
             // Check
-            assertEquals(admin, dpm.getProfileOwnerAsUser(CALLER_USER_HANDLE));
+            assertThat(dpm.getProfileOwnerAsUser(CALLER_USER_HANDLE)).isEqualTo(admin);
         });
 
         mServiceContext.binder.restoreCallingIdentity(ident);
     }
 
+    @Test
     public void testHasNoFeature() throws Exception {
         when(getServices().packageManager.hasSystemFeature(eq(PackageManager.FEATURE_DEVICE_ADMIN)))
                 .thenReturn(false);
@@ -352,9 +351,10 @@
         new DevicePolicyManagerServiceTestable(getServices(), mContext);
 
         // If the device has no DPMS feature, it shouldn't register the local service.
-        assertNull(LocalServices.getService(DevicePolicyManagerInternal.class));
+        assertThat(LocalServices.getService(DevicePolicyManagerInternal.class)).isNull();
     }
 
+    @Test
     public void testLoadAdminData() throws Exception {
         // Device owner in SYSTEM_USER
         setDeviceOwner();
@@ -365,7 +365,7 @@
         final int ANOTHER_UID = UserHandle.getUid(CALLER_USER_HANDLE, 1306);
         setUpPackageManagerForFakeAdmin(adminAnotherPackage, ANOTHER_UID, admin2);
         dpm.setActiveAdmin(adminAnotherPackage, /* replace =*/ false, CALLER_USER_HANDLE);
-        assertTrue(dpm.isAdminActiveAsUser(adminAnotherPackage, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActiveAsUser(adminAnotherPackage, CALLER_USER_HANDLE)).isTrue();
 
         initializeDpms();
 
@@ -381,6 +381,7 @@
         verify(getServices().networkPolicyManagerInternal).onAdminDataAvailable();
     }
 
+    @Test
     public void testLoadAdminData_noAdmins() throws Exception {
         final int ANOTHER_USER_ID = 15;
         getServices().addUser(ANOTHER_USER_ID, 0, "");
@@ -399,6 +400,7 @@
     /**
      * Caller doesn't have proper permissions.
      */
+    @Test
     public void testSetActiveAdmin_SecurityException() {
         // 1. Failure cases.
 
@@ -422,6 +424,7 @@
      * {@link DevicePolicyManager#getActiveAdmins}
      * {@link DevicePolicyManager#getActiveAdminsAsUser}
      */
+    @Test
     public void testSetActiveAdmin() throws Exception {
         // 1. Make sure the caller has proper permissions.
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
@@ -456,9 +459,9 @@
         // TODO Verify other calls too.
 
         // Make sure it's active admin1.
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isAdminActive(admin2));
-        assertFalse(dpm.isAdminActive(admin3));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isAdminActive(admin2)).isFalse();
+        assertThat(dpm.isAdminActive(admin3)).isFalse();
 
         // But not admin1 for a different user.
 
@@ -466,8 +469,8 @@
         // (Because we're checking a different user's status from CALLER_USER_HANDLE.)
         mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL");
 
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE + 1));
-        assertFalse(dpm.isAdminActiveAsUser(admin2, CALLER_USER_HANDLE + 1));
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE + 1)).isFalse();
+        assertThat(dpm.isAdminActiveAsUser(admin2, CALLER_USER_HANDLE + 1)).isFalse();
 
         mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL");
 
@@ -479,9 +482,9 @@
         dpm.setActiveAdmin(admin2, /* replace =*/ false);
 
         // Now we have two admins.
-        assertTrue(dpm.isAdminActive(admin1));
-        assertTrue(dpm.isAdminActive(admin2));
-        assertFalse(dpm.isAdminActive(admin3));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isAdminActive(admin2)).isTrue();
+        assertThat(dpm.isAdminActive(admin3)).isFalse();
 
         // Admin2 was already enabled, so setApplicationEnabledSetting() shouldn't have called
         // again.  (times(1) because it was previously called for admin1)
@@ -508,9 +511,9 @@
 
         // 6. Test getActiveAdmins()
         List<ComponentName> admins = dpm.getActiveAdmins();
-        assertEquals(2, admins.size());
-        assertEquals(admin1, admins.get(0));
-        assertEquals(admin2, admins.get(1));
+        assertThat(admins.size()).isEqualTo(2);
+        assertThat(admins.get(0)).isEqualTo(admin1);
+        assertThat(admins.get(1)).isEqualTo(admin2);
 
         // There shouldn't be any callback to UsageStatsManagerInternal when the admin is being
         // replaced
@@ -519,12 +522,13 @@
         // Another user has no admins.
         mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL");
 
-        assertEquals(0, DpmTestUtils.getListSizeAllowingNull(
-                dpm.getActiveAdminsAsUser(CALLER_USER_HANDLE + 1)));
+        assertThat(DpmTestUtils.getListSizeAllowingNull(
+        dpm.getActiveAdminsAsUser(CALLER_USER_HANDLE + 1))).isEqualTo(0);
 
         mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL");
     }
 
+    @Test
     public void testSetActiveAdmin_multiUsers() throws Exception {
 
         final int ANOTHER_USER_ID = 100;
@@ -544,12 +548,12 @@
 
 
         mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isAdminActive(admin2));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isAdminActive(admin2)).isFalse();
 
         mMockContext.binder.callingUid = ANOTHER_ADMIN_UID;
-        assertFalse(dpm.isAdminActive(admin1));
-        assertTrue(dpm.isAdminActive(admin2));
+        assertThat(dpm.isAdminActive(admin1)).isFalse();
+        assertThat(dpm.isAdminActive(admin2)).isTrue();
     }
 
     /**
@@ -557,12 +561,13 @@
      * {@link DevicePolicyManager#setActiveAdmin}
      * with replace=false
      */
+    @Test
     public void testSetActiveAdmin_twiceWithoutReplace() throws Exception {
         // 1. Make sure the caller has proper permissions.
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
 
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
         // Add the same admin1 again without replace, which should throw.
         assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null,
@@ -574,6 +579,7 @@
      * {@link DevicePolicyManager#setActiveAdmin} when the admin isn't protected with
      * BIND_DEVICE_ADMIN.
      */
+    @Test
     public void testSetActiveAdmin_permissionCheck() throws Exception {
         // 1. Make sure the caller has proper permissions.
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
@@ -581,13 +587,13 @@
         assertExpectException(IllegalArgumentException.class,
                 /* messageRegex= */ permission.BIND_DEVICE_ADMIN,
                 () -> dpm.setActiveAdmin(adminNoPerm, /* replace =*/ false));
-        assertFalse(dpm.isAdminActive(adminNoPerm));
+        assertThat(dpm.isAdminActive(adminNoPerm)).isFalse();
 
         // Change the target API level to MNC.  Now it can be set as DA.
         setUpPackageManagerForAdmin(adminNoPerm, DpmMockContext.CALLER_UID, null,
                 VERSION_CODES.M);
         dpm.setActiveAdmin(adminNoPerm, /* replace =*/ false);
-        assertTrue(dpm.isAdminActive(adminNoPerm));
+        assertThat(dpm.isAdminActive(adminNoPerm)).isTrue();
 
         // TODO Test the "load from the file" case where DA will still be loaded even without
         // BIND_DEVICE_ADMIN and target API is N.
@@ -597,6 +603,7 @@
      * Test for:
      * {@link DevicePolicyManager#removeActiveAdmin}
      */
+    @Test
     public void testRemoveActiveAdmin_SecurityException() {
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
 
@@ -604,9 +611,9 @@
 
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
 
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
 
         // Directly call the DPMS method with a different userid, which should fail.
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
@@ -627,6 +634,7 @@
      * {@link DevicePolicyManager#removeActiveAdmin} should fail with the user is not unlocked
      * (because we can't send the remove broadcast).
      */
+    @Test
     public void testRemoveActiveAdmin_userNotRunningOrLocked() {
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
 
@@ -636,9 +644,9 @@
 
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
 
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
 
         // 1. User not unlocked.
         setUserUnlocked(CALLER_USER_HANDLE, false);
@@ -646,7 +654,7 @@
                 /* messageRegex= */ "User must be running and unlocked",
                 () -> dpm.removeActiveAdmin(admin1));
 
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal, times(0)).setActiveAdminApps(
                 null, CALLER_USER_HANDLE);
 
@@ -654,7 +662,7 @@
         setUserUnlocked(CALLER_USER_HANDLE, true);
 
         dpm.removeActiveAdmin(admin1);
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 null, CALLER_USER_HANDLE);
     }
@@ -663,6 +671,7 @@
      * Test for:
      * {@link DevicePolicyManager#removeActiveAdmin}
      */
+    @Test
     public void testRemoveActiveAdmin_fromDifferentUserWithINTERACT_ACROSS_USERS_FULL() {
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
 
@@ -670,8 +679,8 @@
 
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
 
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
 
         // Different user, but should work, because caller has proper permissions.
         mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
@@ -680,7 +689,7 @@
         mContext.binder.callingUid = 1234567;
 
         dpms.removeActiveAdmin(admin1, CALLER_USER_HANDLE);
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 null, CALLER_USER_HANDLE);
 
@@ -691,6 +700,7 @@
      * Test for:
      * {@link DevicePolicyManager#removeActiveAdmin}
      */
+    @Test
     public void testRemoveActiveAdmin_sameUserNoMANAGE_DEVICE_ADMINS() {
         // Need MANAGE_DEVICE_ADMINS for setActiveAdmin.  We'll remove it later.
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
@@ -699,8 +709,8 @@
 
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
 
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
 
         // Broadcast from saveSettingsLocked().
         verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
@@ -725,7 +735,7 @@
                 isNull(String.class),
                 isNull(Bundle.class));
 
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 null, CALLER_USER_HANDLE);
 
@@ -738,6 +748,7 @@
         // TODO Check other internal calls.
     }
 
+    @Test
     public void testRemoveActiveAdmin_multipleAdminsInUser() {
         // Need MANAGE_DEVICE_ADMINS for setActiveAdmin.  We'll remove it later.
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
@@ -745,14 +756,14 @@
         // Add admin1.
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
 
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
 
         // Add admin2.
         dpm.setActiveAdmin(admin2, /* replace =*/ false);
 
-        assertTrue(dpm.isAdminActive(admin2));
-        assertFalse(dpm.isRemovingAdmin(admin2, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActive(admin2)).isTrue();
+        assertThat(dpm.isRemovingAdmin(admin2, CALLER_USER_HANDLE)).isFalse();
 
         // Broadcast from saveSettingsLocked().
         verify(mContext.spiedContext, times(2)).sendBroadcastAsUser(
@@ -777,7 +788,7 @@
                 isNull(String.class),
                 isNull(Bundle.class));
 
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 MockUtils.checkApps(admin2.getPackageName()),
                 eq(CALLER_USER_HANDLE));
@@ -793,6 +804,7 @@
      * Test for:
      * {@link DevicePolicyManager#forceRemoveActiveAdmin(ComponentName, int)}
      */
+    @Test
     public void testForceRemoveActiveAdmin() throws Exception {
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
 
@@ -802,7 +814,7 @@
                 /* appId= */ 10138,
                 /* flags= */ ApplicationInfo.FLAG_TEST_ONLY);
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
         // Calling from a non-shell uid should fail with a SecurityException
         mContext.binder.callingUid = 123456;
@@ -815,7 +827,7 @@
 
         mContext.callerPermissions.add(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL);
         // Verify
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 null, CALLER_USER_HANDLE);
     }
@@ -825,6 +837,7 @@
      *
      * Validates that when the password history length is set, it is persisted after rebooting
      */
+    @Test
     public void testSaveAndLoadPasswordHistoryLength_persistedAfterReboot() throws Exception {
         int passwordHistoryLength = 2;
 
@@ -842,13 +855,13 @@
         // Save password history length
         dpm.setPasswordHistoryLength(admin1, passwordHistoryLength);
 
-        assertEquals(dpm.getPasswordHistoryLength(admin1), passwordHistoryLength);
+        assertThat(passwordHistoryLength).isEqualTo(dpm.getPasswordHistoryLength(admin1));
 
         initializeDpms();
         reset(mContext.spiedContext);
 
         // Password history length should persist after rebooted
-        assertEquals(dpm.getPasswordHistoryLength(admin1), passwordHistoryLength);
+        assertThat(passwordHistoryLength).isEqualTo(dpm.getPasswordHistoryLength(admin1));
     }
 
     /**
@@ -858,6 +871,7 @@
      * {@link DeviceAdminReceiver#ACTION_PASSWORD_CHANGED} is sent to managed profile owners, in
      * addition to ones in the original user.
      */
+    @Test
     public void testSetActivePasswordState_sendToProfiles() throws Exception {
         mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
 
@@ -893,6 +907,7 @@
      * intent {@link DeviceAdminReceiver#ACTION_PASSWORD_CHANGED} is only sent to the profile, not
      * its parent.
      */
+    @Test
     public void testSetActivePasswordState_notSentToParent() throws Exception {
         mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
 
@@ -932,6 +947,7 @@
     /**
      * Test for: {@link DevicePolicyManager#setDeviceOwner} DO on system user installs successfully.
      */
+    @Test
     public void testSetDeviceOwner() throws Exception {
         setDeviceOwner();
 
@@ -944,7 +960,7 @@
 
         // DO admin can't be deactivated.
         dpm.removeActiveAdmin(admin1);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
         // TODO Test getDeviceOwnerName() too. To do so, we need to change
         // DPMS.getApplicationLabel() because Context.createPackageContextAsUser() is not mockable.
@@ -969,19 +985,19 @@
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
 
         // Fire!
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name")).isTrue();
 
         // getDeviceOwnerComponent should return the admin1 component.
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
+        assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(admin1);
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
 
         // Check various get APIs.
         checkGetDeviceOwnerInfoApi(dpm, /* hasDeviceOwner =*/ true);
 
         // getDeviceOwnerComponent should *NOT* return the admin1 component for other users.
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
-        assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
+        assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
 
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
 
@@ -997,7 +1013,7 @@
                 MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED),
                 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
 
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
     }
 
     private void checkGetDeviceOwnerInfoApi(DevicePolicyManager dpm, boolean hasDeviceOwner) {
@@ -1012,89 +1028,89 @@
         // TODO Test getDeviceOwnerName() too.  To do so, we need to change
         // DPMS.getApplicationLabel() because Context.createPackageContextAsUser() is not mockable.
         if (hasDeviceOwner) {
-            assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isTrue();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(admin1);
 
-            assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
         } else {
-            assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isFalse();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
 
-            assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(null);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
         }
 
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         if (hasDeviceOwner) {
-            assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isTrue();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(admin1);
 
-            assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
         } else {
-            assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isFalse();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
 
-            assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(null);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
         }
 
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         // Still with MANAGE_USERS.
-        assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-        assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-        assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
+        assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isFalse();
+        assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isFalse();
+        assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
 
         if (hasDeviceOwner) {
-            assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
         } else {
-            assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(null);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
         }
 
         mContext.binder.callingUid = Process.SYSTEM_UID;
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
         // System can still call "OnAnyUser" without MANAGE_USERS.
         if (hasDeviceOwner) {
-            assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isTrue();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(admin1);
 
-            assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
         } else {
-            assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isFalse();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
 
-            assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
-            assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
+            assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(null);
+            assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
         }
 
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         // Still no MANAGE_USERS.
         if (hasDeviceOwner) {
-            assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isTrue();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isTrue();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(admin1);
         } else {
-            assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-            assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-            assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
+            assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isFalse();
+            assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isFalse();
+            assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
         }
 
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
@@ -1108,9 +1124,9 @@
 
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         // Still no MANAGE_USERS.
-        assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-        assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-        assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
+        assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isFalse();
+        assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isFalse();
+        assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(null);
 
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
                 () -> dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
@@ -1130,6 +1146,7 @@
     /**
      * Test for: {@link DevicePolicyManager#setDeviceOwner} Package doesn't exist.
      */
+    @Test
     public void testSetDeviceOwner_noSuchPackage() {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -1144,10 +1161,12 @@
                 () -> dpm.setDeviceOwner(new ComponentName("a.b.c", ".def")));
     }
 
+    @Test
     public void testSetDeviceOwner_failures() throws Exception {
         // TODO Test more failure cases.  Basically test all chacks in enforceCanSetDeviceOwner().
     }
 
+    @Test
     public void testClearDeviceOwner() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -1164,20 +1183,20 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name")).isTrue();
 
         // Verify internal calls.
         verify(getServices().iactivityManager, times(1)).updateDeviceOwner(
                 eq(admin1.getPackageName()));
 
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
 
         dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
         when(getServices().userManager.hasUserRestriction(eq(UserManager.DISALLOW_ADD_USER),
                 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM))).thenReturn(true);
 
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isRemovingAdmin(admin1, UserHandle.USER_SYSTEM));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isRemovingAdmin(admin1, UserHandle.USER_SYSTEM)).isFalse();
 
         // Set up other mocks.
         when(getServices().userManager.getUserRestrictions()).thenReturn(new Bundle());
@@ -1196,7 +1215,7 @@
         dpm.clearDeviceOwnerApp(admin1.getPackageName());
 
         // Now DO shouldn't be set.
-        assertNull(dpm.getDeviceOwnerComponentOnAnyUser());
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isNull();
 
         verify(getServices().userManager).setUserRestriction(eq(UserManager.DISALLOW_ADD_USER),
                 eq(false),
@@ -1209,7 +1228,7 @@
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 null, UserHandle.USER_SYSTEM);
 
-        assertFalse(dpm.isAdminActiveAsUser(admin1, UserHandle.USER_SYSTEM));
+        assertThat(dpm.isAdminActiveAsUser(admin1, UserHandle.USER_SYSTEM)).isFalse();
 
         // ACTION_DEVICE_OWNER_CHANGED should be sent twice, once for setting the device owner
         // and once for clearing it.
@@ -1219,6 +1238,7 @@
         // TODO Check other calls.
     }
 
+    @Test
     public void testDeviceOwnerBackupActivateDeactivate() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -1227,7 +1247,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name")).isTrue();
 
         verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
                 eq(UserHandle.USER_SYSTEM), eq(false));
@@ -1238,6 +1258,7 @@
                 eq(UserHandle.USER_SYSTEM), eq(true));
     }
 
+    @Test
     public void testProfileOwnerBackupActivateDeactivate() throws Exception {
         setAsProfileOwner(admin1);
 
@@ -1250,6 +1271,7 @@
                 eq(CALLER_USER_HANDLE), eq(true));
     }
 
+    @Test
     public void testClearDeviceOwner_fromDifferentUser() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -1266,13 +1288,13 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name")).isTrue();
 
         // Verify internal calls.
         verify(getServices().iactivityManager, times(1)).updateDeviceOwner(
                 eq(admin1.getPackageName()));
 
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
 
         // Now call clear from the secondary user, which should throw.
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
@@ -1286,7 +1308,7 @@
                 () -> dpm.clearDeviceOwnerApp(admin1.getPackageName()));
 
         // DO shouldn't be removed.
-        assertTrue(dpm.isDeviceManaged());
+        assertThat(dpm.isDeviceManaged()).isTrue();
     }
 
     /**
@@ -1294,6 +1316,7 @@
      *
      * Validates that when the device owner is removed, the reset password token is cleared
      */
+    @Test
     public void testClearDeviceOwner_clearResetPasswordToken() throws Exception {
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -1312,13 +1335,13 @@
         when(getServices().lockPatternUtils.addEscrowToken(eq(token), eq(UserHandle.USER_SYSTEM),
                 nullable(EscrowTokenStateChangeCallback.class)))
                 .thenReturn(handle);
-        assertTrue(dpm.setResetPasswordToken(admin1, token));
+        assertThat(dpm.setResetPasswordToken(admin1, token)).isTrue();
 
         // Assert reset password token is active
         when(getServices().lockPatternUtils.isEscrowTokenActive(eq(handle),
                 eq(UserHandle.USER_SYSTEM)))
                 .thenReturn(true);
-        assertTrue(dpm.isResetPasswordTokenActive(admin1));
+        assertThat(dpm.isResetPasswordTokenActive(admin1)).isTrue();
 
         // Remove the device owner
         dpm.clearDeviceOwnerApp(admin1.getPackageName());
@@ -1328,12 +1351,13 @@
                 eq(UserHandle.USER_SYSTEM));
     }
 
+    @Test
     public void testSetProfileOwner() throws Exception {
         setAsProfileOwner(admin1);
 
         // PO admin can't be deactivated.
         dpm.removeActiveAdmin(admin1);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
         // Try setting DO on the same user, which should fail.
         setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
@@ -1347,13 +1371,14 @@
         });
     }
 
+    @Test
     public void testClearProfileOwner() throws Exception {
         setAsProfileOwner(admin1);
 
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
 
-        assertTrue(dpm.isProfileOwnerApp(admin1.getPackageName()));
-        assertFalse(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isProfileOwnerApp(admin1.getPackageName())).isTrue();
+        assertThat(dpm.isRemovingAdmin(admin1, CALLER_USER_HANDLE)).isFalse();
 
         // First try when the user is locked, which should fail.
         when(getServices().userManager.isUserUnlocked(anyInt()))
@@ -1367,16 +1392,18 @@
         dpm.clearProfileOwner(admin1);
 
         // Check
-        assertFalse(dpm.isProfileOwnerApp(admin1.getPackageName()));
-        assertFalse(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE));
+        assertThat(dpm.isProfileOwnerApp(admin1.getPackageName())).isFalse();
+        assertThat(dpm.isAdminActiveAsUser(admin1, CALLER_USER_HANDLE)).isFalse();
         verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
                 null, CALLER_USER_HANDLE);
     }
 
+    @Test
     public void testSetProfileOwner_failures() throws Exception {
         // TODO Test more failure cases.  Basically test all chacks in enforceCanSetProfileOwner().
     }
 
+    @Test
     public void testGetDeviceOwnerAdminLocked() throws Exception {
         checkDeviceOwnerWithMultipleDeviceAdmins();
     }
@@ -1421,13 +1448,13 @@
 
         // Set DO on the first non-system user.
         getServices().setUserRunning(CALLER_USER_HANDLE, true);
-        assertTrue(dpm.setDeviceOwner(admin2, "owner-name", CALLER_USER_HANDLE));
+        assertThat(dpm.setDeviceOwner(admin2, "owner-name", CALLER_USER_HANDLE)).isTrue();
 
-        assertEquals(admin2, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false));
+        assertThat(dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false)).isEqualTo(admin2);
 
         // Then check getDeviceOwnerAdminLocked().
-        assertEquals(admin2, getDeviceOwner().info.getComponent());
-        assertEquals(DpmMockContext.CALLER_UID, getDeviceOwner().getUid());
+        assertThat(getDeviceOwner().info.getComponent()).isEqualTo(admin2);
+        assertThat(getDeviceOwner().getUid()).isEqualTo(DpmMockContext.CALLER_UID);
     }
 
     /**
@@ -1438,6 +1465,7 @@
      * We didn't use to persist the DO component class name, but now we do, and the above method
      * finds the right component from a package name upon migration.
      */
+    @Test
     public void testDeviceOwnerMigration() throws Exception {
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         checkDeviceOwnerWithMultipleDeviceAdmins();
@@ -1449,7 +1477,8 @@
         dpms.mOwners.writeDeviceOwner();
 
         // Make sure the DO component name doesn't have a class name.
-        assertEquals("", dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false).getClassName());
+        assertThat(dpms.getDeviceOwnerComponent(/* callingUserOnly= */ false).getClassName())
+                .isEmpty();
 
         // Then create a new DPMS to have it load the settings from files.
         when(getServices().userManager.getUserRestrictions(any(UserHandle.class)))
@@ -1459,9 +1488,10 @@
         // Now the DO component name is a full name.
         // *BUT* because both admin1 and admin2 belong to the same package, we think admin1 is the
         // DO.
-        assertEquals(admin1, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false));
+        assertThat(dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false)).isEqualTo(admin1);
     }
 
+    @Test
     public void testSetGetApplicationRestriction() {
         setAsProfileOwner(admin1);
         mContext.packageName = admin1.getPackageName();
@@ -1480,20 +1510,20 @@
 
         {
             Bundle returned = dpm.getApplicationRestrictions(admin1, "pkg1");
-            assertNotNull(returned);
-            assertEquals(returned.size(), 1);
-            assertEquals(returned.get("KEY_STRING"), "Foo1");
+            assertThat(returned).isNotNull();
+            assertThat(returned.size()).isEqualTo(1);
+            assertThat("Foo1").isEqualTo(returned.get("KEY_STRING"));
         }
 
         {
             Bundle returned = dpm.getApplicationRestrictions(admin1, "pkg2");
-            assertNotNull(returned);
-            assertEquals(returned.size(), 1);
-            assertEquals(returned.get("KEY_STRING"), "Foo2");
+            assertThat(returned).isNotNull();
+            assertThat(returned.size()).isEqualTo(1);
+            assertThat("Foo2").isEqualTo(returned.get("KEY_STRING"));
         }
 
         dpm.setApplicationRestrictions(admin1, "pkg2", new Bundle());
-        assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg2").size());
+        assertThat(dpm.getApplicationRestrictions(admin1, "pkg2").size()).isEqualTo(0);
     }
 
     /**
@@ -1546,6 +1576,7 @@
         return uid;
     }
 
+    @Test
     public void testCertificateDisclosure() throws Exception {
         final int userId = CALLER_USER_HANDLE;
         final UserHandle user = UserHandle.of(userId);
@@ -1571,7 +1602,8 @@
                 .cancelAsUser(anyString(), anyInt(), eq(user));
 
         // Given that we have four certificates installed,
-        when(getServices().keyChainConnection.getService().getUserCaAliases()).thenReturn(fourCerts);
+        when(getServices().keyChainConnection.getService().getUserCaAliases())
+                .thenReturn(fourCerts);
         // when two of them are approved (one of them approved twice hence no action),
         dpms.approveCaCert(fourCerts.getList().get(0), userId, true);
         dpms.approveCaCert(fourCerts.getList().get(1), userId, true);
@@ -1586,6 +1618,7 @@
      * Simple test for delegate set/get and general delegation. Tests verifying that delegated
      * privileges can acually be exercised by a delegate are not covered here.
      */
+    @Test
     public void testDelegation() throws Exception {
         setAsProfileOwner(admin1);
 
@@ -1606,17 +1639,18 @@
 
         // DPMS correctly stores and retrieves the delegates
         DevicePolicyData policy = dpms.mUserData.get(userHandle);
-        assertEquals(2, policy.mDelegationMap.size());
+        assertThat(policy.mDelegationMap.size()).isEqualTo(2);
         MoreAsserts.assertContentsInAnyOrder(policy.mDelegationMap.get(CERT_DELEGATE),
             DELEGATION_CERT_INSTALL);
         MoreAsserts.assertContentsInAnyOrder(dpm.getDelegatedScopes(admin1, CERT_DELEGATE),
             DELEGATION_CERT_INSTALL);
-        assertEquals(CERT_DELEGATE, dpm.getCertInstallerPackage(admin1));
+        assertThat(dpm.getCertInstallerPackage(admin1)).isEqualTo(CERT_DELEGATE);
         MoreAsserts.assertContentsInAnyOrder(policy.mDelegationMap.get(RESTRICTIONS_DELEGATE),
             DELEGATION_APP_RESTRICTIONS);
         MoreAsserts.assertContentsInAnyOrder(dpm.getDelegatedScopes(admin1, RESTRICTIONS_DELEGATE),
             DELEGATION_APP_RESTRICTIONS);
-        assertEquals(RESTRICTIONS_DELEGATE, dpm.getApplicationRestrictionsManagingPackage(admin1));
+        assertThat(dpm.getApplicationRestrictionsManagingPackage(admin1))
+                .isEqualTo(RESTRICTIONS_DELEGATE);
 
         // On calling install certificate APIs from an unauthorized process
         mContext.binder.callingUid = RESTRICTIONS_DELEGATE_UID;
@@ -1658,6 +1692,7 @@
         }
     }
 
+    @Test
     public void testApplicationRestrictionsManagingApp() throws Exception {
         setAsProfileOwner(admin1);
 
@@ -1673,7 +1708,7 @@
         // delegated that permission yet.
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         mContext.packageName = admin1.getPackageName();
-        assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
+        assertThat(dpm.isCallerApplicationRestrictionsManagingPackage()).isFalse();
         final Bundle rest = new Bundle();
         rest.putString("KEY_STRING", "Foo1");
         assertExpectException(SecurityException.class, INVALID_CALLING_IDENTITY_MSG,
@@ -1682,7 +1717,7 @@
         // Check via the profile owner that no restrictions were set.
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         mContext.packageName = admin1.getPackageName();
-        assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg1").size());
+        assertThat(dpm.getApplicationRestrictions(admin1, "pkg1").size()).isEqualTo(0);
 
         // Check the API does not allow setting a non-existent package
         assertExpectException(PackageManager.NameNotFoundException.class,
@@ -1692,22 +1727,22 @@
 
         // Let appRestrictionsManagerPackage manage app restrictions
         dpm.setApplicationRestrictionsManagingPackage(admin1, appRestrictionsManagerPackage);
-        assertEquals(appRestrictionsManagerPackage,
-                dpm.getApplicationRestrictionsManagingPackage(admin1));
+        assertThat(dpm.getApplicationRestrictionsManagingPackage(admin1))
+                .isEqualTo(appRestrictionsManagerPackage);
 
         // Now that package should be able to set and retrieve app restrictions.
         mContext.binder.callingUid = appRestrictionsManagerUid;
         mContext.packageName = appRestrictionsManagerPackage;
-        assertTrue(dpm.isCallerApplicationRestrictionsManagingPackage());
+        assertThat(dpm.isCallerApplicationRestrictionsManagingPackage()).isTrue();
         dpm.setApplicationRestrictions(null, "pkg1", rest);
         Bundle returned = dpm.getApplicationRestrictions(null, "pkg1");
-        assertEquals(1, returned.size(), 1);
-        assertEquals("Foo1", returned.get("KEY_STRING"));
+        assertThat(returned.size()).isEqualTo(1);
+        assertThat(returned.get("KEY_STRING")).isEqualTo("Foo1");
 
         // The same app running on a separate user shouldn't be able to manage app restrictions.
         mContext.binder.callingUid = UserHandle.getUid(
                 UserHandle.USER_SYSTEM, appRestrictionsManagerAppId);
-        assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
+        assertThat(dpm.isCallerApplicationRestrictionsManagingPackage()).isFalse();
         assertExpectException(SecurityException.class, nonDelegateExceptionMessageRegex,
                 () -> dpm.setApplicationRestrictions(null, "pkg1", rest));
 
@@ -1715,20 +1750,21 @@
         // too.
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         mContext.packageName = admin1.getPackageName();
-        assertEquals(returned, dpm.getApplicationRestrictions(admin1, "pkg1"));
+        assertThat(dpm.getApplicationRestrictions(admin1, "pkg1")).isEqualTo(returned);
         dpm.setApplicationRestrictions(admin1, "pkg1", null);
-        assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg1").size());
+        assertThat(dpm.getApplicationRestrictions(admin1, "pkg1").size()).isEqualTo(0);
 
         // Removing the ability for the package to manage app restrictions.
         dpm.setApplicationRestrictionsManagingPackage(admin1, null);
-        assertNull(dpm.getApplicationRestrictionsManagingPackage(admin1));
+        assertThat(dpm.getApplicationRestrictionsManagingPackage(admin1)).isNull();
         mContext.binder.callingUid = appRestrictionsManagerUid;
         mContext.packageName = appRestrictionsManagerPackage;
-        assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
+        assertThat(dpm.isCallerApplicationRestrictionsManagingPackage()).isFalse();
         assertExpectException(SecurityException.class, INVALID_CALLING_IDENTITY_MSG,
                 () -> dpm.setApplicationRestrictions(null, "pkg1", null));
     }
 
+    @Test
     public void testSetUserRestriction_asDo() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -1745,8 +1781,8 @@
 
         // Call.
         dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM);
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name",
-                UserHandle.USER_SYSTEM));
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name",
+        UserHandle.USER_SYSTEM)).isTrue();
 
         assertNoDeviceOwnerRestrictions();
         reset(getServices().userManagerInternal);
@@ -1859,6 +1895,7 @@
         return null;
     }
 
+    @Test
     public void testDaDisallowedPolicies_SecurityException() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
@@ -1869,25 +1906,28 @@
         boolean originalCameraDisabled = dpm.getCameraDisabled(admin1);
         assertExpectException(SecurityException.class, /* messageRegex= */ null,
                 () -> dpm.setCameraDisabled(admin1, true));
-        assertEquals(originalCameraDisabled, dpm.getCameraDisabled(admin1));
+        assertThat(dpm.getCameraDisabled(admin1)).isEqualTo(originalCameraDisabled);
 
         int originalKeyguardDisabledFeatures = dpm.getKeyguardDisabledFeatures(admin1);
         assertExpectException(SecurityException.class, /* messageRegex= */ null,
                 () -> dpm.setKeyguardDisabledFeatures(admin1,
                         DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_ALL));
-        assertEquals(originalKeyguardDisabledFeatures, dpm.getKeyguardDisabledFeatures(admin1));
+        assertThat(dpm.getKeyguardDisabledFeatures(admin1))
+                .isEqualTo(originalKeyguardDisabledFeatures);
 
         long originalPasswordExpirationTimeout = dpm.getPasswordExpirationTimeout(admin1);
         assertExpectException(SecurityException.class, /* messageRegex= */ null,
                 () -> dpm.setPasswordExpirationTimeout(admin1, 1234));
-        assertEquals(originalPasswordExpirationTimeout, dpm.getPasswordExpirationTimeout(admin1));
+        assertThat(dpm.getPasswordExpirationTimeout(admin1))
+                .isEqualTo(originalPasswordExpirationTimeout);
 
         int originalPasswordQuality = dpm.getPasswordQuality(admin1);
         assertExpectException(SecurityException.class, /* messageRegex= */ null,
                 () -> dpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC));
-        assertEquals(originalPasswordQuality, dpm.getPasswordQuality(admin1));
+        assertThat(dpm.getPasswordQuality(admin1)).isEqualTo(originalPasswordQuality);
     }
 
+    @Test
     public void testSetUserRestriction_asPo() {
         setAsProfileOwner(admin1);
 
@@ -2023,6 +2063,7 @@
                     UserManager.DISALLOW_UNMUTE_MICROPHONE
             );
 
+    @Test
     public void testSetUserRestriction_asPoOfOrgOwnedDevice() throws Exception {
         final int MANAGED_PROFILE_ADMIN_UID =
                 UserHandle.getUid(CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID);
@@ -2097,6 +2138,7 @@
         );
     }
 
+    @Test
     public void testNoDefaultEnabledUserRestrictions() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -2112,8 +2154,8 @@
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
 
         dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM);
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name",
-                UserHandle.USER_SYSTEM));
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name",
+        UserHandle.USER_SYSTEM)).isTrue();
 
         assertNoDeviceOwnerRestrictions();
 
@@ -2132,6 +2174,7 @@
         );
     }
 
+    @Test
     public void testSetFactoryResetProtectionPolicyWithDO() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -2156,6 +2199,7 @@
                 eq(android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION));
     }
 
+    @Test
     public void testSetFactoryResetProtectionPolicyFailWithPO() throws Exception {
         setupProfileOwner();
 
@@ -2167,6 +2211,7 @@
                 () -> dpm.setFactoryResetProtectionPolicy(admin1, policy));
     }
 
+    @Test
     public void testSetFactoryResetProtectionPolicyWithPOOfOrganizationOwnedDevice()
             throws Exception {
         setupProfileOwner();
@@ -2204,6 +2249,7 @@
                 eq(android.Manifest.permission.MANAGE_FACTORY_RESET_PROTECTION));
     }
 
+    @Test
     public void testGetFactoryResetProtectionPolicyWithFrpManagementAgent()
             throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -2245,6 +2291,7 @@
         assertThat(actualAccounts).containsExactlyElementsIn(expectedAccounts);
     }
 
+    @Test
     public void testSetKeyguardDisabledFeaturesWithDO() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -2255,6 +2302,7 @@
                 DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA);
     }
 
+    @Test
     public void testSetKeyguardDisabledFeaturesWithPO() throws Exception {
         setupProfileOwner();
 
@@ -2264,6 +2312,7 @@
                 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
     }
 
+    @Test
     public void testSetKeyguardDisabledFeaturesWithPOOfOrganizationOwnedDevice()
             throws Exception {
         final int MANAGED_PROFILE_USER_ID = CALLER_USER_HANDLE;
@@ -2281,6 +2330,7 @@
                 DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA);
     }
 
+    @Test
     public void testSetApplicationHiddenWithDO() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -2304,6 +2354,7 @@
                 UserHandle.USER_SYSTEM);
     }
 
+    @Test
     public void testSetApplicationHiddenWithPOOfOrganizationOwnedDevice() throws Exception {
         final int MANAGED_PROFILE_USER_ID = CALLER_USER_HANDLE;
         final int MANAGED_PROFILE_ADMIN_UID =
@@ -2334,6 +2385,7 @@
                 false, UserHandle.USER_SYSTEM);
     }
 
+    @Test
     public void testGetMacAddress() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -2351,7 +2403,7 @@
 
         // DO needs to be an DA.
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
 
         // Test 2. Caller has DA, but not DO.
         assertExpectException(SecurityException.class,
@@ -2359,7 +2411,7 @@
                 () -> dpm.getWifiMacAddress(admin1));
 
         // Test 3. Caller has PO, but not DO.
-        assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM)).isTrue();
         assertExpectException(SecurityException.class,
                 /* messageRegex= */ INVALID_CALLING_IDENTITY_MSG,
                 () -> dpm.getWifiMacAddress(admin1));
@@ -2368,30 +2420,32 @@
         dpm.clearProfileOwner(admin1);
         dpm.setActiveAdmin(admin1, false);
         // Test 4, Caller is DO now.
-        assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM)).isTrue();
 
         // 4-1.  But WifiManager is not ready.
-        assertNull(dpm.getWifiMacAddress(admin1));
+        assertThat(dpm.getWifiMacAddress(admin1)).isNull();
 
         // 4-2.  When WifiManager returns an empty array, dpm should also output null.
         when(getServices().wifiManager.getFactoryMacAddresses()).thenReturn(new String[0]);
-        assertNull(dpm.getWifiMacAddress(admin1));
+        assertThat(dpm.getWifiMacAddress(admin1)).isNull();
 
         // 4-3. With a real MAC address.
         final String[] macAddresses = new String[]{"11:22:33:44:55:66"};
         when(getServices().wifiManager.getFactoryMacAddresses()).thenReturn(macAddresses);
-        assertEquals("11:22:33:44:55:66", dpm.getWifiMacAddress(admin1));
+        assertThat(dpm.getWifiMacAddress(admin1)).isEqualTo("11:22:33:44:55:66");
     }
 
+    @Test
     public void testGetMacAddressByOrgOwnedPO() throws Exception {
         setupProfileOwner();
         configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE);
 
         final String[] macAddresses = new String[]{"11:22:33:44:55:66"};
         when(getServices().wifiManager.getFactoryMacAddresses()).thenReturn(macAddresses);
-        assertEquals("11:22:33:44:55:66", dpm.getWifiMacAddress(admin1));
+        assertThat(dpm.getWifiMacAddress(admin1)).isEqualTo("11:22:33:44:55:66");
     }
 
+    @Test
     public void testReboot() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -2404,19 +2458,19 @@
 
         // Set admin1 as DA.
         dpm.setActiveAdmin(admin1, false);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
         assertExpectException(SecurityException.class, /* messageRegex= */
                 INVALID_CALLING_IDENTITY_MSG, () -> dpm.reboot(admin1));
 
         // Set admin1 as PO.
-        assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM)).isTrue();
         assertExpectException(SecurityException.class, /* messageRegex= */
                 INVALID_CALLING_IDENTITY_MSG, () -> dpm.reboot(admin1));
 
         // Remove PO and add DO.
         dpm.clearProfileOwner(admin1);
         dpm.setActiveAdmin(admin1, false);
-        assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM)).isTrue();
 
         // admin1 is DO.
         // Set current call state of device to ringing.
@@ -2432,10 +2486,12 @@
                 () -> dpm.reboot(admin1));
 
         // Set current call state of device to idle.
-        when(getServices().telephonyManager.getCallState()).thenReturn(TelephonyManager.CALL_STATE_IDLE);
+        when(getServices().telephonyManager.getCallState())
+                .thenReturn(TelephonyManager.CALL_STATE_IDLE);
         dpm.reboot(admin1);
     }
 
+    @Test
     public void testSetGetSupportText() {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         dpm.setActiveAdmin(admin1, true);
@@ -2444,11 +2500,11 @@
 
         // Null default support messages.
         {
-            assertNull(dpm.getLongSupportMessage(admin1));
-            assertNull(dpm.getShortSupportMessage(admin1));
+            assertThat(dpm.getLongSupportMessage(admin1)).isNull();
+            assertThat(dpm.getShortSupportMessage(admin1)).isNull();
             mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-            assertNull(dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE));
-            assertNull(dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE));
+            assertThat(dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE)).isNull();
+            assertThat(dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE)).isNull();
             mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
         }
 
@@ -2473,46 +2529,46 @@
         {
             final String supportText = "Some text to test with.";
             dpm.setShortSupportMessage(admin1, supportText);
-            assertEquals(supportText, dpm.getShortSupportMessage(admin1));
-            assertNull(dpm.getLongSupportMessage(admin1));
-            assertNull(dpm.getShortSupportMessage(admin2));
+            assertThat(dpm.getShortSupportMessage(admin1)).isEqualTo(supportText);
+            assertThat(dpm.getLongSupportMessage(admin1)).isNull();
+            assertThat(dpm.getShortSupportMessage(admin2)).isNull();
 
             mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-            assertEquals(supportText, dpm.getShortSupportMessageForUser(admin1,
-                    CALLER_USER_HANDLE));
-            assertNull(dpm.getShortSupportMessageForUser(admin2, CALLER_USER_HANDLE));
-            assertNull(dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE));
+            assertThat(dpm.getShortSupportMessageForUser(admin1,
+            CALLER_USER_HANDLE)).isEqualTo(supportText);
+            assertThat(dpm.getShortSupportMessageForUser(admin2, CALLER_USER_HANDLE)).isNull();
+            assertThat(dpm.getLongSupportMessageForUser(admin1, CALLER_USER_HANDLE)).isNull();
             mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
 
             dpm.setShortSupportMessage(admin1, null);
-            assertNull(dpm.getShortSupportMessage(admin1));
+            assertThat(dpm.getShortSupportMessage(admin1)).isNull();
         }
 
         // Set/Get long returns what it sets and other admins text isn't changed.
         {
             final String supportText = "Some text to test with.\nWith more text.";
             dpm.setLongSupportMessage(admin1, supportText);
-            assertEquals(supportText, dpm.getLongSupportMessage(admin1));
-            assertNull(dpm.getShortSupportMessage(admin1));
-            assertNull(dpm.getLongSupportMessage(admin2));
+            assertThat(dpm.getLongSupportMessage(admin1)).isEqualTo(supportText);
+            assertThat(dpm.getShortSupportMessage(admin1)).isNull();
+            assertThat(dpm.getLongSupportMessage(admin2)).isNull();
 
             mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-            assertEquals(supportText, dpm.getLongSupportMessageForUser(admin1,
-                    CALLER_USER_HANDLE));
-            assertNull(dpm.getLongSupportMessageForUser(admin2, CALLER_USER_HANDLE));
-            assertNull(dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE));
+            assertThat(dpm.getLongSupportMessageForUser(admin1,
+            CALLER_USER_HANDLE)).isEqualTo(supportText);
+            assertThat(dpm.getLongSupportMessageForUser(admin2, CALLER_USER_HANDLE)).isNull();
+            assertThat(dpm.getShortSupportMessageForUser(admin1, CALLER_USER_HANDLE)).isNull();
             mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
 
             dpm.setLongSupportMessage(admin1, null);
-            assertNull(dpm.getLongSupportMessage(admin1));
+            assertThat(dpm.getLongSupportMessage(admin1)).isNull();
         }
     }
 
+    @Test
     public void testSetGetMeteredDataDisabledPackages() throws Exception {
         setAsProfileOwner(admin1);
 
-        final ArrayList<String> emptyList = new ArrayList<>();
-        assertEquals(emptyList, dpm.getMeteredDataDisabledPackages(admin1));
+        assertThat(dpm.getMeteredDataDisabledPackages(admin1)).isEmpty();
 
         // Setup
         final ArrayList<String> pkgsToRestrict = new ArrayList<>();
@@ -2525,8 +2581,8 @@
         List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
 
         // Verify
-        assertEquals(emptyList, excludedPkgs);
-        assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1));
+        assertThat(excludedPkgs).isEmpty();
+        assertThat(dpm.getMeteredDataDisabledPackages(admin1)).isEqualTo(pkgsToRestrict);
         verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
                 MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
                 eq(CALLER_USER_HANDLE));
@@ -2536,17 +2592,18 @@
         excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
 
         // Verify
-        assertEquals(emptyList, excludedPkgs);
-        assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1));
+        assertThat(excludedPkgs).isEmpty();
+        assertThat(dpm.getMeteredDataDisabledPackages(admin1)).isEqualTo(pkgsToRestrict);
         verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
                 MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
                 eq(CALLER_USER_HANDLE));
     }
 
+    @Test
     public void testSetGetMeteredDataDisabledPackages_deviceAdmin() {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         dpm.setActiveAdmin(admin1, true);
-        assertTrue(dpm.isAdminActive(admin1));
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
         mContext.callerPermissions.remove(permission.MANAGE_DEVICE_ADMINS);
 
         assertExpectException(SecurityException.class,  /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
@@ -2555,11 +2612,11 @@
                 () -> dpm.getMeteredDataDisabledPackages(admin1));
     }
 
+    @Test
     public void testIsMeteredDataDisabledForUserPackage() throws Exception {
         setAsProfileOwner(admin1);
 
         // Setup
-        final ArrayList<String> emptyList = new ArrayList<>();
         final ArrayList<String> pkgsToRestrict = new ArrayList<>();
         final String package1 = "com.example.one";
         final String package2 = "com.example.two";
@@ -2571,16 +2628,20 @@
         List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
 
         // Verify
-        assertEquals(emptyList, excludedPkgs);
+        assertThat(excludedPkgs).isEmpty();
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(package1 + "should be restricted",
-                dpm.isMeteredDataDisabledPackageForUser(admin1, package1, CALLER_USER_HANDLE));
-        assertTrue(package2 + "should be restricted",
-                dpm.isMeteredDataDisabledPackageForUser(admin1, package2, CALLER_USER_HANDLE));
-        assertFalse(package3 + "should not be restricted",
-                dpm.isMeteredDataDisabledPackageForUser(admin1, package3, CALLER_USER_HANDLE));
+        assertWithMessage("%s should be restricted", package1)
+                .that(dpm.isMeteredDataDisabledPackageForUser(admin1, package1, CALLER_USER_HANDLE))
+                .isTrue();
+        assertWithMessage("%s should be restricted", package2)
+                .that(dpm.isMeteredDataDisabledPackageForUser(admin1, package2, CALLER_USER_HANDLE))
+                .isTrue();
+        assertWithMessage("%s should not be restricted", package3)
+                .that(dpm.isMeteredDataDisabledPackageForUser(admin1, package3, CALLER_USER_HANDLE))
+                .isFalse();
     }
 
+    @Test
     public void testIsMeteredDataDisabledForUserPackage_nonSystemUidCaller() throws Exception {
         setAsProfileOwner(admin1);
         assertExpectException(SecurityException.class,
@@ -2597,6 +2658,7 @@
         clearDeviceOwner();
     }
 
+    @Test
     public void testCreateAdminSupportIntent() throws Exception {
         // Setup device owner.
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -2604,11 +2666,11 @@
 
         // Nonexisting permission returns null
         Intent intent = dpm.createAdminSupportIntent("disallow_nothing");
-        assertNull(intent);
+        assertThat(intent).isNull();
 
         // Existing permission that is not set returns null
         intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
-        assertNull(intent);
+        assertThat(intent).isNull();
 
         // Existing permission that is not set by device/profile owner returns null
         when(getServices().userManager.hasUserRestriction(
@@ -2616,7 +2678,7 @@
                 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
                 .thenReturn(true);
         intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
-        assertNull(intent);
+        assertThat(intent).isNull();
 
         // UM.getUserRestrictionSources() will return a list of size 1 with the caller resource.
         doAnswer((Answer<List<UserManager.EnforcingUser>>) invocation -> Collections.singletonList(
@@ -2626,51 +2688,53 @@
                 eq(UserManager.DISALLOW_ADJUST_VOLUME),
                 eq(UserHandle.of(UserHandle.myUserId())));
         intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
-        assertNotNull(intent);
-        assertEquals(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS, intent.getAction());
-        assertEquals(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID),
-                intent.getIntExtra(Intent.EXTRA_USER_ID, -1));
-        assertEquals(admin1, intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN));
-        assertEquals(UserManager.DISALLOW_ADJUST_VOLUME,
-                intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
+        assertThat(intent).isNotNull();
+        assertThat(intent.getAction()).isEqualTo(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
+        assertThat(intent.getIntExtra(Intent.EXTRA_USER_ID, -1))
+                .isEqualTo(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID));
+        assertThat(
+                (ComponentName) intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN))
+                        .isEqualTo(admin1);
+        assertThat(intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION))
+                .isEqualTo(UserManager.DISALLOW_ADJUST_VOLUME);
 
         // Try with POLICY_DISABLE_CAMERA and POLICY_DISABLE_SCREEN_CAPTURE, which are not
         // user restrictions
 
         // Camera is not disabled
         intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
-        assertNull(intent);
+        assertThat(intent).isNull();
 
         // Camera is disabled
         dpm.setCameraDisabled(admin1, true);
         intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
-        assertNotNull(intent);
-        assertEquals(DevicePolicyManager.POLICY_DISABLE_CAMERA,
-                intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
+        assertThat(intent).isNotNull();
+        assertThat(intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION))
+                .isEqualTo(DevicePolicyManager.POLICY_DISABLE_CAMERA);
 
         // Screen capture is not disabled
         intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
-        assertNull(intent);
+        assertThat(intent).isNull();
 
         // Screen capture is disabled
         dpm.setScreenCaptureDisabled(admin1, true);
         intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
-        assertNotNull(intent);
-        assertEquals(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE,
-                intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
+        assertThat(intent).isNotNull();
+        assertThat(intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION))
+                .isEqualTo(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
 
         // Same checks for different user
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         // Camera should be disabled by device owner
         intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
-        assertNotNull(intent);
-        assertEquals(DevicePolicyManager.POLICY_DISABLE_CAMERA,
-                intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
-        assertEquals(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID),
-                intent.getIntExtra(Intent.EXTRA_USER_ID, -1));
+        assertThat(intent).isNotNull();
+        assertThat(intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION))
+                .isEqualTo(DevicePolicyManager.POLICY_DISABLE_CAMERA);
+        assertThat(intent.getIntExtra(Intent.EXTRA_USER_ID, -1))
+                .isEqualTo(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID));
         // ScreenCapture should not be disabled by device owner
         intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
-        assertNull(intent);
+        assertThat(intent).isNull();
     }
 
     /**
@@ -2679,6 +2743,7 @@
      * {@link DevicePolicyManager#getAffiliationIds}
      * {@link DevicePolicyManager#isAffiliatedUser}
      */
+    @Test
     public void testUserAffiliation() throws Exception {
         mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -2686,20 +2751,20 @@
 
         // Check that the system user is unaffiliated.
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
-        assertFalse(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isFalse();
 
         // Set a device owner on the system user. Check that the system user becomes affiliated.
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
         dpm.setActiveAdmin(admin1, /* replace =*/ false);
-        assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
-        assertTrue(dpm.isAffiliatedUser());
-        assertTrue(dpm.getAffiliationIds(admin1).isEmpty());
+        assertThat(dpm.setDeviceOwner(admin1, "owner-name")).isTrue();
+        assertThat(dpm.isAffiliatedUser()).isTrue();
+        assertThat(dpm.getAffiliationIds(admin1).isEmpty()).isTrue();
 
         // Install a profile owner. Check that the test user is unaffiliated.
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         setAsProfileOwner(admin2);
-        assertFalse(dpm.isAffiliatedUser());
-        assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
+        assertThat(dpm.isAffiliatedUser()).isFalse();
+        assertThat(dpm.getAffiliationIds(admin2).isEmpty()).isTrue();
 
         // Have the profile owner specify a set of affiliation ids. Check that the test user remains
         // unaffiliated.
@@ -2709,7 +2774,7 @@
         userAffiliationIds.add("blue");
         dpm.setAffiliationIds(admin2, userAffiliationIds);
         MoreAsserts.assertContentsInAnyOrder(dpm.getAffiliationIds(admin2), "red", "green", "blue");
-        assertFalse(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isFalse();
 
         // Have the device owner specify a set of affiliation ids that do not intersect with those
         // specified by the profile owner. Check that the test user remains unaffiliated.
@@ -2722,7 +2787,7 @@
         MoreAsserts.assertContentsInAnyOrder(
             dpm.getAffiliationIds(admin1), "cyan", "yellow", "magenta");
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
-        assertFalse(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isFalse();
 
         // Have the profile owner specify a set of affiliation ids that intersect with those
         // specified by the device owner. Check that the test user becomes affiliated.
@@ -2730,33 +2795,36 @@
         dpm.setAffiliationIds(admin2, userAffiliationIds);
         MoreAsserts.assertContentsInAnyOrder(
             dpm.getAffiliationIds(admin2), "red", "green", "blue", "yellow");
-        assertTrue(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isTrue();
 
         // Clear affiliation ids for the profile owner. The user becomes unaffiliated.
         dpm.setAffiliationIds(admin2, Collections.emptySet());
-        assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
-        assertFalse(dpm.isAffiliatedUser());
+        assertThat(dpm.getAffiliationIds(admin2).isEmpty()).isTrue();
+        assertThat(dpm.isAffiliatedUser()).isFalse();
 
         // Set affiliation ids again, then clear PO to check that the user becomes unaffiliated
         dpm.setAffiliationIds(admin2, userAffiliationIds);
-        assertTrue(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isTrue();
         dpm.clearProfileOwner(admin2);
-        assertFalse(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isFalse();
 
         // Check that the system user remains affiliated.
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
-        assertTrue(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isTrue();
 
         // Clear the device owner - the user becomes unaffiliated.
         clearDeviceOwner();
-        assertFalse(dpm.isAffiliatedUser());
+        assertThat(dpm.isAffiliatedUser()).isFalse();
     }
 
+    @Test
     public void testGetUserProvisioningState_defaultResult() {
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
+        assertThat(dpm.getUserProvisioningState())
+                .isEqualTo(DevicePolicyManager.STATE_USER_UNMANAGED);
     }
 
+    @Test
     public void testSetUserProvisioningState_permission() throws Exception {
         setupProfileOwner();
 
@@ -2764,6 +2832,7 @@
                 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_unprivileged() throws Exception {
         setupProfileOwner();
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
@@ -2771,6 +2840,7 @@
                         CALLER_USER_HANDLE));
     }
 
+    @Test
     public void testSetUserProvisioningState_noManagement() {
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
@@ -2778,9 +2848,11 @@
                 /* messageRegex= */ "change provisioning state unless a .* owner is set",
                 () -> dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
                         CALLER_USER_HANDLE));
-        assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
+        assertThat(dpm.getUserProvisioningState())
+                .isEqualTo(DevicePolicyManager.STATE_USER_UNMANAGED);
     }
 
+    @Test
     public void testSetUserProvisioningState_deviceOwnerFromSetupWizard() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -2790,6 +2862,7 @@
                 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_deviceOwnerFromSetupWizardAlternative()
             throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -2800,6 +2873,7 @@
                 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_deviceOwnerWithoutSetupWizard() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -2808,6 +2882,7 @@
                 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_managedProfileFromSetupWizard_primaryUser()
             throws Exception {
         setupProfileOwner();
@@ -2817,6 +2892,7 @@
                 DevicePolicyManager.STATE_USER_PROFILE_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_managedProfileFromSetupWizard_managedProfile()
             throws Exception {
         setupProfileOwner();
@@ -2826,6 +2902,7 @@
                 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_managedProfileWithoutSetupWizard() throws Exception {
         setupProfileOwner();
 
@@ -2833,6 +2910,7 @@
                 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
     }
 
+    @Test
     public void testSetUserProvisioningState_illegalTransitionOutOfFinalized1() throws Exception {
         setupProfileOwner();
 
@@ -2843,6 +2921,7 @@
                         DevicePolicyManager.STATE_USER_UNMANAGED));
     }
 
+    @Test
     public void testSetUserProvisioningState_illegalTransitionToAnotherInProgressState()
             throws Exception {
         setupProfileOwner();
@@ -2858,10 +2937,11 @@
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
         mContext.callerPermissions.add(permission.MANAGE_USERS);
 
-        assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
+        assertThat(dpm.getUserProvisioningState())
+                .isEqualTo(DevicePolicyManager.STATE_USER_UNMANAGED);
         for (int state : states) {
             dpm.setUserProvisioningState(state, userId);
-            assertEquals(state, dpm.getUserProvisioningState());
+            assertThat(dpm.getUserProvisioningState()).isEqualTo(state);
         }
     }
 
@@ -2870,7 +2950,7 @@
 
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
         dpm.setActiveAdmin(admin1, false);
-        assertTrue(dpm.setProfileOwner(admin1, null, CALLER_USER_HANDLE));
+        assertThat(dpm.setProfileOwner(admin1, null, CALLER_USER_HANDLE)).isTrue();
 
         mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
     }
@@ -2880,7 +2960,7 @@
 
         setUpPackageManagerForAdmin(admin1, DpmMockContext.SYSTEM_UID);
         dpm.setActiveAdmin(admin1, false);
-        assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM)).isTrue();
 
         mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
     }
@@ -2890,11 +2970,12 @@
 
         setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
         dpm.setActiveAdmin(admin1, false);
-        assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM)).isTrue();
 
         mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
     }
 
+    @Test
     public void testSetMaximumTimeToLock() {
         mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
 
@@ -2956,6 +3037,7 @@
         verifyStayOnWhilePluggedCleared(false);
     }
 
+    @Test
     public void testIsActiveSupervisionApp() throws Exception {
         when(mServiceContext.resources
                 .getString(R.string.config_defaultSupervisionProfileOwnerComponent))
@@ -2968,11 +3050,12 @@
 
         final DevicePolicyManagerInternal dpmi =
                 LocalServices.getService(DevicePolicyManagerInternal.class);
-        assertTrue(dpmi.isActiveSupervisionApp(PROFILE_ADMIN));
+        assertThat(dpmi.isActiveSupervisionApp(PROFILE_ADMIN)).isTrue();
     }
 
     // Test if lock timeout on managed profile is handled correctly depending on whether profile
     // uses separate challenge.
+    @Test
     public void testSetMaximumTimeToLockProfile() throws Exception {
         final int PROFILE_USER = 15;
         final int PROFILE_ADMIN = UserHandle.getUid(PROFILE_USER, 19436);
@@ -3039,6 +3122,7 @@
         verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM);
     }
 
+    @Test
     public void testSetRequiredStrongAuthTimeout_DeviceOwner() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3055,8 +3139,8 @@
         getServices().buildMock.isDebuggable = false;
 
         dpm.setRequiredStrongAuthTimeout(admin1, MAX_MINUS_ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MAX_MINUS_ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null), MAX_MINUS_ONE_MINUTE);
+        assertThat(MAX_MINUS_ONE_MINUTE).isEqualTo(dpm.getRequiredStrongAuthTimeout(admin1));
+        assertThat(MAX_MINUS_ONE_MINUTE).isEqualTo(dpm.getRequiredStrongAuthTimeout(null));
 
         verify(getServices().systemProperties, never()).getLong(anyString(), anyLong());
 
@@ -3067,45 +3151,47 @@
         dpm.setRequiredStrongAuthTimeout(admin1, 0);
 
         // aggregation should be the default if unset by any admin
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null),
-                DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+        assertThat(DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS)
+                .isEqualTo(dpm.getRequiredStrongAuthTimeout(null));
 
         // admin not participating by default
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
+        assertThat(dpm.getRequiredStrongAuthTimeout(admin1)).isEqualTo(0);
 
         //clamping from the top
         dpm.setRequiredStrongAuthTimeout(admin1,
                 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1),
-                DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null),
-                DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+        assertThat(DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS)
+                .isEqualTo(dpm.getRequiredStrongAuthTimeout(admin1));
+        assertThat(DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS)
+                .isEqualTo(dpm.getRequiredStrongAuthTimeout(null));
 
         // 0 means the admin is not participating, so default should be returned
         dpm.setRequiredStrongAuthTimeout(admin1, 0);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null),
-                DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+        assertThat(dpm.getRequiredStrongAuthTimeout(admin1)).isEqualTo(0);
+        assertThat(DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS)
+                .isEqualTo(dpm.getRequiredStrongAuthTimeout(null));
 
         // clamping from the bottom
         dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS - ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
+        assertThat(dpm.getRequiredStrongAuthTimeout(admin1))
+                .isEqualTo(MINIMUM_STRONG_AUTH_TIMEOUT_MS);
+        assertThat(dpm.getRequiredStrongAuthTimeout(null))
+                .isEqualTo(MINIMUM_STRONG_AUTH_TIMEOUT_MS);
 
         // values within range
         dpm.setRequiredStrongAuthTimeout(admin1, MIN_PLUS_ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MIN_PLUS_ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null), MIN_PLUS_ONE_MINUTE);
+        assertThat(dpm.getRequiredStrongAuthTimeout(admin1)).isEqualTo(MIN_PLUS_ONE_MINUTE);
+        assertThat(dpm.getRequiredStrongAuthTimeout(null)).isEqualTo(MIN_PLUS_ONE_MINUTE);
 
         dpm.setRequiredStrongAuthTimeout(admin1, MAX_MINUS_ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MAX_MINUS_ONE_MINUTE);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null), MAX_MINUS_ONE_MINUTE);
+        assertThat(dpm.getRequiredStrongAuthTimeout(admin1)).isEqualTo(MAX_MINUS_ONE_MINUTE);
+        assertThat(dpm.getRequiredStrongAuthTimeout(null)).isEqualTo(MAX_MINUS_ONE_MINUTE);
 
         // reset to default
         dpm.setRequiredStrongAuthTimeout(admin1, 0);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
-        assertEquals(dpm.getRequiredStrongAuthTimeout(null),
-                DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
+        assertThat(dpm.getRequiredStrongAuthTimeout(admin1)).isEqualTo(0);
+        assertThat(DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS)
+                .isEqualTo(dpm.getRequiredStrongAuthTimeout(null));
 
         // negative value
         assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null,
@@ -3130,8 +3216,8 @@
     private void setup_DeviceAdminFeatureOff() throws Exception {
         when(getServices().packageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN))
                 .thenReturn(false);
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(false);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(false);
         initializeDpms();
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
@@ -3141,6 +3227,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_DeviceAdminFeatureOff() throws Exception {
         setup_DeviceAdminFeatureOff();
         mContext.packageName = admin1.getPackageName();
@@ -3153,6 +3240,7 @@
         assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_DeviceAdminFeatureOff() throws Exception {
         setup_DeviceAdminFeatureOff();
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -3170,8 +3258,8 @@
     }
 
     private void setup_ManagedProfileFeatureOff() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(false);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(false);
         initializeDpms();
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
@@ -3181,6 +3269,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_ManagedProfileFeatureOff() throws Exception {
         setup_ManagedProfileFeatureOff();
         mContext.packageName = admin1.getPackageName();
@@ -3202,6 +3291,7 @@
         assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_ManagedProfileFeatureOff() throws Exception {
         setup_ManagedProfileFeatureOff();
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
@@ -3233,8 +3323,8 @@
     }
 
     private void setup_nonSplitUser_firstBoot_primaryUser() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
                 .thenReturn(true);
@@ -3244,6 +3334,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_nonSplitUser_firstBoot_primaryUser() throws Exception {
         setup_nonSplitUser_firstBoot_primaryUser();
         mContext.packageName = admin1.getPackageName();
@@ -3257,6 +3348,7 @@
                 false /* because of non-split user */);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_nonSplitUser_firstBoot_primaryUser()
             throws Exception {
         setup_nonSplitUser_firstBoot_primaryUser();
@@ -3275,8 +3367,8 @@
     }
 
     private void setup_nonSplitUser_afterDeviceSetup_primaryUser() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
                 .thenReturn(true);
@@ -3302,6 +3394,7 @@
                 true)).thenReturn(true);
     }
 
+    @Test
     public void testIsProvisioningAllowed_nonSplitUser_afterDeviceSetup_primaryUser()
             throws Exception {
         setup_nonSplitUser_afterDeviceSetup_primaryUser();
@@ -3318,6 +3411,7 @@
                 false/* because of non-split user */);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_nonSplitUser_afterDeviceSetup_primaryUser()
             throws Exception {
         setup_nonSplitUser_afterDeviceSetup_primaryUser();
@@ -3335,6 +3429,7 @@
                 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
     }
 
+    @Test
     public void testProvisioning_nonSplitUser_withDo_primaryUser() throws Exception {
         setup_nonSplitUser_withDo_primaryUser();
         mContext.packageName = admin1.getPackageName();
@@ -3361,6 +3456,7 @@
                 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
     }
 
+    @Test
     public void testProvisioning_nonSplitUser_withDo_primaryUser_restrictedBySystem()
             throws Exception {
         setup_nonSplitUser_withDo_primaryUser();
@@ -3388,6 +3484,7 @@
                 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
     }
 
+    @Test
     public void testCheckCannotSetProfileOwnerWithDeviceOwner() throws Exception {
         setup_nonSplitUser_withDo_primaryUser();
         final int managedProfileUserId = 18;
@@ -3399,10 +3496,11 @@
         mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
         setUpPackageManagerForFakeAdmin(admin1, managedProfileAdminUid, admin1);
         dpm.setActiveAdmin(admin1, false, userId);
-        assertFalse(dpm.setProfileOwner(admin1, null, userId));
+        assertThat(dpm.setProfileOwner(admin1, null, userId)).isFalse();
         mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_nonSplitUser_attemptingComp() throws Exception {
         setup_nonSplitUser_withDo_primaryUser_ManagedProfile();
         mContext.packageName = admin1.getPackageName();
@@ -3420,6 +3518,7 @@
                 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_nonSplitUser_comp_cannot_remove_profile()
             throws Exception {
         setup_nonSplitUser_withDo_primaryUser_ManagedProfile();
@@ -3449,8 +3548,8 @@
     }
 
     private void setup_splitUser_firstBoot_systemUser() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
                 .thenReturn(false);
@@ -3459,6 +3558,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_splitUser_firstBoot_systemUser() throws Exception {
         setup_splitUser_firstBoot_systemUser();
         mContext.packageName = admin1.getPackageName();
@@ -3473,6 +3573,7 @@
                 false/* because calling uid is system user */);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_splitUser_firstBoot_systemUser()
             throws Exception {
         setup_splitUser_firstBoot_systemUser();
@@ -3491,8 +3592,8 @@
     }
 
     private void setup_splitUser_afterDeviceSetup_systemUser() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
                 .thenReturn(false);
@@ -3501,6 +3602,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_splitUser_afterDeviceSetup_systemUser() throws Exception {
         setup_splitUser_afterDeviceSetup_systemUser();
         mContext.packageName = admin1.getPackageName();
@@ -3517,6 +3619,7 @@
                 false/* because calling uid is system user */);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_splitUser_afterDeviceSetup_systemUser()
             throws Exception {
         setup_splitUser_afterDeviceSetup_systemUser();
@@ -3535,8 +3638,8 @@
     }
 
     private void setup_splitUser_firstBoot_primaryUser() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE,
                 true)).thenReturn(true);
@@ -3545,6 +3648,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_splitUser_firstBoot_primaryUser() throws Exception {
         setup_splitUser_firstBoot_primaryUser();
         mContext.packageName = admin1.getPackageName();
@@ -3557,6 +3661,7 @@
         assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, true);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_splitUser_firstBoot_primaryUser()
             throws Exception {
         setup_splitUser_firstBoot_primaryUser();
@@ -3575,8 +3680,8 @@
     }
 
     private void setup_splitUser_afterDeviceSetup_primaryUser() throws Exception {
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         when(getServices().userManager.canAddMoreManagedProfiles(CALLER_USER_HANDLE,
                 true)).thenReturn(true);
@@ -3585,6 +3690,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_splitUser_afterDeviceSetup_primaryUser()
             throws Exception {
         setup_splitUser_afterDeviceSetup_primaryUser();
@@ -3601,6 +3707,7 @@
                 false/* because user setup completed */);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_splitUser_afterDeviceSetup_primaryUser()
             throws Exception {
         setup_splitUser_afterDeviceSetup_primaryUser();
@@ -3621,8 +3728,8 @@
     private void setup_provisionManagedProfileWithDeviceOwner_systemUser() throws Exception {
         setDeviceOwner();
 
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
                 .thenReturn(false);
@@ -3631,6 +3738,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_provisionManagedProfileWithDeviceOwner_systemUser()
             throws Exception {
         setup_provisionManagedProfileWithDeviceOwner_systemUser();
@@ -3640,6 +3748,7 @@
                 false /* can't provision managed profile on system user */);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_provisionManagedProfileWithDeviceOwner_systemUser()
             throws Exception {
         setup_provisionManagedProfileWithDeviceOwner_systemUser();
@@ -3651,8 +3760,8 @@
     private void setup_provisionManagedProfileWithDeviceOwner_primaryUser() throws Exception {
         setDeviceOwner();
 
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
         when(getServices().userManager.getProfileParent(CALLER_USER_HANDLE))
             .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
@@ -3663,6 +3772,7 @@
         mContext.binder.callingUid = DpmMockContext.ANOTHER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_provisionManagedProfileWithDeviceOwner_primaryUser()
             throws Exception {
         setup_provisionManagedProfileWithDeviceOwner_primaryUser();
@@ -3671,6 +3781,7 @@
         assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_provisionManagedProfileWithDeviceOwner_primaryUser()
             throws Exception {
         setup_provisionManagedProfileWithDeviceOwner_primaryUser();
@@ -3684,8 +3795,8 @@
     private void setup_provisionManagedProfileCantRemoveUser_primaryUser() throws Exception {
         setDeviceOwner();
 
-        when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
-                .thenReturn(true);
+        when(getServices().ipackageManager
+                .hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0)).thenReturn(true);
         when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
         when(getServices().userManager.hasUserRestriction(
                 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
@@ -3700,6 +3811,7 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
     }
 
+    @Test
     public void testIsProvisioningAllowed_provisionManagedProfileCantRemoveUser_primaryUser()
             throws Exception {
         setup_provisionManagedProfileCantRemoveUser_primaryUser();
@@ -3708,6 +3820,7 @@
         assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_provisionManagedProfileCantRemoveUser_primaryUser()
             throws Exception {
         setup_provisionManagedProfileCantRemoveUser_primaryUser();
@@ -3716,6 +3829,7 @@
                 DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE);
     }
 
+    @Test
     public void testCheckProvisioningPreCondition_permission() {
         // GIVEN the permission MANAGE_PROFILE_AND_DEVICE_OWNERS is not granted
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
@@ -3723,12 +3837,14 @@
                         DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, "some.package"));
     }
 
+    @Test
     public void testForceUpdateUserSetupComplete_permission() {
         // GIVEN the permission MANAGE_PROFILE_AND_DEVICE_OWNERS is not granted
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
                 () -> dpm.forceUpdateUserSetupComplete());
     }
 
+    @Test
     public void testForceUpdateUserSetupComplete_systemUser() {
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
         // GIVEN calling from user 20
@@ -3737,6 +3853,7 @@
                 () -> dpm.forceUpdateUserSetupComplete());
     }
 
+    @Test
     public void testForceUpdateUserSetupComplete_userbuild() {
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -3753,14 +3870,15 @@
         // GIVEN it's user build
         getServices().buildMock.isDebuggable = false;
 
-        assertTrue(dpms.hasUserSetupCompleted());
+        assertThat(dpms.hasUserSetupCompleted()).isTrue();
 
         dpm.forceUpdateUserSetupComplete();
 
         // THEN the state in dpms is not changed
-        assertTrue(dpms.hasUserSetupCompleted());
+        assertThat(dpms.hasUserSetupCompleted()).isTrue();
     }
 
+    @Test
     public void testForceUpdateUserSetupComplete_userDebugbuild() {
         mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -3777,12 +3895,12 @@
         // GIVEN it's userdebug build
         getServices().buildMock.isDebuggable = true;
 
-        assertTrue(dpms.hasUserSetupCompleted());
+        assertThat(dpms.hasUserSetupCompleted()).isTrue();
 
         dpm.forceUpdateUserSetupComplete();
 
         // THEN the state in dpms is not changed
-        assertFalse(dpms.hasUserSetupCompleted());
+        assertThat(dpms.hasUserSetupCompleted()).isFalse();
     }
 
     private void clearDeviceOwner() throws Exception {
@@ -3795,6 +3913,7 @@
         });
     }
 
+    @Test
     public void testGetLastSecurityLogRetrievalTime() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3806,7 +3925,7 @@
                 .thenReturn(true);
 
         // No logs were retrieved so far.
-        assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(-1);
 
         // Enabling logging should not change the timestamp.
         dpm.setSecurityLoggingEnabled(admin1, true);
@@ -3814,55 +3933,56 @@
                 .securityLogSetLoggingEnabledProperty(true);
         when(getServices().settings.securityLogGetLoggingEnabledProperty())
                 .thenReturn(true);
-        assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(-1);
 
         // Retrieving the logs should update the timestamp.
         final long beforeRetrieval = System.currentTimeMillis();
         dpm.retrieveSecurityLogs(admin1);
         final long firstSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
         final long afterRetrieval = System.currentTimeMillis();
-        assertTrue(firstSecurityLogRetrievalTime >= beforeRetrieval);
-        assertTrue(firstSecurityLogRetrievalTime <= afterRetrieval);
+        assertThat(firstSecurityLogRetrievalTime >= beforeRetrieval).isTrue();
+        assertThat(firstSecurityLogRetrievalTime <= afterRetrieval).isTrue();
 
         // Retrieving the pre-boot logs should update the timestamp.
         Thread.sleep(2);
         dpm.retrievePreRebootSecurityLogs(admin1);
         final long secondSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
-        assertTrue(secondSecurityLogRetrievalTime > firstSecurityLogRetrievalTime);
+        assertThat(secondSecurityLogRetrievalTime > firstSecurityLogRetrievalTime).isTrue();
 
         // Checking the timestamp again should not change it.
         Thread.sleep(2);
-        assertEquals(secondSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(secondSecurityLogRetrievalTime);
 
         // Retrieving the logs again should update the timestamp.
         dpm.retrieveSecurityLogs(admin1);
         final long thirdSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
-        assertTrue(thirdSecurityLogRetrievalTime > secondSecurityLogRetrievalTime);
+        assertThat(thirdSecurityLogRetrievalTime > secondSecurityLogRetrievalTime).isTrue();
 
         // Disabling logging should not change the timestamp.
         Thread.sleep(2);
         dpm.setSecurityLoggingEnabled(admin1, false);
-        assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(thirdSecurityLogRetrievalTime);
 
         // Restarting the DPMS should not lose the timestamp.
         initializeDpms();
-        assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(thirdSecurityLogRetrievalTime);
 
         // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
         mContext.binder.callingUid = 1234567;
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(thirdSecurityLogRetrievalTime);
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
 
         // System can retrieve the timestamp.
         mContext.binder.clearCallingIdentity();
-        assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(thirdSecurityLogRetrievalTime);
 
         // Removing the device owner should clear the timestamp.
         clearDeviceOwner();
-        assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
+        assertThat(dpm.getLastSecurityLogRetrievalTime()).isEqualTo(-1);
     }
 
+    @Test
     public void testSetConfiguredNetworksLockdownStateWithDO() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3875,6 +3995,7 @@
                 Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0);
     }
 
+    @Test
     public void testSetConfiguredNetworksLockdownStateWithPO() throws Exception {
         setupProfileOwner();
         assertExpectException(SecurityException.class, null,
@@ -3883,6 +4004,7 @@
                 Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0);
     }
 
+    @Test
     public void testSetConfiguredNetworksLockdownStateWithPOOfOrganizationOwnedDevice()
             throws Exception {
         setupProfileOwner();
@@ -3896,6 +4018,7 @@
                 Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0);
     }
 
+    @Test
     public void testSetSystemSettingFailWithNonWhitelistedSettings() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3903,6 +4026,7 @@
                 dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS_FOR_VR, "0"));
     }
 
+    @Test
     public void testSetSystemSettingWithDO() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3911,6 +4035,7 @@
                 Settings.System.SCREEN_BRIGHTNESS, "0", UserHandle.USER_SYSTEM);
     }
 
+    @Test
     public void testSetSystemSettingWithPO() throws Exception {
         setupProfileOwner();
         dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0");
@@ -3918,6 +4043,7 @@
             Settings.System.SCREEN_BRIGHTNESS, "0", CALLER_USER_HANDLE);
     }
 
+    @Test
     public void testSetAutoTimeEnabledModifiesSetting() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3928,6 +4054,7 @@
         verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME, 0);
     }
 
+    @Test
     public void testSetAutoTimeEnabledWithPOOnUser0() throws Exception {
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
         setupProfileOwnerOnUser0();
@@ -3938,6 +4065,7 @@
         verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME, 0);
     }
 
+    @Test
     public void testSetAutoTimeEnabledFailWithPONotOnUser0() throws Exception {
         setupProfileOwner();
         assertExpectException(SecurityException.class, null,
@@ -3945,6 +4073,7 @@
         verify(getServices().settings, never()).settingsGlobalPutInt(Settings.Global.AUTO_TIME, 0);
     }
 
+    @Test
     public void testSetAutoTimeEnabledWithPOOfOrganizationOwnedDevice() throws Exception {
         setupProfileOwner();
         configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE);
@@ -3956,6 +4085,7 @@
         verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME, 0);
     }
 
+    @Test
     public void testSetAutoTimeZoneEnabledModifiesSetting() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -3966,6 +4096,7 @@
         verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 0);
     }
 
+    @Test
     public void testSetAutoTimeZoneEnabledWithPOOnUser0() throws Exception {
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
         setupProfileOwnerOnUser0();
@@ -3976,6 +4107,7 @@
         verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 0);
     }
 
+    @Test
     public void testSetAutoTimeZoneEnabledFailWithPONotOnUser0() throws Exception {
         setupProfileOwner();
         assertExpectException(SecurityException.class, null,
@@ -3984,6 +4116,7 @@
                 0);
     }
 
+    @Test
     public void testSetAutoTimeZoneEnabledWithPOOfOrganizationOwnedDevice() throws Exception {
         setupProfileOwner();
         configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE);
@@ -3995,12 +4128,13 @@
         verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 0);
     }
 
+    @Test
     public void testIsOrganizationOwnedDevice() throws Exception {
         // Set up the user manager to return correct user info
         addManagedProfile(admin1, DpmMockContext.CALLER_UID, admin1);
 
         // Any caller should be able to call this method.
-        assertFalse(dpm.isOrganizationOwnedDeviceWithManagedProfile());
+        assertThat(dpm.isOrganizationOwnedDeviceWithManagedProfile()).isFalse();
         configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE);
 
         verify(getServices().userManager).setUserRestriction(
@@ -4008,13 +4142,14 @@
                 eq(true),
                 eq(UserHandle.of(UserHandle.USER_SYSTEM)));
 
-        assertTrue(dpm.isOrganizationOwnedDeviceWithManagedProfile());
+        assertThat(dpm.isOrganizationOwnedDeviceWithManagedProfile()).isTrue();
 
         // A random caller from another user should also be able to get the right result.
         mContext.binder.callingUid = DpmMockContext.ANOTHER_UID;
-        assertTrue(dpm.isOrganizationOwnedDeviceWithManagedProfile());
+        assertThat(dpm.isOrganizationOwnedDeviceWithManagedProfile()).isTrue();
     }
 
+    @Test
     public void testMarkOrganizationOwnedDevice_baseRestrictionsAdded() throws Exception {
         addManagedProfile(admin1, DpmMockContext.CALLER_UID, admin1);
 
@@ -4044,6 +4179,7 @@
                 parentDpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADD_USER));
     }
 
+    @Test
     public void testSetTime() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4051,11 +4187,13 @@
         verify(getServices().alarmManager).setTime(0);
     }
 
+    @Test
     public void testSetTimeFailWithPO() throws Exception {
         setupProfileOwner();
         assertExpectException(SecurityException.class, null, () -> dpm.setTime(admin1, 0));
     }
 
+    @Test
     public void testSetTimeWithPOOfOrganizationOwnedDevice() throws Exception {
         setupProfileOwner();
         configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE);
@@ -4063,14 +4201,16 @@
         verify(getServices().alarmManager).setTime(0);
     }
 
+    @Test
     public void testSetTimeWithAutoTimeOn() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
         when(getServices().settings.settingsGlobalGetInt(Settings.Global.AUTO_TIME, 0))
                 .thenReturn(1);
-        assertFalse(dpm.setTime(admin1, 0));
+        assertThat(dpm.setTime(admin1, 0)).isFalse();
     }
 
+    @Test
     public void testSetTimeZone() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4078,12 +4218,14 @@
         verify(getServices().alarmManager).setTimeZone("Asia/Shanghai");
     }
 
+    @Test
     public void testSetTimeZoneFailWithPO() throws Exception {
         setupProfileOwner();
         assertExpectException(SecurityException.class, null,
                 () -> dpm.setTimeZone(admin1, "Asia/Shanghai"));
     }
 
+    @Test
     public void testSetTimeZoneWithPOOfOrganizationOwnedDevice() throws Exception {
         setupProfileOwner();
         configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE);
@@ -4091,14 +4233,16 @@
         verify(getServices().alarmManager).setTimeZone("Asia/Shanghai");
     }
 
+    @Test
     public void testSetTimeZoneWithAutoTimeZoneOn() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
         when(getServices().settings.settingsGlobalGetInt(Settings.Global.AUTO_TIME_ZONE, 0))
                 .thenReturn(1);
-        assertFalse(dpm.setTimeZone(admin1, "Asia/Shanghai"));
+        assertThat(dpm.setTimeZone(admin1, "Asia/Shanghai")).isFalse();
     }
 
+    @Test
     public void testGetLastBugReportRequestTime() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4115,39 +4259,40 @@
         getServices().removeUser(CALLER_USER_HANDLE);
 
         // No bug reports were requested so far.
-        assertEquals(-1, dpm.getLastBugReportRequestTime());
+        assertThat(dpm.getLastBugReportRequestTime()).isEqualTo(-1);
 
         // Requesting a bug report should update the timestamp.
         final long beforeRequest = System.currentTimeMillis();
         dpm.requestBugreport(admin1);
         final long bugReportRequestTime = dpm.getLastBugReportRequestTime();
         final long afterRequest = System.currentTimeMillis();
-        assertTrue(bugReportRequestTime >= beforeRequest);
-        assertTrue(bugReportRequestTime <= afterRequest);
+        assertThat(bugReportRequestTime).isAtLeast(beforeRequest);
+        assertThat(bugReportRequestTime).isAtMost(afterRequest);
 
         // Checking the timestamp again should not change it.
         Thread.sleep(2);
-        assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
+        assertThat(dpm.getLastBugReportRequestTime()).isEqualTo(bugReportRequestTime);
 
         // Restarting the DPMS should not lose the timestamp.
         initializeDpms();
-        assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
+        assertThat(dpm.getLastBugReportRequestTime()).isEqualTo(bugReportRequestTime);
 
         // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
         mContext.binder.callingUid = 1234567;
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
+        assertThat(dpm.getLastBugReportRequestTime()).isEqualTo(bugReportRequestTime);
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
 
         // System can retrieve the timestamp.
         mContext.binder.clearCallingIdentity();
-        assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
+        assertThat(dpm.getLastBugReportRequestTime()).isEqualTo(bugReportRequestTime);
 
         // Removing the device owner should clear the timestamp.
         clearDeviceOwner();
-        assertEquals(-1, dpm.getLastBugReportRequestTime());
+        assertThat(dpm.getLastBugReportRequestTime()).isEqualTo(-1);
     }
 
+    @Test
     public void testGetLastNetworkLogRetrievalTime() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4165,57 +4310,58 @@
                 .thenReturn(true);
 
         // No logs were retrieved so far.
-        assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(-1);
 
         // Attempting to retrieve logs without enabling logging should not change the timestamp.
         dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
-        assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(-1);
 
         // Enabling logging should not change the timestamp.
         dpm.setNetworkLoggingEnabled(admin1, true);
-        assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(-1);
 
         // Retrieving the logs should update the timestamp.
         final long beforeRetrieval = System.currentTimeMillis();
         dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
         final long firstNetworkLogRetrievalTime = dpm.getLastNetworkLogRetrievalTime();
         final long afterRetrieval = System.currentTimeMillis();
-        assertTrue(firstNetworkLogRetrievalTime >= beforeRetrieval);
-        assertTrue(firstNetworkLogRetrievalTime <= afterRetrieval);
+        assertThat(firstNetworkLogRetrievalTime >= beforeRetrieval).isTrue();
+        assertThat(firstNetworkLogRetrievalTime <= afterRetrieval).isTrue();
 
         // Checking the timestamp again should not change it.
         Thread.sleep(2);
-        assertEquals(firstNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(firstNetworkLogRetrievalTime);
 
         // Retrieving the logs again should update the timestamp.
         dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
         final long secondNetworkLogRetrievalTime = dpm.getLastNetworkLogRetrievalTime();
-        assertTrue(secondNetworkLogRetrievalTime > firstNetworkLogRetrievalTime);
+        assertThat(secondNetworkLogRetrievalTime > firstNetworkLogRetrievalTime).isTrue();
 
         // Disabling logging should not change the timestamp.
         Thread.sleep(2);
         dpm.setNetworkLoggingEnabled(admin1, false);
-        assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(secondNetworkLogRetrievalTime);
 
         // Restarting the DPMS should not lose the timestamp.
         initializeDpms();
-        assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(secondNetworkLogRetrievalTime);
 
         // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
         mContext.binder.callingUid = 1234567;
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(secondNetworkLogRetrievalTime);
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
 
         // System can retrieve the timestamp.
         mContext.binder.clearCallingIdentity();
-        assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(secondNetworkLogRetrievalTime);
 
         // Removing the device owner should clear the timestamp.
         clearDeviceOwner();
-        assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
+        assertThat(dpm.getLastNetworkLogRetrievalTime()).isEqualTo(-1);
     }
 
+    @Test
     public void testGetBindDeviceAdminTargetUsers() throws Exception {
         // Setup device owner.
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -4268,9 +4414,9 @@
         dpm.setLockTaskPackages(who, packages);
         MoreAsserts.assertEquals(packages, dpm.getLockTaskPackages(who));
         for (String p : packages) {
-            assertTrue(dpm.isLockTaskPermitted(p));
+            assertThat(dpm.isLockTaskPermitted(p)).isTrue();
         }
-        assertFalse(dpm.isLockTaskPermitted("anotherPackage"));
+        assertThat(dpm.isLockTaskPermitted("anotherPackage")).isFalse();
         // Test to see if set lock task features can be set
         dpm.setLockTaskFeatures(who, flags);
         verifyLockTaskState(userId, packages, flags);
@@ -4283,11 +4429,12 @@
                 () -> dpm.setLockTaskPackages(who, packages));
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
                 () -> dpm.getLockTaskPackages(who));
-        assertFalse(dpm.isLockTaskPermitted("doPackage1"));
+        assertThat(dpm.isLockTaskPermitted("doPackage1")).isFalse();
         assertExpectException(SecurityException.class, /* messageRegex =*/ null,
                 () -> dpm.setLockTaskFeatures(who, flags));
     }
 
+    @Test
     public void testLockTaskPolicyForProfileOwner() throws Exception {
         // Setup a PO
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
@@ -4315,9 +4462,11 @@
         final int mpoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
                 | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
                 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
-        verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, mpoPackages, mpoFlags);
+        verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, mpoPackages,
+                mpoFlags);
     }
 
+    @Test
     public void testLockTaskFeatures_IllegalArgumentException() throws Exception {
         // Setup a device owner.
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -4332,12 +4481,13 @@
                 () -> dpm.setLockTaskFeatures(admin1, flags));
     }
 
+    @Test
     public void testSecondaryLockscreen_profileOwner() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
 
         // Initial state is disabled.
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
-                CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
+        CALLER_USER_HANDLE))).isFalse();
 
         // Profile owner can set enabled state.
         setAsProfileOwner(admin1);
@@ -4345,8 +4495,8 @@
                 .getString(R.string.config_defaultSupervisionProfileOwnerComponent))
                 .thenReturn(admin1.flattenToString());
         dpm.setSecondaryLockscreenEnabled(admin1, true);
-        assertTrue(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
-                CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
+        CALLER_USER_HANDLE))).isTrue();
 
         // Managed profile managed by different package is unaffiliated - cannot set enabled.
         final int managedProfileUserId = 15;
@@ -4359,11 +4509,13 @@
                 () -> dpm.setSecondaryLockscreenEnabled(adminDifferentPackage, false));
     }
 
+    @Test
     public void testSecondaryLockscreen_deviceOwner() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
 
         // Initial state is disabled.
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(UserHandle.USER_SYSTEM)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(UserHandle.USER_SYSTEM)))
+                .isFalse();
 
         // Device owners can set enabled state.
         setupDeviceOwner();
@@ -4371,14 +4523,16 @@
                 .getString(R.string.config_defaultSupervisionProfileOwnerComponent))
                 .thenReturn(admin1.flattenToString());
         dpm.setSecondaryLockscreenEnabled(admin1, true);
-        assertTrue(dpm.isSecondaryLockscreenEnabled(UserHandle.of(UserHandle.USER_SYSTEM)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(UserHandle.USER_SYSTEM)))
+                .isTrue();
     }
 
+    @Test
     public void testSecondaryLockscreen_nonOwner() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
 
         // Initial state is disabled.
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))).isFalse();
 
         // Non-DO/PO cannot set enabled state.
         when(mServiceContext.resources
@@ -4386,9 +4540,10 @@
                 .thenReturn(admin1.flattenToString());
         assertExpectException(SecurityException.class, /* messageRegex= */ null,
                 () -> dpm.setSecondaryLockscreenEnabled(admin1, true));
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))).isFalse();
     }
 
+    @Test
     public void testSecondaryLockscreen_nonSupervisionApp() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
 
@@ -4403,13 +4558,13 @@
                 eq(CALLER_USER_HANDLE));
 
         // Initial state is disabled.
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))).isFalse();
 
         // Caller is Profile Owner, but no supervision app is configured.
         setAsProfileOwner(admin1);
         assertExpectException(SecurityException.class, "is not the default supervision component",
                 () -> dpm.setSecondaryLockscreenEnabled(admin1, true));
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))).isFalse();
 
         // Caller is Profile Owner, but is not the default configured supervision app.
         when(mServiceContext.resources
@@ -4417,22 +4572,23 @@
                 .thenReturn(admin2.flattenToString());
         assertExpectException(SecurityException.class, "is not the default supervision component",
                 () -> dpm.setSecondaryLockscreenEnabled(admin1, true));
-        assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE)));
+        assertThat(dpm.isSecondaryLockscreenEnabled(UserHandle.of(CALLER_USER_HANDLE))).isFalse();
     }
 
+    @Test
     public void testIsDeviceManaged() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
 
         // The device owner itself, any uid holding MANAGE_USERS permission and the system can
         // find out that the device has a device owner.
-        assertTrue(dpm.isDeviceManaged());
+        assertThat(dpm.isDeviceManaged()).isTrue();
         mContext.binder.callingUid = 1234567;
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertTrue(dpm.isDeviceManaged());
+        assertThat(dpm.isDeviceManaged()).isTrue();
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
         mContext.binder.clearCallingIdentity();
-        assertTrue(dpm.isDeviceManaged());
+        assertThat(dpm.isDeviceManaged()).isTrue();
 
         clearDeviceOwner();
 
@@ -4440,12 +4596,13 @@
         // not have a device owner.
         mContext.binder.callingUid = 1234567;
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertFalse(dpm.isDeviceManaged());
+        assertThat(dpm.isDeviceManaged()).isFalse();
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
         mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDeviceManaged());
+        assertThat(dpm.isDeviceManaged()).isFalse();
     }
 
+    @Test
     public void testDeviceOwnerOrganizationName() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4453,23 +4610,24 @@
         dpm.setOrganizationName(admin1, "organization");
 
         // Device owner can retrieve organization managing the device.
-        assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
+        assertThat(dpm.getDeviceOwnerOrganizationName()).isEqualTo("organization");
 
         // Any uid holding MANAGE_USERS permission can retrieve organization managing the device.
         mContext.binder.callingUid = 1234567;
         mContext.callerPermissions.add(permission.MANAGE_USERS);
-        assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
+        assertThat(dpm.getDeviceOwnerOrganizationName()).isEqualTo("organization");
         mContext.callerPermissions.remove(permission.MANAGE_USERS);
 
         // System can retrieve organization managing the device.
         mContext.binder.clearCallingIdentity();
-        assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
+        assertThat(dpm.getDeviceOwnerOrganizationName()).isEqualTo("organization");
 
         // Removing the device owner clears the organization managing the device.
         clearDeviceOwner();
-        assertNull(dpm.getDeviceOwnerOrganizationName());
+        assertThat(dpm.getDeviceOwnerOrganizationName()).isNull();
     }
 
+    @Test
     public void testWipeDataManagedProfile() throws Exception {
         final int MANAGED_PROFILE_USER_ID = 15;
         final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
@@ -4489,6 +4647,7 @@
                 MANAGED_PROFILE_USER_ID);
     }
 
+    @Test
     public void testWipeDataManagedProfileDisallowed() throws Exception {
         final int MANAGED_PROFILE_USER_ID = 15;
         final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
@@ -4512,6 +4671,7 @@
                 () -> dpm.wipeData(0));
     }
 
+    @Test
     public void testWipeDataDeviceOwner() throws Exception {
         setDeviceOwner();
         when(getServices().userManager.getUserRestrictionSource(
@@ -4527,6 +4687,7 @@
                 /*wipeEuicc=*/ eq(false));
     }
 
+    @Test
     public void testWipeEuiccDataEnabled() throws Exception {
         setDeviceOwner();
         when(getServices().userManager.getUserRestrictionSource(
@@ -4542,6 +4703,7 @@
                 /*wipeEuicc=*/ eq(true));
     }
 
+    @Test
     public void testWipeDataDeviceOwnerDisallowed() throws Exception {
         setDeviceOwner();
         when(getServices().userManager.getUserRestrictionSource(
@@ -4556,6 +4718,7 @@
                 () -> dpm.wipeData(0));
     }
 
+    @Test
     public void testMaximumFailedPasswordAttemptsReachedManagedProfile() throws Exception {
         final int MANAGED_PROFILE_USER_ID = 15;
         final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
@@ -4588,6 +4751,7 @@
         verifyZeroInteractions(getServices().recoverySystem);
     }
 
+    @Test
     public void testMaximumFailedPasswordAttemptsReachedManagedProfileDisallowed()
             throws Exception {
         final int MANAGED_PROFILE_USER_ID = 15;
@@ -4621,6 +4785,7 @@
         verifyZeroInteractions(getServices().recoverySystem);
     }
 
+    @Test
     public void testMaximumFailedPasswordAttemptsReachedDeviceOwner() throws Exception {
         setDeviceOwner();
         when(getServices().userManager.getUserRestrictionSource(
@@ -4643,6 +4808,7 @@
                 /*wipeEuicc=*/ eq(false));
     }
 
+    @Test
     public void testMaximumFailedPasswordAttemptsReachedDeviceOwnerDisallowed() throws Exception {
         setDeviceOwner();
         when(getServices().userManager.getUserRestrictionSource(
@@ -4664,6 +4830,7 @@
                 .removeUserEvenWhenDisallowed(anyInt());
     }
 
+    @Test
     public void testMaximumFailedDevicePasswordAttemptsReachedOrgOwnedManagedProfile()
             throws Exception {
         final int MANAGED_PROFILE_USER_ID = 15;
@@ -4679,16 +4846,16 @@
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
         dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
 
-        assertEquals(3, dpm.getMaximumFailedPasswordsForWipe(admin1));
-        assertEquals(3, dpm.getMaximumFailedPasswordsForWipe(null));
+        assertThat(dpm.getMaximumFailedPasswordsForWipe(admin1)).isEqualTo(3);
+        assertThat(dpm.getMaximumFailedPasswordsForWipe(null)).isEqualTo(3);
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
         mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
 
-        assertEquals(3, dpm.getMaximumFailedPasswordsForWipe(null, UserHandle.USER_SYSTEM));
+        assertThat(dpm.getMaximumFailedPasswordsForWipe(null, UserHandle.USER_SYSTEM)).isEqualTo(3);
         // Check that primary will be wiped as a result of failed primary user unlock attempts.
-        assertEquals(UserHandle.USER_SYSTEM,
-                dpm.getProfileWithMinimumFailedPasswordsForWipe(UserHandle.USER_SYSTEM));
+        assertThat(dpm.getProfileWithMinimumFailedPasswordsForWipe(UserHandle.USER_SYSTEM))
+                .isEqualTo(UserHandle.USER_SYSTEM);
 
         // Failed password attempts on the parent user are taken into account, as there isn't a
         // separate work challenge.
@@ -4702,6 +4869,7 @@
                 /*wipeEuicc=*/ eq(false));
     }
 
+    @Test
     public void testMaximumFailedProfilePasswordAttemptsReachedOrgOwnedManagedProfile()
             throws Exception {
         final int MANAGED_PROFILE_USER_ID = 15;
@@ -4724,14 +4892,15 @@
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
         mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
 
-        assertEquals(0, dpm.getMaximumFailedPasswordsForWipe(null, UserHandle.USER_SYSTEM));
-        assertEquals(3, dpm.getMaximumFailedPasswordsForWipe(null, MANAGED_PROFILE_USER_ID));
+        assertThat(dpm.getMaximumFailedPasswordsForWipe(null, UserHandle.USER_SYSTEM)).isEqualTo(0);
+        assertThat(dpm.getMaximumFailedPasswordsForWipe(null, MANAGED_PROFILE_USER_ID))
+                .isEqualTo(3);
         // Check that the policy is not affecting primary profile challenge.
-        assertEquals(UserHandle.USER_NULL,
-                dpm.getProfileWithMinimumFailedPasswordsForWipe(UserHandle.USER_SYSTEM));
+        assertThat(dpm.getProfileWithMinimumFailedPasswordsForWipe(UserHandle.USER_SYSTEM))
+                .isEqualTo(UserHandle.USER_NULL);
         // Check that primary will be wiped as a result of failed profile unlock attempts.
-        assertEquals(UserHandle.USER_SYSTEM,
-                dpm.getProfileWithMinimumFailedPasswordsForWipe(MANAGED_PROFILE_USER_ID));
+        assertThat(dpm.getProfileWithMinimumFailedPasswordsForWipe(MANAGED_PROFILE_USER_ID))
+                .isEqualTo(UserHandle.USER_SYSTEM);
 
         // Simulate three failed attempts at solving the separate challenge.
         dpm.reportFailedPasswordAttempt(MANAGED_PROFILE_USER_ID);
@@ -4744,6 +4913,7 @@
                 /*wipeEuicc=*/ eq(false));
     }
 
+    @Test
     public void testGetPermissionGrantState() throws Exception {
         final String permission = "some.permission";
         final String app1 = "com.example.app1";
@@ -4766,10 +4936,10 @@
         // System can retrieve permission grant state.
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
         mContext.packageName = "android";
-        assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED,
-                dpm.getPermissionGrantState(null, app1, permission));
-        assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT,
-                dpm.getPermissionGrantState(null, app2, permission));
+        assertThat(dpm.getPermissionGrantState(null, app1, permission))
+                .isEqualTo(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+        assertThat(dpm.getPermissionGrantState(null, app2, permission))
+                .isEqualTo(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
 
         // A regular app cannot retrieve permission grant state.
         mContext.binder.callingUid = setupPackageInPackageManager(app1, 1);
@@ -4781,12 +4951,13 @@
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         mContext.packageName = admin1.getPackageName();
         setAsProfileOwner(admin1);
-        assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED,
-                dpm.getPermissionGrantState(admin1, app1, permission));
-        assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT,
-                dpm.getPermissionGrantState(admin1, app2, permission));
+        assertThat(dpm.getPermissionGrantState(admin1, app1, permission))
+                .isEqualTo(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
+        assertThat(dpm.getPermissionGrantState(admin1, app2, permission))
+                .isEqualTo(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT);
     }
 
+    @Test
     public void testResetPasswordWithToken() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         setupDeviceOwner();
@@ -4801,27 +4972,26 @@
         when(getServices().lockPatternUtils.addEscrowToken(eq(token), eq(UserHandle.USER_SYSTEM),
                 nullable(EscrowTokenStateChangeCallback.class)))
                 .thenReturn(handle);
-        assertTrue(dpm.setResetPasswordToken(admin1, token));
+        assertThat(dpm.setResetPasswordToken(admin1, token)).isTrue();
 
         // test password activation
-        when(getServices().lockPatternUtils.isEscrowTokenActive(eq(handle), eq(UserHandle.USER_SYSTEM)))
-            .thenReturn(true);
-        assertTrue(dpm.isResetPasswordTokenActive(admin1));
+        when(getServices().lockPatternUtils.isEscrowTokenActive(handle, UserHandle.USER_SYSTEM))
+                .thenReturn(true);
+        assertThat(dpm.isResetPasswordTokenActive(admin1)).isTrue();
 
         // test reset password with token
         when(getServices().lockPatternUtils.setLockCredentialWithToken(
-                eq(LockscreenCredential.createPassword(password)),
-                eq(handle), eq(token),
-                eq(UserHandle.USER_SYSTEM)))
-                .thenReturn(true);
-        assertTrue(dpm.resetPasswordWithToken(admin1, password, token, 0));
+                LockscreenCredential.createPassword(password), handle, token,
+                UserHandle.USER_SYSTEM)).thenReturn(true);
+        assertThat(dpm.resetPasswordWithToken(admin1, password, token, 0)).isTrue();
 
         // test removing a token
-        when(getServices().lockPatternUtils.removeEscrowToken(eq(handle), eq(UserHandle.USER_SYSTEM)))
+        when(getServices().lockPatternUtils.removeEscrowToken(handle, UserHandle.USER_SYSTEM))
                 .thenReturn(true);
-        assertTrue(dpm.clearResetPasswordToken(admin1));
+        assertThat(dpm.clearResetPasswordToken(admin1)).isTrue();
     }
 
+    @Test
     public void testIsActivePasswordSufficient() throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
         mContext.packageName = admin1.getPackageName();
@@ -4841,11 +5011,11 @@
         PasswordMetrics passwordMetricsNoSymbols = computeForPassword("abcdXYZ5".getBytes());
 
         setActivePasswordState(passwordMetricsNoSymbols);
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isTrue();
 
         initializeDpms();
         reset(mContext.spiedContext);
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isTrue();
 
         // This call simulates the user entering the password for the first time after a reboot.
         // This causes password metrics to be reloaded into memory.  Until this happens,
@@ -4854,23 +5024,24 @@
         // requirements.  This is a known limitation of the current implementation of
         // isActivePasswordSufficient() - see b/34218769.
         setActivePasswordState(passwordMetricsNoSymbols);
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isTrue();
 
         dpm.setPasswordMinimumSymbols(admin1, 1);
         // This assertion would fail if we had not called setActivePasswordState() again after
         // initializeDpms() - see previous comment.
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isFalse();
 
         initializeDpms();
         reset(mContext.spiedContext);
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isFalse();
 
         PasswordMetrics passwordMetricsWithSymbols = computeForPassword("abcd.XY5".getBytes());
 
         setActivePasswordState(passwordMetricsWithSymbols);
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isTrue();
     }
 
+    @Test
     public void testIsActivePasswordSufficient_noLockScreen() throws Exception {
         // If there is no lock screen, the password is considered empty no matter what, because
         // it provides no security.
@@ -4885,7 +5056,7 @@
                 .thenReturn(new PasswordMetrics(CREDENTIAL_TYPE_NONE));
 
         // If no password requirements are set, isActivePasswordSufficient should succeed.
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isTrue();
 
         // Now set some password quality requirements.
         dpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
@@ -4900,9 +5071,10 @@
                 MockUtils.checkUserHandle(userHandle));
 
         // The active (nonexistent) password doesn't comply with the requirements.
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertThat(dpm.isActivePasswordSufficient()).isFalse();
     }
 
+    @Test
     public void testIsPasswordSufficientAfterProfileUnification() throws Exception {
         final int managedProfileUserId = CALLER_USER_HANDLE;
         final int managedProfileAdminUid =
@@ -4921,13 +5093,13 @@
 
         // Numeric password is compliant with current requirement (QUALITY_NUMERIC set explicitly
         // on the parent admin)
-        assertTrue(dpm.isPasswordSufficientAfterProfileUnification(UserHandle.USER_SYSTEM,
-                UserHandle.USER_NULL));
+        assertThat(dpm.isPasswordSufficientAfterProfileUnification(UserHandle.USER_SYSTEM,
+        UserHandle.USER_NULL)).isTrue();
         // Numeric password is not compliant if profile is to be unified: the profile has a
         // QUALITY_ALPHABETIC policy on itself which will be enforced on the password after
         // unification.
-        assertFalse(dpm.isPasswordSufficientAfterProfileUnification(UserHandle.USER_SYSTEM,
-                managedProfileUserId));
+        assertThat(dpm.isPasswordSufficientAfterProfileUnification(UserHandle.USER_SYSTEM,
+        managedProfileUserId)).isFalse();
     }
 
     private void setActivePasswordState(PasswordMetrics passwordMetrics)
@@ -4961,6 +5133,7 @@
         mContext.binder.restoreCallingIdentity(ident);
     }
 
+    @Test
     public void testIsCurrentInputMethodSetByOwnerForDeviceOwner() throws Exception {
         final String currentIme = Settings.Secure.DEFAULT_INPUT_METHOD;
         final Uri currentImeUri = Settings.Secure.getUriFor(currentIme);
@@ -4976,70 +5149,71 @@
 
         // First and second user set IMEs manually.
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Device owner changes IME for first user.
         mContext.binder.callingUid = deviceOwnerUid;
-        when(getServices().settings.settingsSecureGetStringForUser(currentIme, UserHandle.USER_SYSTEM))
-                .thenReturn("ime1");
+        when(getServices().settings.settingsSecureGetStringForUser(currentIme,
+                UserHandle.USER_SYSTEM)).thenReturn("ime1");
         dpm.setSecureSetting(admin1, currentIme, "ime2");
         verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime2",
                 UserHandle.USER_SYSTEM);
         reset(getServices().settings);
         dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Second user changes IME manually.
         dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // First user changes IME manually.
         dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Device owner changes IME for first user again.
         mContext.binder.callingUid = deviceOwnerUid;
-        when(getServices().settings.settingsSecureGetStringForUser(currentIme, UserHandle.USER_SYSTEM))
-                .thenReturn("ime2");
+        when(getServices().settings.settingsSecureGetStringForUser(currentIme,
+                UserHandle.USER_SYSTEM)).thenReturn("ime2");
         dpm.setSecureSetting(admin1, currentIme, "ime3");
         verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime3",
                 UserHandle.USER_SYSTEM);
         dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Restarting the DPMS should not lose information.
         initializeDpms();
         mContext.binder.callingUid = firstUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Device owner can find out whether it set the current IME itself.
         mContext.binder.callingUid = deviceOwnerUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
 
         // Removing the device owner should clear the information that it set the current IME.
         clearDeviceOwner();
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
     }
 
+    @Test
     public void testIsCurrentInputMethodSetByOwnerForProfileOwner() throws Exception {
         final String currentIme = Settings.Secure.DEFAULT_INPUT_METHOD;
         final Uri currentImeUri = Settings.Secure.getUriFor(currentIme);
@@ -5055,9 +5229,9 @@
 
         // First and second user set IMEs manually.
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Profile owner changes IME for second user.
         mContext.binder.callingUid = profileOwnerUid;
@@ -5069,23 +5243,23 @@
         reset(getServices().settings);
         dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
 
         // First user changes IME manually.
         dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
 
         // Second user changes IME manually.
         dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
 
         // Profile owner changes IME for second user again.
         mContext.binder.callingUid = profileOwnerUid;
@@ -5096,29 +5270,30 @@
                 CALLER_USER_HANDLE);
         dpms.notifyChangeToContentObserver(currentImeUri, CALLER_USER_HANDLE);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
 
         // Restarting the DPMS should not lose information.
         initializeDpms();
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
 
         // Profile owner can find out whether it set the current IME itself.
         mContext.binder.callingUid = profileOwnerUid;
-        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isTrue();
 
         // Removing the profile owner should clear the information that it set the current IME.
         dpm.clearProfileOwner(admin1);
         mContext.binder.callingUid = firstUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
         mContext.binder.callingUid = secondUserSystemUid;
-        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        assertThat(dpm.isCurrentInputMethodSetByOwner()).isFalse();
     }
 
+    @Test
     public void testSetPermittedCrossProfileNotificationListeners_unavailableForDo()
             throws Exception {
         // Set up a device owner.
@@ -5127,6 +5302,7 @@
         assertSetPermittedCrossProfileNotificationListenersUnavailable(mContext.binder.callingUid);
     }
 
+    @Test
     public void testSetPermittedCrossProfileNotificationListeners_unavailableForPoOnUser()
             throws Exception {
         // Set up a profile owner.
@@ -5141,23 +5317,24 @@
         final int userId = UserHandle.getUserId(adminUid);
 
         final String packageName = "some.package";
-        assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
-                admin1, Collections.singletonList(packageName)));
-        assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(
+        admin1, Collections.singletonList(packageName))).isFalse();
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1)).isNull();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
+        assertThat(dpms.isNotificationListenerServicePermitted(packageName, userId)).isTrue();
 
         // Attempt to set to empty list (which means no listener is allowlisted)
         mContext.binder.callingUid = adminUid;
-        assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
-                admin1, Collections.emptyList()));
-        assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(
+                admin1, Collections.emptyList())).isFalse();
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1)).isNull();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
+        assertThat(dpms.isNotificationListenerServicePermitted(packageName, userId)).isTrue();
     }
 
+    @Test
     public void testIsNotificationListenerServicePermitted_onlySystemCanCall() throws Exception {
         // Set up a managed profile
         final int MANAGED_PROFILE_USER_ID = 15;
@@ -5171,8 +5348,8 @@
                 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
                 /*appId=*/ 12345, /*flags=*/ 0);
 
-        assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
-                admin1, Collections.singletonList(permittedListener)));
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(
+        admin1, Collections.singletonList(permittedListener))).isTrue();
 
         // isNotificationListenerServicePermitted should throw if not called from System.
         assertExpectException(SecurityException.class, /* messageRegex= */ null,
@@ -5180,10 +5357,11 @@
                         permittedListener, MANAGED_PROFILE_USER_ID));
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                permittedListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        permittedListener, MANAGED_PROFILE_USER_ID)).isTrue();
     }
 
+    @Test
     public void testSetPermittedCrossProfileNotificationListeners_managedProfile()
             throws Exception {
         // Set up a managed profile
@@ -5212,63 +5390,64 @@
                 ++appId, ApplicationInfo.FLAG_SYSTEM);
 
         // By default all packages are allowed
-        assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1)).isNull();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                permittedListener, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                notPermittedListener, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        permittedListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        notPermittedListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, MANAGED_PROFILE_USER_ID)).isTrue();
 
         // Setting only one package in the allowlist
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
-        assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
-                admin1, Collections.singletonList(permittedListener)));
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(
+        admin1, Collections.singletonList(permittedListener))).isTrue();
         final List<String> permittedListeners =
                 dpms.getPermittedCrossProfileNotificationListeners(admin1);
-        assertEquals(1, permittedListeners.size());
-        assertEquals(permittedListener, permittedListeners.get(0));
+        assertThat(permittedListeners.size()).isEqualTo(1);
+        assertThat(permittedListeners.get(0)).isEqualTo(permittedListener);
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                permittedListener, MANAGED_PROFILE_USER_ID));
-        assertFalse(dpms.isNotificationListenerServicePermitted(
-                notPermittedListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        permittedListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        notPermittedListener, MANAGED_PROFILE_USER_ID)).isFalse();
         // System packages are always allowed (even if not in the allowlist)
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, MANAGED_PROFILE_USER_ID)).isTrue();
 
         // Setting an empty allowlist - only system listeners allowed
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
-        assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
-                admin1, Collections.emptyList()));
-        assertEquals(0, dpms.getPermittedCrossProfileNotificationListeners(admin1).size());
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(
+                admin1, Collections.emptyList())).isTrue();
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1).size()).isEqualTo(0);
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertFalse(dpms.isNotificationListenerServicePermitted(
-                permittedListener, MANAGED_PROFILE_USER_ID));
-        assertFalse(dpms.isNotificationListenerServicePermitted(
-                notPermittedListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        permittedListener, MANAGED_PROFILE_USER_ID)).isFalse();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        notPermittedListener, MANAGED_PROFILE_USER_ID)).isFalse();
         // System packages are always allowed (even if not in the allowlist)
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, MANAGED_PROFILE_USER_ID)).isTrue();
 
         // Setting a null allowlist - all listeners allowed
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
-        assertTrue(dpms.setPermittedCrossProfileNotificationListeners(admin1, null));
-        assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(admin1, null)).isTrue();
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1)).isNull();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                permittedListener, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                notPermittedListener, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, MANAGED_PROFILE_USER_ID));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        permittedListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        notPermittedListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, MANAGED_PROFILE_USER_ID)).isTrue();
     }
 
+    @Test
     public void testSetPermittedCrossProfileNotificationListeners_doesNotAffectPrimaryProfile()
             throws Exception {
         // Set up a managed profile
@@ -5291,36 +5470,37 @@
                 ++appId, ApplicationInfo.FLAG_SYSTEM);
 
         // By default all packages are allowed (for all profiles)
-        assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1)).isNull();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                nonSystemPackage, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                nonSystemPackage, UserHandle.USER_SYSTEM));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, UserHandle.USER_SYSTEM));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        nonSystemPackage, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        nonSystemPackage, UserHandle.USER_SYSTEM)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, UserHandle.USER_SYSTEM)).isTrue();
 
         // Setting an empty allowlist - only system listeners allowed in managed profile, but
         // all allowed in primary profile
         mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
-        assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
-                admin1, Collections.emptyList()));
-        assertEquals(0, dpms.getPermittedCrossProfileNotificationListeners(admin1).size());
+        assertThat(dpms.setPermittedCrossProfileNotificationListeners(
+                admin1, Collections.emptyList())).isTrue();
+        assertThat(dpms.getPermittedCrossProfileNotificationListeners(admin1).size()).isEqualTo(0);
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertFalse(dpms.isNotificationListenerServicePermitted(
-                nonSystemPackage, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, MANAGED_PROFILE_USER_ID));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                nonSystemPackage, UserHandle.USER_SYSTEM));
-        assertTrue(dpms.isNotificationListenerServicePermitted(
-                systemListener, UserHandle.USER_SYSTEM));
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        nonSystemPackage, MANAGED_PROFILE_USER_ID)).isFalse();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, MANAGED_PROFILE_USER_ID)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        nonSystemPackage, UserHandle.USER_SYSTEM)).isTrue();
+        assertThat(dpms.isNotificationListenerServicePermitted(
+        systemListener, UserHandle.USER_SYSTEM)).isTrue();
     }
 
+    @Test
     public void testGetOwnerInstalledCaCertsForDeviceOwner() throws Exception {
         mServiceContext.packageName = mRealTestContext.getPackageName();
         mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
@@ -5330,6 +5510,7 @@
         verifyCanGetOwnerInstalledCaCerts(admin1, mAdmin1Context);
     }
 
+    @Test
     public void testGetOwnerInstalledCaCertsForProfileOwner() throws Exception {
         mServiceContext.packageName = mRealTestContext.getPackageName();
         mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
@@ -5340,6 +5521,7 @@
         verifyCantGetOwnerInstalledCaCertsProfileOwnerRemoval(admin1, mAdmin1Context);
     }
 
+    @Test
     public void testGetOwnerInstalledCaCertsForDelegate() throws Exception {
         mServiceContext.packageName = mRealTestContext.getPackageName();
         mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
@@ -5359,6 +5541,7 @@
         verifyCantGetOwnerInstalledCaCertsProfileOwnerRemoval(null, caller);
     }
 
+    @Test
     public void testDisallowSharingIntoProfileSetRestriction() {
         when(mServiceContext.resources.getString(R.string.config_managed_provisioning_package))
                 .thenReturn("com.android.managedprovisioning");
@@ -5371,6 +5554,7 @@
         verifyDataSharingChangedBroadcast();
     }
 
+    @Test
     public void testDisallowSharingIntoProfileClearRestriction() {
         when(mServiceContext.resources.getString(R.string.config_managed_provisioning_package))
                 .thenReturn("com.android.managedprovisioning");
@@ -5383,6 +5567,7 @@
         verifyDataSharingChangedBroadcast();
     }
 
+    @Test
     public void testDisallowSharingIntoProfileUnchanged() {
         RestrictionsListener listener = new RestrictionsListener(mContext);
         listener.onUserRestrictionsChanged(CALLER_USER_HANDLE, new Bundle(), new Bundle());
@@ -5399,6 +5584,7 @@
                 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
     }
 
+    @Test
     public void testOverrideApnAPIsFailWithPO() throws Exception {
         setupProfileOwner();
         ApnSetting apn = (new ApnSetting.Builder())
@@ -5446,13 +5632,14 @@
         runAsCaller(callerContext, dpms, (dpm) -> {
             when(getServices().keyChainConnection.getService().installCaCertificate(caCert))
                         .thenReturn(alias);
-            assertTrue(dpm.installCaCert(caller, caCert));
+            assertThat(dpm.installCaCert(caller, caCert)).isTrue();
             when(getServices().keyChainConnection.getService().getUserCaAliases())
                     .thenReturn(asSlice(new String[] {alias}));
         });
 
-        getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
-                .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
+        getServices().injectBroadcast(mServiceContext,
+                new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
+                        .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
                 callerUser.getIdentifier());
         flushTasks(dpms);
 
@@ -5461,25 +5648,27 @@
         // Device Owner / Profile Owner can find out which CA certs were installed by itself.
         runAsCaller(admin1Context, dpms, (dpm) -> {
             final List<String> installedCaCerts = dpm.getOwnerInstalledCaCerts(callerUser);
-            assertEquals(Collections.singletonList(alias), installedCaCerts);
+            assertThat(installedCaCerts).isEqualTo(Collections.singletonList(alias));
             ownerInstalledCaCerts.addAll(installedCaCerts);
         });
 
         // Restarting the DPMS should not lose information.
         initializeDpms();
-        runAsCaller(admin1Context, dpms, (dpm) ->
-                assertEquals(ownerInstalledCaCerts, dpm.getOwnerInstalledCaCerts(callerUser)));
+        runAsCaller(admin1Context, dpms,
+                (dpm) -> assertThat(dpm.getOwnerInstalledCaCerts(callerUser))
+                        .isEqualTo(ownerInstalledCaCerts));
 
         // System can find out which CA certs were installed by the Device Owner / Profile Owner.
         runAsCaller(serviceContext, dpms, (dpm) -> {
-            assertEquals(ownerInstalledCaCerts, dpm.getOwnerInstalledCaCerts(callerUser));
+            assertThat(dpm.getOwnerInstalledCaCerts(callerUser)).isEqualTo(ownerInstalledCaCerts);
 
             // Remove the CA cert.
             reset(getServices().keyChainConnection.getService());
         });
 
-        getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
-                .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
+        getServices().injectBroadcast(mServiceContext,
+                new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
+                        .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
                 callerUser.getIdentifier());
         flushTasks(dpms);
 
@@ -5516,14 +5705,15 @@
         runAsCaller(callerContext, dpms, (dpm) -> {
             when(getServices().keyChainConnection.getService().installCaCertificate(caCert))
                     .thenReturn(alias);
-            assertTrue(dpm.installCaCert(callerName, caCert));
+            assertThat(dpm.installCaCert(callerName, caCert)).isTrue();
         });
 
         // Fake the CA cert as having been installed
         when(getServices().keyChainConnection.getService().getUserCaAliases())
                 .thenReturn(asSlice(new String[] {alias}));
-        getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
-                .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
+        getServices().injectBroadcast(mServiceContext,
+                new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
+                        .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
                 callerUser.getIdentifier());
         flushTasks(dpms);
 
@@ -5532,8 +5722,8 @@
 
         runAsCaller(serviceContext, dpms, (dpm) -> {
             final List<String> ownerInstalledCaCerts = dpm.getOwnerInstalledCaCerts(callerUser);
-            assertNotNull(ownerInstalledCaCerts);
-            assertTrue(ownerInstalledCaCerts.isEmpty());
+            assertThat(ownerInstalledCaCerts).isNotNull();
+            assertThat(ownerInstalledCaCerts.isEmpty()).isTrue();
         });
     }
 
@@ -5541,9 +5731,10 @@
         int[] gotFlags = DevicePolicyManagerService.translateIdAttestationFlags(attestationFlags);
         Arrays.sort(gotFlags);
         Arrays.sort(expectedFlags);
-        assertTrue(Arrays.equals(expectedFlags, gotFlags));
+        assertThat(Arrays.equals(expectedFlags, gotFlags)).isTrue();
     }
 
+    @Test
     public void testTranslationOfIdAttestationFlag() {
         int[] allIdTypes = new int[]{ID_TYPE_SERIAL, ID_TYPE_IMEI, ID_TYPE_MEID};
         int[] correspondingAttUtilsTypes = new int[]{
@@ -5551,7 +5742,7 @@
             AttestationUtils.ID_TYPE_MEID};
 
         // Test translation of zero flags
-        assertNull(DevicePolicyManagerService.translateIdAttestationFlags(0));
+        assertThat(DevicePolicyManagerService.translateIdAttestationFlags(0)).isNull();
 
         // Test translation of the ID_TYPE_BASE_INFO flag, which should yield an empty, but
         // non-null array
@@ -5578,39 +5769,41 @@
                     AttestationUtils.ID_TYPE_MEID});
     }
 
+    @Test
     public void testRevertDeviceOwnership_noMetadataFile() throws Exception {
         setDeviceOwner();
         initializeDpms();
-        assertFalse(getMockTransferMetadataManager().metadataFileExists());
-        assertTrue(dpms.isDeviceOwner(admin1, UserHandle.USER_SYSTEM));
-        assertTrue(dpms.isAdminActive(admin1, UserHandle.USER_SYSTEM));
+        assertThat(getMockTransferMetadataManager().metadataFileExists()).isFalse();
+        assertThat(dpms.isDeviceOwner(admin1, UserHandle.USER_SYSTEM)).isTrue();
+        assertThat(dpms.isAdminActive(admin1, UserHandle.USER_SYSTEM)).isTrue();
     }
 
-    // @FlakyTest(bugId = 148934649)
-    // public void testRevertDeviceOwnership_adminAndDeviceMigrated() throws Exception {
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
-    //             getDeviceOwnerPoliciesFile());
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_migrated),
-    //             getDeviceOwnerFile());
-    //     assertDeviceOwnershipRevertedWithFakeTransferMetadata();
-    // }
+    @FlakyTest(bugId = 148934649)
+    @Test
+    public void testRevertDeviceOwnership_adminAndDeviceMigrated() throws Exception {
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
+                getDeviceOwnerPoliciesFile());
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_migrated),
+                getDeviceOwnerFile());
+        assertDeviceOwnershipRevertedWithFakeTransferMetadata();
+    }
 
-    // @FlakyTest(bugId = 148934649)
-    // public void testRevertDeviceOwnership_deviceNotMigrated()
-    //         throws Exception {
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
-    //             getDeviceOwnerPoliciesFile());
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_not_migrated),
-    //             getDeviceOwnerFile());
-    //     assertDeviceOwnershipRevertedWithFakeTransferMetadata();
-    // }
+    @FlakyTest(bugId = 148934649)
+    @Test
+    public void testRevertDeviceOwnership_deviceNotMigrated() throws Exception {
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
+                getDeviceOwnerPoliciesFile());
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_not_migrated),
+                getDeviceOwnerFile());
+        assertDeviceOwnershipRevertedWithFakeTransferMetadata();
+    }
 
-    public void testRevertDeviceOwnership_adminAndDeviceNotMigrated()
-            throws Exception {
+    @Test
+    public void testRevertDeviceOwnership_adminAndDeviceNotMigrated() throws Exception {
         DpmTestUtils.writeInputStreamToFile(
                 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_not_migrated),
                 getDeviceOwnerPoliciesFile());
@@ -5620,40 +5813,44 @@
         assertDeviceOwnershipRevertedWithFakeTransferMetadata();
     }
 
+    @Test
     public void testRevertProfileOwnership_noMetadataFile() throws Exception {
         setupProfileOwner();
         initializeDpms();
-        assertFalse(getMockTransferMetadataManager().metadataFileExists());
-        assertTrue(dpms.isProfileOwner(admin1, CALLER_USER_HANDLE));
-        assertTrue(dpms.isAdminActive(admin1, CALLER_USER_HANDLE));
+        assertThat(getMockTransferMetadataManager().metadataFileExists()).isFalse();
+        assertThat(dpms.isProfileOwner(admin1, CALLER_USER_HANDLE)).isTrue();
+        assertThat(dpms.isAdminActive(admin1, CALLER_USER_HANDLE)).isTrue();
     }
 
-    // @FlakyTest(bugId = 148934649)
-    // public void testRevertProfileOwnership_adminAndProfileMigrated() throws Exception {
-    //     getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0,
-    //             UserManager.USER_TYPE_PROFILE_MANAGED, UserHandle.USER_SYSTEM);
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
-    //             getProfileOwnerPoliciesFile());
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_migrated),
-    //             getProfileOwnerFile());
-    //     assertProfileOwnershipRevertedWithFakeTransferMetadata();
-    // }
+    @FlakyTest(bugId = 148934649)
+    @Test
+    public void testRevertProfileOwnership_adminAndProfileMigrated() throws Exception {
+        getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0,
+                UserManager.USER_TYPE_PROFILE_MANAGED, UserHandle.USER_SYSTEM);
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
+                getProfileOwnerPoliciesFile());
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_migrated),
+                getProfileOwnerFile());
+        assertProfileOwnershipRevertedWithFakeTransferMetadata();
+    }
 
-    // @FlakyTest(bugId = 148934649)
-    // public void testRevertProfileOwnership_profileNotMigrated() throws Exception {
-    //     getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0,
-    //             UserManager.USER_TYPE_PROFILE_MANAGED, UserHandle.USER_SYSTEM);
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
-    //             getProfileOwnerPoliciesFile());
-    //     DpmTestUtils.writeInputStreamToFile(
-    //             getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_not_migrated),
-    //             getProfileOwnerFile());
-    //     assertProfileOwnershipRevertedWithFakeTransferMetadata();
-    // }
+    @FlakyTest(bugId = 148934649)
+    @Test
+    public void testRevertProfileOwnership_profileNotMigrated() throws Exception {
+        getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0,
+                UserManager.USER_TYPE_PROFILE_MANAGED, UserHandle.USER_SYSTEM);
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
+                getProfileOwnerPoliciesFile());
+        DpmTestUtils.writeInputStreamToFile(
+                getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_not_migrated),
+                getProfileOwnerFile());
+        assertProfileOwnershipRevertedWithFakeTransferMetadata();
+    }
 
+    @Test
     public void testRevertProfileOwnership_adminAndProfileNotMigrated() throws Exception {
         getServices().addUser(CALLER_USER_HANDLE, 0,
                 UserManager.USER_TYPE_PROFILE_MANAGED, UserHandle.USER_SYSTEM);
@@ -5666,6 +5863,7 @@
         assertProfileOwnershipRevertedWithFakeTransferMetadata();
     }
 
+    @Test
     public void testGrantDeviceIdsAccess_notToProfileOwner() throws Exception {
         setupProfileOwner();
         configureContextForAccess(mContext, false);
@@ -5674,6 +5872,7 @@
                 () -> dpm.markProfileOwnerOnOrganizationOwnedDevice(admin2));
     }
 
+    @Test
     public void testGrantDeviceIdsAccess_notByAuthorizedCaller() throws Exception {
         setupProfileOwner();
         configureContextForAccess(mContext, false);
@@ -5682,6 +5881,7 @@
                 () -> dpm.markProfileOwnerOnOrganizationOwnedDevice(admin1));
     }
 
+    @Test
     public void testGrantDeviceIdsAccess_byAuthorizedSystemCaller() throws Exception {
         setupProfileOwner();
 
@@ -5700,6 +5900,7 @@
                 .thenReturn(UserHandle.SYSTEM);
     }
 
+    @Test
     public void testGrantDeviceIdsAccess_byAuthorizedManagedProvisioning() throws Exception {
         setupProfileOwner();
 
@@ -5719,6 +5920,7 @@
         }
     }
 
+    @Test
     public void testEnforceCallerCanRequestDeviceIdAttestation_deviceOwnerCaller()
             throws Exception {
         mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
@@ -5741,6 +5943,7 @@
                         dpms.getCallerIdentity(admin2)));
     }
 
+    @Test
     public void testEnforceCallerCanRequestDeviceIdAttestation_profileOwnerCaller()
             throws Exception {
         configureContextForAccess(mContext, false);
@@ -5781,6 +5984,7 @@
         }
     }
 
+    @Test
     public void testEnforceCallerCanRequestDeviceIdAttestation_delegateCaller() throws Exception {
         setupProfileOwner();
         markDelegatedCertInstallerAsInstalled();
@@ -5800,6 +6004,7 @@
                 dpms.getCallerIdentity(null, DpmMockContext.DELEGATE_PACKAGE_NAME)));
     }
 
+    @Test
     public void testEnforceCallerCanRequestDeviceIdAttestation_delegateCallerWithoutPermissions()
             throws Exception {
         setupProfileOwner();
@@ -5821,6 +6026,7 @@
         });
     }
 
+    @Test
     public void testGetPasswordComplexity_securityExceptionNotThrownForParentInstance() {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn(
@@ -5830,9 +6036,10 @@
 
         parentDpm.getPasswordComplexity();
 
-        assertEquals(PASSWORD_COMPLEXITY_NONE, dpm.getPasswordComplexity());
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_NONE);
     }
 
+    @Test
     public void testGetPasswordComplexity_illegalStateExceptionIfLocked() {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn(
@@ -5841,6 +6048,7 @@
         assertThrows(IllegalStateException.class, () -> dpm.getPasswordComplexity());
     }
 
+    @Test
     public void testGetPasswordComplexity_securityExceptionWithoutPermissions() {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn(
@@ -5850,6 +6058,7 @@
     }
 
 
+    @Test
     public void testGetPasswordComplexity_currentUserNoPassword() {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn(
@@ -5859,9 +6068,10 @@
         when(getServices().userManager.getCredentialOwnerProfile(CALLER_USER_HANDLE))
                 .thenReturn(CALLER_USER_HANDLE);
 
-        assertEquals(PASSWORD_COMPLEXITY_NONE, dpm.getPasswordComplexity());
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_NONE);
     }
 
+    @Test
     public void testGetPasswordComplexity_currentUserHasPassword() {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn(
@@ -5874,9 +6084,10 @@
                 .getUserPasswordMetrics(CALLER_USER_HANDLE))
                 .thenReturn(computeForPassword("asdf".getBytes()));
 
-        assertEquals(PASSWORD_COMPLEXITY_MEDIUM, dpm.getPasswordComplexity());
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_MEDIUM);
     }
 
+    @Test
     public void testGetPasswordComplexity_unifiedChallengeReturnsParentUserPassword() {
         mContext.binder.callingUid = DpmMockContext.CALLER_UID;
         when(getServices().packageManager.getPackagesForUid(DpmMockContext.CALLER_UID)).thenReturn(
@@ -5896,23 +6107,25 @@
                 .getUserPasswordMetrics(parentUser.id))
                 .thenReturn(computeForPassword("parentUser".getBytes()));
 
-        assertEquals(PASSWORD_COMPLEXITY_HIGH, dpm.getPasswordComplexity());
+        assertThat(dpm.getPasswordComplexity()).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
     }
 
+    @Test
     public void testCrossProfileCalendarPackages_initiallyEmpty() {
         setAsProfileOwner(admin1);
         final Set<String> packages = dpm.getCrossProfileCalendarPackages(admin1);
         assertCrossProfileCalendarPackagesEqual(packages, Collections.emptySet());
     }
 
+    @Test
     public void testCrossProfileCalendarPackages_reopenDpms() {
         setAsProfileOwner(admin1);
         dpm.setCrossProfileCalendarPackages(admin1, null);
         Set<String> packages = dpm.getCrossProfileCalendarPackages(admin1);
-        assertTrue(packages == null);
+        assertThat(packages == null).isTrue();
         initializeDpms();
         packages = dpm.getCrossProfileCalendarPackages(admin1);
-        assertTrue(packages == null);
+        assertThat(packages == null).isTrue();
 
         dpm.setCrossProfileCalendarPackages(admin1, Collections.emptySet());
         packages = dpm.getCrossProfileCalendarPackages(admin1);
@@ -5932,21 +6145,22 @@
     }
 
     private void assertCrossProfileCalendarPackagesEqual(Set<String> expected, Set<String> actual) {
-        assertTrue(expected != null);
-        assertTrue(actual != null);
-        assertTrue(expected.containsAll(actual));
-        assertTrue(actual.containsAll(expected));
+        assertThat(expected).isNotNull();
+        assertThat(actual).isNotNull();
+        assertThat(actual).containsExactlyElementsIn(expected);
     }
 
+    @Test
     public void testIsPackageAllowedToAccessCalendar_adminNotAllowed() {
         setAsProfileOwner(admin1);
         dpm.setCrossProfileCalendarPackages(admin1, Collections.emptySet());
         when(getServices().settings.settingsSecureGetIntForUser(
                 Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED,
                 0, CALLER_USER_HANDLE)).thenReturn(1);
-        assertFalse(dpm.isPackageAllowedToAccessCalendar("TEST_PACKAGE"));
+        assertThat(dpm.isPackageAllowedToAccessCalendar("TEST_PACKAGE")).isFalse();
     }
 
+    @Test
     public void testIsPackageAllowedToAccessCalendar_settingOff() {
         final String testPackage = "TEST_PACKAGE";
         setAsProfileOwner(admin1);
@@ -5954,9 +6168,10 @@
         when(getServices().settings.settingsSecureGetIntForUser(
                 Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED,
                 0, CALLER_USER_HANDLE)).thenReturn(0);
-        assertFalse(dpm.isPackageAllowedToAccessCalendar(testPackage));
+        assertThat(dpm.isPackageAllowedToAccessCalendar(testPackage)).isFalse();
     }
 
+    @Test
     public void testIsPackageAllowedToAccessCalendar_bothAllowed() {
         final String testPackage = "TEST_PACKAGE";
         setAsProfileOwner(admin1);
@@ -5964,9 +6179,10 @@
         when(getServices().settings.settingsSecureGetIntForUser(
                 Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED,
                 0, CALLER_USER_HANDLE)).thenReturn(1);
-        assertTrue(dpm.isPackageAllowedToAccessCalendar(testPackage));
+        assertThat(dpm.isPackageAllowedToAccessCalendar(testPackage)).isTrue();
     }
 
+    @Test
     public void testSetUserControlDisabledPackages_asDO() throws Exception {
         final List<String> testPackages = new ArrayList<>();
         testPackages.add("package_1");
@@ -5979,9 +6195,10 @@
 
         verify(getServices().packageManagerInternal).setDeviceOwnerProtectedPackages(testPackages);
 
-        assertEquals(testPackages, dpm.getUserControlDisabledPackages(admin1));
+        assertThat(dpm.getUserControlDisabledPackages(admin1)).isEqualTo(testPackages);
     }
 
+    @Test
     public void testSetUserControlDisabledPackages_failingAsPO() throws Exception {
         final List<String> testPackages = new ArrayList<>();
         testPackages.add("package_1");
@@ -6008,28 +6225,32 @@
         mServiceContext.binder.restoreCallingIdentity(ident);
     }
 
+    @Test
     public void testGetCrossProfilePackages_notSet_returnsEmpty() {
         setAsProfileOwner(admin1);
-        assertTrue(dpm.getCrossProfilePackages(admin1).isEmpty());
+        assertThat(dpm.getCrossProfilePackages(admin1).isEmpty()).isTrue();
     }
 
+    @Test
     public void testGetCrossProfilePackages_notSet_dpmsReinitialized_returnsEmpty() {
         setAsProfileOwner(admin1);
 
         initializeDpms();
 
-        assertTrue(dpm.getCrossProfilePackages(admin1).isEmpty());
+        assertThat(dpm.getCrossProfilePackages(admin1).isEmpty()).isTrue();
     }
 
+    @Test
     public void testGetCrossProfilePackages_whenSet_returnsEqual() {
         setAsProfileOwner(admin1);
         Set<String> packages = Collections.singleton("TEST_PACKAGE");
 
         dpm.setCrossProfilePackages(admin1, packages);
 
-        assertEquals(packages, dpm.getCrossProfilePackages(admin1));
+        assertThat(dpm.getCrossProfilePackages(admin1)).isEqualTo(packages);
     }
 
+    @Test
     public void testGetCrossProfilePackages_whenSet_dpmsReinitialized_returnsEqual() {
         setAsProfileOwner(admin1);
         Set<String> packages = Collections.singleton("TEST_PACKAGE");
@@ -6037,9 +6258,10 @@
         dpm.setCrossProfilePackages(admin1, packages);
         initializeDpms();
 
-        assertEquals(packages, dpm.getCrossProfilePackages(admin1));
+        assertThat(dpm.getCrossProfilePackages(admin1)).isEqualTo(packages);
     }
 
+    @Test
     public void testGetAllCrossProfilePackages_notSet_returnsEmpty() throws Exception {
         addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1);
         mContext.packageName = admin1.getPackageName();
@@ -6047,9 +6269,10 @@
         setCrossProfileAppsList();
         setVendorCrossProfileAppsList();
 
-        assertTrue(dpm.getAllCrossProfilePackages().isEmpty());
+        assertThat(dpm.getAllCrossProfilePackages().isEmpty()).isTrue();
     }
 
+    @Test
     public void testGetAllCrossProfilePackages_notSet_dpmsReinitialized_returnsEmpty()
             throws Exception {
         addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1);
@@ -6059,9 +6282,10 @@
         setVendorCrossProfileAppsList();
         initializeDpms();
 
-        assertTrue(dpm.getAllCrossProfilePackages().isEmpty());
+        assertThat(dpm.getAllCrossProfilePackages().isEmpty()).isTrue();
     }
 
+    @Test
     public void testGetAllCrossProfilePackages_whenSet_returnsCombinedSet() throws Exception {
         addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1);
         final Set<String> packages = Sets.newSet("TEST_PACKAGE", "TEST_COMMON_PACKAGE");
@@ -6071,13 +6295,12 @@
         setCrossProfileAppsList("TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE");
         setVendorCrossProfileAppsList("TEST_VENDOR_DEFAULT_PACKAGE");
 
-        assertEquals(Sets.newSet(
-                        "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE",
-                        "TEST_VENDOR_DEFAULT_PACKAGE"),
-                dpm.getAllCrossProfilePackages());
-
+        assertThat(dpm.getAllCrossProfilePackages()).containsExactly(
+                "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE",
+                "TEST_VENDOR_DEFAULT_PACKAGE");
     }
 
+    @Test
     public void testGetAllCrossProfilePackages_whenSet_dpmsReinitialized_returnsCombinedSet()
             throws Exception {
         addManagedProfile(admin1, mServiceContext.binder.callingUid, admin1);
@@ -6089,12 +6312,12 @@
         setVendorCrossProfileAppsList("TEST_VENDOR_DEFAULT_PACKAGE");
         initializeDpms();
 
-        assertEquals(Sets.newSet(
+        assertThat(dpm.getAllCrossProfilePackages()).containsExactly(
                 "TEST_PACKAGE", "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE",
-                "TEST_VENDOR_DEFAULT_PACKAGE"),
-                dpm.getAllCrossProfilePackages());
+                "TEST_VENDOR_DEFAULT_PACKAGE");
     }
 
+    @Test
     public void testGetDefaultCrossProfilePackages_noPackagesSet_returnsEmpty() {
         setCrossProfileAppsList();
         setVendorCrossProfileAppsList();
@@ -6102,27 +6325,29 @@
         assertThat(dpm.getDefaultCrossProfilePackages()).isEmpty();
     }
 
+    @Test
     public void testGetDefaultCrossProfilePackages_packagesSet_returnsCombinedSet() {
         setCrossProfileAppsList("TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE");
         setVendorCrossProfileAppsList("TEST_VENDOR_DEFAULT_PACKAGE");
 
-        assertThat(dpm.getDefaultCrossProfilePackages()).isEqualTo(Sets.newSet(
-                "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE", "TEST_VENDOR_DEFAULT_PACKAGE"
-        ));
+        assertThat(dpm.getDefaultCrossProfilePackages()).containsExactly(
+                "TEST_DEFAULT_PACKAGE", "TEST_COMMON_PACKAGE", "TEST_VENDOR_DEFAULT_PACKAGE");
     }
 
+    @Test
     public void testSetCommonCriteriaMode_asDeviceOwner() throws Exception {
         setDeviceOwner();
 
-        assertFalse(dpm.isCommonCriteriaModeEnabled(admin1));
-        assertFalse(dpm.isCommonCriteriaModeEnabled(null));
+        assertThat(dpm.isCommonCriteriaModeEnabled(admin1)).isFalse();
+        assertThat(dpm.isCommonCriteriaModeEnabled(null)).isFalse();
 
         dpm.setCommonCriteriaModeEnabled(admin1, true);
 
-        assertTrue(dpm.isCommonCriteriaModeEnabled(admin1));
-        assertTrue(dpm.isCommonCriteriaModeEnabled(null));
+        assertThat(dpm.isCommonCriteriaModeEnabled(admin1)).isTrue();
+        assertThat(dpm.isCommonCriteriaModeEnabled(null)).isTrue();
     }
 
+    @Test
     public void testSetCommonCriteriaMode_asPoOfOrgOwnedDevice() throws Exception {
         final int managedProfileUserId = 15;
         final int managedProfileAdminUid = UserHandle.getUid(managedProfileUserId, 19436);
@@ -6130,15 +6355,16 @@
         configureProfileOwnerOfOrgOwnedDevice(admin1, managedProfileUserId);
         mContext.binder.callingUid = managedProfileAdminUid;
 
-        assertFalse(dpm.isCommonCriteriaModeEnabled(admin1));
-        assertFalse(dpm.isCommonCriteriaModeEnabled(null));
+        assertThat(dpm.isCommonCriteriaModeEnabled(admin1)).isFalse();
+        assertThat(dpm.isCommonCriteriaModeEnabled(null)).isFalse();
 
         dpm.setCommonCriteriaModeEnabled(admin1, true);
 
-        assertTrue(dpm.isCommonCriteriaModeEnabled(admin1));
-        assertTrue(dpm.isCommonCriteriaModeEnabled(null));
+        assertThat(dpm.isCommonCriteriaModeEnabled(admin1)).isTrue();
+        assertThat(dpm.isCommonCriteriaModeEnabled(null)).isTrue();
     }
 
+    @Test
     public void testCanProfileOwnerResetPasswordWhenLocked_nonDirectBootAwarePo()
             throws Exception {
         setDeviceEncryptionPerUser();
@@ -6146,30 +6372,33 @@
         setupPasswordResetToken();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertFalse("po is not direct boot aware",
-                dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE));
+        assertWithMessage("po is not direct boot aware")
+                .that(dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)).isFalse();
     }
 
+    @Test
     public void testCanProfileOwnerResetPasswordWhenLocked_noActiveToken() throws Exception {
         setDeviceEncryptionPerUser();
         setupProfileOwner();
         makeAdmin1DirectBootAware();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertFalse("po doesn't have an active password reset token",
-                dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE));
+        assertWithMessage("po doesn't have an active password reset token")
+                .that(dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)).isFalse();
     }
 
+    @Test
     public void testCanProfileOwnerResetPasswordWhenLocked_nonFbeDevice() throws Exception {
         setupProfileOwner();
         makeAdmin1DirectBootAware();
         setupPasswordResetToken();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertFalse("device is not FBE",
-                dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE));
+        assertWithMessage("device is not FBE")
+                .that(dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)).isFalse();
     }
 
+    @Test
     public void testCanProfileOwnerResetPasswordWhenLocked() throws Exception {
         setDeviceEncryptionPerUser();
         setupProfileOwner();
@@ -6177,8 +6406,8 @@
         setupPasswordResetToken();
 
         mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
-        assertTrue("direct boot aware po with active password reset token",
-                dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE));
+        assertWithMessage("direct boot aware po with active password reset token")
+                .that(dpm.canProfileOwnerResetPasswordWhenLocked(CALLER_USER_HANDLE)).isTrue();
     }
 
     private void setupPasswordResetToken() {
@@ -6196,7 +6425,8 @@
                 .isEscrowTokenActive(eq(handle), eq(CALLER_USER_HANDLE)))
                 .thenReturn(true);
 
-        assertTrue("failed to activate token", dpm.isResetPasswordTokenActive(admin1));
+        assertWithMessage("failed to activate token").that(dpm.isResetPasswordTokenActive(admin1))
+                .isTrue();
     }
 
     private void makeAdmin1DirectBootAware()
@@ -6231,6 +6461,7 @@
                 .thenReturn(packages);
     }
 
+    @Test
     public void testSetAccountTypesWithManagementDisabledOnManagedProfile() throws Exception {
         setupProfileOwner();
 
@@ -6249,6 +6480,7 @@
         assertThat(dpm.getAccountTypesWithManagementDisabled()).isEmpty();
     }
 
+    @Test
     public void testSetAccountTypesWithManagementDisabledOnOrgOwnedManagedProfile()
             throws Exception {
         final int managedProfileUserId = 15;
@@ -6284,6 +6516,7 @@
      * Tests the case when the user doesn't turn the profile on in time, verifies that the user is
      * warned with a notification and then the apps get suspended.
      */
+    @Test
     public void testMaximumProfileTimeOff_profileOffTimeExceeded() throws Exception {
         prepareMocksForSetMaximumProfileTimeOff();
 
@@ -6346,6 +6579,7 @@
     /**
      * Tests the case when the user turns the profile back on long before the deadline (> 1 day).
      */
+    @Test
     public void testMaximumProfileTimeOff_turnOnBeforeWarning() throws Exception {
         prepareMocksForSetMaximumProfileTimeOff();
 
@@ -6366,6 +6600,7 @@
     /**
      * Tests the case when the user turns the profile back on after the warning notification.
      */
+    @Test
     public void testMaximumProfileTimeOff_turnOnAfterWarning() throws Exception {
         prepareMocksForSetMaximumProfileTimeOff();
 
@@ -6395,6 +6630,7 @@
     /**
      * Tests the case when the user turns the profile back on when the apps are already suspended.
      */
+    @Test
     public void testMaximumProfileTimeOff_turnOnAfterDeadline() throws Exception {
         prepareMocksForSetMaximumProfileTimeOff();
 
@@ -6482,7 +6718,7 @@
     }
 
     private static Matcher<Notification> hasExtra(String... extras) {
-        assertEquals("Odd number of extra key-values", 0, extras.length % 2);
+        assertWithMessage("Odd number of extra key-values").that(extras.length % 2).isEqualTo(0);
         return new BaseMatcher<Notification>() {
             @Override
             public boolean matches(Object item) {
@@ -6520,17 +6756,17 @@
         // To simulate a reboot, we just reinitialize dpms and call systemReady
         initializeDpms();
 
-        assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
-        assertFalse(dpm.isDeviceOwnerApp(adminAnotherPackage.getPackageName()));
-        assertFalse(dpm.isAdminActive(adminAnotherPackage));
-        assertTrue(dpm.isAdminActive(admin1));
-        assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
+        assertThat(dpm.isDeviceOwnerApp(admin1.getPackageName())).isTrue();
+        assertThat(dpm.isDeviceOwnerApp(adminAnotherPackage.getPackageName())).isFalse();
+        assertThat(dpm.isAdminActive(adminAnotherPackage)).isFalse();
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName())).isTrue();
+        assertThat(dpm.getDeviceOwnerComponentOnCallingUser()).isEqualTo(admin1);
 
-        assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
-        assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
-        assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
-        assertFalse(getMockTransferMetadataManager().metadataFileExists());
+        assertThat(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName())).isTrue();
+        assertThat(dpm.getDeviceOwnerComponentOnAnyUser()).isEqualTo(admin1);
+        assertThat(dpm.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
+        assertThat(getMockTransferMetadataManager().metadataFileExists()).isFalse();
 
         mServiceContext.binder.restoreCallingIdentity(ident);
     }
@@ -6547,12 +6783,12 @@
         // To simulate a reboot, we just reinitialize dpms and call systemReady
         initializeDpms();
 
-        assertTrue(dpm.isProfileOwnerApp(admin1.getPackageName()));
-        assertTrue(dpm.isAdminActive(admin1));
-        assertFalse(dpm.isProfileOwnerApp(adminAnotherPackage.getPackageName()));
-        assertFalse(dpm.isAdminActive(adminAnotherPackage));
-        assertEquals(dpm.getProfileOwnerAsUser(CALLER_USER_HANDLE), admin1);
-        assertFalse(getMockTransferMetadataManager().metadataFileExists());
+        assertThat(dpm.isProfileOwnerApp(admin1.getPackageName())).isTrue();
+        assertThat(dpm.isAdminActive(admin1)).isTrue();
+        assertThat(dpm.isProfileOwnerApp(adminAnotherPackage.getPackageName())).isFalse();
+        assertThat(dpm.isAdminActive(adminAnotherPackage)).isFalse();
+        assertThat(admin1).isEqualTo(dpm.getProfileOwnerAsUser(CALLER_USER_HANDLE));
+        assertThat(getMockTransferMetadataManager().metadataFileExists()).isFalse();
     }
 
     private void writeFakeTransferMetadataFile(int callerUserHandle, String adminType) {
@@ -6597,8 +6833,8 @@
     }
 
     private void assertProvisioningAllowed(String action, boolean expected) {
-        assertEquals("isProvisioningAllowed(" + action + ") returning unexpected result", expected,
-                dpm.isProvisioningAllowed(action));
+        assertWithMessage("isProvisioningAllowed(%s) returning unexpected result", action)
+                .that(dpm.isProvisioningAllowed(action)).isEqualTo(expected);
     }
 
     private void assertProvisioningAllowed(String action, boolean expected, String packageName,
@@ -6622,9 +6858,9 @@
 
     private void assertCheckProvisioningPreCondition(
             String action, String packageName, int provisioningCondition) {
-        assertEquals("checkProvisioningPreCondition("
-                        + action + ", " + packageName + ") returning unexpected result",
-                provisioningCondition, dpm.checkProvisioningPreCondition(action, packageName));
+        assertWithMessage("checkProvisioningPreCondition(%s, %s) returning unexpected result",
+                action, packageName).that(dpm.checkProvisioningPreCondition(action, packageName))
+                        .isEqualTo(provisioningCondition);
     }
 
     /**
@@ -6642,7 +6878,7 @@
         mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
         setUpPackageManagerForFakeAdmin(admin, adminUid, copyFromAdmin);
         dpm.setActiveAdmin(admin, false, userId);
-        assertTrue(dpm.setProfileOwner(admin, null, userId));
+        assertThat(dpm.setProfileOwner(admin, null, userId)).isTrue();
         mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
index 41d54e9..81570a1 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java
@@ -16,6 +16,8 @@
 
 package com.android.server.devicepolicy;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -35,18 +37,28 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.UserHandle;
-import android.test.AndroidTestCase;
+
+import androidx.test.InstrumentationRegistry;
+
+import org.junit.Before;
 
 import java.io.InputStream;
 import java.util.List;
 
-public abstract class DpmTestBase extends AndroidTestCase {
+/**
+ * Temporary copy of DpmTestBase using JUnit 4 - once all tests extend it, it should be renamed
+ * back to DpmTestBase (with the temporary methods removed.
+ *
+ */
+public abstract class DpmTestBase {
+
     public static final String TAG = "DpmTest";
 
-    protected Context mRealTestContext;
+    protected final Context mRealTestContext = InstrumentationRegistry.getTargetContext();
     protected DpmMockContext mMockContext;
     private MockSystemServices mServices;
 
+    // Attributes below are public so they don't need to be prefixed with m
     public ComponentName admin1;
     public ComponentName admin2;
     public ComponentName admin3;
@@ -54,12 +66,8 @@
     public ComponentName adminNoPerm;
     public ComponentName delegateCertInstaller;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mRealTestContext = super.getContext();
-
+    @Before
+    public void setFixtures() throws Exception {
         mServices = new MockSystemServices(mRealTestContext, "test-data");
         mMockContext = new DpmMockContext(mServices, mRealTestContext);
 
@@ -74,8 +82,7 @@
         mockSystemPropertiesToReturnDefault();
     }
 
-    @Override
-    public DpmMockContext getContext() {
+    protected DpmMockContext getContext() {
         return mMockContext;
     }
 
@@ -136,20 +143,15 @@
         final PackageInfo pi = DpmTestUtils.cloneParcelable(
                 mRealTestContext.getPackageManager().getPackageInfo(
                         mRealTestContext.getPackageName(), 0));
-        assertTrue(pi.applicationInfo.flags != 0);
+        assertThat(pi.applicationInfo.flags).isNotEqualTo(0);
 
         if (ai != null) {
             pi.applicationInfo = ai;
         }
 
-        doReturn(pi).when(mServices.ipackageManager).getPackageInfo(
-                eq(packageName),
-                eq(0),
-                eq(userId));
+        doReturn(pi).when(mServices.ipackageManager).getPackageInfo(packageName, 0, userId);
 
-        doReturn(ai.uid).when(mServices.packageManager).getPackageUidAsUser(
-                eq(packageName),
-                eq(userId));
+        doReturn(ai.uid).when(mServices.packageManager).getPackageUidAsUser(packageName, userId);
     }
 
     protected void markDelegatedCertInstallerAsInstalled() throws Exception {
@@ -230,8 +232,8 @@
                 mRealTestContext.getPackageManager().queryBroadcastReceivers(
                         resolveIntent,
                         PackageManager.GET_META_DATA);
-        assertNotNull(realResolveInfo);
-        assertEquals(1, realResolveInfo.size());
+        assertThat(realResolveInfo).isNotNull();
+        assertThat(realResolveInfo).hasSize(1);
 
         // We need to change AI, so set a clone.
         realResolveInfo.set(0, DpmTestUtils.cloneParcelable(realResolveInfo.get(0)));
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/FactoryResetProtectionPolicyTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/FactoryResetProtectionPolicyTest.java
index e8818a3..3aa5a80 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/FactoryResetProtectionPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/FactoryResetProtectionPolicyTest.java
@@ -16,8 +16,8 @@
 
 package com.android.server.devicepolicy;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -100,7 +100,7 @@
         ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
         XmlPullParser parser = Xml.newPullParser();
         parser.setInput(new InputStreamReader(inStream));
-        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertThat(parser.next()).isEqualTo(XmlPullParser.START_TAG);
 
         assertPoliciesAreEqual(policy, policy.readFromXml(parser));
     }
@@ -114,7 +114,7 @@
         parser.setInput(new InputStreamReader(inStream));
 
         // If deserialization fails, then null is returned.
-        assertNull(policy.readFromXml(parser));
+        assertThat(policy.readFromXml(parser)).isNull();
     }
 
     private ByteArrayOutputStream serialize(FactoryResetProtectionPolicy policy)
@@ -133,17 +133,17 @@
 
     private void assertPoliciesAreEqual(FactoryResetProtectionPolicy expectedPolicy,
             FactoryResetProtectionPolicy actualPolicy) {
-        assertEquals(expectedPolicy.isFactoryResetProtectionEnabled(),
-                actualPolicy.isFactoryResetProtectionEnabled());
+        assertThat(actualPolicy.isFactoryResetProtectionEnabled())
+                .isEqualTo(expectedPolicy.isFactoryResetProtectionEnabled());
         assertAccountsAreEqual(expectedPolicy.getFactoryResetProtectionAccounts(),
                 actualPolicy.getFactoryResetProtectionAccounts());
     }
 
     private void assertAccountsAreEqual(List<String> expectedAccounts,
             List<String> actualAccounts) {
-        assertEquals(expectedAccounts.size(), actualAccounts.size());
+        assertThat(actualAccounts.size()).isEqualTo(expectedAccounts.size());
         for (int i = 0; i < expectedAccounts.size(); i++) {
-            assertEquals(expectedAccounts.get(i), actualAccounts.get(i));
+            assertThat(actualAccounts.get(i)).isEqualTo(expectedAccounts.get(i));
         }
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java
index c698312..7506dd4 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java
@@ -17,6 +17,9 @@
 
 import static com.android.server.devicepolicy.NetworkLoggingHandler.LOG_NETWORK_EVENT_MSG;
 
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.spy;
@@ -37,8 +40,9 @@
 import android.test.suitebuilder.annotation.SmallTest;
 
 import com.android.server.LocalServices;
-import com.android.server.SystemService;
 
+import org.junit.Before;
+import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
 import java.util.List;
@@ -50,9 +54,8 @@
     private DpmMockContext mSpiedDpmMockContext;
     private DevicePolicyManagerServiceTestable mDpmTestable;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
+    @Before
+    public void setUp() throws Exception {
         mSpiedDpmMockContext = spy(mMockContext);
         mSpiedDpmMockContext.callerPermissions.add(
                 android.Manifest.permission.MANAGE_DEVICE_ADMINS);
@@ -64,6 +67,7 @@
         mDpmTestable.setActiveAdmin(admin1, true, DpmMockContext.CALLER_USER_HANDLE);
     }
 
+    @Test
     public void testNetworkEventId_monotonicallyIncreasing() throws Exception {
         // GIVEN the handler has not processed any events.
         long startingId = 0;
@@ -72,17 +76,20 @@
         List<NetworkEvent> events = fillHandlerWithFullBatchOfEvents(startingId);
 
         // THEN the events are in a batch.
-        assertTrue("Batch not at the returned token.",
-                events != null && events.size() == MAX_EVENTS_PER_BATCH);
+        assertWithMessage("Batch not at the returned token.").that(events).isNotNull();
+        assertWithMessage("Batch not at the returned token.").that(events)
+                .hasSize(MAX_EVENTS_PER_BATCH);
+
         // THEN event ids are monotonically increasing.
         long expectedId = startingId;
         for (int i = 0; i < MAX_EVENTS_PER_BATCH; i++) {
-            assertEquals("At index " + i + ", the event has the wrong id.", expectedId,
-                    events.get(i).getId());
+            assertWithMessage("At index %s, the event has the wrong id.", i)
+                    .that(events.get(i).getId()).isEqualTo(expectedId);
             expectedId++;
         }
     }
 
+    @Test
     public void testNetworkEventId_wrapsAround() throws Exception {
         // GIVEN the handler has almost processed Long.MAX_VALUE events.
         int gap = 5;
@@ -92,24 +99,25 @@
         List<NetworkEvent> events = fillHandlerWithFullBatchOfEvents(startingId);
 
         // THEN the events are in a batch.
-        assertTrue("Batch not at the returned token.",
-                events != null && events.size() == MAX_EVENTS_PER_BATCH);
+        assertWithMessage("Batch not at the returned token.").that(events).isNotNull();
+        assertWithMessage("Batch not at the returned token.").that(events)
+                .hasSize(MAX_EVENTS_PER_BATCH);
         // THEN event ids are monotonically increasing.
         long expectedId = startingId;
         for (int i = 0; i < gap; i++) {
-            assertEquals("At index " + i + ", the event has the wrong id.", expectedId,
-                    events.get(i).getId());
+            assertWithMessage("At index %s, the event has the wrong id.", i)
+                    .that(events.get(i).getId()).isEqualTo(expectedId);
             expectedId++;
         }
         // THEN event ids are reset when the id reaches the maximum possible value.
-        assertEquals("Event was not assigned the maximum id value.", Long.MAX_VALUE,
-                events.get(gap).getId());
-        assertEquals("Event id was not reset.", 0, events.get(gap + 1).getId());
+        assertWithMessage("Event was not assigned the maximum id value.")
+                .that(events.get(gap).getId()).isEqualTo(Long.MAX_VALUE);
+        assertWithMessage("Event id was not reset.").that(events.get(gap + 1).getId()).isEqualTo(0);
         // THEN event ids are monotonically increasing.
         expectedId = 0;
         for (int i = gap + 1; i < MAX_EVENTS_PER_BATCH; i++) {
-            assertEquals("At index " + i + ", the event has the wrong id.", expectedId,
-                    events.get(i).getId());
+            assertWithMessage("At index %s, the event has the wrong id.", i)
+                    .that(events.get(i).getId()).isEqualTo(expectedId);
             expectedId++;
         }
     }
@@ -134,8 +142,8 @@
         ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
         verify(mSpiedDpmMockContext).sendBroadcastAsUser(intentCaptor.capture(),
                 any(UserHandle.class));
-        assertEquals(intentCaptor.getValue().getAction(),
-                DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE);
+        assertThat(DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE)
+                .isEqualTo(intentCaptor.getValue().getAction());
         long token = intentCaptor.getValue().getExtras().getLong(
                 DeviceAdminReceiver.EXTRA_NETWORK_LOGS_TOKEN, 0);
         return handler.retrieveFullLogBatch(token);
@@ -144,6 +152,7 @@
     /**
      * Test parceling and unparceling of a ConnectEvent.
      */
+    @Test
     public void testConnectEventParceling() {
         ConnectEvent event = new ConnectEvent("127.0.0.1", 80, "com.android.whateverdude", 100000);
         event.setId(5L);
@@ -152,16 +161,17 @@
         p.setDataPosition(0);
         ConnectEvent unparceledEvent = p.readParcelable(NetworkEventTest.class.getClassLoader());
         p.recycle();
-        assertEquals(event.getInetAddress(), unparceledEvent.getInetAddress());
-        assertEquals(event.getPort(), unparceledEvent.getPort());
-        assertEquals(event.getPackageName(), unparceledEvent.getPackageName());
-        assertEquals(event.getTimestamp(), unparceledEvent.getTimestamp());
-        assertEquals(event.getId(), unparceledEvent.getId());
+        assertThat(unparceledEvent.getInetAddress()).isEqualTo(event.getInetAddress());
+        assertThat(unparceledEvent.getPort()).isEqualTo(event.getPort());
+        assertThat(unparceledEvent.getPackageName()).isEqualTo(event.getPackageName());
+        assertThat(unparceledEvent.getTimestamp()).isEqualTo(event.getTimestamp());
+        assertThat(unparceledEvent.getId()).isEqualTo(event.getId());
     }
 
     /**
      * Test parceling and unparceling of a DnsEvent.
      */
+    @Test
     public void testDnsEventParceling() {
         DnsEvent event = new DnsEvent("d.android.com", new String[]{"192.168.0.1", "127.0.0.1"}, 2,
                 "com.android.whateverdude", 100000);
@@ -171,13 +181,15 @@
         p.setDataPosition(0);
         DnsEvent unparceledEvent = p.readParcelable(NetworkEventTest.class.getClassLoader());
         p.recycle();
-        assertEquals(event.getHostname(), unparceledEvent.getHostname());
-        assertEquals(event.getInetAddresses().get(0), unparceledEvent.getInetAddresses().get(0));
-        assertEquals(event.getInetAddresses().get(1), unparceledEvent.getInetAddresses().get(1));
-        assertEquals(event.getTotalResolvedAddressCount(),
-                unparceledEvent.getTotalResolvedAddressCount());
-        assertEquals(event.getPackageName(), unparceledEvent.getPackageName());
-        assertEquals(event.getTimestamp(), unparceledEvent.getTimestamp());
-        assertEquals(event.getId(), unparceledEvent.getId());
+        assertThat(unparceledEvent.getHostname()).isEqualTo(event.getHostname());
+        assertThat(unparceledEvent.getInetAddresses().get(0))
+                .isEqualTo(event.getInetAddresses().get(0));
+        assertThat(unparceledEvent.getInetAddresses().get(1))
+                .isEqualTo(event.getInetAddresses().get(1));
+        assertThat(unparceledEvent.getTotalResolvedAddressCount())
+                .isEqualTo(event.getTotalResolvedAddressCount());
+        assertThat(unparceledEvent.getPackageName()).isEqualTo(event.getPackageName());
+        assertThat(unparceledEvent.getTimestamp()).isEqualTo(event.getTimestamp());
+        assertThat(unparceledEvent.getId()).isEqualTo(event.getId());
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
index a3cc915..24e226a 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OverlayPackagesProviderTest.java
@@ -20,6 +20,9 @@
 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER;
 
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.when;
 
@@ -32,16 +35,17 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.content.res.Resources;
-import android.test.AndroidTestCase;
 import android.test.mock.MockPackageManager;
 import android.view.inputmethod.InputMethodInfo;
 
 import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.R;
 
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -51,18 +55,23 @@
 import java.util.List;
 import java.util.Set;
 
-public class OverlayPackagesProviderTest extends AndroidTestCase {
+/**
+ * Run this test with:
+ *
+ * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.OwnersTest}
+ *
+ */
+@RunWith(AndroidJUnit4.class)
+public class OverlayPackagesProviderTest {
     private static final String TEST_DPC_PACKAGE_NAME = "dpc.package.name";
     private static final ComponentName TEST_MDM_COMPONENT_NAME = new ComponentName(
             TEST_DPC_PACKAGE_NAME, "pc.package.name.DeviceAdmin");
     private static final int TEST_USER_ID = 123;
 
-    private @Mock
-    Resources mResources;
-    @Mock
-    private OverlayPackagesProvider.Injector mInjector;
-    private @Mock
-    Context mTestContext;
+    private @Mock Resources mResources;
+
+    private @Mock OverlayPackagesProvider.Injector mInjector;
+    private @Mock Context mTestContext;
     private Resources mRealResources;
 
     private FakePackageManager mPackageManager;
@@ -256,12 +265,12 @@
         ArrayList<String> required = getStringArrayInRealResources(requiredId);
         ArrayList<String> disallowed = getStringArrayInRealResources(disallowedId);
         required.retainAll(disallowed);
-        assertTrue(required.isEmpty());
+        assertThat(required.isEmpty()).isTrue();
     }
 
     private void verifyAppsAreNonRequired(String action, String... appArray) {
-        assertEquals(setFromArray(appArray),
-                mHelper.getNonRequiredApps(TEST_MDM_COMPONENT_NAME, TEST_USER_ID, action));
+        assertThat(mHelper.getNonRequiredApps(TEST_MDM_COMPONENT_NAME, TEST_USER_ID, action))
+                .containsExactlyElementsIn(setFromArray(appArray));
     }
 
     private void setRequiredAppsManagedDevice(String... apps) {
@@ -348,19 +357,19 @@
     class FakePackageManager extends MockPackageManager {
         @Override
         public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
-            assertTrue("Expected an intent with action ACTION_MAIN",
-                    Intent.ACTION_MAIN.equals(intent.getAction()));
-            assertEquals("Expected an intent with category CATEGORY_LAUNCHER",
-                    setFromArray(Intent.CATEGORY_LAUNCHER), intent.getCategories());
-            assertTrue("Expected the flag MATCH_UNINSTALLED_PACKAGES",
-                    (flags & PackageManager.MATCH_UNINSTALLED_PACKAGES) != 0);
-            assertTrue("Expected the flag MATCH_DISABLED_COMPONENTS",
-                    (flags & PackageManager.MATCH_DISABLED_COMPONENTS) != 0);
-            assertTrue("Expected the flag MATCH_DIRECT_BOOT_AWARE",
-                    (flags & PackageManager.MATCH_DIRECT_BOOT_AWARE) != 0);
-            assertTrue("Expected the flag MATCH_DIRECT_BOOT_UNAWARE",
-                    (flags & PackageManager.MATCH_DIRECT_BOOT_UNAWARE) != 0);
-            assertEquals(userId, TEST_USER_ID);
+            assertWithMessage("Expected an intent with action ACTION_MAIN")
+                    .that(Intent.ACTION_MAIN.equals(intent.getAction())).isTrue();
+            assertWithMessage("Expected an intent with category CATEGORY_LAUNCHER")
+                    .that(intent.getCategories()).containsExactly(Intent.CATEGORY_LAUNCHER);
+            assertWithMessage("Expected the flag MATCH_UNINSTALLED_PACKAGES")
+                    .that((flags & PackageManager.MATCH_UNINSTALLED_PACKAGES)).isNotEqualTo(0);
+            assertWithMessage("Expected the flag MATCH_DISABLED_COMPONENTS")
+                    .that((flags & PackageManager.MATCH_DISABLED_COMPONENTS)).isNotEqualTo(0);
+            assertWithMessage("Expected the flag MATCH_DIRECT_BOOT_AWARE")
+                    .that((flags & PackageManager.MATCH_DIRECT_BOOT_AWARE)).isNotEqualTo(0);
+            assertWithMessage("Expected the flag MATCH_DIRECT_BOOT_UNAWARE")
+                    .that((flags & PackageManager.MATCH_DIRECT_BOOT_UNAWARE)).isNotEqualTo(0);
+            assertThat(TEST_USER_ID).isEqualTo(userId);
             List<ResolveInfo> result = new ArrayList<>();
             if (mSystemAppsWithLauncher == null) {
                 return result;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
index 5899bb0..bfe183c 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/OwnersTest.java
@@ -16,25 +16,32 @@
 
 package com.android.server.devicepolicy;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import android.content.ComponentName;
 import android.os.UserHandle;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import androidx.test.runner.AndroidJUnit4;
+
 import com.android.server.devicepolicy.DevicePolicyManagerServiceTestable.OwnersTestable;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 /**
  * Tests for the DeviceOwner object that saves & loads device and policy owner information.
- * run this test with:
- m FrameworksServicesTests &&
- adb install \
-   -r out/target/product/hammerhead/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
- adb shell am instrument -e class com.android.server.devicepolicy.OwnersTest \
-   -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
-
- (mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
+ *
+ * <p>Run this test with:
+ *
+ * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.OwnersTest}
+ *
  */
 @SmallTest
+@RunWith(AndroidJUnit4.class)
 public class OwnersTest extends DpmTestBase {
+
+    @Test
     public void testUpgrade01() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -48,26 +55,26 @@
             owners.load();
 
             // The legacy file should be removed.
-            assertFalse(owners.getLegacyConfigFile().exists());
+            assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
             // File was empty, so no new files should be created.
-            assertFalse(owners.getDeviceOwnerFile().exists());
+            assertThat(owners.getDeviceOwnerFile().exists()).isFalse();
 
-            assertFalse(owners.getProfileOwnerFile(10).exists());
-            assertFalse(owners.getProfileOwnerFile(11).exists());
-            assertFalse(owners.getProfileOwnerFile(20).exists());
-            assertFalse(owners.getProfileOwnerFile(21).exists());
+            assertThat(owners.getProfileOwnerFile(10).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(11).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(20).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(21).exists()).isFalse();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
-            assertNull(owners.getSystemUpdatePolicy());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
 
         // Then re-read and check.
@@ -75,19 +82,20 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
-            assertNull(owners.getSystemUpdatePolicy());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
     }
 
+    @Test
     public void testUpgrade02() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -101,28 +109,28 @@
             owners.load();
 
             // The legacy file should be removed.
-            assertFalse(owners.getLegacyConfigFile().exists());
+            assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
-            assertTrue(owners.getDeviceOwnerFile().exists()); // TODO Check content
+            assertThat(owners.getDeviceOwnerFile().exists()).isTrue(); // TODO Check content
 
-            assertFalse(owners.getProfileOwnerFile(10).exists());
-            assertFalse(owners.getProfileOwnerFile(11).exists());
-            assertFalse(owners.getProfileOwnerFile(20).exists());
-            assertFalse(owners.getProfileOwnerFile(21).exists());
+            assertThat(owners.getProfileOwnerFile(10).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(11).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(20).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(21).exists()).isFalse();
 
-            assertTrue(owners.hasDeviceOwner());
-            assertEquals(null, owners.getDeviceOwnerName());
-            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
-            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
+            assertThat(owners.hasDeviceOwner()).isTrue();
+            assertThat(owners.getDeviceOwnerName()).isEqualTo(null);
+            assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc");
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
 
-            assertNull(owners.getSystemUpdatePolicy());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
 
         // Then re-read and check.
@@ -130,22 +138,23 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertTrue(owners.hasDeviceOwner());
-            assertEquals(null, owners.getDeviceOwnerName());
-            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
-            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
+            assertThat(owners.hasDeviceOwner()).isTrue();
+            assertThat(owners.getDeviceOwnerName()).isEqualTo(null);
+            assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc");
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
 
-            assertNull(owners.getSystemUpdatePolicy());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
     }
 
+    @Test
     public void testUpgrade03() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -159,36 +168,36 @@
             owners.load();
 
             // The legacy file should be removed.
-            assertFalse(owners.getLegacyConfigFile().exists());
+            assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
-            assertFalse(owners.getDeviceOwnerFile().exists());
+            assertThat(owners.getDeviceOwnerFile().exists()).isFalse();
 
-            assertTrue(owners.getProfileOwnerFile(10).exists());
-            assertTrue(owners.getProfileOwnerFile(11).exists());
-            assertFalse(owners.getProfileOwnerFile(20).exists());
-            assertFalse(owners.getProfileOwnerFile(21).exists());
+            assertThat(owners.getProfileOwnerFile(10).exists()).isTrue();
+            assertThat(owners.getProfileOwnerFile(11).exists()).isTrue();
+            assertThat(owners.getProfileOwnerFile(20).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(21).exists()).isFalse();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
-            assertNull(owners.getSystemUpdatePolicy());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
 
-            assertEquals(2, owners.getProfileOwnerKeys().size());
-            assertEquals(new ComponentName("com.google.android.testdpc",
-                            "com.google.android.testdpc.DeviceAdminReceiver0"),
-                    owners.getProfileOwnerComponent(10));
-            assertEquals("0", owners.getProfileOwnerName(10));
-            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
+            assertThat(owners.getProfileOwnerKeys()).hasSize(2);
+            assertThat(owners.getProfileOwnerComponent(10))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc",
+                            "com.google.android.testdpc.DeviceAdminReceiver0"));
+            assertThat(owners.getProfileOwnerName(10)).isEqualTo("0");
+            assertThat(owners.getProfileOwnerPackage(10)).isEqualTo("com.google.android.testdpc");
 
-            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
-                    owners.getProfileOwnerComponent(11));
-            assertEquals("1", owners.getProfileOwnerName(11));
-            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
+            assertThat(owners.getProfileOwnerComponent(11))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc1", ""));
+            assertThat(owners.getProfileOwnerName(11)).isEqualTo("1");
+            assertThat(owners.getProfileOwnerPackage(11)).isEqualTo("com.google.android.testdpc1");
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
 
         // Then re-read and check.
@@ -196,27 +205,27 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
-            assertNull(owners.getSystemUpdatePolicy());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
 
-            assertEquals(2, owners.getProfileOwnerKeys().size());
-            assertEquals(new ComponentName("com.google.android.testdpc",
-                            "com.google.android.testdpc.DeviceAdminReceiver0"),
-                    owners.getProfileOwnerComponent(10));
-            assertEquals("0", owners.getProfileOwnerName(10));
-            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
+            assertThat(owners.getProfileOwnerKeys()).hasSize(2);
+            assertThat(owners.getProfileOwnerComponent(10))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc",
+                            "com.google.android.testdpc.DeviceAdminReceiver0"));
+            assertThat(owners.getProfileOwnerName(10)).isEqualTo("0");
+            assertThat(owners.getProfileOwnerPackage(10)).isEqualTo("com.google.android.testdpc");
 
-            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
-                    owners.getProfileOwnerComponent(11));
-            assertEquals("1", owners.getProfileOwnerName(11));
-            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
+            assertThat(owners.getProfileOwnerComponent(11))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc1", ""));
+            assertThat(owners.getProfileOwnerName(11)).isEqualTo("1");
+            assertThat(owners.getProfileOwnerPackage(11)).isEqualTo("com.google.android.testdpc1");
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
     }
 
@@ -224,6 +233,7 @@
      * Note this also tests {@link Owners#setDeviceOwnerUserRestrictionsMigrated()}
      * and {@link  Owners#setProfileOwnerUserRestrictionsMigrated(int)}.
      */
+    @Test
     public void testUpgrade04() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -237,40 +247,40 @@
             owners.load();
 
             // The legacy file should be removed.
-            assertFalse(owners.getLegacyConfigFile().exists());
+            assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
-            assertTrue(owners.getDeviceOwnerFile().exists());
+            assertThat(owners.getDeviceOwnerFile().exists()).isTrue();
 
-            assertTrue(owners.getProfileOwnerFile(10).exists());
-            assertTrue(owners.getProfileOwnerFile(11).exists());
-            assertFalse(owners.getProfileOwnerFile(20).exists());
-            assertFalse(owners.getProfileOwnerFile(21).exists());
+            assertThat(owners.getProfileOwnerFile(10).exists()).isTrue();
+            assertThat(owners.getProfileOwnerFile(11).exists()).isTrue();
+            assertThat(owners.getProfileOwnerFile(20).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(21).exists()).isFalse();
 
-            assertTrue(owners.hasDeviceOwner());
-            assertEquals(null, owners.getDeviceOwnerName());
-            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
-            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
+            assertThat(owners.hasDeviceOwner()).isTrue();
+            assertThat(owners.getDeviceOwnerName()).isEqualTo(null);
+            assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc");
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
 
-            assertNotNull(owners.getSystemUpdatePolicy());
-            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
+            assertThat(owners.getSystemUpdatePolicy()).isNotNull();
+            assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5);
 
-            assertEquals(2, owners.getProfileOwnerKeys().size());
-            assertEquals(new ComponentName("com.google.android.testdpc",
-                            "com.google.android.testdpc.DeviceAdminReceiver0"),
-                    owners.getProfileOwnerComponent(10));
-            assertEquals("0", owners.getProfileOwnerName(10));
-            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
+            assertThat(owners.getProfileOwnerKeys()).hasSize(2);
+            assertThat(owners.getProfileOwnerComponent(10))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc",
+                            "com.google.android.testdpc.DeviceAdminReceiver0"));
+            assertThat(owners.getProfileOwnerName(10)).isEqualTo("0");
+            assertThat(owners.getProfileOwnerPackage(10)).isEqualTo("com.google.android.testdpc");
 
-            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
-                    owners.getProfileOwnerComponent(11));
-            assertEquals("1", owners.getProfileOwnerName(11));
-            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
+            assertThat(owners.getProfileOwnerComponent(11))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc1", ""));
+            assertThat(owners.getProfileOwnerName(11)).isEqualTo("1");
+            assertThat(owners.getProfileOwnerPackage(11)).isEqualTo("com.google.android.testdpc1");
 
-            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
 
         // Then re-read and check.
@@ -278,31 +288,31 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertTrue(owners.hasDeviceOwner());
-            assertEquals(null, owners.getDeviceOwnerName());
-            assertEquals("com.google.android.testdpc", owners.getDeviceOwnerPackageName());
-            assertEquals(UserHandle.USER_SYSTEM, owners.getDeviceOwnerUserId());
+            assertThat(owners.hasDeviceOwner()).isTrue();
+            assertThat(owners.getDeviceOwnerName()).isEqualTo(null);
+            assertThat(owners.getDeviceOwnerPackageName()).isEqualTo("com.google.android.testdpc");
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_SYSTEM);
 
-            assertNotNull(owners.getSystemUpdatePolicy());
-            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
+            assertThat(owners.getSystemUpdatePolicy()).isNotNull();
+            assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5);
 
-            assertEquals(2, owners.getProfileOwnerKeys().size());
-            assertEquals(new ComponentName("com.google.android.testdpc",
-                            "com.google.android.testdpc.DeviceAdminReceiver0"),
-                    owners.getProfileOwnerComponent(10));
-            assertEquals("0", owners.getProfileOwnerName(10));
-            assertEquals("com.google.android.testdpc", owners.getProfileOwnerPackage(10));
+            assertThat(owners.getProfileOwnerKeys()).hasSize(2);
+            assertThat(owners.getProfileOwnerComponent(10))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc",
+                            "com.google.android.testdpc.DeviceAdminReceiver0"));
+            assertThat(owners.getProfileOwnerName(10)).isEqualTo("0");
+            assertThat(owners.getProfileOwnerPackage(10)).isEqualTo("com.google.android.testdpc");
 
-            assertEquals(new ComponentName("com.google.android.testdpc1", ""),
-                    owners.getProfileOwnerComponent(11));
-            assertEquals("1", owners.getProfileOwnerName(11));
-            assertEquals("com.google.android.testdpc1", owners.getProfileOwnerPackage(11));
+            assertThat(owners.getProfileOwnerComponent(11))
+                    .isEqualTo(new ComponentName("com.google.android.testdpc1", ""));
+            assertThat(owners.getProfileOwnerName(11)).isEqualTo("1");
+            assertThat(owners.getProfileOwnerPackage(11)).isEqualTo("com.google.android.testdpc1");
 
-            assertTrue(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
 
             owners.setDeviceOwnerUserRestrictionsMigrated();
         }
@@ -311,11 +321,11 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
 
             owners.setProfileOwnerUserRestrictionsMigrated(11);
         }
@@ -324,16 +334,17 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertTrue(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isTrue();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
 
             owners.setProfileOwnerUserRestrictionsMigrated(11);
         }
     }
 
+    @Test
     public void testUpgrade05() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -347,27 +358,27 @@
             owners.load();
 
             // The legacy file should be removed.
-            assertFalse(owners.getLegacyConfigFile().exists());
+            assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
             // Note device initializer is no longer supported.  No need to write the DO file.
-            assertFalse(owners.getDeviceOwnerFile().exists());
+            assertThat(owners.getDeviceOwnerFile().exists()).isFalse();
 
-            assertFalse(owners.getProfileOwnerFile(10).exists());
-            assertFalse(owners.getProfileOwnerFile(11).exists());
-            assertFalse(owners.getProfileOwnerFile(20).exists());
+            assertThat(owners.getProfileOwnerFile(10).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(11).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(20).exists()).isFalse();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
 
 
-            assertNull(owners.getSystemUpdatePolicy());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
 
         // Then re-read and check.
@@ -375,21 +386,22 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
 
 
-            assertNull(owners.getSystemUpdatePolicy());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.getSystemUpdatePolicy()).isNull();
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
     }
 
+    @Test
     public void testUpgrade06() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -403,26 +415,26 @@
             owners.load();
 
             // The legacy file should be removed.
-            assertFalse(owners.getLegacyConfigFile().exists());
+            assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
-            assertTrue(owners.getDeviceOwnerFile().exists());
+            assertThat(owners.getDeviceOwnerFile().exists()).isTrue();
 
-            assertFalse(owners.getProfileOwnerFile(10).exists());
-            assertFalse(owners.getProfileOwnerFile(11).exists());
-            assertFalse(owners.getProfileOwnerFile(20).exists());
+            assertThat(owners.getProfileOwnerFile(10).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(11).exists()).isFalse();
+            assertThat(owners.getProfileOwnerFile(20).exists()).isFalse();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertNotNull(owners.getSystemUpdatePolicy());
-            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
+            assertThat(owners.getSystemUpdatePolicy()).isNotNull();
+            assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5);
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
 
         // Then re-read and check.
@@ -430,21 +442,22 @@
             final OwnersTestable owners = new OwnersTestable(getServices());
             owners.load();
 
-            assertFalse(owners.hasDeviceOwner());
-            assertEquals(UserHandle.USER_NULL, owners.getDeviceOwnerUserId());
-            assertEquals(0, owners.getProfileOwnerKeys().size());
+            assertThat(owners.hasDeviceOwner()).isFalse();
+            assertThat(owners.getDeviceOwnerUserId()).isEqualTo(UserHandle.USER_NULL);
+            assertThat(owners.getProfileOwnerKeys()).isEmpty();
 
-            assertNotNull(owners.getSystemUpdatePolicy());
-            assertEquals(5, owners.getSystemUpdatePolicy().getPolicyType());
+            assertThat(owners.getSystemUpdatePolicy()).isNotNull();
+            assertThat(owners.getSystemUpdatePolicy().getPolicyType()).isEqualTo(5);
 
-            assertFalse(owners.getDeviceOwnerUserRestrictionsNeedsMigration());
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(10));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(11));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(20));
-            assertFalse(owners.getProfileOwnerUserRestrictionsNeedsMigration(21));
+            assertThat(owners.getDeviceOwnerUserRestrictionsNeedsMigration()).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(10)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(11)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(20)).isFalse();
+            assertThat(owners.getProfileOwnerUserRestrictionsNeedsMigration(21)).isFalse();
         }
     }
 
+    @Test
     public void testRemoveExistingFiles() throws Exception {
         getServices().addUsers(10, 11, 20, 21);
 
@@ -456,11 +469,11 @@
 
         owners.load();
 
-        assertFalse(owners.getLegacyConfigFile().exists());
+        assertThat(owners.getLegacyConfigFile().exists()).isFalse();
 
-        assertTrue(owners.getDeviceOwnerFile().exists());
-        assertTrue(owners.getProfileOwnerFile(10).exists());
-        assertTrue(owners.getProfileOwnerFile(11).exists());
+        assertThat(owners.getDeviceOwnerFile().exists()).isTrue();
+        assertThat(owners.getProfileOwnerFile(10).exists()).isTrue();
+        assertThat(owners.getProfileOwnerFile(11).exists()).isTrue();
 
         // Then clear all information and save.
         owners.clearDeviceOwner();
@@ -475,8 +488,8 @@
         owners.writeProfileOwner(21);
 
         // Now all files should be removed.
-        assertFalse(owners.getDeviceOwnerFile().exists());
-        assertFalse(owners.getProfileOwnerFile(10).exists());
-        assertFalse(owners.getProfileOwnerFile(11).exists());
+        assertThat(owners.getDeviceOwnerFile().exists()).isFalse();
+        assertThat(owners.getProfileOwnerFile(10).exists()).isFalse();
+        assertThat(owners.getProfileOwnerFile(11).exists()).isFalse();
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/SecurityEventTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/SecurityEventTest.java
index 8dcf21f..6cefaeb 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/SecurityEventTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/SecurityEventTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2020 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.server.devicepolicy;
 
 import static android.app.admin.SecurityLog.TAG_ADB_SHELL_CMD;
@@ -11,6 +26,8 @@
 import static android.app.admin.SecurityLog.TAG_MEDIA_MOUNT;
 import static android.app.admin.SecurityLog.TAG_MEDIA_UNMOUNT;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import android.app.admin.SecurityLog.SecurityEvent;
 import android.os.Parcel;
 import android.os.UserHandle;
@@ -18,21 +35,37 @@
 import android.util.EventLog;
 import android.util.EventLog.Event;
 
+import androidx.test.runner.AndroidJUnit4;
+
 import junit.framework.AssertionFailedError;
 
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * Tests for the DeviceOwner object that saves & loads device and policy owner information.
+ *
+ * <p>Run this test with:
+ *
+ * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.SecurityEventTest}
+ *
+ */
+@RunWith(AndroidJUnit4.class)
 public class SecurityEventTest extends DpmTestBase {
 
+    @Test
     public void testSecurityEventId() throws Exception {
         SecurityEvent event = createEvent(() -> {
             EventLog.writeEvent(TAG_ADB_SHELL_CMD, 0);
         }, TAG_ADB_SHELL_CMD);
         event.setId(20);
-        assertEquals(20, event.getId());
+        assertThat(event.getId()).isEqualTo(20);
     }
 
+    @Test
     public void testSecurityEventParceling() throws Exception {
         // GIVEN an event.
         SecurityEvent event = createEvent(() -> {
@@ -45,12 +78,13 @@
         SecurityEvent unparceledEvent = p.readParcelable(SecurityEventTest.class.getClassLoader());
         p.recycle();
         // THEN the event state is preserved.
-        assertEquals(event.getTag(), unparceledEvent.getTag());
-        assertEquals(event.getData(), unparceledEvent.getData());
-        assertEquals(event.getTimeNanos(), unparceledEvent.getTimeNanos());
-        assertEquals(event.getId(), unparceledEvent.getId());
+        assertThat(unparceledEvent.getTag()).isEqualTo(event.getTag());
+        assertThat(unparceledEvent.getData()).isEqualTo(event.getData());
+        assertThat(unparceledEvent.getTimeNanos()).isEqualTo(event.getTimeNanos());
+        assertThat(unparceledEvent.getId()).isEqualTo(event.getId());
     }
 
+    @Test
     public void testSecurityEventRedaction() throws Exception {
         SecurityEvent event;
 
@@ -58,75 +92,75 @@
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_ADB_SHELL_CMD, "command");
         }, TAG_ADB_SHELL_CMD);
-        assertFalse(TextUtils.isEmpty((String) event.getData()));
+        assertThat(TextUtils.isEmpty((String) event.getData())).isFalse();
 
         // TAG_MEDIA_MOUNT will have the volume label redacted (second data)
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_MEDIA_MOUNT, new Object[] {"path", "label"});
         }, TAG_MEDIA_MOUNT);
-        assertFalse(TextUtils.isEmpty(event.getStringData(1)));
-        assertTrue(TextUtils.isEmpty(event.redact(0).getStringData(1)));
+        assertThat(TextUtils.isEmpty(event.getStringData(1))).isFalse();
+        assertThat(TextUtils.isEmpty(event.redact(0).getStringData(1))).isTrue();
 
         // TAG_MEDIA_UNMOUNT will have the volume label redacted (second data)
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_MEDIA_UNMOUNT, new Object[] {"path", "label"});
         }, TAG_MEDIA_UNMOUNT);
-        assertFalse(TextUtils.isEmpty(event.getStringData(1)));
-        assertTrue(TextUtils.isEmpty(event.redact(0).getStringData(1)));
+        assertThat(TextUtils.isEmpty(event.getStringData(1))).isFalse();
+        assertThat(TextUtils.isEmpty(event.redact(0).getStringData(1))).isTrue();
 
         // TAG_APP_PROCESS_START will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_APP_PROCESS_START, new Object[] {"process", 12345L,
                     UserHandle.getUid(10, 123), 456, "seinfo", "hash"});
         }, TAG_APP_PROCESS_START);
-        assertNotNull(event.redact(10));
-        assertNull(event.redact(11));
+        assertThat(event.redact(10)).isNotNull();
+        assertThat(event.redact(11)).isNull();
 
         // TAG_CERT_AUTHORITY_INSTALLED will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_CERT_AUTHORITY_INSTALLED, new Object[] {1, "subject", 10});
         }, TAG_CERT_AUTHORITY_INSTALLED);
-        assertNotNull(event.redact(10));
-        assertNull(event.redact(11));
+        assertThat(event.redact(10)).isNotNull();
+        assertThat(event.redact(11)).isNull();
 
         // TAG_CERT_AUTHORITY_REMOVED will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_CERT_AUTHORITY_REMOVED, new Object[] {1, "subject", 20});
         }, TAG_CERT_AUTHORITY_REMOVED);
-        assertNotNull(event.redact(20));
-        assertNull(event.redact(0));
+        assertThat(event.redact(20)).isNotNull();
+        assertThat(event.redact(0)).isNull();
 
         // TAG_KEY_GENERATED will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_KEY_GENERATED,
                     new Object[] {1, "alias", UserHandle.getUid(0, 123)});
         }, TAG_KEY_GENERATED);
-        assertNotNull(event.redact(0));
-        assertNull(event.redact(10));
+        assertThat(event.redact(0)).isNotNull();
+        assertThat(event.redact(10)).isNull();
 
         // TAG_KEY_IMPORT will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_KEY_IMPORT,
                     new Object[] {1, "alias", UserHandle.getUid(1, 123)});
         }, TAG_KEY_IMPORT);
-        assertNotNull(event.redact(1));
-        assertNull(event.redact(10));
+        assertThat(event.redact(1)).isNotNull();
+        assertThat(event.redact(10)).isNull();
 
         // TAG_KEY_DESTRUCTION will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_KEY_DESTRUCTION,
                     new Object[] {1, "alias", UserHandle.getUid(2, 123)});
         }, TAG_KEY_DESTRUCTION);
-        assertNotNull(event.redact(2));
-        assertNull(event.redact(10));
+        assertThat(event.redact(2)).isNotNull();
+        assertThat(event.redact(10)).isNull();
 
         // TAG_KEY_INTEGRITY_VIOLATION will be fully redacted if user does not match
         event = createEvent(() -> {
             EventLog.writeEvent(TAG_KEY_INTEGRITY_VIOLATION,
                     new Object[] {"alias", UserHandle.getUid(2, 123)});
         }, TAG_KEY_INTEGRITY_VIOLATION);
-        assertNotNull(event.redact(2));
-        assertNull(event.redact(10));
+        assertThat(event.redact(2)).isNotNull();
+        assertThat(event.redact(10)).isNull();
 
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
index e51859b..0a9aad7 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
@@ -21,8 +21,9 @@
 import static android.app.admin.SystemUpdatePolicy.ValidationFailedException.ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE;
 import static android.app.admin.SystemUpdatePolicy.ValidationFailedException.ERROR_NEW_FREEZE_PERIOD_TOO_LONG;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
 import static org.junit.Assert.fail;
 
 import android.app.admin.FreezePeriod;
@@ -53,10 +54,12 @@
 
 /**
  * Unit tests for {@link android.app.admin.SystemUpdatePolicy}.
- * Throughout this test, we use "MM-DD" format to denote dates without year.
  *
- * atest com.android.server.devicepolicy.SystemUpdatePolicyTest
- * runtest -c com.android.server.devicepolicy.SystemUpdatePolicyTest frameworks-services
+ * <p>NOTE: Throughout this test, we use {@code "MM-DD"} format to denote dates without year.
+ *
+ * <p>Run this test with:
+ *
+ * {@code atest FrameworksServicesTests:com.android.server.devicepolicy.SystemUpdatePolicyTest}
  */
 @RunWith(AndroidJUnit4.class)
 public final class SystemUpdatePolicyTest {
@@ -224,37 +227,37 @@
 
     @Test
     public void testDistanceWithoutLeapYear() {
-        assertEquals(364, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 12, 31), LocalDate.of(2016, 1, 1)));
-        assertEquals(365, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2017, 1, 1), LocalDate.of(2016, 1, 1)));
-        assertEquals(365, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2017, 2, 28), LocalDate.of(2016, 2, 29)));
-        assertEquals(-365, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 1, 1), LocalDate.of(2017, 1, 1)));
-        assertEquals(1, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 3, 1), LocalDate.of(2016, 2, 29)));
-        assertEquals(1, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 3, 1), LocalDate.of(2016, 2, 28)));
-        assertEquals(0, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 2, 29), LocalDate.of(2016, 2, 28)));
-        assertEquals(0, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 2, 28), LocalDate.of(2016, 2, 28)));
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 12, 31), LocalDate.of(2016, 1, 1))).isEqualTo(364);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2017, 1, 1), LocalDate.of(2016, 1, 1))).isEqualTo(365);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2017, 2, 28), LocalDate.of(2016, 2, 29))).isEqualTo(365);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 1, 1), LocalDate.of(2017, 1, 1))).isEqualTo(-365);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 3, 1), LocalDate.of(2016, 2, 29))).isEqualTo(1);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 3, 1), LocalDate.of(2016, 2, 28))).isEqualTo(1);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 2, 29), LocalDate.of(2016, 2, 28))).isEqualTo(0);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 2, 28), LocalDate.of(2016, 2, 28))).isEqualTo(0);
 
-        assertEquals(59, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2016, 3, 1), LocalDate.of(2016, 1, 1)));
-        assertEquals(59, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2017, 3, 1), LocalDate.of(2017, 1, 1)));
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2016, 3, 1), LocalDate.of(2016, 1, 1))).isEqualTo(59);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2017, 3, 1), LocalDate.of(2017, 1, 1))).isEqualTo(59);
 
-        assertEquals(365 * 40, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2040, 1, 1), LocalDate.of(2000, 1, 1)));
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2040, 1, 1), LocalDate.of(2000, 1, 1))).isEqualTo(365 * 40);
 
-        assertEquals(365 * 2, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2019, 3, 1), LocalDate.of(2017, 3, 1)));
-        assertEquals(365 * 2, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2018, 3, 1), LocalDate.of(2016, 3, 1)));
-        assertEquals(365 * 2, FreezePeriod.distanceWithoutLeapYear(
-                LocalDate.of(2017, 3, 1), LocalDate.of(2015, 3, 1)));
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2019, 3, 1), LocalDate.of(2017, 3, 1))).isEqualTo(365 * 2);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2018, 3, 1), LocalDate.of(2016, 3, 1))).isEqualTo(365 * 2);
+        assertThat(FreezePeriod.distanceWithoutLeapYear(
+        LocalDate.of(2017, 3, 1), LocalDate.of(2015, 3, 1))).isEqualTo(365 * 2);
 
     }
 
@@ -395,8 +398,8 @@
 
     private void assertInstallationOption(int expectedType, long expectedTime, long now,
             SystemUpdatePolicy p) {
-        assertEquals(expectedType, p.getInstallationOptionAt(now).getType());
-        assertEquals(expectedTime, p.getInstallationOptionAt(now).getEffectiveTime());
+        assertThat(p.getInstallationOptionAt(now).getType()).isEqualTo(expectedType);
+        assertThat(p.getInstallationOptionAt(now).getEffectiveTime()).isEqualTo(expectedTime);
     }
 
     private void testFreezePeriodsSucceeds(String...dates) throws Exception {
@@ -410,8 +413,8 @@
             setFreezePeriods(p, dates);
             fail("Invalid periods (" + expectedError + ") not flagged: " + String.join(" ", dates));
         } catch (SystemUpdatePolicy.ValidationFailedException e) {
-            assertTrue("Exception not expected: " + e.getMessage(),
-                    e.getErrorCode() == expectedError);
+            assertWithMessage("Exception not expected: %s", e.getMessage()).that(e.getErrorCode())
+                    .isEqualTo(expectedError);
         }
     }
 
@@ -426,8 +429,8 @@
             createPrevFreezePeriod(prevStart, prevEnd, now, dates);
             fail("Invalid period (" + expectedError + ") not flagged: " + String.join(" ", dates));
         } catch (SystemUpdatePolicy.ValidationFailedException e) {
-            assertTrue("Exception not expected: " + e.getMessage(),
-                    e.getErrorCode() == expectedError);
+            assertWithMessage("Exception not expected: %s", e.getMessage()).that(e.getErrorCode())
+                    .isEqualTo(expectedError);
         }
     }
 
@@ -480,7 +483,7 @@
         ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
         XmlPullParser parser = Xml.newPullParser();
         parser.setInput(new InputStreamReader(inStream));
-        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertThat(parser.next()).isEqualTo(XmlPullParser.START_TAG);
         checkFreezePeriods(SystemUpdatePolicy.restoreFromXml(parser), expectedPeriods);
     }
 
@@ -488,8 +491,8 @@
             List<FreezePeriod> expectedPeriods) {
         int i = 0;
         for (FreezePeriod period : policy.getFreezePeriods()) {
-            assertEquals(expectedPeriods.get(i).getStart(), period.getStart());
-            assertEquals(expectedPeriods.get(i).getEnd(), period.getEnd());
+            assertThat(period.getStart()).isEqualTo(expectedPeriods.get(i).getStart());
+            assertThat(period.getEnd()).isEqualTo(expectedPeriods.get(i).getEnd());
             i++;
         }
     }
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
index 2005dd9..07ea855 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
@@ -25,14 +25,13 @@
 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_TARGET_COMPONENT;
 import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_USER_ID;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import android.os.Environment;
-import androidx.test.runner.AndroidJUnit4;
 import android.util.Log;
 
+import androidx.test.runner.AndroidJUnit4;
+
 import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Injector;
 import com.android.server.devicepolicy.TransferOwnershipMetadataManager.Metadata;
 
@@ -51,12 +50,14 @@
 /**
 * Unit tests for {@link TransferOwnershipMetadataManager}.
  *
- * bit FrameworksServicesTests:com.android.server.devicepolicy.TransferOwnershipMetadataManagerTest
- * runtest -x frameworks/base/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
-* */
-
+ * <p>Run this test with:
+ *
+ * <pre><code>
+ atest FrameworksServicesTests:com.android.server.devicepolicy.TransferOwnershipMetadataManagerTest
+ * </code></pre>
+ */
 @RunWith(AndroidJUnit4.class)
-public class TransferOwnershipMetadataManagerTest {
+public final class TransferOwnershipMetadataManagerTest {
     private final static String TAG = TransferOwnershipMetadataManagerTest.class.getName();
     private final static String SOURCE_COMPONENT =
             "com.dummy.admin.package/com.dummy.admin.package.SourceClassName";
@@ -77,28 +78,27 @@
     @Test
     public void testSave() {
         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
-        assertTrue(paramsManager.saveMetadataFile(TEST_PARAMS));
-        assertTrue(paramsManager.metadataFileExists());
+        assertThat(paramsManager.saveMetadataFile(TEST_PARAMS)).isTrue();
+        assertThat(paramsManager.metadataFileExists()).isTrue();
     }
 
     @Test
     public void testFileContentValid() {
         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
-        assertTrue(paramsManager.saveMetadataFile(TEST_PARAMS));
+        assertThat(paramsManager.saveMetadataFile(TEST_PARAMS)).isTrue();
         Path path = Paths.get(new File(mMockInjector.getOwnerTransferMetadataDir(),
                 OWNER_TRANSFER_METADATA_XML).getAbsolutePath());
         try {
             String contents = new String(Files.readAllBytes(path), Charset.forName("UTF-8"));
-            assertEquals(
-                "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-                    + "<" + TAG_USER_ID + ">" + USER_ID + "</" + TAG_USER_ID + ">\n"
-                    + "<" + TAG_SOURCE_COMPONENT + ">" + SOURCE_COMPONENT + "</"
-                        + TAG_SOURCE_COMPONENT + ">\n"
-                    + "<" + TAG_TARGET_COMPONENT + ">" + TARGET_COMPONENT + "</"
-                        + TAG_TARGET_COMPONENT + ">\n"
-                    + "<" + TAG_ADMIN_TYPE + ">" + ADMIN_TYPE_DEVICE_OWNER + "</"
-                        + TAG_ADMIN_TYPE + ">\n",
-                contents);
+            assertThat(contents).isEqualTo(
+                    "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+                            + "<" + TAG_USER_ID + ">" + USER_ID + "</" + TAG_USER_ID + ">\n"
+                            + "<" + TAG_SOURCE_COMPONENT + ">" + SOURCE_COMPONENT + "</"
+                            + TAG_SOURCE_COMPONENT + ">\n"
+                            + "<" + TAG_TARGET_COMPONENT + ">" + TARGET_COMPONENT + "</"
+                            + TAG_TARGET_COMPONENT + ">\n"
+                            + "<" + TAG_ADMIN_TYPE + ">" + ADMIN_TYPE_DEVICE_OWNER + "</"
+                            + TAG_ADMIN_TYPE + ">\n");
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -124,7 +124,7 @@
             Log.d(TAG, "testLoad: failed to get canonical file");
         }
         paramsManager.saveMetadataFile(TEST_PARAMS);
-        assertEquals(TEST_PARAMS, paramsManager.loadMetadataFile());
+        assertThat(paramsManager.loadMetadataFile()).isEqualTo(TEST_PARAMS);
     }
 
     @Test
@@ -132,7 +132,7 @@
         TransferOwnershipMetadataManager paramsManager = getOwnerTransferParams();
         paramsManager.saveMetadataFile(TEST_PARAMS);
         paramsManager.deleteMetadataFile();
-        assertFalse(paramsManager.metadataFileExists());
+        assertThat(paramsManager.metadataFileExists()).isFalse();
     }
 
     @After
