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

Commit 79091b6e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fixing some robolectric tests" into ub-launcher3-master

parents 4607c34d cf845f0d
Loading
Loading
Loading
Loading
+38 −55
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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());
        }
    }
}
+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}
 */
@@ -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(),
@@ -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
@@ -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!"));
@@ -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();
@@ -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!"));
+10 −3
Original line number Diff line number Diff line
@@ -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;

@@ -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.
 */
@@ -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);
@@ -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());
        }
    }
}
+0 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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"));

@@ -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"));

+1 −1
Original line number Diff line number Diff line
@@ -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