| Index: chrome/android/javatests/src/org/chromium/chrome/browser/media/remote/CastTestBase.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/remote/CastTestBase.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/remote/CastTestBase.java
|
| index 5fe83fd3c3da4142c7e6ae3bd5376bb778ba58b7..8d56e5487439ff3b0b311478af45b1ffb3315020 100644
|
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/remote/CastTestBase.java
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/remote/CastTestBase.java
|
| @@ -32,7 +32,11 @@ import org.chromium.content.browser.test.util.UiUtils;
|
| import org.chromium.content_public.browser.WebContents;
|
|
|
| import java.util.ArrayList;
|
| +import java.util.HashSet;
|
| +import java.util.Set;
|
| import java.util.concurrent.Callable;
|
| +import java.util.concurrent.CountDownLatch;
|
| +import java.util.concurrent.TimeUnit;
|
| import java.util.concurrent.TimeoutException;
|
|
|
| /**
|
| @@ -58,12 +62,17 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| }
|
|
|
| @Override
|
| - public void onPlaybackStateChanged(PlayerState oldState, PlayerState newState) {
|
| - if (newState == PlayerState.PLAYING) {
|
| - mPlaying = true;
|
| - } else if (newState != PlayerState.PLAYING) {
|
| - mPlaying = false;
|
| - }
|
| + public void onPlaybackStateChanged(PlayerState oldState, final PlayerState newState) {
|
| + // Use postOnUiThread to handling the latch until the current UI task has completed,
|
| + // this makes sure that Cast has finished handling the event.
|
| + ThreadUtils.postOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + if ((mAwaitedStates.contains(newState))) {
|
| + mLatch.countDown();
|
| + }
|
| + }
|
| + });
|
| }
|
|
|
| @Override
|
| @@ -78,6 +87,9 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
|
|
| }
|
|
|
| + private Set<PlayerState> mAwaitedStates;
|
| + private CountDownLatch mLatch;
|
| +
|
| // The name of the route provided by the dummy cast device.
|
| protected static final String CAST_TEST_ROUTE = "Cast Test Route";
|
|
|
| @@ -109,8 +121,6 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
|
|
| private static final String TAG = "CastTestBase";
|
|
|
| - private boolean mPlaying = false;
|
| -
|
| private MediaRouteController mMediaRouteController;
|
|
|
| private StrictMode.ThreadPolicy mOldPolicy;
|
| @@ -149,6 +159,42 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| startMainActivityOnBlankPage();
|
| }
|
|
|
| + /**
|
| + * Wait for cast to reach a state we are interested in.
|
| + * Will deadlock if called on the target's UI thread.
|
| + * @param states
|
| + */
|
| + protected boolean waitForStates(final Set<PlayerState> states, int waitTimeMs) {
|
| + mAwaitedStates = states;
|
| + mLatch = new CountDownLatch(1);
|
| + // Deal with the case where Chrome is already in the desired state
|
| + ThreadUtils.runOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + if (mMediaRouteController != null
|
| + && states.contains(mMediaRouteController.getPlayerState())) {
|
| + mLatch.countDown();
|
| + }
|
| + }
|
| + });
|
| + try {
|
| + return mLatch.await(waitTimeMs, TimeUnit.MILLISECONDS);
|
| + } catch (InterruptedException e) {
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Wait for cast to reach a state we are interested in.
|
| + * Will deadlock if called on the target's UI thread.
|
| + * @param states
|
| + */
|
| + protected boolean waitForState(final PlayerState state, int waitTimeMs) {
|
| + Set<PlayerState> states = new HashSet<PlayerState>();
|
| + states.add(state);
|
| + return waitForStates(states, waitTimeMs);
|
| + }
|
| +
|
| protected void castAndPauseDefaultVideoFromPage(String pagePath) throws InterruptedException,
|
| TimeoutException {
|
| Rect videoRect = castDefaultVideoFromPage(pagePath);
|
| @@ -161,7 +207,7 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| Thread.sleep(RUN_TIME_MS);
|
|
|
| tapButton(tab, pauseButton);
|
| - assertTrue("Not paused", waitForState(PlayerState.PAUSED));
|
| + assertTrue("Not paused", waitForState(PlayerState.PAUSED, MAX_VIEW_TIME_MS));
|
| }
|
|
|
| private boolean videoReady(String videoElement, WebContents webContents) {
|
| @@ -289,15 +335,15 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| }
|
|
|
| protected void checkDisconnected() {
|
| - for (int time = 0; time < MAX_VIEW_TIME_MS; time += VIEW_RETRY_MS) {
|
| - if (isDisconnected()) break;
|
| - sleepNoThrow(VIEW_RETRY_MS);
|
| - }
|
| + HashSet<PlayerState> disconnectedStates = new HashSet<PlayerState>();
|
| + disconnectedStates.add(PlayerState.FINISHED);
|
| + disconnectedStates.add(PlayerState.INVALIDATED);
|
| + waitForStates(disconnectedStates, MAX_VIEW_TIME_MS);
|
| // Could use assertTrue(isDisconnected()) here, but retesting the individual aspects of
|
| // disconnection gives more specific error messages.
|
| - NotificationTransportControl notificationTransportControl =
|
| - NotificationTransportControl.getIfExists();
|
| - if (notificationTransportControl != null && notificationTransportControl.isShowing()) {
|
| + CastNotificationControl notificationControl =
|
| + CastNotificationControl.getForTests();
|
| + if (notificationControl != null && notificationControl.isShowingForTests()) {
|
| fail("Failed to close notification");
|
| }
|
| assertEquals("Video still playing?", null, getUriPlaying());
|
| @@ -339,10 +385,9 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| */
|
| protected void checkVideoStarted(String testVideo) {
|
| // Check we have a notification
|
| - NotificationTransportControl notificationTransportControl = waitForCastNotification();
|
| - assertNotNull("No notification controller", notificationTransportControl);
|
| - waitForCastNotificationService(notificationTransportControl);
|
| - assertTrue("No notification", notificationTransportControl.isShowing());
|
| + CastNotificationControl notificationControl = waitForCastNotification();
|
| + assertNotNull("No notification controller", notificationControl);
|
| + assertTrue("No notification", notificationControl.isShowingForTests());
|
| // Check that we are playing the right video
|
| waitUntilVideoCurrent(testVideo);
|
| assertEquals(
|
| @@ -417,13 +462,13 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| return null;
|
| }
|
|
|
| - protected NotificationTransportControl waitForCastNotification() {
|
| + protected CastNotificationControl waitForCastNotification() {
|
| for (int time = 0; time < MAX_VIEW_TIME_MS; time += VIEW_RETRY_MS) {
|
| - NotificationTransportControl result = ThreadUtils.runOnUiThreadBlockingNoException(
|
| - new Callable<NotificationTransportControl>() {
|
| + CastNotificationControl result = ThreadUtils.runOnUiThreadBlockingNoException(
|
| + new Callable<CastNotificationControl>() {
|
| @Override
|
| - public NotificationTransportControl call() {
|
| - return NotificationTransportControl.getIfExists();
|
| + public CastNotificationControl call() {
|
| + return CastNotificationControl.getForTests();
|
| }
|
| });
|
| if (result != null) {
|
| @@ -434,67 +479,16 @@ public abstract class CastTestBase extends ChromeActivityTestCaseBase<ChromeActi
|
| return null;
|
| }
|
|
|
| - protected NotificationTransportControl.ListenerService waitForCastNotificationService(
|
| - final NotificationTransportControl notification) {
|
| - for (int time = 0; time < MAX_VIEW_TIME_MS; time += VIEW_RETRY_MS) {
|
| - NotificationTransportControl.ListenerService service =
|
| - ThreadUtils.runOnUiThreadBlockingNoException(
|
| - new Callable<NotificationTransportControl.ListenerService>() {
|
| - @Override
|
| - public NotificationTransportControl.ListenerService call() {
|
| - return notification.getService();
|
| - }
|
| - });
|
| - if (service != null) {
|
| - return service;
|
| - }
|
| - sleepNoThrow(VIEW_RETRY_MS);
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - protected boolean waitForState(final RemoteVideoInfo.PlayerState state) {
|
| - for (int time = 0; time < MAX_VIEW_TIME_MS; time += VIEW_RETRY_MS) {
|
| - boolean result = ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
|
| - @Override
|
| - public Boolean call() {
|
| - RemoteMediaPlayerController playerController =
|
| - RemoteMediaPlayerController.getIfExists();
|
| - return playerController != null
|
| - && playerController.getCurrentlyPlayingMediaRouteController() != null
|
| - && playerController.getCurrentlyPlayingMediaRouteController()
|
| - .getPlayerState()
|
| - == state;
|
| - }
|
| - });
|
| - if (result) return true;
|
| - sleepNoThrow(VIEW_RETRY_MS);
|
| - }
|
| - return false;
|
| - }
|
| -
|
| protected boolean waitUntilPlaying() {
|
| - for (int time = 0; time < MAX_VIEW_TIME_MS; time += VIEW_RETRY_MS) {
|
| - boolean playing = ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
|
| - @Override
|
| - public Boolean call() {
|
| - return mPlaying;
|
| - }
|
| - });
|
| - if (playing) return true;
|
| - sleepNoThrow(VIEW_RETRY_MS);
|
| - }
|
| - return false;
|
| + return waitForState(PlayerState.PLAYING, MAX_VIEW_TIME_MS);
|
| }
|
|
|
| private boolean isDisconnected() {
|
| return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
|
| @Override
|
| public Boolean call() {
|
| - NotificationTransportControl notificationTransportControl =
|
| - NotificationTransportControl.getIfExists();
|
| - if (notificationTransportControl != null
|
| - && notificationTransportControl.isShowing()) {
|
| + CastNotificationControl notificationControl = CastNotificationControl.getForTests();
|
| + if (notificationControl != null && notificationControl.isShowingForTests()) {
|
| return false;
|
| }
|
| if (getUriPlaying() != null) return false;
|
|
|