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

Commit 1e2f7e1d authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Do not mask exceptions from initialization

Flag: EXEMPT host test change only
Bug: 379184974
Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh
Change-Id: I0918856ffab2225e530fe8b663cdccfedf03b5fb
parent c12581fb
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import android.util.Log;

import androidx.test.platform.app.InstrumentationRegistry;

import com.android.ravenwood.common.RavenwoodCommonUtils;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runner.Runner;
@@ -229,7 +231,9 @@ public final class RavenwoodAwareTestRunner extends RavenwoodAwareTestRunnerBase
            s.evaluate();
            onAfter(description, scope, order, null);
        } catch (Throwable t) {
            if (onAfter(description, scope, order, t)) {
            var shouldReportFailure = RavenwoodCommonUtils.runIgnoringException(
                    () -> onAfter(description, scope, order, t));
            if (shouldReportFailure == null || shouldReportFailure) {
                throw t;
            }
        }
+14 −4
Original line number Diff line number Diff line
@@ -256,7 +256,9 @@ public class RavenwoodRuntimeEnvironmentController {
            initInner(runner.mState.getConfig());
        } catch (Exception th) {
            Log.e(TAG, "init() failed", th);
            reset();

            RavenwoodCommonUtils.runIgnoringException(()-> reset());

            SneakyThrow.sneakyThrow(th);
        }
    }
@@ -349,9 +351,12 @@ public class RavenwoodRuntimeEnvironmentController {
     * Partially re-initialize after each test method invocation
     */
    public static void reinit() {
        // sRunner could be null, if there was a failure in the initialization.
        if (sRunner != null) {
            var config = sRunner.mState.getConfig();
            Binder.restoreCallingIdentity(packBinderIdentityToken(false, config.mUid, config.mPid));
        }
    }

    private static void initializeCompatIds(RavenwoodConfig config) {
        // Set up compat-IDs for the app side.
@@ -380,6 +385,9 @@ public class RavenwoodRuntimeEnvironmentController {

    /**
     * De-initialize.
     *
     * Note, we call this method when init() fails too, so this method should deal with
     * any partially-initialized states.
     */
    public static void reset() {
        if (RAVENWOOD_VERBOSE_LOGGING) {
@@ -411,7 +419,9 @@ public class RavenwoodRuntimeEnvironmentController {
            config.mState.mSystemServerContext.cleanUp();
        }

        if (Looper.getMainLooper() != null) {
            Looper.getMainLooper().quit();
        }
        Looper.clearMainLooperForTest();

        ActivityManager.reset$ravenwood();
+29 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.function.Supplier;

public class RavenwoodCommonUtils {
    private static final String TAG = "RavenwoodCommonUtils";
@@ -277,8 +278,35 @@ public class RavenwoodCommonUtils {
                (isStatic ? "static" : "")));
    }

    /**
     * Run a supplier and swallow the exception, if any.
     *
     * It's a dangerous function. Only use it in an exception handler where we don't want to crash.
     */
    @Nullable
    public static <T> T runIgnoringException(@NonNull Supplier<T> s) {
        try {
            return s.get();
        } catch (Throwable th) {
            log(TAG, "Warning: Exception detected! " + getStackTraceString(th));
        }
        return null;
    }

    /**
     * Run a runnable and swallow the exception, if any.
     *
     * It's a dangerous function. Only use it in an exception handler where we don't want to crash.
     */
    public static void runIgnoringException(@NonNull Runnable r) {
        runIgnoringException(() -> {
            r.run();
            return null;
        });
    }

    @NonNull
    public static String getStackTraceString(@Nullable Throwable th) {
    public static String getStackTraceString(@NonNull Throwable th) {
        StringWriter stringWriter = new StringWriter();
        PrintWriter writer = new PrintWriter(stringWriter);
        th.printStackTrace(writer);