Merge "Complete shareFrontend API implementation in TunerResourceManagerService"

This commit is contained in:
Treehugger Robot
2020-12-30 11:45:14 +00:00
committed by Gerrit Code Review
3 changed files with 410 additions and 41 deletions

View File

@@ -67,6 +67,11 @@ public final class ClientProfile {
*/ */
private Set<Integer> mUsingFrontendIds = new HashSet<>(); private Set<Integer> mUsingFrontendIds = new HashSet<>();
/**
* List of the client ids that share frontend with the current client.
*/
private Set<Integer> mShareFeClientIds = new HashSet<>();
/** /**
* List of the Lnb ids that are used by the current client. * List of the Lnb ids that are used by the current client.
*/ */
@@ -113,11 +118,7 @@ public final class ClientProfile {
} }
public int getPriority() { public int getPriority() {
return mPriority; return mPriority - mNiceValue;
}
public int getNiceValue() {
return mNiceValue;
} }
public void setGroupId(int groupId) { public void setGroupId(int groupId) {
@@ -141,17 +142,38 @@ public final class ClientProfile {
mUsingFrontendIds.add(frontendId); mUsingFrontendIds.add(frontendId);
} }
/**
* Update the set of client that share frontend with the current client.
*
* @param clientId the client to share the fe with the current client.
*/
public void shareFrontend(int clientId) {
mShareFeClientIds.add(clientId);
}
/**
* Remove the given client id from the share frontend client id set.
*
* @param clientId the client to stop sharing the fe with the current client.
*/
public void stopSharingFrontend(int clientId) {
mShareFeClientIds.remove(clientId);
}
public Set<Integer> getInUseFrontendIds() { public Set<Integer> getInUseFrontendIds() {
return mUsingFrontendIds; return mUsingFrontendIds;
} }
public Set<Integer> getShareFeClientIds() {
return mShareFeClientIds;
}
/** /**
* Called when the client released a frontend. * Called when the client released a frontend.
*
* @param frontendId being released.
*/ */
public void releaseFrontend(int frontendId) { public void releaseFrontend() {
mUsingFrontendIds.remove(frontendId); mUsingFrontendIds.clear();
mShareFeClientIds.clear();
} }
/** /**
@@ -201,6 +223,7 @@ public final class ClientProfile {
*/ */
public void reclaimAllResources() { public void reclaimAllResources() {
mUsingFrontendIds.clear(); mUsingFrontendIds.clear();
mShareFeClientIds.clear();
mUsingLnbIds.clear(); mUsingLnbIds.clear();
mUsingCasSystemId = INVALID_RESOURCE_ID; mUsingCasSystemId = INVALID_RESOURCE_ID;
} }

View File

@@ -210,19 +210,36 @@ public class TunerResourceManagerService extends SystemService implements IBinde
} }
synchronized (mLock) { synchronized (mLock) {
if (!checkClientExists(request.getClientId())) { if (!checkClientExists(request.getClientId())) {
throw new RemoteException("Request frontend from unregistered client:" throw new RemoteException("Request frontend from unregistered client: "
+ request.getClientId()); + request.getClientId());
} }
// If the request client is holding or sharing a frontend, throw an exception.
if (!getClientProfile(request.getClientId()).getInUseFrontendIds().isEmpty()) {
throw new RemoteException("Release frontend before requesting another one. "
+ "Client id: " + request.getClientId());
}
return requestFrontendInternal(request, frontendHandle); return requestFrontendInternal(request, frontendHandle);
} }
} }
@Override @Override
public void shareFrontend(int selfClientId, int targetClientId) { public void shareFrontend(int selfClientId, int targetClientId) throws RemoteException {
enforceTunerAccessPermission("shareFrontend"); enforceTunerAccessPermission("shareFrontend");
enforceTrmAccessPermission("shareFrontend"); enforceTrmAccessPermission("shareFrontend");
if (DEBUG) { synchronized (mLock) {
Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId); if (!checkClientExists(selfClientId)) {
throw new RemoteException("Share frontend request from an unregistered client:"
+ selfClientId);
}
if (!checkClientExists(targetClientId)) {
throw new RemoteException("Request to share frontend with an unregistered "
+ "client:" + targetClientId);
}
if (getClientProfile(targetClientId).getInUseFrontendIds().isEmpty()) {
throw new RemoteException("Request to share frontend with a client that has no "
+ "frontend resources. Target client id:" + targetClientId);
}
shareFrontendInternal(selfClientId, targetClientId);
} }
} }
@@ -315,7 +332,7 @@ public class TunerResourceManagerService extends SystemService implements IBinde
throw new RemoteException( throw new RemoteException(
"Client is not the current owner of the releasing fe."); "Client is not the current owner of the releasing fe.");
} }
releaseFrontendInternal(fe); releaseFrontendInternal(fe, clientId);
} }
} }
@@ -648,6 +665,17 @@ public class TunerResourceManagerService extends SystemService implements IBinde
return false; return false;
} }
@VisibleForTesting
protected void shareFrontendInternal(int selfClientId, int targetClientId) {
if (DEBUG) {
Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId);
}
for (int feId : getClientProfile(targetClientId).getInUseFrontendIds()) {
getClientProfile(selfClientId).useFrontend(feId);
}
getClientProfile(targetClientId).shareFrontend(selfClientId);
}
@VisibleForTesting @VisibleForTesting
protected boolean requestLnbInternal(TunerLnbRequest request, int[] lnbHandle) { protected boolean requestLnbInternal(TunerLnbRequest request, int[] lnbHandle) {
if (DEBUG) { if (DEBUG) {
@@ -777,11 +805,17 @@ public class TunerResourceManagerService extends SystemService implements IBinde
} }
@VisibleForTesting @VisibleForTesting
protected void releaseFrontendInternal(FrontendResource fe) { protected void releaseFrontendInternal(FrontendResource fe, int clientId) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "releaseFrontend(id=" + fe.getId() + ")"); Slog.d(TAG, "releaseFrontend(id=" + fe.getId() + ", clientId=" + clientId + " )");
} }
updateFrontendClientMappingOnRelease(fe); if (clientId == fe.getOwnerClientId()) {
ClientProfile ownerClient = getClientProfile(fe.getOwnerClientId());
for (int shareOwnerId : ownerClient.getShareFeClientIds()) {
clearFrontendAndClientMapping(getClientProfile(shareOwnerId));
}
}
clearFrontendAndClientMapping(getClientProfile(clientId));
} }
@VisibleForTesting @VisibleForTesting
@@ -882,8 +916,21 @@ public class TunerResourceManagerService extends SystemService implements IBinde
Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e); Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e);
return false; return false;
} }
// Reclaim all the resources of the share owners of the frontend that is used by the current
// resource reclaimed client.
ClientProfile profile = getClientProfile(reclaimingClientId); ClientProfile profile = getClientProfile(reclaimingClientId);
reclaimingResourcesFromClient(profile); Set<Integer> shareFeClientIds = profile.getShareFeClientIds();
for (int clientId : shareFeClientIds) {
try {
mListeners.get(clientId).getListener().onReclaimResources();
} catch (RemoteException e) {
Slog.e(TAG, "Failed to reclaim resources on client " + clientId, e);
return false;
}
clearAllResourcesAndClientMapping(getClientProfile(clientId));
}
clearAllResourcesAndClientMapping(profile);
return true; return true;
} }
@@ -929,16 +976,6 @@ public class TunerResourceManagerService extends SystemService implements IBinde
} }
} }
private void updateFrontendClientMappingOnRelease(@NonNull FrontendResource releasingFrontend) {
ClientProfile ownerProfile = getClientProfile(releasingFrontend.getOwnerClientId());
releasingFrontend.removeOwner();
ownerProfile.releaseFrontend(releasingFrontend.getId());
for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) {
getFrontendResource(exclusiveGroupMember).removeOwner();
ownerProfile.releaseFrontend(exclusiveGroupMember);
}
}
private void updateLnbClientMappingOnNewGrant(int grantingId, int ownerClientId) { private void updateLnbClientMappingOnNewGrant(int grantingId, int ownerClientId) {
LnbResource grantingLnb = getLnbResource(grantingId); LnbResource grantingLnb = getLnbResource(grantingId);
ClientProfile ownerProfile = getClientProfile(ownerClientId); ClientProfile ownerProfile = getClientProfile(ownerClientId);
@@ -967,10 +1004,10 @@ public class TunerResourceManagerService extends SystemService implements IBinde
} }
/** /**
* Get the owner client's priority from the resource id. * Get the owner client's priority.
* *
* @param clientId the owner client id. * @param clientId the owner client id.
* @return the priority of the owner client of the resource. * @return the priority of the owner client.
*/ */
private int getOwnerClientPriority(int clientId) { private int getOwnerClientPriority(int clientId) {
return getClientProfile(clientId).getPriority(); return getClientProfile(clientId).getPriority();
@@ -1011,7 +1048,11 @@ public class TunerResourceManagerService extends SystemService implements IBinde
return; return;
} }
if (fe.isInUse()) { if (fe.isInUse()) {
releaseFrontendInternal(fe); ClientProfile ownerClient = getClientProfile(fe.getOwnerClientId());
for (int shareOwnerId : ownerClient.getShareFeClientIds()) {
clearFrontendAndClientMapping(getClientProfile(shareOwnerId));
}
clearFrontendAndClientMapping(ownerClient);
} }
for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) { for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
getFrontendResource(excGroupmemberFeId) getFrontendResource(excGroupmemberFeId)
@@ -1093,21 +1134,37 @@ public class TunerResourceManagerService extends SystemService implements IBinde
} }
private void removeClientProfile(int clientId) { private void removeClientProfile(int clientId) {
reclaimingResourcesFromClient(getClientProfile(clientId)); for (int shareOwnerId : getClientProfile(clientId).getShareFeClientIds()) {
clearFrontendAndClientMapping(getClientProfile(shareOwnerId));
}
clearAllResourcesAndClientMapping(getClientProfile(clientId));
mClientProfiles.remove(clientId); mClientProfiles.remove(clientId);
mListeners.remove(clientId); mListeners.remove(clientId);
} }
private void reclaimingResourcesFromClient(ClientProfile profile) { private void clearFrontendAndClientMapping(ClientProfile profile) {
for (Integer feId : profile.getInUseFrontendIds()) { for (Integer feId : profile.getInUseFrontendIds()) {
getFrontendResource(feId).removeOwner(); FrontendResource fe = getFrontendResource(feId);
if (fe.getOwnerClientId() == profile.getId()) {
fe.removeOwner();
continue;
}
getClientProfile(fe.getOwnerClientId()).stopSharingFrontend(profile.getId());
} }
profile.releaseFrontend();
}
private void clearAllResourcesAndClientMapping(ClientProfile profile) {
// Clear Lnb
for (Integer lnbId : profile.getInUseLnbIds()) { for (Integer lnbId : profile.getInUseLnbIds()) {
getLnbResource(lnbId).removeOwner(); getLnbResource(lnbId).removeOwner();
} }
// Clear Cas
if (profile.getInUseCasSystemId() != ClientProfile.INVALID_RESOURCE_ID) { if (profile.getInUseCasSystemId() != ClientProfile.INVALID_RESOURCE_ID) {
getCasResource(profile.getInUseCasSystemId()).removeOwner(profile.getId()); getCasResource(profile.getInUseCasSystemId()).removeOwner(profile.getId());
} }
// Clear Frontend
clearFrontendAndClientMapping(profile);
profile.reclaimAllResources(); profile.reclaimAllResources();
} }

