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

Commit e2ace0b9 authored by Antonio Kantek's avatar Antonio Kantek Committed by Android (Google) Code Review
Browse files

Merge "Enabling ClientControllerTest as hostside test" into main

parents 26b900e1 d9066c30
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -19,11 +19,13 @@ package android.view.inputmethod;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;

/**
 * Information given to an {@link InputMethod} about a client connecting
 * to it.
 */
@RavenwoodKeepWholeClass
public final class InputBinding implements Parcelable {
    static final String TAG = "InputBinding";
    
+1 −0
Original line number Diff line number Diff line
@@ -255,6 +255,7 @@ android.view.Display
android.view.Display$HdrCapabilities
android.view.Display$Mode
android.view.DisplayInfo
android.view.inputmethod.InputBinding

android.hardware.SerialManager
android.hardware.SerialManagerInternal
+13 −0
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ import com.android.internal.inputmethod.InputBindResult;
 * the given {@link Handler} thread if {@link IInputMethodClient} is not a proxy object. Be careful
 * about its call ordering characteristics.</p>
 */
// TODO(b/322895594) Mark this class to be host side test compatible once enabling fw/services in
//     Ravenwood (mark this class with @RavenwoodKeepWholeClass and #create with @RavenwoodReplace,
//     so Ravenwood can properly swap create method during test execution).
final class IInputMethodClientInvoker {
    private static final String TAG = InputMethodManagerService.TAG;
    private static final boolean DEBUG = InputMethodManagerService.DEBUG;
@@ -64,6 +67,16 @@ final class IInputMethodClientInvoker {
        return new IInputMethodClientInvoker(inputMethodClient, isProxy, isProxy ? null : handler);
    }

    @AnyThread
    @Nullable
    static IInputMethodClientInvoker create$ravenwood(
            @Nullable IInputMethodClient inputMethodClient, @NonNull Handler handler) {
        if (inputMethodClient == null) {
            return null;
        }
        return new IInputMethodClientInvoker(inputMethodClient, true, null);
    }

    private IInputMethodClientInvoker(@NonNull IInputMethodClient target,
            boolean isProxy, @Nullable Handler handler) {
        mTarget = target;
+0 −1
Original line number Diff line number Diff line
@@ -85,7 +85,6 @@ android_ravenwood_test {
    srcs: [
        "src/com/android/server/inputmethod/**/ClientControllerTest.java",
    ],
    sdk_version: "test_current",
    auto_gen_config: true,
}

+18 −26
Original line number Diff line number Diff line
@@ -32,10 +32,8 @@ import android.content.pm.PackageManagerInternal;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.platform.test.annotations.IgnoreUnderRavenwood;
import android.platform.test.ravenwood.RavenwoodRule;
import android.view.Display;
import android.view.inputmethod.InputBinding;

import com.android.internal.inputmethod.IInputMethodClient;
import com.android.internal.inputmethod.IRemoteInputConnection;
@@ -53,7 +51,7 @@ import java.util.concurrent.TimeUnit;
public final class ClientControllerTest {
    private static final int ANY_DISPLAY_ID = Display.DEFAULT_DISPLAY;
    private static final int ANY_CALLER_UID = 1;
    private static final int ANY_CALLER_PID = 1;
    private static final int ANY_CALLER_PID = 2;
    private static final String SOME_PACKAGE_NAME = "some.package";

    @Rule
@@ -82,13 +80,16 @@ public final class ClientControllerTest {
        mController = new ClientController(mMockPackageManagerInternal);
    }

    // TODO(b/322895594): No need to directly invoke create$ravenwood once b/322895594 is fixed.
    private IInputMethodClientInvoker createInvoker(IInputMethodClient client, Handler handler) {
        return RavenwoodRule.isOnRavenwood()
                ? IInputMethodClientInvoker.create$ravenwood(client, handler) :
                IInputMethodClientInvoker.create(client, handler);
    }

    @Test
    // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for
    //  inputmethod server classes.
    @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class})
    public void testAddClient_cannotAddTheSameClientTwice() {
        var invoker = IInputMethodClientInvoker.create(mClient, mHandler);

        final var invoker = createInvoker(mClient, mHandler);
        synchronized (ImfLock.class) {
            mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID,
                    ANY_CALLER_PID);
@@ -101,18 +102,17 @@ public final class ClientControllerTest {
                        }
                    });
            assertThat(thrown.getMessage()).isEqualTo(
                    "uid=1/pid=1/displayId=0 is already registered");
                    "uid=" + ANY_CALLER_UID + "/pid=" + ANY_CALLER_PID
                            + "/displayId=0 is already registered");
        }
    }

    @Test
    // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for
    //  inputmethod server classes.
    @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class})
    public void testAddClient() throws Exception {
        final var invoker = createInvoker(mClient, mHandler);
        synchronized (ImfLock.class) {
            var invoker = IInputMethodClientInvoker.create(mClient, mHandler);
            var added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID,
            final var added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID,
                    ANY_CALLER_UID,
                    ANY_CALLER_PID);

            verify(invoker.asBinder()).linkToDeath(any(IBinder.DeathRecipient.class), eq(0));
@@ -121,16 +121,12 @@ public final class ClientControllerTest {
    }

    @Test
    // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for
    //  inputmethod server classes.
    @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class})
    public void testRemoveClient() {
        var callback = new TestClientControllerCallback();
        final var invoker = createInvoker(mClient, mHandler);
        final var callback = new TestClientControllerCallback();
        ClientState added;
        synchronized (ImfLock.class) {
            mController.addClientControllerCallback(callback);

            var invoker = IInputMethodClientInvoker.create(mClient, mHandler);
            added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID,
                    ANY_CALLER_PID);
            assertThat(mController.getClient(invoker.asBinder())).isSameInstanceAs(added);
@@ -138,21 +134,17 @@ public final class ClientControllerTest {
        }

        // Test callback
        var removed = callback.waitForRemovedClient(5, TimeUnit.SECONDS);
        final var removed = callback.waitForRemovedClient(5, TimeUnit.SECONDS);
        assertThat(removed).isSameInstanceAs(added);
    }

    @Test
    // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for
    //  inputmethod server classes and updated to newer Mockito with static mock support (mock
    //  InputMethodUtils#checkIfPackageBelongsToUid instead of PackageManagerInternal#isSameApp)
    @IgnoreUnderRavenwood(blockedBy = {InputMethodUtils.class})
    public void testVerifyClientAndPackageMatch() {
        final var invoker = createInvoker(mClient, mHandler);
        when(mMockPackageManagerInternal.isSameApp(eq(SOME_PACKAGE_NAME),  /* flags= */
                anyLong(), eq(ANY_CALLER_UID), /* userId= */ anyInt())).thenReturn(true);

        synchronized (ImfLock.class) {
            var invoker = IInputMethodClientInvoker.create(mClient, mHandler);
            mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID,
                    ANY_CALLER_PID);
            assertThat(