Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 024ec168 authored by Weilin Xu's avatar Weilin Xu
Browse files

Add user control for broadcast radio HAL client

For opening tuner and adding announcement listener methods in HAL
clients, an illegal state exception is thrown if the user calling
methods is not the current user or system user. Calls from
non-current on other public methods in HAL clients which can modify
HAL state are rejected silently, to avoid crash radio apps when
the current user is switched.

Meanwhile, public methods in radio modules are changed to non-public
since there is no need to access them outside their package. HAL
2.0 client code is also refactored.

Bug: 240344065
Test: atest com.android.server.broadcastradio.aidl
Change-Id: I62147a5d68b1f6a0314941ab65d0faedb78bfa7d
parent 5c0c1f5f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.os.ServiceManager;

import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase;
import com.android.server.broadcastradio.RadioServiceUserController;

import org.junit.Test;
import org.mockito.Mock;
@@ -81,7 +82,8 @@ public final class BroadcastRadioServiceImplTest extends ExtendedRadioMockitoTes
    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
        builder.spyStatic(ServiceManager.class)
                .spyStatic(RadioModule.class);
                .spyStatic(RadioModule.class)
                .spyStatic(RadioServiceUserController.class);
    }

    @Test
@@ -150,6 +152,7 @@ public final class BroadcastRadioServiceImplTest extends ExtendedRadioMockitoTes
    }

    private void createBroadcastRadioService() throws RemoteException {
        doReturn(true).when(() -> RadioServiceUserController.isCurrentOrSystemUser());
        mockServiceManager();
        mBroadcastRadioService = new BroadcastRadioServiceImpl(SERVICE_LIST);
    }
+14 −4
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.broadcastradio.aidl;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;

import static com.google.common.truth.Truth.assertWithMessage;

import static org.junit.Assert.assertThrows;
@@ -44,12 +46,14 @@ import android.os.ServiceSpecificException;
import android.util.ArrayMap;
import android.util.ArraySet;

import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase;
import com.android.server.broadcastradio.RadioServiceUserController;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.verification.VerificationWithTimeout;

import java.util.ArrayList;
@@ -59,8 +63,7 @@ import java.util.Map;
/**
 * Tests for AIDL HAL TunerSession.
 */
@RunWith(MockitoJUnitRunner.class)
public final class TunerSessionTest {
public final class TunerSessionTest extends ExtendedRadioMockitoTestCase {

    private static final VerificationWithTimeout CALLBACK_TIMEOUT =
            timeout(/* millis= */ 200);
@@ -91,8 +94,15 @@ public final class TunerSessionTest {

    private TunerSession[] mTunerSessions;

    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
        builder.spyStatic(RadioServiceUserController.class);
    }

    @Before
    public void setup() throws Exception {
        doReturn(true).when(() -> RadioServiceUserController.isCurrentOrSystemUser());

        mRadioModule = new RadioModule(mBroadcastRadioMock,
                AidlTestUtils.makeDefaultModuleProperties(), mLock);

+5 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.os.RemoteException;

import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase;
import com.android.server.broadcastradio.RadioServiceUserController;

import org.junit.Test;
import org.mockito.Mock;
@@ -92,7 +93,8 @@ public final class BroadcastRadioServiceHidlTest extends ExtendedRadioMockitoTes

    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
        builder.spyStatic(RadioModule.class);
        builder.spyStatic(RadioModule.class)
                .spyStatic(RadioServiceUserController.class);
    }

    @Test
@@ -181,6 +183,8 @@ public final class BroadcastRadioServiceHidlTest extends ExtendedRadioMockitoTes
    }

    private void createBroadcastRadioService() throws RemoteException {
        doReturn(true).when(() -> RadioServiceUserController.isCurrentOrSystemUser());

        mockServiceManager();
        mBroadcastRadioService = new BroadcastRadioService(/* nextModuleId= */ FM_RADIO_MODULE_ID,
                mLock, mServiceManagerMock);
+3 −1
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.test.suitebuilder.annotation.MediumTest;

import androidx.test.runner.AndroidJUnit4;

import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase;

import org.junit.Test;
import org.junit.runner.RunWith;

@@ -37,7 +39,7 @@ import java.util.Set;
 */
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ProgramInfoCacheTest {
public class ProgramInfoCacheTest extends ExtendedRadioMockitoTestCase {
    private static final String TAG = "BroadcastRadioTests.ProgramInfoCache";

    private final ProgramSelector.Identifier mAmFmIdentifier =
+12 −8
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
package com.android.server.broadcastradio.hal2;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;

import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
@@ -34,15 +36,14 @@ import android.hardware.radio.ProgramList;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
import android.os.RemoteException;
import android.test.suitebuilder.annotation.MediumTest;

import androidx.test.runner.AndroidJUnit4;
import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase;
import com.android.server.broadcastradio.RadioServiceUserController;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer;
import org.mockito.verification.VerificationWithTimeout;

@@ -53,9 +54,7 @@ import java.util.List;
/**
 * Tests for v2 HAL RadioModule.
 */
@RunWith(AndroidJUnit4.class)
@MediumTest
public class StartProgramListUpdatesFanoutTest {
public class StartProgramListUpdatesFanoutTest extends ExtendedRadioMockitoTestCase {
    private static final String TAG = "BroadcastRadioTests.hal2.StartProgramListUpdatesFanout";

    private static final VerificationWithTimeout CB_TIMEOUT = timeout(500);
@@ -91,9 +90,14 @@ public class StartProgramListUpdatesFanoutTest {
    private final RadioManager.ProgramInfo mDabEnsembleInfo = TestUtils.makeProgramInfo(
            ProgramSelector.PROGRAM_TYPE_DAB, mDabEnsembleIdentifier, 0);

    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
        builder.spyStatic(RadioServiceUserController.class);
    }

    @Before
    public void setup() throws RemoteException {
        MockitoAnnotations.initMocks(this);
        doReturn(true).when(() -> RadioServiceUserController.isCurrentOrSystemUser());

        mRadioModule = new RadioModule(mBroadcastRadioMock,
                TestUtils.makeDefaultModuleProperties(), mLock);
Loading