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

Commit 75ccaa14 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add HD radio support radio service unit tests" into main

parents e5d62519 67f79aa1
Loading
Loading
Loading
Loading
+186 −6
Original line number Diff line number Diff line
@@ -23,19 +23,27 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import android.app.compat.CompatChanges;
import android.hardware.broadcastradio.AmFmBandRange;
import android.hardware.broadcastradio.AmFmRegionConfig;
import android.hardware.broadcastradio.ConfigFlag;
import android.hardware.broadcastradio.DabTableEntry;
import android.hardware.broadcastradio.IdentifierType;
import android.hardware.broadcastradio.Metadata;
import android.hardware.broadcastradio.ProgramIdentifier;
import android.hardware.broadcastradio.ProgramInfo;
import android.hardware.broadcastradio.Properties;
import android.hardware.broadcastradio.Result;
import android.hardware.broadcastradio.VendorKeyValue;
import android.hardware.radio.Announcement;
import android.hardware.radio.Flags;
import android.hardware.radio.ProgramList;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
import android.hardware.radio.RadioMetadata;
import android.hardware.radio.UniqueProgramIdentifier;
import android.os.ServiceSpecificException;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;

import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
import com.android.server.broadcastradio.ExtendedRadioMockitoTestCase;
@@ -82,6 +90,10 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
    private static final long TEST_DAB_ENSEMBLE_VALUE = 0x1001;
    private static final long TEST_DAB_FREQUENCY_VALUE = 220_352;
    private static final long TEST_FM_FREQUENCY_VALUE = 92_100;
    private static final long TEST_HD_FREQUENCY_VALUE = 95_300;
    private static final long TEST_HD_STATION_ID_EXT_VALUE = 0x100000001L
            | (TEST_HD_FREQUENCY_VALUE << 36);
    private static final long TEST_HD_LOCATION_VALUE = 0x89CC8E06CCB9ECL;
    private static final long TEST_VENDOR_ID_VALUE = 9_901;

    private static final ProgramSelector.Identifier TEST_DAB_SID_EXT_ID =
@@ -112,6 +124,14 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
    private static final ProgramSelector TEST_FM_SELECTOR =
            AidlTestUtils.makeFmSelector(TEST_FM_FREQUENCY_VALUE);

    private static final ProgramSelector.Identifier TEST_HD_STATION_EXT_ID =
            new ProgramSelector.Identifier(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_ID_EXT,
                    TEST_HD_STATION_ID_EXT_VALUE);

    private static final ProgramIdentifier TEST_HAL_HD_STATION_LOCATION_ID =
            AidlTestUtils.makeHalIdentifier(IdentifierType.HD_STATION_LOCATION,
                    TEST_HD_LOCATION_VALUE);

    private static final UniqueProgramIdentifier TEST_DAB_UNIQUE_ID = new UniqueProgramIdentifier(
            TEST_DAB_SELECTOR);

@@ -127,8 +147,19 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
            ConversionUtils.announcementFromHalAnnouncement(
                    AidlTestUtils.makeAnnouncement(TEST_ENABLED_TYPE, TEST_ANNOUNCEMENT_FREQUENCY));

    private static final String TEST_SONG_TITLE = "titleTest";
    private static final int TEST_ALBUM_ART = 2;
    private static final int TEST_HD_SUBCHANNELS = 1;

    private static final Metadata TEST_HAL_SONG_TITLE = Metadata.songTitle(TEST_SONG_TITLE);
    private static final Metadata TEST_HAL_ALBUM_ART = Metadata.albumArt(TEST_ALBUM_ART);
    private static final Metadata TEST_HAL_HD_SUBCHANNELS = Metadata.hdSubChannelsAvailable(
            TEST_HD_SUBCHANNELS);

    @Rule
    public final Expect expect = Expect.create();
    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