View File

@@ -74,7 +74,7 @@ public class TunerResourceManagerServiceTest {
mReclaimed = true; mReclaimed = true;
} }
public boolean isRelaimed() { public boolean isReclaimed() {
return mReclaimed; return mReclaimed;
} }
} }
@@ -379,13 +379,13 @@ public class TunerResourceManagerServiceTest {
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT); new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
assertThat(mTunerResourceManagerService assertThat(mTunerResourceManagerService
.requestFrontendInternal(request, frontendHandle)).isFalse(); .requestFrontendInternal(request, frontendHandle)).isFalse();
assertThat(listener.isRelaimed()).isFalse(); assertThat(listener.isReclaimed()).isFalse();
request = request =
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
assertThat(mTunerResourceManagerService assertThat(mTunerResourceManagerService
.requestFrontendInternal(request, frontendHandle)).isFalse(); .requestFrontendInternal(request, frontendHandle)).isFalse();
assertThat(listener.isRelaimed()).isFalse(); assertThat(listener.isReclaimed()).isFalse();
} }
@Test @Test
@@ -444,7 +444,7 @@ public class TunerResourceManagerServiceTest {
.getOwnerClientId()).isEqualTo(clientId1[0]); .getOwnerClientId()).isEqualTo(clientId1[0]);
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.getOwnerClientId()).isEqualTo(clientId1[0]); .getOwnerClientId()).isEqualTo(clientId1[0]);
assertThat(listener.isRelaimed()).isTrue(); assertThat(listener.isReclaimed()).isTrue();
} }
@Test @Test
@@ -478,7 +478,7 @@ public class TunerResourceManagerServiceTest {
// Release frontend // Release frontend
mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService
.getFrontendResource(frontendId)); .getFrontendResource(frontendId), clientId[0]);
assertThat(mTunerResourceManagerService assertThat(mTunerResourceManagerService
.getFrontendResource(frontendId).isInUse()).isFalse(); .getFrontendResource(frontendId).isInUse()).isFalse();
assertThat(mTunerResourceManagerService assertThat(mTunerResourceManagerService
@@ -540,7 +540,7 @@ public class TunerResourceManagerServiceTest {
assertThat(mTunerResourceManagerService.getCasResource(1) assertThat(mTunerResourceManagerService.getCasResource(1)
.getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId1[0]))); .getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId1[0])));
assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse(); assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse();
assertThat(listener.isRelaimed()).isTrue(); assertThat(listener.isReclaimed()).isTrue();
} }
@Test @Test
@@ -625,7 +625,7 @@ public class TunerResourceManagerServiceTest {
.isInUse()).isTrue(); .isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0]) assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0])
.getOwnerClientId()).isEqualTo(clientId1[0]); .getOwnerClientId()).isEqualTo(clientId1[0]);
assertThat(listener.isRelaimed()).isTrue(); assertThat(listener.isReclaimed()).isTrue();
assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0]) assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
.getInUseLnbIds().size()).isEqualTo(0); .getInUseLnbIds().size()).isEqualTo(0);
} }
@@ -753,4 +753,293 @@ public class TunerResourceManagerServiceTest {
backgroundRecordProfile)).isEqualTo( backgroundRecordProfile)).isEqualTo(
(backgroundPlaybackPriority > backgroundRecordPriority)); (backgroundPlaybackPriority > backgroundRecordPriority));
} }
@Test
public void shareFrontendTest_FrontendWithExclusiveGroupReadyToShare() {
/**** Register Clients and Set Priority ****/
// Int array to save the returned client ids
int[] ownerClientId0 = new int[1];
int[] ownerClientId1 = new int[1];
int[] shareClientId0 = new int[1];
int[] shareClientId1 = new int[1];
// Predefined client profiles
ResourceClientProfile[] ownerProfiles = new ResourceClientProfile[2];
ResourceClientProfile[] shareProfiles = new ResourceClientProfile[2];
ownerProfiles[0] = new ResourceClientProfile(
"0" /*sessionId*/,
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_LIVE);
ownerProfiles[1] = new ResourceClientProfile(
"1" /*sessionId*/,
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_LIVE);
shareProfiles[0] = new ResourceClientProfile(
"2" /*sessionId*/,
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD);
shareProfiles[1] = new ResourceClientProfile(
"3" /*sessionId*/,
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD);
// Predefined client reclaim listeners
TestResourcesReclaimListener ownerListener0 = new TestResourcesReclaimListener();
TestResourcesReclaimListener shareListener0 = new TestResourcesReclaimListener();
TestResourcesReclaimListener ownerListener1 = new TestResourcesReclaimListener();
TestResourcesReclaimListener shareListener1 = new TestResourcesReclaimListener();
// Register clients and validate the returned client ids
mTunerResourceManagerService
.registerClientProfileInternal(ownerProfiles[0], ownerListener0, ownerClientId0);
mTunerResourceManagerService
.registerClientProfileInternal(shareProfiles[0], shareListener0, shareClientId0);
mTunerResourceManagerService
.registerClientProfileInternal(ownerProfiles[1], ownerListener1, ownerClientId1);
mTunerResourceManagerService
.registerClientProfileInternal(shareProfiles[1], shareListener1, shareClientId1);
assertThat(ownerClientId0[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
assertThat(shareClientId0[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
assertThat(ownerClientId1[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
assertThat(shareClientId1[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
mTunerResourceManagerService.updateClientPriorityInternal(
ownerClientId0[0],
100/*priority*/,
0/*niceValue*/);
mTunerResourceManagerService.updateClientPriorityInternal(
shareClientId0[0],
200/*priority*/,
0/*niceValue*/);
mTunerResourceManagerService.updateClientPriorityInternal(
ownerClientId1[0],
300/*priority*/,
0/*niceValue*/);
mTunerResourceManagerService.updateClientPriorityInternal(
shareClientId1[0],
400/*priority*/,
0/*niceValue*/);
/**** Init Frontend Resources ****/
// Predefined frontend info
TunerFrontendInfo[] infos = new TunerFrontendInfo[2];
infos[0] = new TunerFrontendInfo(
0 /*id*/,
FrontendSettings.TYPE_DVBT,
1 /*exclusiveGroupId*/);
infos[1] = new TunerFrontendInfo(
1 /*id*/,
FrontendSettings.TYPE_DVBS,
1 /*exclusiveGroupId*/);
/**** Init Lnb Resources ****/
int[] lnbIds = {1};
mTunerResourceManagerService.setLnbInfoListInternal(lnbIds);
// Update frontend list in TRM
mTunerResourceManagerService.setFrontendInfoListInternal(infos);
/**** Request Frontend ****/
// Predefined frontend request and array to save returned frontend handle
int[] frontendHandle = new int[1];
TunerFrontendRequest request = new TunerFrontendRequest(
ownerClientId0[0] /*clientId*/,
FrontendSettings.TYPE_DVBT);
// Request call and validate granted resource and internal mapping
assertThat(mTunerResourceManagerService
.requestFrontendInternal(request, frontendHandle))
.isTrue();
assertThat(mTunerResourceManagerService
.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId0[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
/**** Share Frontend ****/
// Share frontend call and validate the internal mapping
mTunerResourceManagerService.shareFrontendInternal(
shareClientId0[0]/*selfClientId*/,
ownerClientId0[0]/*targetClientId*/);
mTunerResourceManagerService.shareFrontendInternal(
shareClientId1[0]/*selfClientId*/,
ownerClientId0[0]/*targetClientId*/);
// Verify fe in use status
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.isInUse()).isTrue();
// Verify fe owner status
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.getOwnerClientId()).isEqualTo(ownerClientId0[0]);
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.getOwnerClientId()).isEqualTo(ownerClientId0[0]);
// Verify share fe client status in the primary owner client
assertThat(mTunerResourceManagerService.getClientProfile(ownerClientId0[0])
.getShareFeClientIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
shareClientId0[0],
shareClientId1[0])));
// Verify in use frontend list in all the primary owner and share owner clients
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId0[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId0[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId1[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
/**** Remove Frontend Share Owner ****/
// Unregister the second share fe client
mTunerResourceManagerService.unregisterClientProfileInternal(shareClientId1[0]);
// Validate the internal mapping
assertThat(mTunerResourceManagerService.getClientProfile(ownerClientId0[0])
.getShareFeClientIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
shareClientId0[0])));
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId0[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId0[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
/**** Request Shared Frontend with Higher Priority Client ****/
// Predefined second frontend request
request = new TunerFrontendRequest(
ownerClientId1[0] /*clientId*/,
FrontendSettings.TYPE_DVBT);
// Second request call
assertThat(mTunerResourceManagerService
.requestFrontendInternal(request, frontendHandle))
.isTrue();
// Validate granted resource and internal mapping
assertThat(mTunerResourceManagerService
.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.getOwnerClientId()).isEqualTo(ownerClientId1[0]);
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.getOwnerClientId()).isEqualTo(ownerClientId1[0]);
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId1[0])
.getInUseFrontendIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
infos[0].getId(),
infos[1].getId())));
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId0[0])
.getInUseFrontendIds()
.isEmpty())
.isTrue();
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId0[0])
.getInUseFrontendIds()
.isEmpty())
.isTrue();
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId0[0])
.getShareFeClientIds()
.isEmpty())
.isTrue();
assertThat(ownerListener0.isReclaimed()).isTrue();
assertThat(shareListener0.isReclaimed()).isTrue();
/**** Release Frontend Resource From Primary Owner ****/
// Reshare the frontend
mTunerResourceManagerService.shareFrontendInternal(
shareClientId0[0]/*selfClientId*/,
ownerClientId1[0]/*targetClientId*/);
// Release the frontend resource from the primary owner
mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService
.getFrontendResource(infos[0].getId()), ownerClientId1[0]);
// Validate the internal mapping
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isFalse();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.isInUse()).isFalse();
// Verify client status
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId1[0])
.getInUseFrontendIds()
.isEmpty())
.isTrue();
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId0[0])
.getInUseFrontendIds()
.isEmpty())
.isTrue();
assertThat(mTunerResourceManagerService
.getClientProfile(ownerClientId1[0])
.getShareFeClientIds()
.isEmpty())
.isTrue();
/**** Unregister Primary Owner when the Share owner owns an Lnb ****/
// Predefined Lnb request and handle array
TunerLnbRequest requestLnb = new TunerLnbRequest(shareClientId0[0]);
int[] lnbHandle = new int[1];
// Request for an Lnb
assertThat(mTunerResourceManagerService
.requestLnbInternal(requestLnb, lnbHandle))
.isTrue();
// Request and share the frontend resource again
assertThat(mTunerResourceManagerService
.requestFrontendInternal(request, frontendHandle))
.isTrue();
mTunerResourceManagerService.shareFrontendInternal(
shareClientId0[0]/*selfClientId*/,
ownerClientId1[0]/*targetClientId*/);
// Unregister the primary owner of the shared frontend
mTunerResourceManagerService.unregisterClientProfileInternal(ownerClientId1[0]);
// Validate the internal mapping
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isFalse();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.isInUse()).isFalse();
// Verify client status
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId0[0])
.getInUseFrontendIds()
.isEmpty())
.isTrue();
assertThat(mTunerResourceManagerService
.getClientProfile(shareClientId0[0])
.getInUseLnbIds())
.isEqualTo(new HashSet<Integer>(Arrays.asList(
lnbIds[0])));
}
} }