Loading robolectric_tests/src/com/android/launcher3/config/FlagOverrideRule.java +38 −55 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ import com.android.launcher3.uioverrides.TogglableFlag; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.robolectric.RuntimeEnvironment; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; Loading @@ -15,6 +14,10 @@ import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; /** * Test rule that makes overriding flags in Robolectric tests easier. This rule clears all flags Loading Loading @@ -52,68 +55,48 @@ public final class FlagOverrideRule implements TestRule { boolean value(); } private boolean ruleInProgress; @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { FeatureFlags.initialize(RuntimeEnvironment.application.getApplicationContext()); ruleInProgress = true; try { clearOverrides(); applyAnnotationOverrides(description); base.evaluate(); } finally { ruleInProgress = false; clearOverrides(); } } }; return new MyStatement(base, description); } private void override(BaseTogglableFlag flag, boolean newValue) { if (!ruleInProgress) { throw new IllegalStateException( "Rule isn't in progress. Did you remember to mark it with @Rule?"); } flag.setForTests(newValue); private class MyStatement extends Statement { private final Statement mBase; private final Description mDescription; MyStatement(Statement base, Description description) { mBase = base; mDescription = description; } private void applyAnnotationOverrides(Description description) { for (Annotation annotation : description.getAnnotations()) { @Override public void evaluate() throws Throwable { Map<String, BaseTogglableFlag> allFlags = FeatureFlags.getTogglableFlags().stream() .collect(Collectors.toMap(TogglableFlag::getKey, Function.identity())); HashMap<BaseTogglableFlag, Boolean> changedValues = new HashMap<>(); FlagOverride[] overrides = new FlagOverride[0]; try { for (Annotation annotation : mDescription.getAnnotations()) { if (annotation.annotationType() == FlagOverride.class) { applyAnnotation((FlagOverride) annotation); overrides = new FlagOverride[] { (FlagOverride) annotation }; } else if (annotation.annotationType() == FlagOverrides.class) { // Note: this branch is hit if the annotation is repeated for (FlagOverride flagOverride : ((FlagOverrides) annotation).value()) { applyAnnotation(flagOverride); } } } } private void applyAnnotation(FlagOverride flagOverride) { boolean found = false; for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { if (flag.getKey().equals(flagOverride.key())) { override(flag, flagOverride.value()); found = true; break; overrides = ((FlagOverrides) annotation).value(); } } if (!found) { throw new IllegalStateException("Flag " + flagOverride.key() + " not found"); for (FlagOverride override : overrides) { BaseTogglableFlag flag = allFlags.get(override.key()); changedValues.put(flag, flag.get()); flag.setForTests(override.value()); } mBase.evaluate(); } finally { // Clear the values changedValues.forEach(BaseTogglableFlag::setForTests); } /** * Resets all flags to their default values. */ private void clearOverrides() { for (BaseTogglableFlag flag : FeatureFlags.getTogglableFlags()) { flag.setForTests(flag.getDefaultValue()); } } } robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java +22 −9 Original line number Diff line number Diff line package com.android.launcher3.logging; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.util.Scheduler; import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Calendar; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * Tests for {@link FileLog} */ Loading @@ -22,9 +24,10 @@ import static org.junit.Assert.assertTrue; public class FileLogTest { private File mTempDir; private boolean mTestActive; @Before public void setUp() throws Exception { public void setUp() { int count = 0; do { mTempDir = new File(RuntimeEnvironment.application.getCacheDir(), Loading @@ -32,14 +35,24 @@ public class FileLogTest { } while (!mTempDir.mkdir()); FileLog.setDir(mTempDir); mTestActive = true; Scheduler scheduler = Shadows.shadowOf(FileLog.getHandler().getLooper()).getScheduler(); new Thread(() -> { while (mTestActive) { scheduler.advanceToLastPostedRunnable(); } }).start(); } @After public void tearDown() throws Exception { public void tearDown() { // Clear existing logs new File(mTempDir, "log-0").delete(); new File(mTempDir, "log-1").delete(); mTempDir.delete(); mTestActive = false; } @Test Loading @@ -49,12 +62,12 @@ public class FileLogTest { } FileLog.print("Testing", "hoolalala"); StringWriter writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("hoolalala")); FileLog.print("Testing", "abracadabra", new Exception("cat! cat!")); writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("abracadabra")); // Exception is also printed assertTrue(writer.toString().contains("cat! cat!")); Loading @@ -70,7 +83,7 @@ public class FileLogTest { } FileLog.print("Testing", "hoolalala"); StringWriter writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("hoolalala")); Calendar threeDaysAgo = Calendar.getInstance(); Loading @@ -80,7 +93,7 @@ public class FileLogTest { FileLog.print("Testing", "abracadabra", new Exception("cat! cat!")); writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("abracadabra")); // Exception is also printed assertTrue(writer.toString().contains("cat! cat!")); Loading robolectric_tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +10 −3 Original line number Diff line number Diff line Loading @@ -15,17 +15,20 @@ import android.graphics.Color; import android.os.Process; import android.os.UserHandle; import androidx.annotation.NonNull; import com.android.launcher3.AppFilter; import com.android.launcher3.AppInfo; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.LauncherModel.ModelUpdateTask; import com.android.launcher3.LauncherProvider; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.IconCache; import com.android.launcher3.icons.cache.CachingLogic; import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.TestLauncherProvider; Loading @@ -44,8 +47,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.function.Supplier; import androidx.annotation.NonNull; /** * Base class for writing tests for Model update tasks. */ Loading Loading @@ -79,6 +80,7 @@ public class BaseModelUpdateTaskTestCase { model = mock(LauncherModel.class); modelWriter = mock(ModelWriter.class); LauncherAppState.INSTANCE.initializeForTesting(appState); when(appState.getModel()).thenReturn(model); when(model.getWriter(anyBoolean(), anyBoolean())).thenReturn(modelWriter); when(model.getCallback()).thenReturn(callbacks); Loading Loading @@ -216,5 +218,10 @@ public class BaseModelUpdateTaskTestCase { public Bitmap newIcon() { return Bitmap.createBitmap(1, 1, Config.ARGB_8888); } @Override public synchronized BitmapInfo getDefaultIcon(UserHandle user) { return BitmapInfo.fromBitmap(newIcon()); } } } robolectric_tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +0 −4 Original line number Diff line number Diff line Loading @@ -11,7 +11,6 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.WorkspaceItemInfo; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; Loading Loading @@ -41,7 +40,6 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } @Test @Ignore("This test fails with resource errors") // b/131115553 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) { Loading @@ -66,7 +64,6 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } @Test @Ignore("This test fails with resource errors") // b/131115553 public void testSessionUpdate_ignores_normal_apps() throws Exception { executeTaskForTest(newTask(CacheDataUpdatedTask.OP_SESSION_UPDATE, "app1")); Loading @@ -75,7 +72,6 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } @Test @Ignore("This test fails with resource errors") // b/131115553 public void testSessionUpdate_updates_pending_apps() throws Exception { executeTaskForTest(newTask(CacheDataUpdatedTask.OP_SESSION_UPDATE, "app3")); Loading src/com/android/launcher3/LauncherAppState.java +1 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ public class LauncherAppState { public static final String ACTION_FORCE_ROLOAD = "force-reload-launcher"; // We do not need any synchronization for this variable as its only written on UI thread. private static final MainThreadInitializedObject<LauncherAppState> INSTANCE = public static final MainThreadInitializedObject<LauncherAppState> INSTANCE = new MainThreadInitializedObject<>(LauncherAppState::new); private final Context mContext; Loading Loading
robolectric_tests/src/com/android/launcher3/config/FlagOverrideRule.java +38 −55 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ import com.android.launcher3.uioverrides.TogglableFlag; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.robolectric.RuntimeEnvironment; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; Loading @@ -15,6 +14,10 @@ import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.HashMap; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; /** * Test rule that makes overriding flags in Robolectric tests easier. This rule clears all flags Loading Loading @@ -52,68 +55,48 @@ public final class FlagOverrideRule implements TestRule { boolean value(); } private boolean ruleInProgress; @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { FeatureFlags.initialize(RuntimeEnvironment.application.getApplicationContext()); ruleInProgress = true; try { clearOverrides(); applyAnnotationOverrides(description); base.evaluate(); } finally { ruleInProgress = false; clearOverrides(); } } }; return new MyStatement(base, description); } private void override(BaseTogglableFlag flag, boolean newValue) { if (!ruleInProgress) { throw new IllegalStateException( "Rule isn't in progress. Did you remember to mark it with @Rule?"); } flag.setForTests(newValue); private class MyStatement extends Statement { private final Statement mBase; private final Description mDescription; MyStatement(Statement base, Description description) { mBase = base; mDescription = description; } private void applyAnnotationOverrides(Description description) { for (Annotation annotation : description.getAnnotations()) { @Override public void evaluate() throws Throwable { Map<String, BaseTogglableFlag> allFlags = FeatureFlags.getTogglableFlags().stream() .collect(Collectors.toMap(TogglableFlag::getKey, Function.identity())); HashMap<BaseTogglableFlag, Boolean> changedValues = new HashMap<>(); FlagOverride[] overrides = new FlagOverride[0]; try { for (Annotation annotation : mDescription.getAnnotations()) { if (annotation.annotationType() == FlagOverride.class) { applyAnnotation((FlagOverride) annotation); overrides = new FlagOverride[] { (FlagOverride) annotation }; } else if (annotation.annotationType() == FlagOverrides.class) { // Note: this branch is hit if the annotation is repeated for (FlagOverride flagOverride : ((FlagOverrides) annotation).value()) { applyAnnotation(flagOverride); } } } } private void applyAnnotation(FlagOverride flagOverride) { boolean found = false; for (TogglableFlag flag : FeatureFlags.getTogglableFlags()) { if (flag.getKey().equals(flagOverride.key())) { override(flag, flagOverride.value()); found = true; break; overrides = ((FlagOverrides) annotation).value(); } } if (!found) { throw new IllegalStateException("Flag " + flagOverride.key() + " not found"); for (FlagOverride override : overrides) { BaseTogglableFlag flag = allFlags.get(override.key()); changedValues.put(flag, flag.get()); flag.setForTests(override.value()); } mBase.evaluate(); } finally { // Clear the values changedValues.forEach(BaseTogglableFlag::setForTests); } /** * Resets all flags to their default values. */ private void clearOverrides() { for (BaseTogglableFlag flag : FeatureFlags.getTogglableFlags()) { flag.setForTests(flag.getDefaultValue()); } } }
robolectric_tests/src/com/android/launcher3/logging/FileLogTest.java +22 −9 Original line number Diff line number Diff line package com.android.launcher3.logging; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.util.Scheduler; import java.io.File; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Calendar; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * Tests for {@link FileLog} */ Loading @@ -22,9 +24,10 @@ import static org.junit.Assert.assertTrue; public class FileLogTest { private File mTempDir; private boolean mTestActive; @Before public void setUp() throws Exception { public void setUp() { int count = 0; do { mTempDir = new File(RuntimeEnvironment.application.getCacheDir(), Loading @@ -32,14 +35,24 @@ public class FileLogTest { } while (!mTempDir.mkdir()); FileLog.setDir(mTempDir); mTestActive = true; Scheduler scheduler = Shadows.shadowOf(FileLog.getHandler().getLooper()).getScheduler(); new Thread(() -> { while (mTestActive) { scheduler.advanceToLastPostedRunnable(); } }).start(); } @After public void tearDown() throws Exception { public void tearDown() { // Clear existing logs new File(mTempDir, "log-0").delete(); new File(mTempDir, "log-1").delete(); mTempDir.delete(); mTestActive = false; } @Test Loading @@ -49,12 +62,12 @@ public class FileLogTest { } FileLog.print("Testing", "hoolalala"); StringWriter writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("hoolalala")); FileLog.print("Testing", "abracadabra", new Exception("cat! cat!")); writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("abracadabra")); // Exception is also printed assertTrue(writer.toString().contains("cat! cat!")); Loading @@ -70,7 +83,7 @@ public class FileLogTest { } FileLog.print("Testing", "hoolalala"); StringWriter writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("hoolalala")); Calendar threeDaysAgo = Calendar.getInstance(); Loading @@ -80,7 +93,7 @@ public class FileLogTest { FileLog.print("Testing", "abracadabra", new Exception("cat! cat!")); writer = new StringWriter(); FileLog.flushAll(new PrintWriter(writer)); assertTrue(FileLog.flushAll(new PrintWriter(writer))); assertTrue(writer.toString().contains("abracadabra")); // Exception is also printed assertTrue(writer.toString().contains("cat! cat!")); Loading
robolectric_tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +10 −3 Original line number Diff line number Diff line Loading @@ -15,17 +15,20 @@ import android.graphics.Color; import android.os.Process; import android.os.UserHandle; import androidx.annotation.NonNull; import com.android.launcher3.AppFilter; import com.android.launcher3.AppInfo; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.LauncherModel.ModelUpdateTask; import com.android.launcher3.LauncherProvider; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.icons.IconCache; import com.android.launcher3.icons.cache.CachingLogic; import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.TestLauncherProvider; Loading @@ -44,8 +47,6 @@ import java.util.List; import java.util.concurrent.Executor; import java.util.function.Supplier; import androidx.annotation.NonNull; /** * Base class for writing tests for Model update tasks. */ Loading Loading @@ -79,6 +80,7 @@ public class BaseModelUpdateTaskTestCase { model = mock(LauncherModel.class); modelWriter = mock(ModelWriter.class); LauncherAppState.INSTANCE.initializeForTesting(appState); when(appState.getModel()).thenReturn(model); when(model.getWriter(anyBoolean(), anyBoolean())).thenReturn(modelWriter); when(model.getCallback()).thenReturn(callbacks); Loading Loading @@ -216,5 +218,10 @@ public class BaseModelUpdateTaskTestCase { public Bitmap newIcon() { return Bitmap.createBitmap(1, 1, Config.ARGB_8888); } @Override public synchronized BitmapInfo getDefaultIcon(UserHandle user) { return BitmapInfo.fromBitmap(newIcon()); } } }
robolectric_tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +0 −4 Original line number Diff line number Diff line Loading @@ -11,7 +11,6 @@ import com.android.launcher3.ItemInfo; import com.android.launcher3.WorkspaceItemInfo; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; Loading Loading @@ -41,7 +40,6 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } @Test @Ignore("This test fails with resource errors") // b/131115553 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) { Loading @@ -66,7 +64,6 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } @Test @Ignore("This test fails with resource errors") // b/131115553 public void testSessionUpdate_ignores_normal_apps() throws Exception { executeTaskForTest(newTask(CacheDataUpdatedTask.OP_SESSION_UPDATE, "app1")); Loading @@ -75,7 +72,6 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } @Test @Ignore("This test fails with resource errors") // b/131115553 public void testSessionUpdate_updates_pending_apps() throws Exception { executeTaskForTest(newTask(CacheDataUpdatedTask.OP_SESSION_UPDATE, "app3")); Loading
src/com/android/launcher3/LauncherAppState.java +1 −1 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ public class LauncherAppState { public static final String ACTION_FORCE_ROLOAD = "force-reload-launcher"; // We do not need any synchronization for this variable as its only written on UI thread. private static final MainThreadInitializedObject<LauncherAppState> INSTANCE = public static final MainThreadInitializedObject<LauncherAppState> INSTANCE = new MainThreadInitializedObject<>(LauncherAppState::new); private final Context mContext; Loading