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

Commit ec0f00d7 authored by Biswarup Pal's avatar Biswarup Pal
Browse files

Improve unit test of ViewConfigurationController

Avoid the writing of actual settings in the unit test by
passing an interface (for writing settings) to
ViewConfigurationController that can be mocked.

Test: atest ViewConfigurationControllerTest
Bug: 405708042
Flag: android.companion.virtualdevice.flags.viewconfiguration_apis
Change-Id: I51eb2577bb27bcd8081ea9282561d43d46797134
parent 78a44caf
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -40,8 +40,7 @@ import java.util.Objects;
/**
 * Controls the application of {@link ViewConfigurationParams} for a virtual device.
 */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public class ViewConfigurationController {
class ViewConfigurationController {

    private static final String TAG = "ViewConfigurationController";
    private static final String FRAMEWORK_PACKAGE_NAME = "android";
@@ -61,14 +60,21 @@ public class ViewConfigurationController {

    private final Context mContext;
    private final OverlayManager mOverlayManager;
    private final SettingsWriter mSettingsWriter;
    private final Object mLock = new Object();

    @GuardedBy("mLock")
    private OverlayIdentifier mOverlayIdentifier = null;

    public ViewConfigurationController(@NonNull Context context) {
    ViewConfigurationController(@NonNull Context context) {
        this(context, Settings.Secure::putInt);
    }

    @VisibleForTesting
    ViewConfigurationController(@NonNull Context context, @NonNull SettingsWriter settingsWriter) {
        mContext = Objects.requireNonNull(context);
        mOverlayManager = context.getSystemService(OverlayManager.class);
        mSettingsWriter = settingsWriter;
    }

    /**
@@ -159,11 +165,11 @@ public class ViewConfigurationController {
        ContentResolver contentResolver = deviceContext.getContentResolver();
        Binder.withCleanCallingIdentity(() -> {
            if (!isLongPressTimeoutInvalid) {
                Settings.Secure.putInt(contentResolver, Settings.Secure.LONG_PRESS_TIMEOUT,
                mSettingsWriter.writeSettings(contentResolver, Settings.Secure.LONG_PRESS_TIMEOUT,
                        longPressTimeout);
            }
            if (!isMultiPressTimeoutInvalid) {
                Settings.Secure.putInt(contentResolver, Settings.Secure.MULTI_PRESS_TIMEOUT,
                mSettingsWriter.writeSettings(contentResolver, Settings.Secure.MULTI_PRESS_TIMEOUT,
                        multiPressTimeout);
            }
        });
@@ -214,4 +220,10 @@ public class ViewConfigurationController {
    private static boolean isInvalid(float value) {
        return value == ViewConfigurationParams.INVALID_VALUE;
    }

    @VisibleForTesting
    interface SettingsWriter {
        void writeSettings(@NonNull ContentResolver contentResolver, @NonNull String key,
                int value);
    }
}
+18 −1
Original line number Diff line number Diff line
@@ -19,8 +19,10 @@ package com.android.server.companion.virtual;
import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@@ -35,6 +37,7 @@ import android.content.om.OverlayManagerTransaction;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;

import androidx.test.platform.app.InstrumentationRegistry;
@@ -68,8 +71,12 @@ public class ViewConfigurationControllerTest {
    private ViewConfigurationController mViewConfigurationController;
    @Mock
    private OverlayManager mOverlayManagerMock;
    @Mock
    private ViewConfigurationController.SettingsWriter mSettingsWriter;
    @Captor
    private ArgumentCaptor<OverlayManagerTransaction> mTransactionArgumentCaptor;
    @Captor
    private ArgumentCaptor<String> mSettingsKeyCaptor;

    @Before
    public void setUp() throws Exception {
@@ -78,7 +85,7 @@ public class ViewConfigurationControllerTest {
                InstrumentationRegistry.getInstrumentation().getTargetContext()));
        when(context.getSystemService(OverlayManager.class)).thenReturn(mOverlayManagerMock);
        when(context.createDeviceContext(anyInt())).thenReturn(context);
        mViewConfigurationController = new ViewConfigurationController(context);
        mViewConfigurationController = new ViewConfigurationController(context, mSettingsWriter);
    }

    @Test
@@ -130,6 +137,16 @@ public class ViewConfigurationControllerTest {
        verifyNoInteractions(mOverlayManagerMock);
    }

    @Test
    public void applyViewConfigurationParams_writesSettings() throws Exception {
        mViewConfigurationController.applyViewConfigurationParams(DEVICE_ID,
                createParamsRequiringSettingsOverride());
        verify(mSettingsWriter, times(2)).writeSettings(any(), mSettingsKeyCaptor.capture(),
                anyInt());
        assertThat(mSettingsKeyCaptor.getAllValues()).containsExactly(
                Settings.Secure.LONG_PRESS_TIMEOUT, Settings.Secure.MULTI_PRESS_TIMEOUT);
    }

    private static ViewConfigurationParams createParamsRequiringResourceOverlay() {
        return new ViewConfigurationParams.Builder()
                .setTapTimeoutDuration(Duration.ofMillis(10L))