0

Stop shadowing ApplicationStatus in MultiInstanceManagerApi31UnitTest.

Bug: 406581076
Change-Id: I4cfd117ca99184f881946d08b34e26100b37a692
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6397502
Commit-Queue: Sky Malice <skym@chromium.org>
Reviewed-by: Aishwarya Rajesh <aishwaryarj@google.com>
Cr-Commit-Position: refs/heads/main@{#1439388}
This commit is contained in:
Sky Malice 2025-03-28 07:23:03 -07:00 committed by Chromium LUCI CQ
parent 692efd1c0f
commit 730a98cfbc

@ -31,7 +31,6 @@ import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Pair;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@ -48,12 +47,9 @@ import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.stubbing.Answer;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.chromium.base.ActivityState;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.ContextUtils;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier;
@ -67,7 +63,6 @@ import org.chromium.chrome.browser.app.tabmodel.TabModelOrchestrator;
import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.multiwindow.MultiInstanceManagerApi31UnitTest.ShadowApplicationStatus;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
import org.chromium.chrome.browser.profiles.Profile;
@ -108,38 +103,8 @@ import java.util.Set;
/** Unit tests for {@link MultiInstanceManagerApi31}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(
manifest = Config.NONE,
shadows = {ShadowApplicationStatus.class})
@Config(manifest = Config.NONE)
public class MultiInstanceManagerApi31UnitTest {
/** Shadows {@link ApplicationStatus} class for testing. */
@Implements(ApplicationStatus.class)
public static class ShadowApplicationStatus {
private static final SparseArray<Activity> sRunningActivities = new SparseArray<>();
public static void addRunningActivity(int instanceId, Activity activity) {
sRunningActivities.put(instanceId, activity);
}
public static void deleteRunningActivity(int instanceId) {
sRunningActivities.delete(instanceId);
}
public static void removeRunningActivity(Activity activity) {
int index = sRunningActivities.indexOfValue(activity);
if (index >= 0) sRunningActivities.removeAt(index);
}
@Implementation
public static List<Activity> getRunningActivities() {
List<Activity> result = new ArrayList<>();
for (int i = 0; i < sRunningActivities.size(); ++i) {
result.add(sRunningActivities.valueAt(i));
}
return result;
}
}
private static final int INVALID_INSTANCE_ID = MultiInstanceManagerApi31.INVALID_INSTANCE_ID;
private static final int INSTANCE_ID_1 = 1;
private static final int INSTANCE_ID_2 = 2;
@ -257,8 +222,8 @@ public class MultiInstanceManagerApi31UnitTest {
private void createInstance(int instanceId, Activity activity) {
MultiInstanceManagerApi31.writeUrl(instanceId, "https://id-" + instanceId + ".com");
ShadowApplicationStatus.addRunningActivity(instanceId, activity);
updateTasks(instanceId, activity);
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED);
updateTasksWithoutDestroyingActivity(instanceId, activity);
addInstanceInfo(instanceId, activity.getTaskId());
}
@ -266,11 +231,6 @@ public class MultiInstanceManagerApi31UnitTest {
mAdjacentInstance = activity;
}
// Called when activity instance is destroyed but its task remains alive.
private void closeInstanceOnly(int instanceId) {
ShadowApplicationStatus.deleteRunningActivity(instanceId);
}
private void addInstanceInfo(int instanceId, int taskId) {
if (mTestBuildInstancesList) {
int numberOfInstances = mTestInstanceInfos.size();
@ -291,15 +251,6 @@ public class MultiInstanceManagerApi31UnitTest {
}
}
private void updateTasks(int instanceId, Activity activity) {
if (instanceId == INVALID_INSTANCE_ID) {
mAppTaskIds.remove(activity.getTaskId());
ShadowApplicationStatus.removeRunningActivity(activity);
} else {
mAppTaskIds.add(activity.getTaskId());
}
}
private void updateTasksWithoutDestroyingActivity(int instanceId, Activity activity) {
if (instanceId == INVALID_INSTANCE_ID) {
mAppTaskIds.remove(activity.getTaskId());
@ -424,7 +375,6 @@ public class MultiInstanceManagerApi31UnitTest {
mMenuOrKeyboardActionController,
mDesktopWindowStateManagerSupplier));
ApplicationStatus.setCachingEnabled(true);
ApplicationStatus.onStateChangeForTesting(mCurrentActivity, ActivityState.CREATED);
ChromeSharedPreferences.getInstance()
.removeKeysWithPrefix(ChromePreferenceKeys.MULTI_INSTANCE_TASK_MAP);
@ -699,6 +649,7 @@ public class MultiInstanceManagerApi31UnitTest {
when(mTab3.getOriginalUrl()).thenReturn(URL3);
when(mTab3.getTitle()).thenReturn(TITLE3);
ApplicationStatus.onStateChangeForTesting(mCurrentActivity, ActivityState.CREATED);
MultiInstanceManagerApi31 multiInstanceManager =
new MultiInstanceManagerApi31(
mCurrentActivity,
@ -783,6 +734,7 @@ public class MultiInstanceManagerApi31UnitTest {
Answer normalActiveTab = invocation -> mNormalTabCount > 0 ? 0 : TabModel.INVALID_TAB_INDEX;
when(mNormalTabModel.index()).then(normalActiveTab);
ApplicationStatus.onStateChangeForTesting(mCurrentActivity, ActivityState.CREATED);
MultiInstanceManagerApi31 multiInstanceManager =
new MultiInstanceManagerApi31(
mCurrentActivity,
@ -867,6 +819,7 @@ public class MultiInstanceManagerApi31UnitTest {
when(mTab2.getOriginalUrl()).thenReturn(URL2);
when(mTab2.getTitle()).thenReturn(TITLE2);
ApplicationStatus.onStateChangeForTesting(mCurrentActivity, ActivityState.CREATED);
MultiInstanceManagerApi31 multiInstanceManager =
new MultiInstanceManagerApi31(
mCurrentActivity,
@ -1081,7 +1034,8 @@ public class MultiInstanceManagerApi31UnitTest {
// Simulate a task is removed by swiping it away. Both the task and the associated activity
// get destroyed. Task map gets updated. The persistent state file remains intact.
private void removeTaskOnRecentsScreen(Activity activityForTask) {
mMultiInstanceManager.updateTasks(INVALID_INSTANCE_ID, activityForTask);
mMultiInstanceManager.updateTasksWithoutDestroyingActivity(
INVALID_INSTANCE_ID, activityForTask);
destroyActivity(activityForTask);
}
@ -1091,15 +1045,12 @@ public class MultiInstanceManagerApi31UnitTest {
}
// Simulate only an activity gets destroyed, leaving everything intact.
private void closeInstanceOnly(Activity activity, int instanceId) {
mMultiInstanceManager.closeInstanceOnly(instanceId);
private void closeInstanceOnly(Activity activity, int ignored) {
destroyActivity(activity);
}
private void destroyActivity(Activity activity) {
ActivityStateListener stateListener =
(ActivityStateListener) TabWindowManagerSingleton.getInstance();
stateListener.onActivityStateChange(activity, ActivityState.DESTROYED);
ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED);
}
@Test
@ -1457,7 +1408,6 @@ public class MultiInstanceManagerApi31UnitTest {
if (!isActivityAlive) {
// Force destruction of |mTabbedActivityTask63|.
destroyActivity(mTabbedActivityTask63);
ShadowApplicationStatus.removeRunningActivity(mTabbedActivityTask63);
}
// Try to restore the instance in task |taskId63|, from |mTabbedActivityTask62|.