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; ...@@ -14,6 +14,9 @@ import org.chromium.base.Log;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CallbackHelper;
import java.util.Collections;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
/** /**
...@@ -22,6 +25,21 @@ import java.util.concurrent.TimeoutException; ...@@ -22,6 +25,21 @@ import java.util.concurrent.TimeoutException;
*/ */
public class DestroyActivitiesRule extends ExternalResource { public class DestroyActivitiesRule extends ExternalResource {
private static final String TAG = "DestroyActivities"; 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 @Override
public void after() { public void after() {
if (!ApplicationStatus.isInitialized()) { if (!ApplicationStatus.isInitialized()) {
...@@ -34,7 +52,7 @@ public class DestroyActivitiesRule extends ExternalResource { ...@@ -34,7 +52,7 @@ public class DestroyActivitiesRule extends ExternalResource {
public void onActivityStateChange(Activity activity, int newState) { public void onActivityStateChange(Activity activity, int newState) {
switch (newState) { switch (newState) {
case ActivityState.DESTROYED: case ActivityState.DESTROYED:
if (ApplicationStatus.isEveryActivityDestroyed()) { if (allActivitiesDestroyedOrBlacklisted()) {
allDestroyedCalledback.notifyCalled(); allDestroyedCalledback.notifyCalled();
ApplicationStatus.unregisterActivityStateListener(this); ApplicationStatus.unregisterActivityStateListener(this);
} }
...@@ -51,13 +69,13 @@ public class DestroyActivitiesRule extends ExternalResource { ...@@ -51,13 +69,13 @@ public class DestroyActivitiesRule extends ExternalResource {
}; };
ThreadUtils.runOnUiThread(() -> { ThreadUtils.runOnUiThread(() -> {
if (ApplicationStatus.isEveryActivityDestroyed()) { if (allActivitiesDestroyedOrBlacklisted()) {
allDestroyedCalledback.notifyCalled(); allDestroyedCalledback.notifyCalled();
} else { } else {
ApplicationStatus.registerStateListenerForAllActivities(activityStateListener); ApplicationStatus.registerStateListenerForAllActivities(activityStateListener);
} }
for (Activity a : ApplicationStatus.getRunningActivities()) { for (Activity a : ApplicationStatus.getRunningActivities()) {
if (!a.isFinishing()) { if (!a.isFinishing() && !mBlacklistedActivities.contains(a)) {
a.finish(); a.finish();
} }
} }
...@@ -70,9 +88,8 @@ public class DestroyActivitiesRule extends ExternalResource { ...@@ -70,9 +88,8 @@ public class DestroyActivitiesRule extends ExternalResource {
Log.w(TAG, "Activity failed to be destroyed after a test"); Log.w(TAG, "Activity failed to be destroyed after a test");
ThreadUtils.runOnUiThreadBlocking(() -> { ThreadUtils.runOnUiThreadBlocking(() -> {
for (Activity a : ApplicationStatus.getRunningActivities()) { mBlacklistedActivities.addAll(ApplicationStatus.getRunningActivities());
ApplicationStatus.onStateChangeForTesting(a, ActivityState.DESTROYED);
}
// Make sure subsequent tests don't have these notifications firing. // Make sure subsequent tests don't have these notifications firing.
ApplicationStatus.unregisterActivityStateListener(activityStateListener); 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