diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2018-11-07 16:54:02 -0800 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2018-11-12 10:49:59 -0800 |
commit | 06a07e9748d07941be5f49f3388e94e5fcdeb840 (patch) | |
tree | e83cb6d85badbe22ef33e225e4d883932e25da1f /tests/src/com/android/launcher3/model | |
parent | f1982fcaae1c24c93eab2309cb06905d25a90c00 (diff) | |
download | android_packages_apps_Trebuchet-06a07e9748d07941be5f49f3388e94e5fcdeb840.tar.gz android_packages_apps_Trebuchet-06a07e9748d07941be5f49f3388e94e5fcdeb840.tar.bz2 android_packages_apps_Trebuchet-06a07e9748d07941be5f49f3388e94e5fcdeb840.zip |
Moving come tests to Roboelectric
> Fixing resource loading in robo tests
Change-Id: Id5b8a0e4916a2a200da7a41b03f19846834beb1f
Diffstat (limited to 'tests/src/com/android/launcher3/model')
5 files changed, 0 insertions, 1062 deletions
diff --git a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java b/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java deleted file mode 100644 index 6673ba928..000000000 --- a/tests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.android.launcher3.model; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.verify; - -import android.content.ComponentName; -import android.content.ContentProviderOperation; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.graphics.Rect; -import android.net.Uri; -import android.util.Pair; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.launcher3.ItemInfo; -import com.android.launcher3.LauncherProvider; -import com.android.launcher3.LauncherSettings; -import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.util.GridOccupancy; -import com.android.launcher3.util.IntArray; -import com.android.launcher3.util.IntSparseArrayMap; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; - -import java.util.ArrayList; -import java.util.List; - -/** - * Tests for {@link AddWorkspaceItemsTask} - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class AddWorkspaceItemsTaskTest extends BaseModelUpdateTaskTestCase { - - private final ComponentName mComponent1 = new ComponentName("a", "b"); - private final ComponentName mComponent2 = new ComponentName("b", "b"); - - private IntArray existingScreens; - private IntArray newScreens; - private IntSparseArrayMap<GridOccupancy> screenOccupancy; - - @Before - public void initData() throws Exception { - existingScreens = new IntArray(); - screenOccupancy = new IntSparseArrayMap<>(); - newScreens = new IntArray(); - - idp.numColumns = 5; - idp.numRows = 5; - } - - private AddWorkspaceItemsTask newTask(ItemInfo... items) { - List<Pair<ItemInfo, Object>> list = new ArrayList<>(); - for (ItemInfo item : items) { - list.add(Pair.create(item, null)); - } - return new AddWorkspaceItemsTask(list) { - - @Override - protected void updateScreens(Context context, IntArray workspaceScreens) { } - }; - } - - @Test - public void testFindSpaceForItem_prefers_second() { - // First screen has only one hole of size 1 - int nextId = setupWorkspaceWithHoles(1, 1, new Rect(2, 2, 3, 3)); - - // Second screen has 2 holes of sizes 3x2 and 2x3 - setupWorkspaceWithHoles(nextId, 2, new Rect(2, 0, 5, 2), new Rect(0, 2, 2, 5)); - - int[] spaceFound = newTask() - .findSpaceForItem(appState, bgDataModel, existingScreens, newScreens, 1, 1); - assertEquals(2, spaceFound[0]); - assertTrue(screenOccupancy.get(spaceFound[0]) - .isRegionVacant(spaceFound[1], spaceFound[2], 1, 1)); - - // Find a larger space - spaceFound = newTask() - .findSpaceForItem(appState, bgDataModel, existingScreens, newScreens, 2, 3); - assertEquals(2, spaceFound[0]); - assertTrue(screenOccupancy.get(spaceFound[0]) - .isRegionVacant(spaceFound[1], spaceFound[2], 2, 3)); - } - - @Test - public void testFindSpaceForItem_adds_new_screen() throws Exception { - // First screen has 2 holes of sizes 3x2 and 2x3 - setupWorkspaceWithHoles(1, 1, new Rect(2, 0, 5, 2), new Rect(0, 2, 2, 5)); - commitScreensToDb(); - - IntArray oldScreens = existingScreens.clone(); - int[] spaceFound = newTask() - .findSpaceForItem(appState, bgDataModel, existingScreens, newScreens, 3, 3); - assertFalse(oldScreens.contains(spaceFound[0])); - assertTrue(newScreens.contains(spaceFound[0])); - } - - @Test - public void testAddItem_existing_item_ignored() throws Exception { - ShortcutInfo info = new ShortcutInfo(); - info.intent = new Intent().setComponent(mComponent1); - - // Setup a screen with a hole - setupWorkspaceWithHoles(1, 1, new Rect(2, 2, 3, 3)); - commitScreensToDb(); - - // Nothing was added - assertTrue(executeTaskForTest(newTask(info)).isEmpty()); - } - - @Test - public void testAddItem_some_items_added() throws Exception { - ShortcutInfo info = new ShortcutInfo(); - info.intent = new Intent().setComponent(mComponent1); - - ShortcutInfo info2 = new ShortcutInfo(); - info2.intent = new Intent().setComponent(mComponent2); - - // Setup a screen with a hole - setupWorkspaceWithHoles(1, 1, new Rect(2, 2, 3, 3)); - commitScreensToDb(); - - executeTaskForTest(newTask(info, info2)).get(0).run(); - ArgumentCaptor<ArrayList> notAnimated = ArgumentCaptor.forClass(ArrayList.class); - ArgumentCaptor<ArrayList> animated = ArgumentCaptor.forClass(ArrayList.class); - - // only info2 should be added because info was already added to the workspace - // in setupWorkspaceWithHoles() - verify(callbacks).bindAppsAdded(any(IntArray.class), notAnimated.capture(), - animated.capture()); - assertTrue(notAnimated.getValue().isEmpty()); - - assertEquals(1, animated.getValue().size()); - assertTrue(animated.getValue().contains(info2)); - } - - private int setupWorkspaceWithHoles(int startId, int screenId, Rect... holes) { - GridOccupancy occupancy = new GridOccupancy(idp.numColumns, idp.numRows); - occupancy.markCells(0, 0, idp.numColumns, idp.numRows, true); - for (Rect r : holes) { - occupancy.markCells(r, false); - } - - existingScreens.add(screenId); - screenOccupancy.append(screenId, occupancy); - - for (int x = 0; x < idp.numColumns; x++) { - for (int y = 0; y < idp.numRows; y++) { - if (!occupancy.cells[x][y]) { - continue; - } - - ShortcutInfo info = new ShortcutInfo(); - info.intent = new Intent().setComponent(mComponent1); - info.id = startId++; - info.screenId = screenId; - info.cellX = x; - info.cellY = y; - info.container = LauncherSettings.Favorites.CONTAINER_DESKTOP; - bgDataModel.addItem(targetContext, info, false); - } - } - return startId; - } - - private void commitScreensToDb() throws Exception { - LauncherSettings.Settings.call(mProviderRule.getResolver(), - LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); - - Uri uri = LauncherSettings.WorkspaceScreens.CONTENT_URI; - ArrayList<ContentProviderOperation> ops = new ArrayList<>(); - // Clear the table - ops.add(ContentProviderOperation.newDelete(uri).build()); - int count = existingScreens.size(); - for (int i = 0; i < count; i++) { - ContentValues v = new ContentValues(); - int screenId = existingScreens.get(i); - v.put(LauncherSettings.WorkspaceScreens._ID, screenId); - v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i); - ops.add(ContentProviderOperation.newInsert(uri).withValues(v).build()); - } - mProviderRule.getResolver().applyBatch(LauncherProvider.AUTHORITY, ops); - } -} diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java deleted file mode 100644 index afe9dc655..000000000 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ /dev/null @@ -1,231 +0,0 @@ -package com.android.launcher3.model; - -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.ComponentName; -import android.content.ContentResolver; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.Intent; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Bitmap.Config; -import android.graphics.Color; -import android.os.Process; -import android.os.UserHandle; -import androidx.test.InstrumentationRegistry; -import androidx.test.rule.provider.ProviderTestRule; - -import com.android.launcher3.AllAppsList; -import com.android.launcher3.AppFilter; -import com.android.launcher3.AppInfo; -import com.android.launcher3.icons.cache.CachingLogic; -import com.android.launcher3.icons.IconCache; -import com.android.launcher3.InvariantDeviceProfile; -import com.android.launcher3.ItemInfo; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherModel; -import com.android.launcher3.LauncherModel.Callbacks; -import com.android.launcher3.LauncherModel.ModelUpdateTask; -import com.android.launcher3.LauncherProvider; -import com.android.launcher3.icons.BitmapInfo; -import com.android.launcher3.util.ComponentKey; -import com.android.launcher3.util.Provider; -import com.android.launcher3.util.TestLauncherProvider; - -import org.junit.Before; -import org.junit.Rule; -import org.mockito.ArgumentCaptor; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.Executor; - -import androidx.annotation.NonNull; - -/** - * Base class for writing tests for Model update tasks. - */ -public class BaseModelUpdateTaskTestCase { - - @Rule - public ProviderTestRule mProviderRule = - new ProviderTestRule.Builder(TestLauncherProvider.class, LauncherProvider.AUTHORITY) - .build(); - - public final HashMap<Class, HashMap<String, Field>> fieldCache = new HashMap<>(); - - public Context targetContext; - public UserHandle myUser; - - public InvariantDeviceProfile idp; - public LauncherAppState appState; - public LauncherModel model; - public ModelWriter modelWriter; - public MyIconCache iconCache; - - public BgDataModel bgDataModel; - public AllAppsList allAppsList; - public Callbacks callbacks; - - @Before - public void setUp() throws Exception { - callbacks = mock(Callbacks.class); - appState = mock(LauncherAppState.class); - model = mock(LauncherModel.class); - modelWriter = mock(ModelWriter.class); - - when(appState.getModel()).thenReturn(model); - when(model.getWriter(anyBoolean(), anyBoolean())).thenReturn(modelWriter); - when(model.getCallback()).thenReturn(callbacks); - - myUser = Process.myUserHandle(); - - bgDataModel = new BgDataModel(); - targetContext = new ContextWrapper(InstrumentationRegistry.getTargetContext()) { - @Override - public ContentResolver getContentResolver() { - return mProviderRule.getResolver(); - } - }; - idp = new InvariantDeviceProfile(); - iconCache = new MyIconCache(targetContext, idp); - - allAppsList = new AllAppsList(iconCache, new AppFilter()); - - when(appState.getIconCache()).thenReturn(iconCache); - when(appState.getInvariantDeviceProfile()).thenReturn(idp); - when(appState.getContext()).thenReturn(targetContext); - - } - - /** - * Synchronously executes the task and returns all the UI callbacks posted. - */ - public List<Runnable> executeTaskForTest(ModelUpdateTask task) throws Exception { - when(model.isModelLoaded()).thenReturn(true); - - Executor mockExecutor = mock(Executor.class); - - task.init(appState, model, bgDataModel, allAppsList, mockExecutor); - task.run(); - ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class); - verify(mockExecutor, atLeast(0)).execute(captor.capture()); - - return captor.getAllValues(); - } - - /** - * Initializes mock data for the test. - */ - public void initializeData(String resourceName) throws Exception { - Context myContext = InstrumentationRegistry.getContext(); - Resources res = myContext.getResources(); - int id = res.getIdentifier(resourceName, "raw", myContext.getPackageName()); - try (BufferedReader reader = - new BufferedReader(new InputStreamReader(res.openRawResource(id)))) { - String line; - HashMap<String, Class> classMap = new HashMap<>(); - while((line = reader.readLine()) != null) { - line = line.trim(); - if (line.startsWith("#") || line.isEmpty()) { - continue; - } - String[] commands = line.split(" "); - switch (commands[0]) { - case "classMap": - classMap.put(commands[1], Class.forName(commands[2])); - break; - case "bgItem": - bgDataModel.addItem(targetContext, - (ItemInfo) initItem(classMap.get(commands[1]), commands, 2), false); - break; - case "allApps": - allAppsList.add((AppInfo) initItem(AppInfo.class, commands, 1), null); - break; - } - } - } - } - - private Object initItem(Class clazz, String[] fieldDef, int startIndex) throws Exception { - HashMap<String, Field> cache = fieldCache.get(clazz); - if (cache == null) { - cache = new HashMap<>(); - Class c = clazz; - while (c != null) { - for (Field f : c.getDeclaredFields()) { - f.setAccessible(true); - cache.put(f.getName(), f); - } - c = c.getSuperclass(); - } - fieldCache.put(clazz, cache); - } - - Object item = clazz.newInstance(); - for (int i = startIndex; i < fieldDef.length; i++) { - String[] fieldData = fieldDef[i].split("=", 2); - Field f = cache.get(fieldData[0]); - Class type = f.getType(); - if (type == int.class || type == long.class) { - f.set(item, Integer.parseInt(fieldData[1])); - } else if (type == CharSequence.class || type == String.class) { - f.set(item, fieldData[1]); - } else if (type == Intent.class) { - if (!fieldData[1].startsWith("#Intent")) { - fieldData[1] = "#Intent;" + fieldData[1] + ";end"; - } - f.set(item, Intent.parseUri(fieldData[1], 0)); - } else if (type == ComponentName.class) { - f.set(item, ComponentName.unflattenFromString(fieldData[1])); - } else { - throw new Exception("Added parsing logic for " - + f.getName() + " of type " + f.getType()); - } - } - return item; - } - - public static class MyIconCache extends IconCache { - - private final HashMap<ComponentKey, CacheEntry> mCache = new HashMap<>(); - - public MyIconCache(Context context, InvariantDeviceProfile idp) { - super(context, idp); - } - - @Override - protected <T> CacheEntry cacheLocked( - @NonNull ComponentName componentName, - UserHandle user, @NonNull Provider<T> infoProvider, - @NonNull CachingLogic<T> cachingLogic, - boolean usePackageIcon, boolean useLowResIcon) { - CacheEntry entry = mCache.get(new ComponentKey(componentName, user)); - if (entry == null) { - entry = new CacheEntry(); - getDefaultIcon(user).applyTo(entry); - } - return entry; - } - - public void addCache(ComponentName key, String title) { - CacheEntry entry = new CacheEntry(); - entry.icon = newIcon(); - entry.color = Color.RED; - entry.title = title; - mCache.put(new ComponentKey(key, Process.myUserHandle()), entry); - } - - public Bitmap newIcon() { - return Bitmap.createBitmap(1, 1, Config.ARGB_8888); - } - } -} diff --git a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java deleted file mode 100644 index 5fe9018e1..000000000 --- a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.android.launcher3.model; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertNull; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.launcher3.AppInfo; -import com.android.launcher3.ItemInfo; -import com.android.launcher3.ShortcutInfo; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.Arrays; -import java.util.HashSet; - -/** - * Tests for {@link CacheDataUpdatedTask} - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { - - private static final String NEW_LABEL_PREFIX = "new-label-"; - - @Before - public void initData() throws Exception { - initializeData("cache_data_updated_task_data"); - // Add dummy entries in the cache to simulate update - for (ItemInfo info : bgDataModel.itemsIdMap) { - iconCache.addCache(info.getTargetComponent(), NEW_LABEL_PREFIX + info.id); - } - } - - private CacheDataUpdatedTask newTask(int op, String... pkg) { - return new CacheDataUpdatedTask(op, myUser, new HashSet<>(Arrays.asList(pkg))); - } - - @Test - public void testCacheUpdate_update_apps() throws Exception { - // Clear all icons from apps list so that its easy to check what was updated - for (AppInfo info : allAppsList.data) { - info.iconBitmap = null; - } - - executeTaskForTest(newTask(CacheDataUpdatedTask.OP_CACHE_UPDATE, "app1")); - - // Verify that only the app icons of app1 (id 1 & 2) are updated. Custom shortcut (id 7) - // is not updated - verifyUpdate(1, 2); - - // Verify that only app1 var updated in allAppsList - assertFalse(allAppsList.data.isEmpty()); - for (AppInfo info : allAppsList.data) { - if (info.componentName.getPackageName().equals("app1")) { - assertNotNull(info.iconBitmap); - } else { - assertNull(info.iconBitmap); - } - } - } - - @Test - public void testSessionUpdate_ignores_normal_apps() throws Exception { - executeTaskForTest(newTask(CacheDataUpdatedTask.OP_SESSION_UPDATE, "app1")); - - // app1 has no restored shortcuts. Verify that nothing was updated. - verifyUpdate(); - } - - @Test - public void testSessionUpdate_updates_pending_apps() throws Exception { - executeTaskForTest(newTask(CacheDataUpdatedTask.OP_SESSION_UPDATE, "app3")); - - // app3 has only restored apps (id 5, 6) and shortcuts (id 9). Verify that only apps were - // were updated - verifyUpdate(5, 6); - } - - private void verifyUpdate(Integer... idsUpdated) { - HashSet<Integer> updates = new HashSet<>(Arrays.asList(idsUpdated)); - for (ItemInfo info : bgDataModel.itemsIdMap) { - if (updates.contains(info.id)) { - assertEquals(NEW_LABEL_PREFIX + info.id, info.title); - assertNotNull(((ShortcutInfo) info).iconBitmap); - } else { - assertNotSame(NEW_LABEL_PREFIX + info.id, info.title); - assertNull(((ShortcutInfo) info).iconBitmap); - } - } - } -} diff --git a/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java b/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java deleted file mode 100644 index 7fa401b14..000000000 --- a/tests/src/com/android/launcher3/model/GridSizeMigrationTaskTest.java +++ /dev/null @@ -1,466 +0,0 @@ -package com.android.launcher3.model; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Point; -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.MediumTest; -import androidx.test.rule.provider.ProviderTestRule; -import androidx.test.runner.AndroidJUnit4; - -import com.android.launcher3.InvariantDeviceProfile; -import com.android.launcher3.LauncherModel; -import com.android.launcher3.LauncherProvider; -import com.android.launcher3.LauncherSettings; -import com.android.launcher3.model.GridSizeMigrationTask.MultiStepMigrationTask; -import com.android.launcher3.util.IntArray; -import com.android.launcher3.util.TestLauncherProvider; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.HashSet; -import java.util.LinkedList; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -/** - * Unit tests for {@link GridSizeMigrationTask} - */ -@MediumTest -@RunWith(AndroidJUnit4.class) -public class GridSizeMigrationTaskTest { - - @Rule - public ProviderTestRule mProviderRule = - new ProviderTestRule.Builder(TestLauncherProvider.class, LauncherProvider.AUTHORITY) - .build(); - - private static final int DESKTOP = LauncherSettings.Favorites.CONTAINER_DESKTOP; - private static final int HOTSEAT = LauncherSettings.Favorites.CONTAINER_HOTSEAT; - - private static final int APPLICATION = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; - private static final int SHORTCUT = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; - - private static final String TEST_PACKAGE = "com.android.launcher3.validpackage"; - private static final String VALID_INTENT = - new Intent(Intent.ACTION_MAIN).setPackage(TEST_PACKAGE).toUri(0); - - private HashSet<String> mValidPackages; - private InvariantDeviceProfile mIdp; - private Context mContext; - - @Before - public void setUp() throws Exception { - mValidPackages = new HashSet<>(); - mValidPackages.add(TEST_PACKAGE); - - mIdp = new InvariantDeviceProfile(); - - mContext = new ContextWrapper(InstrumentationRegistry.getTargetContext()) { - - @Override - public ContentResolver getContentResolver() { - return mProviderRule.getResolver(); - } - }; - } - - @Test - public void testHotseatMigration_apps_dropped() throws Exception { - int[] hotseatItems = { - addItem(APPLICATION, 0, HOTSEAT, 0, 0), - addItem(SHORTCUT, 1, HOTSEAT, 0, 0), - -1, - addItem(SHORTCUT, 3, HOTSEAT, 0, 0), - addItem(APPLICATION, 4, HOTSEAT, 0, 0), - }; - - mIdp.numHotseatIcons = 3; - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, 5, 3) - .migrateHotseat(); - // First item is dropped as it has the least weight. - verifyHotseat(hotseatItems[1], hotseatItems[3], hotseatItems[4]); - } - - @Test - public void testHotseatMigration_shortcuts_dropped() throws Exception { - int[] hotseatItems = { - addItem(APPLICATION, 0, HOTSEAT, 0, 0), - addItem(30, 1, HOTSEAT, 0, 0), - -1, - addItem(SHORTCUT, 3, HOTSEAT, 0, 0), - addItem(10, 4, HOTSEAT, 0, 0), - }; - - mIdp.numHotseatIcons = 3; - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, 5, 3) - .migrateHotseat(); - // First item is dropped as it has the least weight. - verifyHotseat(hotseatItems[1], hotseatItems[3], hotseatItems[4]); - } - - private void verifyHotseat(int... sortedIds) { - int screenId = 0; - int total = 0; - - for (int id : sortedIds) { - Cursor c = mProviderRule.getResolver().query(LauncherSettings.Favorites.CONTENT_URI, - new String[]{LauncherSettings.Favorites._ID}, - "container=-101 and screen=" + screenId, null, null, null); - - if (id == -1) { - assertEquals(0, c.getCount()); - } else { - assertEquals(1, c.getCount()); - c.moveToNext(); - assertEquals(id, c.getLong(0)); - total ++; - } - c.close(); - - screenId++; - } - - // Verify that not other entry exist in the DB. - Cursor c = mProviderRule.getResolver().query(LauncherSettings.Favorites.CONTENT_URI, - new String[]{LauncherSettings.Favorites._ID}, - "container=-101", null, null, null); - assertEquals(total, c.getCount()); - c.close(); - } - - @Test - public void testWorkspace_empty_row_column_removed() throws Exception { - int[][][] ids = createGrid(new int[][][]{{ - { 0, 0, -1, 1}, - { 3, 1, -1, 4}, - { -1, -1, -1, -1}, - { 5, 2, -1, 6}, - }}); - - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, - new Point(4, 4), new Point(3, 3)).migrateWorkspace(); - - // Column 2 and row 2 got removed. - verifyWorkspace(new int[][][] {{ - {ids[0][0][0], ids[0][0][1], ids[0][0][3]}, - {ids[0][1][0], ids[0][1][1], ids[0][1][3]}, - {ids[0][3][0], ids[0][3][1], ids[0][3][3]}, - }}); - } - - @Test - public void testWorkspace_new_screen_created() throws Exception { - int[][][] ids = createGrid(new int[][][]{{ - { 0, 0, 0, 1}, - { 3, 1, 0, 4}, - { -1, -1, -1, -1}, - { 5, 2, -1, 6}, - }}); - - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, - new Point(4, 4), new Point(3, 3)).migrateWorkspace(); - - // Items in the second column get moved to new screen - verifyWorkspace(new int[][][] {{ - {ids[0][0][0], ids[0][0][1], ids[0][0][3]}, - {ids[0][1][0], ids[0][1][1], ids[0][1][3]}, - {ids[0][3][0], ids[0][3][1], ids[0][3][3]}, - }, { - {ids[0][0][2], ids[0][1][2], -1}, - }}); - } - - @Test - public void testWorkspace_items_merged_in_next_screen() throws Exception { - int[][][] ids = createGrid(new int[][][]{{ - { 0, 0, 0, 1}, - { 3, 1, 0, 4}, - { -1, -1, -1, -1}, - { 5, 2, -1, 6}, - },{ - { 0, 0, -1, 1}, - { 3, 1, -1, 4}, - }}); - - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, - new Point(4, 4), new Point(3, 3)).migrateWorkspace(); - - // Items in the second column of the first screen should get placed on the 3rd - // row of the second screen - verifyWorkspace(new int[][][] {{ - {ids[0][0][0], ids[0][0][1], ids[0][0][3]}, - {ids[0][1][0], ids[0][1][1], ids[0][1][3]}, - {ids[0][3][0], ids[0][3][1], ids[0][3][3]}, - }, { - {ids[1][0][0], ids[1][0][1], ids[1][0][3]}, - {ids[1][1][0], ids[1][1][1], ids[1][1][3]}, - {ids[0][0][2], ids[0][1][2], -1}, - }}); - } - - @Test - public void testWorkspace_items_not_merged_in_next_screen() throws Exception { - // First screen has 2 items that need to be moved, but second screen has only one - // empty space after migration (top-left corner) - int[][][] ids = createGrid(new int[][][]{{ - { 0, 0, 0, 1}, - { 3, 1, 0, 4}, - { -1, -1, -1, -1}, - { 5, 2, -1, 6}, - },{ - { -1, 0, -1, 1}, - { 3, 1, -1, 4}, - { -1, -1, -1, -1}, - { 5, 2, -1, 6}, - }}); - - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, - new Point(4, 4), new Point(3, 3)).migrateWorkspace(); - - // Items in the second column of the first screen should get placed on a new screen. - verifyWorkspace(new int[][][] {{ - {ids[0][0][0], ids[0][0][1], ids[0][0][3]}, - {ids[0][1][0], ids[0][1][1], ids[0][1][3]}, - {ids[0][3][0], ids[0][3][1], ids[0][3][3]}, - }, { - { -1, ids[1][0][1], ids[1][0][3]}, - {ids[1][1][0], ids[1][1][1], ids[1][1][3]}, - {ids[1][3][0], ids[1][3][1], ids[1][3][3]}, - }, { - {ids[0][0][2], ids[0][1][2], -1}, - }}); - } - - @Test - public void testWorkspace_first_row_blocked() throws Exception { - // The first screen has one item on the 4th column which needs moving, as the first row - // will be kept empty. - int[][][] ids = createGrid(new int[][][]{{ - { -1, -1, -1, -1}, - { 3, 1, 7, 0}, - { 8, 7, 7, -1}, - { 5, 2, 7, -1}, - }}, 0); - - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, - new Point(4, 4), new Point(3, 4)).migrateWorkspace(); - - // Items in the second column of the first screen should get placed on a new screen. - verifyWorkspace(new int[][][] {{ - { -1, -1, -1}, - {ids[0][1][0], ids[0][1][1], ids[0][1][2]}, - {ids[0][2][0], ids[0][2][1], ids[0][2][2]}, - {ids[0][3][0], ids[0][3][1], ids[0][3][2]}, - }, { - {ids[0][1][3]}, - }}); - } - - @Test - public void testWorkspace_items_moved_to_empty_first_row() throws Exception { - // Items will get moved to the next screen to keep the first screen empty. - int[][][] ids = createGrid(new int[][][]{{ - { -1, -1, -1, -1}, - { 0, 1, 0, 0}, - { 8, 7, 7, -1}, - { 5, 6, 7, -1}, - }}, 0); - - new GridSizeMigrationTask(mContext, mIdp, mValidPackages, - new Point(4, 4), new Point(3, 3)).migrateWorkspace(); - - // Items in the second column of the first screen should get placed on a new screen. - verifyWorkspace(new int[][][] {{ - { -1, -1, -1}, - {ids[0][2][0], ids[0][2][1], ids[0][2][2]}, - {ids[0][3][0], ids[0][3][1], ids[0][3][2]}, - }, { - {ids[0][1][1], ids[0][1][0], ids[0][1][2]}, - {ids[0][1][3]}, - }}); - } - - private int[][][] createGrid(int[][][] typeArray) throws Exception { - return createGrid(typeArray, 1); - } - - /** - * Initializes the DB with dummy elements to represent the provided grid structure. - * @param typeArray A 3d array of item types. {@see #addItem(int, long, long, int, int)} for - * type definitions. The first dimension represents the screens and the next - * two represent the workspace grid. - * @return the same grid representation where each entry is the corresponding item id. - */ - private int[][][] createGrid(int[][][] typeArray, int startScreen) throws Exception { - LauncherSettings.Settings.call(mProviderRule.getResolver(), - LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB); - int[][][] ids = new int[typeArray.length][][]; - - for (int i = 0; i < typeArray.length; i++) { - // Add screen to DB - int screenId = startScreen + i; - - // Keep the screen id counter up to date - LauncherSettings.Settings.call(mProviderRule.getResolver(), - LauncherSettings.Settings.METHOD_NEW_SCREEN_ID); - - ContentValues v = new ContentValues(); - v.put(LauncherSettings.WorkspaceScreens._ID, screenId); - v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i); - mProviderRule.getResolver().insert(LauncherSettings.WorkspaceScreens.CONTENT_URI, v); - - ids[i] = new int[typeArray[i].length][]; - for (int y = 0; y < typeArray[i].length; y++) { - ids[i][y] = new int[typeArray[i][y].length]; - for (int x = 0; x < typeArray[i][y].length; x++) { - if (typeArray[i][y][x] < 0) { - // Empty cell - ids[i][y][x] = -1; - } else { - ids[i][y][x] = addItem(typeArray[i][y][x], screenId, DESKTOP, x, y); - } - } - } - } - return ids; - } - - /** - * Verifies that the workspace items are arranged in the provided order. - * @param ids A 3d array where the first dimension represents the screen, and the rest two - * represent the workspace grid. - */ - private void verifyWorkspace(int[][][] ids) { - IntArray allScreens = LauncherModel.loadWorkspaceScreensDb(mContext); - assertEquals(ids.length, allScreens.size()); - int total = 0; - - for (int i = 0; i < ids.length; i++) { - int screenId = allScreens.get(i); - for (int y = 0; y < ids[i].length; y++) { - for (int x = 0; x < ids[i][y].length; x++) { - int id = ids[i][y][x]; - - Cursor c = mProviderRule.getResolver().query( - LauncherSettings.Favorites.CONTENT_URI, - new String[]{LauncherSettings.Favorites._ID}, - "container=-100 and screen=" + screenId + - " and cellX=" + x + " and cellY=" + y, null, null, null); - if (id == -1) { - assertEquals(0, c.getCount()); - } else { - assertEquals(1, c.getCount()); - c.moveToNext(); - assertEquals(String.format("Failed to verify item at %d %d, %d", i, y, x), - id, c.getLong(0)); - total++; - } - c.close(); - } - } - } - - // Verify that not other entry exist in the DB. - Cursor c = mProviderRule.getResolver().query(LauncherSettings.Favorites.CONTENT_URI, - new String[]{LauncherSettings.Favorites._ID}, - "container=-100", null, null, null); - assertEquals(total, c.getCount()); - c.close(); - } - - /** - * Adds a dummy item in the DB. - * @param type {@link #APPLICATION} or {@link #SHORTCUT} or >= 2 for - * folder (where the type represents the number of items in the folder). - */ - private int addItem(int type, int screen, int container, int x, int y) throws Exception { - int id = LauncherSettings.Settings.call(mProviderRule.getResolver(), - LauncherSettings.Settings.METHOD_NEW_ITEM_ID) - .getInt(LauncherSettings.Settings.EXTRA_VALUE); - - ContentValues values = new ContentValues(); - values.put(LauncherSettings.Favorites._ID, id); - values.put(LauncherSettings.Favorites.CONTAINER, container); - values.put(LauncherSettings.Favorites.SCREEN, screen); - values.put(LauncherSettings.Favorites.CELLX, x); - values.put(LauncherSettings.Favorites.CELLY, y); - values.put(LauncherSettings.Favorites.SPANX, 1); - values.put(LauncherSettings.Favorites.SPANY, 1); - - if (type == APPLICATION || type == SHORTCUT) { - values.put(LauncherSettings.Favorites.ITEM_TYPE, type); - values.put(LauncherSettings.Favorites.INTENT, VALID_INTENT); - } else { - values.put(LauncherSettings.Favorites.ITEM_TYPE, - LauncherSettings.Favorites.ITEM_TYPE_FOLDER); - // Add folder items. - for (int i = 0; i < type; i++) { - addItem(APPLICATION, 0, id, 0, 0); - } - } - - mProviderRule.getResolver().insert(LauncherSettings.Favorites.CONTENT_URI, values); - return id; - } - - @Test - public void testMultiStepMigration_small_to_large() throws Exception { - MultiStepMigrationTaskVerifier verifier = new MultiStepMigrationTaskVerifier(); - verifier.migrate(new Point(3, 3), new Point(5, 5)); - verifier.assertCompleted(); - } - - @Test - public void testMultiStepMigration_large_to_small() throws Exception { - MultiStepMigrationTaskVerifier verifier = new MultiStepMigrationTaskVerifier( - 5, 5, 4, 4, - 4, 4, 3, 4 - ); - verifier.migrate(new Point(5, 5), new Point(3, 4)); - verifier.assertCompleted(); - } - - @Test - public void testMultiStepMigration_zig_zag() throws Exception { - MultiStepMigrationTaskVerifier verifier = new MultiStepMigrationTaskVerifier( - 5, 7, 4, 7, - 4, 7, 3, 7 - ); - verifier.migrate(new Point(5, 5), new Point(3, 7)); - verifier.assertCompleted(); - } - - private static class MultiStepMigrationTaskVerifier extends MultiStepMigrationTask { - - private final LinkedList<Point> mPoints; - - public MultiStepMigrationTaskVerifier(int... points) { - super(null, null); - - mPoints = new LinkedList<>(); - for (int i = 0; i < points.length; i += 2) { - mPoints.add(new Point(points[i], points[i + 1])); - } - } - - @Override - protected boolean runStepTask(Point sourceSize, Point nextSize) throws Exception { - assertEquals(sourceSize, mPoints.poll()); - assertEquals(nextSize, mPoints.poll()); - return false; - } - - public void assertCompleted() { - assertTrue(mPoints.isEmpty()); - } - } -} diff --git a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java b/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java deleted file mode 100644 index 25100dc3d..000000000 --- a/tests/src/com/android/launcher3/model/PackageInstallStateChangedTaskTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.android.launcher3.model; - -import static org.junit.Assert.assertEquals; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.launcher3.ItemInfo; -import com.android.launcher3.LauncherAppWidgetInfo; -import com.android.launcher3.ShortcutInfo; -import com.android.launcher3.compat.PackageInstallerCompat; -import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.Arrays; -import java.util.HashSet; - -/** - * Tests for {@link PackageInstallStateChangedTask} - */ -@SmallTest -@RunWith(AndroidJUnit4.class) -public class PackageInstallStateChangedTaskTest extends BaseModelUpdateTaskTestCase { - - @Before - public void initData() throws Exception { - initializeData("package_install_state_change_task_data"); - } - - private PackageInstallStateChangedTask newTask(String pkg, int progress) { - int state = PackageInstallerCompat.STATUS_INSTALLING; - PackageInstallInfo installInfo = new PackageInstallInfo(pkg, state, progress); - return new PackageInstallStateChangedTask(installInfo); - } - - @Test - public void testSessionUpdate_ignore_installed() throws Exception { - executeTaskForTest(newTask("app1", 30)); - - // No shortcuts were updated - verifyProgressUpdate(0); - } - - @Test - public void testSessionUpdate_shortcuts_updated() throws Exception { - executeTaskForTest(newTask("app3", 30)); - - verifyProgressUpdate(30, 5, 6, 7); - } - - @Test - public void testSessionUpdate_widgets_updated() throws Exception { - executeTaskForTest(newTask("app4", 30)); - - verifyProgressUpdate(30, 8, 9); - } - - private void verifyProgressUpdate(int progress, Integer... idsUpdated) { - HashSet<Integer> updates = new HashSet<>(Arrays.asList(idsUpdated)); - for (ItemInfo info : bgDataModel.itemsIdMap) { - if (info instanceof ShortcutInfo) { - assertEquals(updates.contains(info.id) ? progress: 0, - ((ShortcutInfo) info).getInstallProgress()); - } else { - assertEquals(updates.contains(info.id) ? progress: -1, - ((LauncherAppWidgetInfo) info).installProgress); - } - } - } -} |