Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2ee3255 authored by Yasin Kilicdere's avatar Yasin Kilicdere Committed by Automerger Merge Worker
Browse files

Merge changes I4b9e6f1e,I9cfa39f1 into udc-dev am: b66ce3a1 am: dd206128

parents d4123f2c dd206128
Loading
Loading
Loading
Loading
+8 −47
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@ import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Perf tests for user life cycle events.
@@ -1262,15 +1261,13 @@ public class UserLifecycleTests {
     * <p> This should always be used for profiles since profiles cannot be started in foreground.
     */
    private void startUserInBackgroundAndWaitForUnlock(int userId) {
        final ProgressWaiter waiter = new ProgressWaiter();
        boolean success = false;
        try {
            mIam.startUserInBackgroundWithListener(userId, waiter);
            success = waiter.waitForFinish(TIMEOUT_IN_SECOND);
        } catch (RemoteException e) {
            Log.e(TAG, "startUserInBackgroundAndWaitForUnlock failed", e);
            attestTrue("Failed to start user " + userId + " in background.",
                    ShellHelper.runShellCommandWithTimeout("am start-user -w " + userId,
                            TIMEOUT_IN_SECOND).startsWith("Success:"));
        } catch (TimeoutException e) {
            fail("Could not start user " + userId + " in " + TIMEOUT_IN_SECOND + " seconds");
        }
        attestTrue("Failed to start user " + userId + " in background.", success);
    }

    /** Starts the given user in the foreground. */
@@ -1472,7 +1469,8 @@ public class UserLifecycleTests {
    private void removeUser(int userId) throws RemoteException {
        stopUserAfterWaitingForBroadcastIdle(userId, true);
        try {
            runShellCommandWithTimeout("pm remove-user -w " + userId, TIMEOUT_IN_SECOND);
            ShellHelper.runShellCommandWithTimeout("pm remove-user -w " + userId,
                    TIMEOUT_IN_SECOND);
        } catch (TimeoutException e) {
            Log.e(TAG, String.format("Could not remove user %d in %d seconds",
                    userId, TIMEOUT_IN_SECOND), e);
@@ -1539,7 +1537,7 @@ public class UserLifecycleTests {

    private void waitForBroadcastIdle() {
        try {
            runShellCommandWithTimeout("am wait-for-broadcast-idle", TIMEOUT_IN_SECOND);
            ShellHelper.runShellCommandWithTimeout("am wait-for-broadcast-idle", TIMEOUT_IN_SECOND);
        } catch (TimeoutException e) {
            Log.e(TAG, "Ending waitForBroadcastIdle because it is taking too long", e);
        }
@@ -1559,41 +1557,4 @@ public class UserLifecycleTests {
        waitForBroadcastIdle();
        sleep(tenSeconds);
    }

    /**
     * Runs a Shell command with a timeout, returning a trimmed response.
     */
    private String runShellCommandWithTimeout(String command, long timeoutInSecond)
            throws TimeoutException {
        AtomicReference<Exception> exception = new AtomicReference<>(null);
        AtomicReference<String> result = new AtomicReference<>(null);

        CountDownLatch latch = new CountDownLatch(1);

        new Thread(() -> {
            try {
                result.set(ShellHelper.runShellCommandRaw(command));
            } catch (Exception e) {
                exception.set(e);
            } finally {
                latch.countDown();
            }
        }).start();

        try {
            if (!latch.await(timeoutInSecond, TimeUnit.SECONDS)) {
                throw new TimeoutException("Command: '" + command + "' could not run in "
                        + timeoutInSecond + " seconds");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        if (exception.get() != null) {
            Log.e(TAG, "Command: '" + command + "' failed.", exception.get());
            throw new RuntimeException(exception.get());
        }

        return result.get();
    }
}
+41 −0
Original line number Diff line number Diff line
@@ -24,12 +24,53 @@ import androidx.annotation.NonNull;
import androidx.test.InstrumentationRegistry;

import java.io.FileInputStream;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Provides Shell-based utilities such as running a command.
 */
public final class ShellHelper {

    /**
     * Runs a Shell command with a timeout, returning a trimmed response.
     */
    @NonNull
    public static String runShellCommandWithTimeout(@NonNull String command, long timeoutInSecond)
            throws TimeoutException {
        AtomicReference<Exception> exception = new AtomicReference<>(null);
        AtomicReference<String> result = new AtomicReference<>(null);

        CountDownLatch latch = new CountDownLatch(1);

        new Thread(() -> {
            try {
                result.set(runShellCommandRaw(command));
            } catch (Exception e) {
                exception.set(e);
            } finally {
                latch.countDown();
            }
        }).start();

        try {
            if (!latch.await(timeoutInSecond, TimeUnit.SECONDS)) {
                throw new TimeoutException("Command: '" + command + "' could not run in "
                        + timeoutInSecond + " seconds");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        if (exception.get() != null) {
            throw new AndroidRuntimeException(exception.get());
        }

        return result.get();
    }

    /**
     * Runs a Shell command, returning a trimmed response.
     */