Commit d4a42b6a authored by Sam Maier's avatar Sam Maier Committed by Commit Bot

Blacklisting unfinished Activities in tests from blocking on finish

Bug: 939148
Change-Id: If82c99bfdf0834589a818591502928212ad35e34
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1508694
Commit-Queue: Sam Maier <smaier@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Auto-Submit: Sam Maier <smaier@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#638612}
parent 6312e222
......@@ -14,6 +14,9 @@ import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.CallbackHelper;
import java.util.Collections;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.TimeoutException;
/**
......@@ -22,6 +25,21 @@ import java.util.concurrent.TimeoutException;
*/
public class DestroyActivitiesRule extends ExternalResource {
private static final String TAG = "DestroyActivities";
private final Set<Activity> mBlacklistedActivities =
Collections.newSetFromMap(new WeakHashMap<>());
private boolean allActivitiesDestroyedOrBlacklisted() {
if (ApplicationStatus.isEveryActivityDestroyed()) {
return true;
}
for (Activity a : ApplicationStatus.getRunningActivities()) {
if (!mBlacklistedActivities.contains(a)) {
return false;
}
}
return true;
}
@Override
public void after() {
if (!ApplicationStatus.isInitialized()) {
......@@ -34,7 +52,7 @@ public class DestroyActivitiesRule extends ExternalResource {
public void onActivityStateChange(Activity activity, int newState) {
switch (newState) {
case ActivityState.DESTROYED:
if (ApplicationStatus.isEveryActivityDestroyed()) {
if (allActivitiesDestroyedOrBlacklisted()) {
allDestroyedCalledback.notifyCalled();
ApplicationStatus.unregisterActivityStateListener(this);
}
......@@ -51,13 +69,13 @@ public class DestroyActivitiesRule extends ExternalResource {
};
ThreadUtils.runOnUiThread(() -> {
if (ApplicationStatus.isEveryActivityDestroyed()) {
if (allActivitiesDestroyedOrBlacklisted()) {
allDestroyedCalledback.notifyCalled();
} else {
ApplicationStatus.registerStateListenerForAllActivities(activityStateListener);
}
for (Activity a : ApplicationStatus.getRunningActivities()) {
if (!a.isFinishing()) {
if (!a.isFinishing() && !mBlacklistedActivities.contains(a)) {
a.finish();
}
}
......@@ -70,9 +88,8 @@ public class DestroyActivitiesRule extends ExternalResource {
Log.w(TAG, "Activity failed to be destroyed after a test");
ThreadUtils.runOnUiThreadBlocking(() -> {
for (Activity a : ApplicationStatus.getRunningActivities()) {
ApplicationStatus.onStateChangeForTesting(a, ActivityState.DESTROYED);
}
mBlacklistedActivities.addAll(ApplicationStatus.getRunningActivities());
// Make sure subsequent tests don't have these notifications firing.
ApplicationStatus.unregisterActivityStateListener(activityStateListener);
});
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment