From 736f8f16887f71577ea77a69babf4bad9a2a12b7 Mon Sep 17 00:00:00 2001 From: Weilin Xu Date: Thu, 20 Oct 2022 21:51:30 +0000 Subject: [PATCH] Add unit tests for public methods in radio manager Bug: 249602599 Test: atest RadioManagerTest Change-Id: I493633cc5fb2bc7aa3356f6db73a13127dc1fa2b --- .../android/hardware/radio/RadioManager.java | 15 ++- .../tests/unittests/RadioManagerTest.java | 124 ++++++++++++++++++ 2 files changed, 136 insertions(+), 3 deletions(-) diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index 43341166d7207..8b7109272f312 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -36,6 +36,7 @@ import android.os.ServiceManager.ServiceNotFoundException; import android.text.TextUtils; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; @@ -1851,9 +1852,17 @@ public class RadioManager { /** * @hide */ - public RadioManager(@NonNull Context context) throws ServiceNotFoundException { + public RadioManager(Context context) throws ServiceNotFoundException { + this(context, IRadioService.Stub.asInterface(ServiceManager.getServiceOrThrow( + Context.RADIO_SERVICE))); + } + + /** + * @hide + */ + @VisibleForTesting + public RadioManager(Context context, IRadioService service) { mContext = context; - mService = IRadioService.Stub.asInterface( - ServiceManager.getServiceOrThrow(Context.RADIO_SERVICE)); + mService = service; } } diff --git a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/unittests/RadioManagerTest.java b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/unittests/RadioManagerTest.java index 9bfa2fba6948e..be4d0d434d794 100644 --- a/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/unittests/RadioManagerTest.java +++ b/core/tests/BroadcastRadioTests/src/android/hardware/radio/tests/unittests/RadioManagerTest.java @@ -18,14 +18,36 @@ package android.hardware.radio.tests.unittests; import static com.google.common.truth.Truth.assertWithMessage; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.hardware.radio.Announcement; +import android.hardware.radio.IAnnouncementListener; +import android.hardware.radio.ICloseHandle; +import android.hardware.radio.IRadioService; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager; import android.hardware.radio.RadioMetadata; +import android.hardware.radio.RadioTuner; +import android.os.RemoteException; +import android.util.ArrayMap; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.Set; +@RunWith(MockitoJUnitRunner.class) public final class RadioManagerTest { private static final int REGION = RadioManager.REGION_ITU_2; @@ -92,6 +114,24 @@ public final class RadioManagerTest { private static final RadioManager.ProgramInfo DAB_PROGRAM_INFO = createDabProgramInfo(DAB_SELECTOR); + private static final int EVENT_ANNOUNCEMENT_TYPE = Announcement.TYPE_EVENT; + private static final List TEST_ANNOUNCEMENT_LIST = Arrays.asList( + new Announcement(DAB_SELECTOR, EVENT_ANNOUNCEMENT_TYPE, + /* vendorInfo= */ new ArrayMap<>())); + + private RadioManager mRadioManager; + + @Mock + private IRadioService mRadioServiceMock; + @Mock + private Context mContextMock; + @Mock + private RadioTuner.Callback mCallbackMock; + @Mock + private Announcement.OnListUpdatedListener mEventListener; + @Mock + private ICloseHandle mCloseHandleMock; + @Test public void getType_forBandDescriptor() { RadioManager.BandDescriptor bandDescriptor = createAmBandDescriptor(); @@ -606,6 +646,80 @@ public final class RadioManagerTest { .that(DAB_PROGRAM_INFO).isNotEqualTo(dabProgramInfoCompared); } + @Test + public void listModules_forRadioManager() throws Exception { + createRadioManager(); + List modules = new ArrayList<>(); + + mRadioManager.listModules(modules); + + assertWithMessage("Modules in radio manager") + .that(modules).containsExactly(AMFM_PROPERTIES); + } + + @Test + public void openTuner_forRadioModule() throws Exception { + createRadioManager(); + int moduleId = 0; + boolean withAudio = true; + + mRadioManager.openTuner(moduleId, FM_BAND_CONFIG, withAudio, mCallbackMock, + /* handler= */ null); + + verify(mRadioServiceMock).openTuner(eq(moduleId), eq(FM_BAND_CONFIG), eq(withAudio), any()); + } + + @Test + public void addAnnouncementListener_withListenerNotAddedBefore() throws Exception { + createRadioManager(); + Set enableTypeSet = createAnnouncementTypeSet(EVENT_ANNOUNCEMENT_TYPE); + int[] enableTypesExpected = new int[]{EVENT_ANNOUNCEMENT_TYPE}; + ArgumentCaptor announcementListener = + ArgumentCaptor.forClass(IAnnouncementListener.class); + + mRadioManager.addAnnouncementListener(enableTypeSet, mEventListener); + + verify(mRadioServiceMock).addAnnouncementListener(eq(enableTypesExpected), + announcementListener.capture()); + + announcementListener.getValue().onListUpdated(TEST_ANNOUNCEMENT_LIST); + + verify(mEventListener).onListUpdated(TEST_ANNOUNCEMENT_LIST); + } + + @Test + public void addAnnouncementListener_withListenerAddedBefore_closesPreviousOne() + throws Exception { + createRadioManager(); + Set enableTypeSet = createAnnouncementTypeSet(EVENT_ANNOUNCEMENT_TYPE); + mRadioManager.addAnnouncementListener(enableTypeSet, mEventListener); + + mRadioManager.addAnnouncementListener(enableTypeSet, mEventListener); + + verify(mCloseHandleMock).close(); + } + + @Test + public void removeAnnouncementListener_withListenerNotAddedBefore_ignores() throws Exception { + createRadioManager(); + + mRadioManager.removeAnnouncementListener(mEventListener); + + verify(mCloseHandleMock, never()).close(); + } + + @Test + public void removeAnnouncementListener_withListenerAddedTwice_closesTheFirstOne() + throws Exception { + createRadioManager(); + Set enableTypeSet = createAnnouncementTypeSet(EVENT_ANNOUNCEMENT_TYPE); + mRadioManager.addAnnouncementListener(enableTypeSet, mEventListener); + + mRadioManager.removeAnnouncementListener(mEventListener); + + verify(mCloseHandleMock).close(); + } + private static RadioManager.ModuleProperties createAmFmProperties() { return new RadioManager.ModuleProperties(PROPERTIES_ID, SERVICE_NAME, CLASS_ID, IMPLEMENTOR, PRODUCT, VERSION, SERIAL, NUM_TUNERS, NUM_AUDIO_SOURCES, @@ -645,4 +759,14 @@ public final class RadioManagerTest { SIGNAL_QUALITY, METADATA, /* vendorInfo= */ null); } + private void createRadioManager() throws RemoteException { + when(mRadioServiceMock.listModules()).thenReturn(Arrays.asList(AMFM_PROPERTIES)); + when(mRadioServiceMock.addAnnouncementListener(any(), any())).thenReturn(mCloseHandleMock); + + mRadioManager = new RadioManager(mContextMock, mRadioServiceMock); + } + + private Set createAnnouncementTypeSet(int enableType) { + return Set.of(enableType); + } }