Commit 9cba33b1 authored by Ted Choc's avatar Ted Choc Committed by Commit Bot

Add additional logging in SearchActivityTest to diagnose flakes.

This removes the similar Activity launching logic in SearchActivityTest
and replaces it with the same functionality in ActivityUtils.  In
addition, it adds additional logs in ActivityUtils on failure to
attempt to help figure out what the state of the system is.

BUG=778239

Change-Id: Ic2aac185958044a8ba733213ac8daf5a4c8aa618
Reviewed-on: https://chromium-review.googlesource.com/738843
Commit-Queue: Ted Choc <tedchoc@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#513016}
parent fde92c70
...@@ -45,6 +45,7 @@ import org.chromium.chrome.browser.searchwidget.SearchActivity.SearchActivityDel ...@@ -45,6 +45,7 @@ import org.chromium.chrome.browser.searchwidget.SearchActivity.SearchActivityDel
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.MultiActivityTestRule; import org.chromium.chrome.test.MultiActivityTestRule;
import org.chromium.chrome.test.util.ActivityUtils;
import org.chromium.chrome.test.util.OmniboxTestUtils; import org.chromium.chrome.test.util.OmniboxTestUtils;
import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.CriteriaHelper;
...@@ -54,6 +55,7 @@ import org.chromium.content_public.common.ContentUrlConstants; ...@@ -54,6 +55,7 @@ import org.chromium.content_public.common.ContentUrlConstants;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.TimeoutException;
/** /**
* Tests the {@link SearchActivity}. * Tests the {@link SearchActivity}.
...@@ -192,15 +194,12 @@ public class SearchActivityTest { ...@@ -192,15 +194,12 @@ public class SearchActivityTest {
// Monitor for ChromeTabbedActivity. // Monitor for ChromeTabbedActivity.
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
ActivityMonitor browserMonitor = waitForChromeTabbedActivityToStart(() -> {
new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false);
instrumentation.addMonitor(browserMonitor);
// Type in a URL that should get kicked to ChromeTabbedActivity. // Type in a URL that should get kicked to ChromeTabbedActivity.
setUrlBarText(searchActivity, url); setUrlBarText(searchActivity, url);
final UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar); final UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar);
KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER); KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER);
waitForChromeTabbedActivityToStart(browserMonitor, url); }, url);
} }
@Test @Test
...@@ -235,15 +234,12 @@ public class SearchActivityTest { ...@@ -235,15 +234,12 @@ public class SearchActivityTest {
R.id.search_location_bar); R.id.search_location_bar);
OmniboxTestUtils.waitForOmniboxSuggestions(locationBar); OmniboxTestUtils.waitForOmniboxSuggestions(locationBar);
// Hitting enter should submit the URL and kick the user to the browser.
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
ActivityMonitor browserMonitor = waitForChromeTabbedActivityToStart(() -> {
new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false); // Hitting enter should submit the URL and kick the user to the browser.
instrumentation.addMonitor(browserMonitor);
UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar); UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar);
KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER); KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER);
waitForChromeTabbedActivityToStart( }, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
browserMonitor, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
} }
@Test @Test
...@@ -264,23 +260,21 @@ public class SearchActivityTest { ...@@ -264,23 +260,21 @@ public class SearchActivityTest {
Assert.assertEquals(searchActivity, ApplicationStatus.getLastTrackedFocusedActivity()); Assert.assertEquals(searchActivity, ApplicationStatus.getLastTrackedFocusedActivity());
Assert.assertFalse(searchActivity.isFinishing()); Assert.assertFalse(searchActivity.isFinishing());
// Finish initialization. It should notice the URL is queued up and start the browser. waitForChromeTabbedActivityToStart(() -> {
ActivityMonitor browserMonitor = // Finish initialization. It should notice the URL is queued up and start the
new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false); // browser.
instrumentation.addMonitor(browserMonitor); ThreadUtils.runOnUiThreadBlocking(
ThreadUtils.runOnUiThreadBlocking(new Runnable() { () -> { searchActivity.startDelayedNativeInitialization(); });
@Override
public void run() {
searchActivity.startDelayedNativeInitialization();
}
});
Assert.assertEquals( Assert.assertEquals(
1, mTestDelegate.shouldDelayNativeInitializationCallback.getCallCount()); 1, mTestDelegate.shouldDelayNativeInitializationCallback.getCallCount());
try {
mTestDelegate.showSearchEngineDialogIfNeededCallback.waitForCallback(0); mTestDelegate.showSearchEngineDialogIfNeededCallback.waitForCallback(0);
mTestDelegate.onFinishDeferredInitializationCallback.waitForCallback(0); mTestDelegate.onFinishDeferredInitializationCallback.waitForCallback(0);
waitForChromeTabbedActivityToStart( } catch (InterruptedException | TimeoutException e) {
browserMonitor, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); Assert.fail("Unexpected exception");
}
}, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
} }
@Test @Test
...@@ -353,15 +347,12 @@ public class SearchActivityTest { ...@@ -353,15 +347,12 @@ public class SearchActivityTest {
R.id.search_location_bar); R.id.search_location_bar);
OmniboxTestUtils.waitForOmniboxSuggestions(locationBar, OMNIBOX_SHOW_TIMEOUT_MS); OmniboxTestUtils.waitForOmniboxSuggestions(locationBar, OMNIBOX_SHOW_TIMEOUT_MS);
// Hitting enter should submit the URL and kick the user to the browser.
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
ActivityMonitor browserMonitor = waitForChromeTabbedActivityToStart(() -> {
new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false); // Hitting enter should submit the URL and kick the user to the browser.
instrumentation.addMonitor(browserMonitor);
UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar); UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar);
KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER); KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER);
waitForChromeTabbedActivityToStart( }, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
browserMonitor, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
} }
@Test @Test
...@@ -392,15 +383,12 @@ public class SearchActivityTest { ...@@ -392,15 +383,12 @@ public class SearchActivityTest {
R.id.search_location_bar); R.id.search_location_bar);
OmniboxTestUtils.waitForOmniboxSuggestions(locationBar); OmniboxTestUtils.waitForOmniboxSuggestions(locationBar);
// Hitting enter should submit the URL and kick the user to the browser.
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
ActivityMonitor browserMonitor = waitForChromeTabbedActivityToStart(() -> {
new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false); // Hitting enter should submit the URL and kick the user to the browser.
instrumentation.addMonitor(browserMonitor);
UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar); UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar);
KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER); KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER);
waitForChromeTabbedActivityToStart( }, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
browserMonitor, ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL);
} }
@Test @Test
...@@ -483,20 +471,15 @@ public class SearchActivityTest { ...@@ -483,20 +471,15 @@ public class SearchActivityTest {
return (SearchActivity) searchActivity; return (SearchActivity) searchActivity;
} }
private void waitForChromeTabbedActivityToStart( private void waitForChromeTabbedActivityToStart(Runnable trigger, String expectedUrl)
ActivityMonitor browserMonitor, String expectedUrl) throws Exception { throws Exception {
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); final ChromeTabbedActivity cta = ActivityUtils.waitForActivity(
final Activity browserActivity = instrumentation.waitForMonitorWithTimeout( InstrumentationRegistry.getInstrumentation(), ChromeTabbedActivity.class, trigger);
browserMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL);
Assert.assertNotNull("Activity didn't start", browserActivity);
Assert.assertTrue(
"Wrong activity started", browserActivity instanceof ChromeTabbedActivity);
CriteriaHelper.pollUiThread(Criteria.equals(expectedUrl, new Callable<String>() { CriteriaHelper.pollUiThread(Criteria.equals(expectedUrl, new Callable<String>() {
@Override @Override
public String call() throws Exception { public String call() throws Exception {
ChromeTabbedActivity chromeActivity = (ChromeTabbedActivity) browserActivity; Tab tab = cta.getActivityTab();
Tab tab = chromeActivity.getActivityTab();
if (tab == null) return null; if (tab == null) return null;
return tab.getUrl(); return tab.getUrl();
......
...@@ -16,6 +16,9 @@ import android.support.v4.app.ActivityOptionsCompat; ...@@ -16,6 +16,9 @@ import android.support.v4.app.ActivityOptionsCompat;
import org.junit.Assert; import org.junit.Assert;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.ScalableTimeout; import org.chromium.base.test.util.ScalableTimeout;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.preferences.Preferences; import org.chromium.chrome.browser.preferences.Preferences;
...@@ -23,10 +26,16 @@ import org.chromium.chrome.browser.util.IntentUtils; ...@@ -23,10 +26,16 @@ import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.CriteriaHelper;
import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Locale;
/** /**
* Collection of activity utilities. * Collection of activity utilities.
*/ */
public class ActivityUtils { public class ActivityUtils {
private static final String TAG = "cr_ActivityUtils";
private static final long ACTIVITY_START_TIMEOUT_MS = ScalableTimeout.scaleTimeout(3000); private static final long ACTIVITY_START_TIMEOUT_MS = ScalableTimeout.scaleTimeout(3000);
private static final long CONDITION_POLL_INTERVAL_MS = 100; private static final long CONDITION_POLL_INTERVAL_MS = 100;
...@@ -118,12 +127,28 @@ public class ActivityUtils { ...@@ -118,12 +127,28 @@ public class ActivityUtils {
Activity activity = monitor.getLastActivity(); Activity activity = monitor.getLastActivity();
if (activity == null) { if (activity == null) {
activity = monitor.waitForActivityWithTimeout(timeOut); activity = monitor.waitForActivityWithTimeout(timeOut);
if (activity == null) logRunningChromeActivities();
} }
Assert.assertNotNull(activityType.getName() + " did not start in: " + timeOut, activity); Assert.assertNotNull(activityType.getName() + " did not start in: " + timeOut, activity);
return activityType.cast(activity); return activityType.cast(activity);
} }
private static void logRunningChromeActivities() {
ThreadUtils.runOnUiThreadBlocking(() -> {
List<WeakReference<Activity>> activities = ApplicationStatus.getRunningActivities();
StringBuilder builder = new StringBuilder("Running Chrome Activities: ");
for (WeakReference<Activity> activityRef : activities) {
Activity activity = activityRef.get();
if (activity == null) continue;
builder.append(String.format(Locale.US, "\n %s : %d",
activity.getClass().getSimpleName(),
ApplicationStatus.getStateForActivity(activity)));
}
Log.i(TAG, builder.toString());
});
}
/** /**
* Waits for a fragment to be registered by the specified activity. * Waits for a fragment to be registered by the specified activity.
* *
......
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