NumberBlockingTest: wait until user started

When starting a user, wait until the user has actually started before
continuing. This is necessary because "am start-user" is async, so it
may not have finished starting the user before the test continues.

Test: run cts-dev -m CtsHostsideNumberBlockingTestCases -t com.android.cts.numberblocking.hostside.NumberBlockingTest#testNumberBlocking

Bug: 129245654

Signed-off-by: duanyangqi <duanyangqi@xiaomi.com>
diff --git a/hostsidetests/numberblocking/src/com/android/cts/numberblocking/hostside/NumberBlockingTest.java b/hostsidetests/numberblocking/src/com/android/cts/numberblocking/hostside/NumberBlockingTest.java
index 1718ab7..6d5c336 100644
--- a/hostsidetests/numberblocking/src/com/android/cts/numberblocking/hostside/NumberBlockingTest.java
+++ b/hostsidetests/numberblocking/src/com/android/cts/numberblocking/hostside/NumberBlockingTest.java
@@ -119,7 +119,7 @@
             runTestAsPrimaryUser(CALL_BLOCKING_TEST_CLASS_NAME, "testUnregisterPhoneAccount");
 
             // Run tests as secondary user.
-            assertTrue(getDevice().startUser(mSecondaryUserId));
+            startUserAndWait(mSecondaryUserId);
 
             // Ensure that a privileged app cannot block numbers when the current user is a
             // secondary user.
@@ -142,6 +142,29 @@
         }
     }
 
+    /** Starts user {@code userId} and waits until it is in state RUNNING_UNLOCKED. */
+    protected void startUserAndWait(int userId) throws Exception {
+        getDevice().startUser(userId);
+
+        final String desiredState = "RUNNING_UNLOCKED";
+        final long USER_STATE_TIMEOUT_MS = 60_0000; // 1 minute
+        final long timeout = System.currentTimeMillis() + USER_STATE_TIMEOUT_MS;
+        final String command = String.format("am get-started-user-state %d", userId);
+        String output = "";
+        while (System.currentTimeMillis() <= timeout) {
+            output = getDevice().executeShellCommand(command);
+            if (output.contains(desiredState)) {
+                return;
+            }
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+                // Do nothing.
+            }
+        }
+        fail("User state of " + userId + " was '" + output + "' rather than " + desiredState);
+    }
+
     private void createSecondaryUser() throws Exception {
         mSecondaryUserId = getDevice().createUser(SECONDARY_USER_NAME);
         getDevice().waitForDeviceAvailable();