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

Commit 6e36aa65 authored by Willie Koomson's avatar Willie Koomson
Browse files

Convert AppWidgetServiceImplTest to JUnit4

Convert AppWidgetServiceImplTest to JUnit4 to allow using Rules and
assumptions, etc.

Bug: 422287481
Test: atest FrameworksServicesTests:AppWidgetServiceImplTest
Flag: EXEMPT bugfix
Change-Id: Ide0a9fdd8f884538efd4423ffd2141441bb127bc
parent 5deb3ba4
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ import android.widget.RemoteViews;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.SuspendedAppActivity;
import com.android.internal.app.UnlaunchableAppActivity;
import com.android.internal.appwidget.IAppWidgetHost;
@@ -349,6 +350,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
    // and package events, as well as various internal events within
    // AppWidgetService.
    private Handler mCallbackHandler;
    // ServiceThread on which the callback handler runs
    private ServiceThread mServiceThread;
    // Map of user id to the next app widget id (monotonically increasing integer)
    // that can be allocated for a new app widget.
    // See {@link AppWidgetHost#allocateAppWidgetId}.
@@ -392,10 +395,10 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
            mSaveStateHandler = BackgroundThread.getHandler();
        }
        mSavePreviewsHandler = new Handler(BackgroundThread.get().getLooper());
        final ServiceThread serviceThread = new ServiceThread(TAG,
        mServiceThread = new ServiceThread(TAG,
            android.os.Process.THREAD_PRIORITY_FOREGROUND, false /* allowIo */);
        serviceThread.start();
        mCallbackHandler = new CallbackHandler(serviceThread.getLooper());
        mServiceThread.start();
        mCallbackHandler = new CallbackHandler(mServiceThread.getLooper());
        mBackupRestoreController = new BackupRestoreController();
        mSecurityPolicy = new SecurityPolicy();
        mIsCombinedBroadcastEnabled = DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI,
@@ -443,6 +446,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
        return mMaxWidgetBitmapMemory;
    }

    @VisibleForTesting
    ServiceThread getServiceThread() {
        return mServiceThread;
    }

    /**
     * Signals that system services (esp. ActivityManagerService) are ready.
     */
+40 −12
Original line number Diff line number Diff line
@@ -20,6 +20,10 @@ import static android.appwidget.flags.Flags.remoteAdapterConversion;

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
@@ -54,14 +58,15 @@ import android.os.Handler;
import android.os.UserHandle;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.test.InstrumentationTestCase;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.SparseArray;
import android.util.Xml;
import android.widget.RemoteViews;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;

import com.android.frameworks.servicestests.R;
import com.android.internal.appwidget.IAppWidgetHost;
@@ -69,7 +74,10 @@ import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.LocalServices;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -88,15 +96,11 @@ import java.util.concurrent.CountDownLatch;

/**
 * Tests for {@link AppWidgetManager} and {@link AppWidgetServiceImpl}.
 *
 m FrameworksServicesTests &&
 adb install \
 -r -g ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
 adb shell am instrument -e class com.android.server.appwidget.AppWidgetServiceImplTest \
 -w com.android.frameworks.servicestests/androidx.test.runner.AndroidJUnitRunner
 * To run: atest FrameworksServicesTests:AppWidgetServiceImplTest
 */
@SmallTest
public class AppWidgetServiceImplTest extends InstrumentationTestCase {
@RunWith(AndroidJUnit4.class)
public class AppWidgetServiceImplTest {

    @Rule
    public SetFlagsRule setFlagsRule = new SetFlagsRule();
@@ -113,9 +117,8 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
    private AppOpsManagerInternal mMockAppOpsManagerInternal;
    private IAppWidgetHost mMockHost;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    @Before
    public void setUp() throws Exception {
        LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
        LocalServices.removeServiceForTest(ShortcutServiceInternal.class);
        LocalServices.removeServiceForTest(AppWidgetManagerInternal.class);
@@ -140,12 +143,14 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        mService.systemServicesReady();
    }

    @Test
    public void testLoadDescription() {
        AppWidgetProviderInfo info =
                mManager.getInstalledProvidersForPackage(mPkgName, null).get(0);
        assertEquals(info.loadDescription(mTestContext), "widget description string");
    }

    @Test
    public void testParseSizeConfiguration() {
        AppWidgetProviderInfo info =
                mManager.getInstalledProvidersForPackage(mPkgName, null).get(0);
@@ -166,6 +171,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
                .isEqualTo(getIntegerResource(R.integer.widget_target_cell_height));
    }

