Complete Frontend release implementation in TRM

Test: atest
Bug: 150952662
Change-Id: Iff876d2f2762724c3ad30d213e75cd364ea5ee87
This commit is contained in:
Amy Zhang
2020-04-13 13:14:27 -07:00
parent 2f9cab383b
commit ee5f63cc76
3 changed files with 94 additions and 28 deletions

View File

@@ -131,7 +131,7 @@ public final class ClientProfile {
mUsingFrontendIds.add(frontendId);
}
public Iterable<Integer> getInUseFrontendIds() {
public Set<Integer> getInUseFrontendIds() {
return mUsingFrontendIds;
}

View File

@@ -243,19 +243,21 @@ public class TunerResourceManagerService extends SystemService {
if (DEBUG) {
Slog.d(TAG, "requestLnb(request=" + request + ")");
}
return true;
}
@Override
public void releaseFrontend(int frontendHandle) {
public void releaseFrontend(int frontendHandle) throws RemoteException {
enforceTunerAccessPermission("releaseFrontend");
enforceTrmAccessPermission("releaseFrontend");
int frontendId = getResourceId(
TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, frontendHandle);
if (DEBUG) {
Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
if (!validateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND,
frontendHandle)) {
throw new RemoteException("frontendHandle can't be invalid");
}
synchronized (mLock) {
releaseFrontendInternal(getResourceIdFromHandle(frontendHandle));
}
updateFrontendClientMappingOnRelease(frontendId);
}
@Override
@@ -396,7 +398,6 @@ public class TunerResourceManagerService extends SystemService {
}
}
// TODO check if the removing resource is in use or not. Handle the conflict.
for (int removingId : updatingFrontendIds) {
// update the exclusive group id member list
removeFrontendResource(removingId);
@@ -466,6 +467,14 @@ public class TunerResourceManagerService extends SystemService {
return false;
}
@VisibleForTesting
void releaseFrontendInternal(int frontendId) {
if (DEBUG) {
Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
}
updateFrontendClientMappingOnRelease(frontendId);
}
@VisibleForTesting
boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) {
if (DEBUG) {
@@ -578,7 +587,7 @@ public class TunerResourceManagerService extends SystemService {
ownerProfile.releaseFrontend(frontendId);
for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) {
getFrontendResource(exclusiveGroupMember).removeOwner();
ownerProfile.releaseFrontend(frontendId);
ownerProfile.releaseFrontend(exclusiveGroupMember);
}
}
@@ -623,6 +632,9 @@ public class TunerResourceManagerService extends SystemService {
private void removeFrontendResource(int removingId) {
FrontendResource fe = getFrontendResource(removingId);
if (fe.isInUse()) {
releaseFrontendInternal(removingId);
}
for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
getFrontendResource(excGroupmemberFeId)
.removeExclusiveGroupMemberFeId(fe.getId());
@@ -665,11 +677,22 @@ public class TunerResourceManagerService extends SystemService {
| (mResourceRequestCount++ & 0xffff);
}
private int getResourceId(
@TunerResourceManager.TunerResourceType int resourceType, int resourceHandle) {
@VisibleForTesting
protected int getResourceIdFromHandle(int resourceHandle) {
if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
return resourceHandle;
}
return (resourceHandle & 0x00ff0000) >> 16;
}
private boolean validateResourceHandle(int resourceType, int resourceHandle) {
if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE
|| ((resourceHandle & 0xff000000) >> 24) != resourceType) {
return false;
}
return true;
}
private void enforceTrmAccessPermission(String apiName) {
getContext().enforceCallingPermission("android.permission.TUNER_RESOURCE_ACCESS",
TAG + ": " + apiName);

View File

@@ -96,13 +96,6 @@ public class TunerResourceManagerServiceTest {
}
};
private static int getResourceIdFromHandle(int resourceHandle) {
if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
return resourceHandle;
}
return (resourceHandle & 0x00ff0000) >> 16;
}
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
@@ -247,7 +240,7 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0]))
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
}
@@ -275,7 +268,7 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0]))
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
}
@@ -307,7 +300,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(0);
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(0);
}
@Test
@@ -344,7 +338,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
request =
new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
@@ -354,7 +349,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[1].getId());
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId())
@@ -464,7 +460,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
request =
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
@@ -474,7 +471,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[1].getId());
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -486,6 +484,49 @@ public class TunerResourceManagerServiceTest {
assertThat(listener.isRelaimed()).isTrue();
}
@Test
public void releaseFrontendTest_UnderTheSameExclusiveGroup() {
// Register clients
ResourceClientProfile[] profiles = new ResourceClientProfile[1];
profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
int[] clientId = new int[1];
TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
mTunerResourceManagerService.registerClientProfileInternal(profiles[0], listener, clientId);
assertThat(clientId[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
// Init frontend resources.
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*/);
mTunerResourceManagerService.setFrontendInfoListInternal(infos);
TunerFrontendRequest request =
new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
int[] frontendHandle = new int[1];
try {
assertThat(mTunerResourceManagerService
.requestFrontendInternal(request, frontendHandle)).isTrue();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
int frontendId = mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]);
assertThat(frontendId).isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService
.getFrontendResource(infos[1].getId()).isInUse()).isTrue();
// Release frontend
mTunerResourceManagerService.releaseFrontendInternal(frontendId);
assertThat(mTunerResourceManagerService
.getFrontendResource(frontendId).isInUse()).isFalse();
assertThat(mTunerResourceManagerService
.getFrontendResource(infos[1].getId()).isInUse()).isFalse();
assertThat(mTunerResourceManagerService
.getClientProfile(clientId[0]).getInUseFrontendIds().size()).isEqualTo(0);
}
@Test
public void unregisterClientTest_usingFrontend() {
// Register client
@@ -513,7 +554,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -543,7 +585,8 @@ public class TunerResourceManagerServiceTest {
TunerDemuxRequest request = new TunerDemuxRequest(clientId[0]);
assertThat(mTunerResourceManagerService.requestDemuxInternal(request, demuxHandle))
.isTrue();
assertThat(getResourceIdFromHandle(demuxHandle[0])).isEqualTo(0);
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(demuxHandle[0]))
.isEqualTo(0);
}
@Test
@@ -560,6 +603,6 @@ public class TunerResourceManagerServiceTest {
TunerDescramblerRequest request = new TunerDescramblerRequest(clientId[0]);
assertThat(mTunerResourceManagerService.requestDescramblerInternal(request, desHandle))
.isTrue();
assertThat(getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
assertThat(mTunerResourceManagerService.getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
}
}