@@ -152,17 +183,29 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
    }

    @Test
    public void isAtLeastU_withTSdkVersion_returnsFalse() {
    public void isAtLeastU_withLowerSdkVersion_returnsFalse() {
        expect.withMessage("Target SDK version of T")
                .that(ConversionUtils.isAtLeastU(T_APP_UID)).isFalse();
    }

    @Test
    public void isAtLeastU_withCurrentSdkVersion_returnsTrue() {
    public void isAtLeastU_withUSdkVersion_returnsTrue() {
        expect.withMessage("Target SDK version of U")
                .that(ConversionUtils.isAtLeastU(U_APP_UID)).isTrue();
    }

    @Test
    public void isAtLeastV_withLowerSdkVersion_returnsFalse() {
        expect.withMessage("Target SDK version U lower than V")
                .that(ConversionUtils.isAtLeastV(U_APP_UID)).isFalse();
    }

    @Test
    public void isAtLeastV_withVSdkVersion_returnsTrue() {
        expect.withMessage("Target SDK version of V not lower than V")
                .that(ConversionUtils.isAtLeastV(V_APP_UID)).isTrue();
    }

    @Test
    public void throwOnError_withCancelException() {
        ServiceSpecificException halException = new ServiceSpecificException(Result.CANCELED);
@@ -273,6 +316,17 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
                .isEqualTo(halDabIdExpected);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void identifierToHalProgramIdentifier_withFlagEnabled() {
        ProgramSelector.Identifier hdLocationId = createHdStationLocationIdWithFlagEnabled();
        ProgramIdentifier halHdLocationId =
                ConversionUtils.identifierToHalProgramIdentifier(hdLocationId);

        expect.withMessage("Converted HD location identifier for HAL").that(halHdLocationId)
                .isEqualTo(TEST_HAL_HD_STATION_LOCATION_ID);
    }

    @Test
    public void identifierFromHalProgramIdentifier_withDabId() {
        ProgramSelector.Identifier dabId =
@@ -281,6 +335,28 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
        expect.withMessage("Converted DAB identifier").that(dabId).isEqualTo(TEST_DAB_SID_EXT_ID);
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void identifierFromHalProgramIdentifier_withFlagEnabled() {
        ProgramSelector.Identifier hdLocationIdExpected =
                createHdStationLocationIdWithFlagEnabled();
        ProgramSelector.Identifier hdLocationId =
                ConversionUtils.identifierFromHalProgramIdentifier(TEST_HAL_HD_STATION_LOCATION_ID);

        expect.withMessage("Converted HD location identifier").that(hdLocationId)
                .isEqualTo(hdLocationIdExpected);
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void identifierFromHalProgramIdentifier_withFlagDisabled_returnsNull() {
        ProgramSelector.Identifier hdLocationId =
                ConversionUtils.identifierFromHalProgramIdentifier(TEST_HAL_HD_STATION_LOCATION_ID);

        expect.withMessage("Null HD location identifier with feature flag disabled")
                .that(hdLocationId).isNull();
    }

    @Test
    public void programSelectorToHalProgramSelector_withValidSelector() {
        android.hardware.broadcastradio.ProgramSelector halDabSelector =
@@ -349,10 +425,20 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
    }

    @Test
    public void programSelectorMeetsSdkVersionRequirement_withLowerVersionId_returnsFalse() {
        expect.withMessage("Selector %s without required SDK version", TEST_DAB_SELECTOR)
                .that(ConversionUtils.programSelectorMeetsSdkVersionRequirement(TEST_DAB_SELECTOR,
                        T_APP_UID)).isFalse();
    public void programSelectorMeetsSdkVersionRequirement_withLowerVersionPrimaryId_returnsFalse() {
        expect.withMessage("Selector %s with primary id requiring higher-version SDK version",
                        TEST_DAB_SELECTOR).that(ConversionUtils
                .programSelectorMeetsSdkVersionRequirement(TEST_DAB_SELECTOR, T_APP_UID)).isFalse();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void programSelectorMeetsSdkVersionRequirement_withLowerVersionSecondaryId() {
        ProgramSelector hdSelector = createHdSelectorWithFlagEnabled();

        expect.withMessage("Selector %s with secondary id requiring higher-version SDK version",
                hdSelector).that(ConversionUtils.programSelectorMeetsSdkVersionRequirement(
                        hdSelector, U_APP_UID)).isFalse();
    }

    @Test
@@ -362,6 +448,16 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
                        T_APP_UID)).isTrue();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void programSelectorMeetsSdkVersionRequirement_withRequiredVersionAndFlagEnabled() {
        ProgramSelector hdSelector = createHdSelectorWithFlagEnabled();

        expect.withMessage("Selector %s with required SDK version and feature flag enabled",
                hdSelector).that(ConversionUtils.programSelectorMeetsSdkVersionRequirement(
                        hdSelector, V_APP_UID)).isTrue();
    }

    @Test
    public void programInfoMeetsSdkVersionRequirement_withLowerVersionId_returnsFalse() {
        RadioManager.ProgramInfo dabProgramInfo = AidlTestUtils.makeProgramInfo(TEST_DAB_SELECTOR,
@@ -451,6 +547,79 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
                .that(ANNOUNCEMENT.getVendorInfo()).isEmpty();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void configFlagMeetsSdkVersionRequirement_withRequiredSdkVersionAndFlagEnabled() {
        int halForceAmAnalogFlag = ConfigFlag.FORCE_ANALOG_FM;

        expect.withMessage("Force Analog FM flag with required SDK version and feature flag"
                        + " enabled").that(ConversionUtils.configFlagMeetsSdkVersionRequirement(
                                halForceAmAnalogFlag, V_APP_UID)).isTrue();
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void configFlagMeetsSdkVersionRequirement_withRequiredSdkVersionAndFlagDisabled() {
        int halForceAmAnalogFlag = ConfigFlag.FORCE_ANALOG_FM;

        expect.withMessage("Force Analog FM with required SDK version and with feature flag"
                        + " disabled").that(ConversionUtils.configFlagMeetsSdkVersionRequirement(
                                halForceAmAnalogFlag, V_APP_UID)).isFalse();
    }

    @Test
    public void configFlagMeetsSdkVersionRequirement_withLowerSdkVersion() {
        int halForceAmAnalogFlag = ConfigFlag.FORCE_ANALOG_FM;

        expect.withMessage("Force Analog FM without required SDK version")
                .that(ConversionUtils.configFlagMeetsSdkVersionRequirement(halForceAmAnalogFlag,
                        U_APP_UID)).isFalse();
    }

    @Test
    public void configFlagMeetsSdkVersionRequirement_withFConfigFlagWithoutSdkVersionRequired() {
        int halForceAmAnalogFlag = ConfigFlag.FORCE_DIGITAL;

        expect.withMessage("Force digital config flag")
                .that(ConversionUtils.configFlagMeetsSdkVersionRequirement(halForceAmAnalogFlag,
                        T_APP_UID)).isTrue();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void radioMetadataFromHalMetadata_withFlagEnabled() {
        RadioMetadata convertedMetadata = ConversionUtils.radioMetadataFromHalMetadata(
                new Metadata[]{TEST_HAL_SONG_TITLE, TEST_HAL_HD_SUBCHANNELS, TEST_HAL_ALBUM_ART});

        expect.withMessage("Metadata with flag enabled").that(convertedMetadata.size())
                .isEqualTo(3);
        expect.withMessage("Song title with flag enabled")
                .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_TITLE))
                .isEqualTo(TEST_SONG_TITLE);
        expect.withMessage("Album art with flag enabled")
                .that(convertedMetadata.getInt(RadioMetadata.METADATA_KEY_ART))
                .isEqualTo(TEST_ALBUM_ART);
        expect.withMessage("HD sub-channels with flag enabled")
                .that(convertedMetadata.getInt(RadioMetadata
                        .METADATA_KEY_HD_SUBCHANNELS_AVAILABLE)).isEqualTo(TEST_HD_SUBCHANNELS);
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void radioMetadataFromHalMetadata_withFlagDisabled() {
        RadioMetadata convertedMetadata = ConversionUtils.radioMetadataFromHalMetadata(
                new Metadata[]{TEST_HAL_SONG_TITLE, TEST_HAL_HD_SUBCHANNELS, TEST_HAL_ALBUM_ART});

        expect.withMessage("Metadata with flag disabled").that(convertedMetadata.size())
                .isEqualTo(2);
        expect.withMessage("Song title with flag disabled")
                .that(convertedMetadata.getString(RadioMetadata.METADATA_KEY_TITLE))
                .isEqualTo(TEST_SONG_TITLE);
        expect.withMessage("Album art with flag disabled")
                .that(convertedMetadata.getInt(RadioMetadata.METADATA_KEY_ART))
                .isEqualTo(TEST_ALBUM_ART);
    }

    private static RadioManager.ModuleProperties convertToModuleProperties() {
        AmFmRegionConfig amFmConfig = createAmFmRegionConfig();
        DabTableEntry[] dabTableEntries = new DabTableEntry[]{
@@ -499,4 +668,15 @@ public final class ConversionUtilsTest extends ExtendedRadioMockitoTestCase {
                AidlTestUtils.makeVendorKeyValue(VENDOR_INFO_KEY_2, VENDOR_INFO_VALUE_2)};
        return halProperties;
    }

    private ProgramSelector.Identifier createHdStationLocationIdWithFlagEnabled() {
        return new ProgramSelector.Identifier(ProgramSelector.IDENTIFIER_TYPE_HD_STATION_LOCATION,
                TEST_HD_LOCATION_VALUE);
    }

    private ProgramSelector createHdSelectorWithFlagEnabled() {
        return new ProgramSelector(ProgramSelector.PROGRAM_TYPE_FM_HD, TEST_HD_STATION_EXT_ID,
                new ProgramSelector.Identifier[]{createHdStationLocationIdWithFlagEnabled()},
                /* vendorIds= */ null);
    }
}
+32 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import static org.junit.Assert.assertThrows;

import android.app.compat.CompatChanges;
import android.graphics.Bitmap;
import android.hardware.broadcastradio.ConfigFlag;
import android.hardware.broadcastradio.IBroadcastRadio;
import android.hardware.broadcastradio.ITunerCallback;
import android.hardware.broadcastradio.IdentifierType;
@@ -41,6 +42,7 @@ import android.hardware.broadcastradio.ProgramInfo;
import android.hardware.broadcastradio.ProgramListChunk;
import android.hardware.broadcastradio.Result;
import android.hardware.broadcastradio.VendorKeyValue;
import android.hardware.radio.Flags;
import android.hardware.radio.ProgramList;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
@@ -51,6 +53,10 @@ import android.os.ParcelableException;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.UserHandle;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.ArrayMap;
import android.util.ArraySet;

@@ -157,6 +163,8 @@ public final class TunerSessionTest extends ExtendedRadioMockitoTestCase {

    @Rule
    public final Expect expect = Expect.create();
    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @Override
    protected void initializeSession(StaticMockitoSessionBuilder builder) {
@@ -1223,7 +1231,30 @@ public final class TunerSessionTest extends ExtendedRadioMockitoTestCase {
    }

    @Test
    public void onConfigFlagUpdated_forTunerCallback() throws Exception {
    @RequiresFlagsEnabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void onConfigFlagUpdated_withRequiredFlagEnabled_invokesCallbacks() throws Exception {
        openAidlClients(/* numClients= */ 1);

        mHalTunerCallback.onConfigFlagUpdated(ConfigFlag.FORCE_ANALOG_FM, true);

        verify(mAidlTunerCallbackMocks[0], CALLBACK_TIMEOUT)
                .onConfigFlagUpdated(RadioManager.CONFIG_FORCE_ANALOG_FM, true);
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_HD_RADIO_IMPROVED)
    public void onConfigFlagUpdated_withRequiredFlagDisabled_doesNotInvokeCallbacks()
            throws Exception {
        openAidlClients(/* numClients= */ 1);

        mHalTunerCallback.onConfigFlagUpdated(ConfigFlag.FORCE_ANALOG_FM, true);

        verify(mAidlTunerCallbackMocks[0], after(CALLBACK_TIMEOUT_MS).never())
                .onConfigFlagUpdated(RadioManager.CONFIG_FORCE_ANALOG_FM, true);
    }

    @Test
    public void onConfigFlagUpdated_withMultipleTunerSessions() throws Exception {
        int numSessions = 3;
        openAidlClients(numSessions);
        int flag = UNSUPPORTED_CONFIG_FLAG + 1;