    @Test
    public void testRequestPinAppWidget_otherProvider() {
        ComponentName otherProvider = null;
        for (AppWidgetProviderInfo provider : mManager.getInstalledProviders()) {
@@ -180,6 +186,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertFalse(mManager.requestPinAppWidget(otherProvider, null, null));
    }

    @Test
    public void testRequestPinAppWidget() {
        ComponentName provider = new ComponentName(mTestContext, TestAppWidgetProvider.class);
        doReturn(true).when(mMockPackageManager).isSameApp(eq(mPkgName), anyInt(), anyInt());
@@ -196,6 +203,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertEquals(provider, providerCaptor.getValue().provider);
    }

    @Test
    public void testIsRequestPinAppWidgetSupported() {
        // Set up users.
        when(mMockShortcutService.isRequestPinItemSupported(anyInt(), anyInt()))
@@ -208,6 +216,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
    }

    @EnableFlags(Flags.FLAG_REMOTE_ADAPTER_CONVERSION)
    @Test
    public void testProviderUpdatesReceived() throws Exception {
        int widgetId = setupHostAndWidget();
        RemoteViews view = new RemoteViews(mPkgName, android.R.layout.simple_list_item_1);
@@ -225,6 +234,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        verify(mMockHost, never()).viewDataChanged(anyInt(), anyInt());
    }

    @Test
    public void testProviderUpdatesNotReceived() throws Exception {
        int widgetId = setupHostAndWidget();
        mService.stopListening(mPkgName, HOST_ID);
@@ -237,6 +247,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        verify(mMockHost, times(0)).viewDataChanged(anyInt(), eq(22));
    }

    @Test
    public void testNoUpdatesReceived_queueEmpty() {
        int widgetId = setupHostAndWidget();
        RemoteViews view = new RemoteViews(mPkgName, android.R.layout.simple_list_item_1);
@@ -270,6 +281,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        }
    }

    @Test
    public void testNoUpdatesReceived_queueNonEmpty_noWidgetId() {
        int widgetId = setupHostAndWidget();
        mService.stopListening(mPkgName, HOST_ID);
@@ -280,6 +292,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertTrue(updates.isEmpty());
    }

    @Test
    public void testUpdatesReceived_queueNotEmpty_widgetIdProvided() {
        int widgetId = setupHostAndWidget();
        int widgetId2 = bindNewWidget();
@@ -294,6 +307,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertEquals(remoteAdapterConversion() ? 1 : 3, updates.size());
    }

    @Test
    public void testUpdatesReceived_queueNotEmpty_widgetIdProvided2() {
        int widgetId = setupHostAndWidget();
        int widgetId2 = bindNewWidget();
@@ -308,6 +322,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertEquals(remoteAdapterConversion() ? 1 : 4, updates.size());
    }

    @Test
    public void testReceiveBroadcastBehavior_enableAndUpdate() {
        TestAppWidgetProvider testAppWidgetProvider = new TestAppWidgetProvider();
        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_ENABLE_AND_UPDATE)
@@ -318,6 +333,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertTrue(testAppWidgetProvider.isBehaviorSuccess());
    }

    @Test
    public void testUpdatesReceived_queueNotEmpty_multipleWidgetIdProvided() {
        int widgetId = setupHostAndWidget();
        int widgetId2 = bindNewWidget();
@@ -332,6 +348,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertEquals(remoteAdapterConversion() ? 2 : 7 , updates.size());
    }

    @Test
    public void testUpdatesReceived_queueEmptyAfterStartListening() {
        int widgetId = setupHostAndWidget();
        int widgetId2 = bindNewWidget();
@@ -352,11 +369,13 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertTrue(updates.isEmpty());
    }

    @Test
    public void testIsFirstConfigActivityPending_without_config() {
        int widgetId = setupHostAndWidget();
        assertFalse(mService.isFirstConfigActivityPending(mPkgName, widgetId));
    }

    @Test
    public void testIsFirstConfigActivityPending_with_config() {
        mManager.updateAppWidgetProviderInfo(
                new ComponentName(mTestContext, TestAppWidgetProvider.class), "info_with_config");
@@ -367,6 +386,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertFalse(mService.isFirstConfigActivityPending(mPkgName, widgetId));
    }

    @Test
    public void testGetInstalledProvidersForPackage() {
        List<AppWidgetProviderInfo> allProviders = mManager.getInstalledProviders();
        assertTrue(!allProviders.isEmpty());
@@ -386,6 +406,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        }
    }

    @Test
    public void testGetPreviewLayout() {
        AppWidgetProviderInfo info =
                mManager.getInstalledProvidersForPackage(mPkgName, null).get(0);
@@ -393,6 +414,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertThat(info.previewLayout).isEqualTo(R.layout.widget_preview);
    }

    @Test
    public void testWidgetProviderInfoPersistence() throws IOException {
        final AppWidgetProviderInfo original = new AppWidgetProviderInfo();
        original.minWidth = 40;
@@ -421,6 +443,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
        assertThat(target.previewLayout).isEqualTo(original.previewLayout);
    }

    @Test
    public void testBackupRestoreControllerStatePersistence() throws IOException {
        // Setup mock data
        final Set<String> mockPrunedApps = getMockPrunedApps();
@@ -526,8 +549,13 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {

    private void flushMainThread() throws Exception {
        CountDownLatch latch = new CountDownLatch(1);
        // Wait for main thread
        new Handler(mTestContext.getMainLooper()).post(latch::countDown);
        latch.await();
        // Wait for service thread
        latch = new CountDownLatch(1);
        mService.getServiceThread().getThreadHandler().post(latch::countDown);
        latch.await();
    }

    private int getDimensionResource(int resId) {
@@ -613,7 +641,7 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
    private class TestContext extends ContextWrapper {

        public TestContext() {
            super(getInstrumentation().getContext());
            super(InstrumentationRegistry.getInstrumentation().getTargetContext());
        }

        @Override