Fix DeviceOwnerPasswordTest flakiness

DevicePolicyManager.isActivePasswordSufficient() now gets its result
updated asynchronously after a password change, so retry a few times
before asserting the expected value.

Bug: 34212737
Test: cts-tradefed run cts-dev -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.DeviceAdminHostSideTestApi23#testRunDeviceOwnerPasswordTest
Change-Id: I03c01db32912debd9b61c9d403929325e7ba653c
diff --git a/hostsidetests/devicepolicy/app/DeviceAdmin/src/com.android.cts.deviceadmin/DeviceOwnerPasswordTest.java b/hostsidetests/devicepolicy/app/DeviceAdmin/src/com.android.cts.deviceadmin/DeviceOwnerPasswordTest.java
index a00b4eb..18db8df 100644
--- a/hostsidetests/devicepolicy/app/DeviceAdmin/src/com.android.cts.deviceadmin/DeviceOwnerPasswordTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAdmin/src/com.android.cts.deviceadmin/DeviceOwnerPasswordTest.java
@@ -46,7 +46,7 @@
                 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
                 dpm.getPasswordQuality(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false);
 
         String caseDescription = "initial";
         assertPasswordSucceeds("1234", caseDescription);
@@ -56,7 +56,7 @@
         dpm.setPasswordMinimumLength(mAdminComponent, 10);
         caseDescription = "minimum password length = 10";
         assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false); // length not checked for this quality
 
         assertPasswordFails("1234", caseDescription);
         assertPasswordFails("abcd", caseDescription);
@@ -66,7 +66,7 @@
         caseDescription = "minimum password length = 4";
         assertEquals(4, dpm.getPasswordMinimumLength(
                 mAdminComponent));
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(true);
 
         assertPasswordSucceeds("1234", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
@@ -78,7 +78,7 @@
                 DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
                 dpm.getPasswordQuality(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());            // failure
+        assertPasswordSufficiency(false);            // failure
 
         String caseDescription = "initial";
         assertPasswordSucceeds("1234", caseDescription);
@@ -88,7 +88,7 @@
         dpm.setPasswordMinimumLength(mAdminComponent, 10);
         caseDescription = "minimum password length = 10";
         assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false);
 
         assertPasswordFails("1234", caseDescription);
         assertPasswordFails("abcd", caseDescription);
@@ -98,7 +98,7 @@
         caseDescription = "minimum password length = 4";
         assertEquals(4, dpm.getPasswordMinimumLength(
                 mAdminComponent));
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(true);
 
         assertPasswordSucceeds("1234", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
@@ -110,7 +110,7 @@
                 DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
                 dpm.getPasswordQuality(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false);
 
         String caseDescription = "initial";
         assertPasswordFails("1234", caseDescription);      // can't change
@@ -120,7 +120,7 @@
         dpm.setPasswordMinimumLength(mAdminComponent, 10);
         caseDescription = "minimum password length = 10";
         assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false);
 
         assertPasswordFails("1234", caseDescription);
         assertPasswordFails("abcd", caseDescription);
@@ -130,7 +130,7 @@
         caseDescription = "minimum password length = 4";
         assertEquals(4, dpm.getPasswordMinimumLength(
                 mAdminComponent));
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(true);
 
         assertPasswordFails("1234", caseDescription);
         assertPasswordSucceeds("abcd", caseDescription);
@@ -142,7 +142,7 @@
                 DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,
                 dpm.getPasswordQuality(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false);
 
         String caseDescription = "initial";
         assertPasswordFails("1234", caseDescription);
@@ -152,7 +152,7 @@
         dpm.setPasswordMinimumLength(mAdminComponent, 10);
         caseDescription = "minimum password length = 10";
         assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent));
-        assertFalse(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(false);
 
         assertPasswordFails("1234", caseDescription);
         assertPasswordFails("abcd", caseDescription);
@@ -162,7 +162,7 @@
         caseDescription = "minimum password length = 4";
         assertEquals(4, dpm.getPasswordMinimumLength(
                 mAdminComponent));
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(true);
 
         assertPasswordFails("1234", caseDescription);
         assertPasswordFails("abcd", caseDescription);
@@ -371,6 +371,21 @@
     private void assertPasswordSucceeds(String password, String restriction) {
         boolean passwordResetResult = dpm.resetPassword(password, /* flags= */0);
         assertTrue("Password '" + password + "' failed on " + restriction, passwordResetResult);
-        assertTrue(dpm.isActivePasswordSufficient());
+        assertPasswordSufficiency(true);
+    }
+
+    private void assertPasswordSufficiency(boolean expectPasswordSufficient) {
+        int retries = 15;
+        // isActivePasswordSufficient() gets the result asynchronously so let's retry a few times
+        while (retries >= 0 && dpm.isActivePasswordSufficient() != expectPasswordSufficient) {
+            retries--;
+            try {
+                Thread.sleep(200);
+            } catch (InterruptedException e) {
+                break;
+            }
+        }
+        assertEquals(expectPasswordSufficient, dpm.isActivePasswordSufficient());
+
     }
 }