diff options
author | Kyunglyul Hyun <klhyun@google.com> | 2020-05-19 23:00:17 +0900 |
---|---|---|
committer | Kyunglyul Hyun <klhyun@google.com> | 2020-06-23 11:28:35 +0900 |
commit | 6a2f1d67b777bc7e4446401202d8c1281b2aad71 (patch) | |
tree | 7a492e42ae077d723a937bd6e7ad1578a1f029a3 /media/tests | |
parent | 1d1bc0f550b437f06b93d8c31372fc2ba944d55f (diff) |
MediaRouter: Defer releasing routing controller when transfer
In order to allow media router to communicate with the old routing
controller for synchronizing media status during transfer,
this CL postpone releasing the old routing controller.
Basically media router should release the old routing controller by
itself when it's done with the old routing controller.
If it didn't, the old routing controller is automatically released
after timeout (30s for now)
This CL also clarifies "old routing controller" in onTransfer callback.
Now it is consistent regardless of who requested transfer.
A request from MediaRouter2Manager is handled by MediaRouter2 to
simplify session creation logic.
Limitation of this approach is that a routing session unknown to
MediaRouter2 can't be transferred to a different provider but it is out
of R scope so it's okay.
Bug: 158713035
Test: CTS test && atest mediaroutertest && manually transfer using
support v7 demos
Change-Id: I168af69e2a25240227aea0fd9e892eaa91e78ee3
Diffstat (limited to 'media/tests')
2 files changed, 94 insertions, 0 deletions
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java index 0979627e5e8d..ddefe266d897 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java @@ -126,6 +126,7 @@ public class MediaRouter2ManagerTest { StubMediaRoute2ProviderService instance = StubMediaRoute2ProviderService.getInstance(); if (instance != null) { instance.setProxy(null); + instance.setSpy(null); } } @@ -425,6 +426,79 @@ public class MediaRouter2ManagerTest { @Test @LargeTest + public void testTransferTwice() throws Exception { + Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); + addRouterCallback(new RouteCallback() { }); + + CountDownLatch successLatch1 = new CountDownLatch(1); + CountDownLatch successLatch2 = new CountDownLatch(1); + CountDownLatch failureLatch = new CountDownLatch(1); + CountDownLatch managerOnSessionReleasedLatch = new CountDownLatch(1); + CountDownLatch serviceOnReleaseSessionLatch = new CountDownLatch(1); + List<RoutingSessionInfo> sessions = new ArrayList<>(); + + StubMediaRoute2ProviderService instance = StubMediaRoute2ProviderService.getInstance(); + assertNotNull(instance); + instance.setSpy(new StubMediaRoute2ProviderService.Spy() { + @Override + public void onReleaseSession(long requestId, String sessionId) { + serviceOnReleaseSessionLatch.countDown(); + } + }); + + addManagerCallback(new MediaRouter2Manager.Callback() { + @Override + public void onTransferred(RoutingSessionInfo oldSession, + RoutingSessionInfo newSession) { + sessions.add(newSession); + if (successLatch1.getCount() > 0) { + successLatch1.countDown(); + } else { + successLatch2.countDown(); + } + } + + @Override + public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) { + failureLatch.countDown(); + } + + @Override + public void onSessionReleased(RoutingSessionInfo session) { + managerOnSessionReleasedLatch.countDown(); + } + }); + + MediaRoute2Info route1 = routes.get(ROUTE_ID1); + MediaRoute2Info route2 = routes.get(ROUTE_ID2); + assertNotNull(route1); + assertNotNull(route2); + + mManager.selectRoute(mPackageName, route1); + assertTrue(successLatch1.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + mManager.selectRoute(mPackageName, route2); + assertTrue(successLatch2.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + + // onTransferFailed/onSessionReleased should not be called. + assertFalse(failureLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); + assertFalse(managerOnSessionReleasedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); + + assertEquals(2, sessions.size()); + List<String> activeSessionIds = mManager.getActiveSessions().stream() + .map(RoutingSessionInfo::getId) + .collect(Collectors.toList()); + // The old session shouldn't appear on the active session list. + assertFalse(activeSessionIds.contains(sessions.get(0).getId())); + assertTrue(activeSessionIds.contains(sessions.get(1).getId())); + + assertFalse(serviceOnReleaseSessionLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); + mManager.releaseSession(sessions.get(0)); + assertTrue(serviceOnReleaseSessionLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertFalse(managerOnSessionReleasedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); + } + + @Test + @LargeTest public void testTransfer_ignored_fails() throws Exception { Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); addRouterCallback(new RouteCallback() {}); diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java index 4551876d774a..a51e3714b6f7 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/StubMediaRoute2ProviderService.java @@ -79,6 +79,7 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { @GuardedBy("sLock") private static StubMediaRoute2ProviderService sInstance; private Proxy mProxy; + private Spy mSpy; private void initializeRoutes() { MediaRoute2Info route1 = new MediaRoute2Info.Builder(ROUTE_ID1, ROUTE_NAME1) @@ -256,6 +257,11 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { @Override public void onReleaseSession(long requestId, String sessionId) { + Spy spy = mSpy; + if (spy != null) { + spy.onReleaseSession(requestId, sessionId); + } + RoutingSessionInfo sessionInfo = getSessionInfo(sessionId); if (sessionInfo == null) { return; @@ -375,7 +381,21 @@ public class StubMediaRoute2ProviderService extends MediaRoute2ProviderService { mProxy = proxy; } + public void setSpy(@Nullable Spy spy) { + mSpy = spy; + } + + /** + * It overrides the original service + */ public static class Proxy { public void onSetRouteVolume(String routeId, int volume, long requestId) {} } + + /** + * It gets notified but doesn't prevent the original methods to be called. + */ + public static class Spy { + public void onReleaseSession(long requestId, String sessionId) {} + } } |