Fixing Robolectic model tests
Some tests were broken because of refactoring in LauncherModel.
Change-Id: I55aa32d75a4d16338796a1b1765717fd72ba4b33
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index 456727c..c724318 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -326,6 +326,8 @@
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
- InteractionJankMonitorWrapper.init(getWindow().getDecorView());
+ if (Utilities.ATLEAST_R) {
+ InteractionJankMonitorWrapper.init(getWindow().getDecorView());
+ }
}
}
diff --git a/robolectric_tests/Android.mk b/robolectric_tests/Android.mk
index 3fa9b0a..836ded5 100644
--- a/robolectric_tests/Android.mk
+++ b/robolectric_tests/Android.mk
@@ -59,4 +59,4 @@
LOCAL_ROBOTEST_TIMEOUT := 36000
-include prebuilts/misc/common/robolectric/4.3.1/run_robotests.mk
+include prebuilts/misc/common/robolectric/4.4/run_robotests.mk
diff --git a/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java b/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java
index b7ba106..2a94d9b 100644
--- a/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java
+++ b/robolectric_tests/src/com/android/launcher3/folder/FolderNameProviderTest.java
@@ -25,16 +25,20 @@
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
+import com.android.launcher3.util.Executors;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.annotation.LooperMode.Mode;
import java.util.ArrayList;
@RunWith(RobolectricTestRunner.class)
+@LooperMode(Mode.PAUSED)
public final class FolderNameProviderTest {
private Context mContext;
private WorkspaceItemInfo mItem1;
@@ -58,18 +62,20 @@
}
@Test
- public void getSuggestedFolderName_workAssignedToEnd() {
+ public void getSuggestedFolderName_workAssignedToEnd() throws Exception {
ArrayList<WorkspaceItemInfo> list = new ArrayList<>();
list.add(mItem1);
list.add(mItem2);
FolderNameInfos nameInfos = new FolderNameInfos();
- new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos);
+ Executors.MODEL_EXECUTOR.submit(() ->
+ new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos)).get();
assertEquals("Work", nameInfos.getLabels()[0]);
nameInfos.setLabel(0, "candidate1", 1.0f);
nameInfos.setLabel(1, "candidate2", 1.0f);
nameInfos.setLabel(2, "candidate3", 1.0f);
- new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos);
+ Executors.MODEL_EXECUTOR.submit(() ->
+ new FolderNameProvider().getSuggestedFolderName(mContext, list, nameInfos)).get();
assertEquals("Work", nameInfos.getLabels()[3]);
assertTrue(nameInfos.hasSuggestions());
assertTrue(nameInfos.hasPrimary());
diff --git a/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java
index c892618..01b23ba 100644
--- a/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java
+++ b/robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java
@@ -9,8 +9,8 @@
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.util.Scheduler;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.annotation.LooperMode.Mode;
import java.io.File;
import java.io.PrintWriter;
@@ -21,11 +21,10 @@
* Tests for {@link FileLog}
*/
@RunWith(RobolectricTestRunner.class)
+@LooperMode(Mode.PAUSED)
public class FileLogTest {
private File mTempDir;
- private boolean mTestActive;
-
@Before
public void setUp() {
int count = 0;
@@ -35,14 +34,6 @@
} while (!mTempDir.mkdir());
FileLog.setDir(mTempDir);
-
- mTestActive = true;
- Scheduler scheduler = Shadows.shadowOf(FileLog.getHandler().getLooper()).getScheduler();
- new Thread(() -> {
- while (mTestActive) {
- scheduler.advanceToLastPostedRunnable();
- }
- }).start();
}
@After
@@ -52,8 +43,6 @@
new File(mTempDir, "log-" + i).delete();
}
mTempDir.delete();
-
- mTestActive = false;
}
@Test
diff --git a/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java b/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java
index 87fe3c0..aab6c25 100644
--- a/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java
+++ b/robolectric_tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java
@@ -30,6 +30,7 @@
import com.android.launcher3.model.BgDataModel.Callbacks;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.shadows.ShadowLooperExecutor;
import com.android.launcher3.util.Executors;
import com.android.launcher3.util.LauncherLayoutBuilder;
import com.android.launcher3.util.LauncherModelHelper;
@@ -43,8 +44,8 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.LooperMode;
import org.robolectric.annotation.LooperMode.Mode;
+import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowPackageManager;
-import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.Arrays;
@@ -74,7 +75,8 @@
// Since robolectric tests run on main thread, we run the loader-UI calls on a temp thread,
// so that we can wait appropriately for the loader to complete.
mTempMainExecutor = new LooperExecutor(createAndStartNewForegroundLooper("tempMain"));
- ReflectionHelpers.setField(mModelHelper.getModel(), "mMainExecutor", mTempMainExecutor);
+ ShadowLooperExecutor sle = Shadow.extract(Executors.MAIN_EXECUTOR);
+ sle.setHandler(mTempMainExecutor.getHandler());
}
@Test
diff --git a/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java b/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java
index baae2a6..e3694ae 100644
--- a/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java
+++ b/robolectric_tests/src/com/android/launcher3/secondarydisplay/SDWorkModeTest.java
@@ -59,8 +59,6 @@
private InvariantDeviceProfile mIdp;
private LauncherModelHelper mModelHelper;
- private LauncherLayoutBuilder mLayoutBuilder;
-
@Before
public void setup() throws Exception {
mModelHelper = new LauncherModelHelper();
@@ -70,7 +68,6 @@
Settings.Global.WINDOW_ANIMATION_SCALE, 0);
mModelHelper.installApp(TEST_PACKAGE);
- mLayoutBuilder = new LauncherLayoutBuilder();
}
@Test
@@ -86,7 +83,7 @@
public void testAllAppsList_workProfile() throws Exception {
ShadowUserManager sum = Shadow.extract(mTargetContext.getSystemService(UserManager.class));
sum.addUser(SYSTEM_USER, "me", FLAG_SYSTEM);
- sum.addUser(WORK_PROFILE_ID, "work", FLAG_PROFILE);
+ sum.addProfile(SYSTEM_USER, WORK_PROFILE_ID, "work", FLAG_PROFILE);
SecondaryDisplayLauncher launcher = loadLauncher();
launcher.showAppDrawer(true);
diff --git a/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java b/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java
index a3b7dc7..57eda7e 100644
--- a/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java
+++ b/robolectric_tests/src/com/android/launcher3/shadows/ShadowLooperExecutor.java
@@ -23,6 +23,8 @@
import android.os.Handler;
+import androidx.annotation.Nullable;
+
import com.android.launcher3.util.LooperExecutor;
import org.robolectric.annotation.Implementation;
@@ -37,8 +39,13 @@
@RealObject private LooperExecutor mRealExecutor;
+ private Handler mOverriddenHandler;
+
@Implementation
protected Handler getHandler() {
+ if (mOverriddenHandler != null) {
+ return mOverriddenHandler;
+ }
Handler handler = directlyOn(mRealExecutor, LooperExecutor.class, "getHandler");
Thread thread = handler.getLooper().getThread();
if (!thread.isAlive()) {
@@ -49,4 +56,8 @@
}
return directlyOn(mRealExecutor, LooperExecutor.class, "getHandler");
}
+
+ public void setHandler(@Nullable Handler handler) {
+ mOverriddenHandler = handler;
+ }
}
diff --git a/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java b/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java
index f2b3071..849f98b 100644
--- a/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java
+++ b/robolectric_tests/src/com/android/launcher3/util/LauncherModelHelper.java
@@ -48,10 +48,12 @@
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.pm.UserCache;
+import com.android.launcher3.shadows.ShadowLooperExecutor;
import org.mockito.ArgumentCaptor;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowContentResolver;
import org.robolectric.shadows.ShadowPackageManager;
import org.robolectric.util.ReflectionHelpers;
@@ -403,14 +405,16 @@
public void loadModelSync() throws ExecutionException, InterruptedException {
// Since robolectric tests run on main thread, we run the loader-UI calls on a temp thread,
// so that we can wait appropriately for the loader to complete.
- ReflectionHelpers.setField(getModel(), "mMainExecutor", Executors.UI_HELPER_EXECUTOR);
+ ShadowLooperExecutor sle = Shadow.extract(Executors.MAIN_EXECUTOR);
+ sle.setHandler(Executors.UI_HELPER_EXECUTOR.getHandler());
Callbacks mockCb = mock(Callbacks.class);
getModel().addCallbacksAndLoad(mockCb);
Executors.MODEL_EXECUTOR.submit(() -> { }).get();
Executors.UI_HELPER_EXECUTOR.submit(() -> { }).get();
- ReflectionHelpers.setField(getModel(), "mMainExecutor", Executors.MAIN_EXECUTOR);
+
+ sle.setHandler(null);
getModel().removeCallbacks(mockCb);
}