/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media.tv.tuner.cts;

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

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import android.content.Context;
import android.content.pm.PackageManager;
import android.media.tv.tuner.Tuner;
import android.media.tv.tuner.TunerVersionChecker;
import android.media.tv.tuner.frontend.AnalogFrontendCapabilities;
import android.media.tv.tuner.frontend.AnalogFrontendSettings;
import android.media.tv.tuner.frontend.Atsc3FrontendCapabilities;
import android.media.tv.tuner.frontend.Atsc3FrontendSettings;
import android.media.tv.tuner.frontend.Atsc3PlpSettings;
import android.media.tv.tuner.frontend.AtscFrontendCapabilities;
import android.media.tv.tuner.frontend.AtscFrontendSettings;
import android.media.tv.tuner.frontend.DtmbFrontendCapabilities;
import android.media.tv.tuner.frontend.DtmbFrontendSettings;
import android.media.tv.tuner.frontend.DvbcFrontendCapabilities;
import android.media.tv.tuner.frontend.DvbcFrontendSettings;
import android.media.tv.tuner.frontend.DvbsCodeRate;
import android.media.tv.tuner.frontend.DvbsFrontendCapabilities;
import android.media.tv.tuner.frontend.DvbsFrontendSettings;
import android.media.tv.tuner.frontend.DvbtFrontendCapabilities;
import android.media.tv.tuner.frontend.DvbtFrontendSettings;
import android.media.tv.tuner.frontend.FrontendCapabilities;
import android.media.tv.tuner.frontend.FrontendInfo;
import android.media.tv.tuner.frontend.FrontendSettings;
import android.media.tv.tuner.frontend.Isdbs3FrontendCapabilities;
import android.media.tv.tuner.frontend.Isdbs3FrontendSettings;
import android.media.tv.tuner.frontend.IsdbsFrontendCapabilities;
import android.media.tv.tuner.frontend.IsdbsFrontendSettings;
import android.media.tv.tuner.frontend.IsdbtFrontendCapabilities;
import android.media.tv.tuner.frontend.IsdbtFrontendSettings;

import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.compatibility.common.util.RequiredFeatureRule;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class TunerFrontendTest {
    private static final String TAG = "MediaTunerFrontendTest";

    @Rule
    public RequiredFeatureRule featureRule = new RequiredFeatureRule(
            PackageManager.FEATURE_TUNER);

    private Context mContext;
    private Tuner mTuner;

    @Before
    public void setUp() throws Exception {
        mContext = InstrumentationRegistry.getTargetContext();
        InstrumentationRegistry
                .getInstrumentation().getUiAutomation().adoptShellPermissionIdentity();
        mTuner = new Tuner(mContext, null, 100);
    }

    @After
    public void tearDown() {
        if (mTuner != null) {
          mTuner.close();
          mTuner = null;
        }
    }

    @Test
    public void testAnalogFrontendSettings() throws Exception {
        AnalogFrontendSettings settings =
                AnalogFrontendSettings
                        .builder()
                        .setFrequency(1)
                        .setSignalType(AnalogFrontendSettings.SIGNAL_TYPE_NTSC)
                        .setSifStandard(AnalogFrontendSettings.SIF_BG_NICAM)
                        .setAftFlag(AnalogFrontendSettings.AFT_FLAG_TRUE)
                        .build();

        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
            settings.setEndFrequency(100);
        } else {
            settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
            settings.setEndFrequency(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY);
        }

        assertEquals(FrontendSettings.TYPE_ANALOG, settings.getType());
        assertEquals(1, settings.getFrequency());
        assertEquals(AnalogFrontendSettings.SIGNAL_TYPE_NTSC, settings.getSignalType());
        assertEquals(AnalogFrontendSettings.SIF_BG_NICAM, settings.getSifStandard());
        assertEquals(AnalogFrontendSettings.AFT_FLAG_TRUE, settings.getAftFlag());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(AnalogFrontendSettings.AFT_FLAG_TRUE, settings.getAftFlag());
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(AnalogFrontendSettings.AFT_FLAG_UNDEFINED, settings.getAftFlag());
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testAtsc3FrontendSettings() throws Exception {
        Atsc3PlpSettings plp1 =
                Atsc3PlpSettings
                        .builder()
                        .setPlpId(1)
                        .setModulation(Atsc3FrontendSettings.MODULATION_MOD_QPSK)
                        .setInterleaveMode(Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_AUTO)
                        .setCodeRate(Atsc3FrontendSettings.CODERATE_6_15)
                        .setFec(Atsc3FrontendSettings.FEC_BCH_LDPC_64K)
                        .build();

        Atsc3PlpSettings plp2 =
                Atsc3PlpSettings
                        .builder()
                        .setPlpId(2)
                        .setModulation(Atsc3FrontendSettings.MODULATION_MOD_QPSK)
                        .setInterleaveMode(Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_HTI)
                        .setCodeRate(Atsc3FrontendSettings.CODERATE_UNDEFINED)
                        .setFec(Atsc3FrontendSettings.FEC_LDPC_16K)
                        .build();

        Atsc3FrontendSettings settings =
                Atsc3FrontendSettings
                        .builder()
                        .setFrequency(2)
                        .setBandwidth(Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_6MHZ)
                        .setDemodOutputFormat(Atsc3FrontendSettings.MODULATION_MOD_QPSK)
                        .setPlpSettings(new Atsc3PlpSettings[] {plp1, plp2})
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_ATSC3, settings.getType());
        assertEquals(2, settings.getFrequency());
        assertEquals(Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_6MHZ, settings.getBandwidth());
        assertEquals(Atsc3FrontendSettings.MODULATION_MOD_QPSK, settings.getDemodOutputFormat());

        Atsc3PlpSettings[] plps = settings.getPlpSettings();
        assertEquals(2, plps.length);

        assertEquals(1, plps[0].getPlpId());
        assertEquals(Atsc3FrontendSettings.MODULATION_MOD_QPSK, plps[0].getModulation());
        assertEquals(Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_AUTO, plps[0].getInterleaveMode());
        assertEquals(Atsc3FrontendSettings.CODERATE_6_15, plps[0].getCodeRate());
        assertEquals(Atsc3FrontendSettings.FEC_BCH_LDPC_64K, plps[0].getFec());

        assertEquals(2, plps[1].getPlpId());
        assertEquals(Atsc3FrontendSettings.MODULATION_MOD_QPSK, plps[1].getModulation());
        assertEquals(Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_HTI, plps[1].getInterleaveMode());
        assertEquals(Atsc3FrontendSettings.CODERATE_UNDEFINED, plps[1].getCodeRate());
        assertEquals(Atsc3FrontendSettings.FEC_LDPC_16K, plps[1].getFec());

        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testAtscFrontendSettings() throws Exception {
        AtscFrontendSettings settings =
                AtscFrontendSettings
                        .builder()
                        .setFrequency(3)
                        .setModulation(AtscFrontendSettings.MODULATION_MOD_8VSB)
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_ATSC, settings.getType());
        assertEquals(3, settings.getFrequency());
        assertEquals(AtscFrontendSettings.MODULATION_MOD_8VSB, settings.getModulation());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testDvbcFrontendSettings() throws Exception {
        DvbcFrontendSettings settings =
                DvbcFrontendSettings
                        .builder()
                        .setFrequency(4)
                        .setModulation(DvbcFrontendSettings.MODULATION_MOD_32QAM)
                        .setInnerFec(FrontendSettings.FEC_8_15)
                        .setSymbolRate(3)
                        .setOuterFec(DvbcFrontendSettings.OUTER_FEC_OUTER_FEC_RS)
                        .setAnnex(DvbcFrontendSettings.ANNEX_B)
                        .setTimeInterleaveMode(DvbcFrontendSettings.TIME_INTERLEAVE_MODE_AUTO)
                        .setBandwidth(DvbcFrontendSettings.BANDWIDTH_5MHZ)
                        // DvbcFrontendSettings.SpectralInversion is deprecated in Android 12. Use
                        // FrontendSettings.FrontendSpectralInversion instead.
                        .setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL)
                        .build();

        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_DVBC, settings.getType());
        assertEquals(4, settings.getFrequency());
        assertEquals(DvbcFrontendSettings.MODULATION_MOD_32QAM, settings.getModulation());
        assertEquals(FrontendSettings.FEC_8_15, settings.getInnerFec());
        assertEquals(3, settings.getSymbolRate());
        assertEquals(DvbcFrontendSettings.OUTER_FEC_OUTER_FEC_RS, settings.getOuterFec());
        assertEquals(DvbcFrontendSettings.ANNEX_B, settings.getAnnex());
        assertEquals(DvbcFrontendSettings.TIME_INTERLEAVE_MODE_AUTO,
                settings.getTimeInterleaveMode());
        assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                settings.getSpectralInversion());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(100, settings.getEndFrequency());
            assertEquals(DvbcFrontendSettings.BANDWIDTH_5MHZ, settings.getBandwidth());
        } else {
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
            assertEquals(DvbcFrontendSettings.BANDWIDTH_UNDEFINED, settings.getBandwidth());
        }
    }

    @Test
    public void testDvbsFrontendSettings() throws Exception {
        DvbsCodeRate codeRate =
                DvbsCodeRate
                        .builder()
                        .setInnerFec(FrontendSettings.FEC_9_10)
                        .setLinear(true)
                        .setShortFrameEnabled(false)
                        .setBitsPer1000Symbol(55)
                        .build();

        DvbsFrontendSettings settings =
                DvbsFrontendSettings
                        .builder()
                        .setFrequency(5)
                        .setModulation(DvbsFrontendSettings.MODULATION_MOD_ACM)
                        .setCodeRate(codeRate)
                        .setSymbolRate(3)
                        .setRolloff(DvbsFrontendSettings.ROLLOFF_0_15)
                        .setPilot(DvbsFrontendSettings.PILOT_OFF)
                        .setInputStreamId(1)
                        .setStandard(DvbsFrontendSettings.STANDARD_S2)
                        .setVcmMode(DvbsFrontendSettings.VCM_MODE_MANUAL)
                        .setScanType(DvbsFrontendSettings.SCAN_TYPE_DIRECT)
                        .setCanHandleDiseqcRxMessage(true)
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_DVBS, settings.getType());
        assertEquals(5, settings.getFrequency());
        assertEquals(DvbsFrontendSettings.MODULATION_MOD_ACM, settings.getModulation());
        assertEquals(3, settings.getSymbolRate());
        assertEquals(DvbsFrontendSettings.ROLLOFF_0_15, settings.getRolloff());
        assertEquals(DvbsFrontendSettings.PILOT_OFF, settings.getPilot());
        assertEquals(1, settings.getInputStreamId());
        assertEquals(DvbsFrontendSettings.STANDARD_S2, settings.getStandard());
        assertEquals(DvbsFrontendSettings.VCM_MODE_MANUAL, settings.getVcmMode());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(DvbsFrontendSettings.SCAN_TYPE_DIRECT, settings.getScanType());
            assertTrue(settings.canHandleDiseqcRxMessage());
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(DvbsFrontendSettings.SCAN_TYPE_UNDEFINED, settings.getScanType());
            assertFalse(settings.canHandleDiseqcRxMessage());
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }

        DvbsCodeRate cr = settings.getCodeRate();
        assertNotNull(cr);
        assertEquals(FrontendSettings.FEC_9_10, cr.getInnerFec());
        assertEquals(true, cr.isLinear());
        assertEquals(false, cr.isShortFrameEnabled());
        assertEquals(55, cr.getBitsPer1000Symbol());
    }

    @Test
    public void testDvbtFrontendSettings() throws Exception {
        DvbtFrontendSettings settings =
                DvbtFrontendSettings
                        .builder()
                        .setFrequency(6)
                        .setTransmissionMode(DvbtFrontendSettings.TRANSMISSION_MODE_EXTENDED_32K)
                        .setBandwidth(DvbtFrontendSettings.BANDWIDTH_1_7MHZ)
                        .setConstellation(DvbtFrontendSettings.CONSTELLATION_16QAM_R)
                        .setHierarchy(DvbtFrontendSettings.HIERARCHY_4_NATIVE)
                        .setHighPriorityCodeRate(DvbtFrontendSettings.CODERATE_6_7)
                        .setLowPriorityCodeRate(DvbtFrontendSettings.CODERATE_2_3)
                        .setGuardInterval(DvbtFrontendSettings.GUARD_INTERVAL_19_128)
                        .setHighPriority(true)
                        .setStandard(DvbtFrontendSettings.STANDARD_T2)
                        .setMiso(false)
                        .setPlpMode(DvbtFrontendSettings.PLP_MODE_MANUAL)
                        .setPlpId(333)
                        .setPlpGroupId(777)
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_DVBT, settings.getType());
        assertEquals(6, settings.getFrequency());
        assertEquals(DvbtFrontendSettings.BANDWIDTH_1_7MHZ, settings.getBandwidth());
        assertEquals(DvbtFrontendSettings.HIERARCHY_4_NATIVE, settings.getHierarchy());
        assertEquals(DvbtFrontendSettings.CODERATE_6_7, settings.getHighPriorityCodeRate());
        assertEquals(DvbtFrontendSettings.CODERATE_2_3, settings.getLowPriorityCodeRate());
        assertEquals(DvbtFrontendSettings.GUARD_INTERVAL_19_128, settings.getGuardInterval());
        assertEquals(true, settings.isHighPriority());
        assertEquals(DvbtFrontendSettings.STANDARD_T2, settings.getStandard());
        assertEquals(false, settings.isMiso());
        assertEquals(DvbtFrontendSettings.PLP_MODE_MANUAL, settings.getPlpMode());
        assertEquals(333, settings.getPlpId());
        assertEquals(777, settings.getPlpGroupId());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(DvbtFrontendSettings.TRANSMISSION_MODE_EXTENDED_32K,
                    settings.getTransmissionMode());
            assertEquals(DvbtFrontendSettings.CONSTELLATION_16QAM_R, settings.getConstellation());
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(DvbtFrontendSettings.TRANSMISSION_MODE_UNDEFINED,
                    settings.getTransmissionMode());
            assertEquals(DvbtFrontendSettings.CONSTELLATION_UNDEFINED, settings.getConstellation());
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testIsdbs3FrontendSettings() throws Exception {
        Isdbs3FrontendSettings settings =
                Isdbs3FrontendSettings
                        .builder()
                        .setFrequency(7)
                        .setStreamId(2)
                        .setStreamIdType(IsdbsFrontendSettings.STREAM_ID_TYPE_ID)
                        .setModulation(Isdbs3FrontendSettings.MODULATION_MOD_BPSK)
                        .setCodeRate(Isdbs3FrontendSettings.CODERATE_1_3)
                        .setSymbolRate(555)
                        .setRolloff(Isdbs3FrontendSettings.ROLLOFF_0_03)
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_ISDBS3, settings.getType());
        assertEquals(7, settings.getFrequency());
        assertEquals(2, settings.getStreamId());
        assertEquals(IsdbsFrontendSettings.STREAM_ID_TYPE_ID, settings.getStreamIdType());
        assertEquals(Isdbs3FrontendSettings.MODULATION_MOD_BPSK, settings.getModulation());
        assertEquals(Isdbs3FrontendSettings.CODERATE_1_3, settings.getCodeRate());
        assertEquals(555, settings.getSymbolRate());
        assertEquals(Isdbs3FrontendSettings.ROLLOFF_0_03, settings.getRolloff());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testIsdbsFrontendSettings() throws Exception {
        IsdbsFrontendSettings settings =
                IsdbsFrontendSettings
                        .builder()
                        .setFrequency(8)
                        .setStreamId(3)
                        .setStreamIdType(IsdbsFrontendSettings.STREAM_ID_TYPE_RELATIVE_NUMBER)
                        .setModulation(IsdbsFrontendSettings.MODULATION_AUTO)
                        .setCodeRate(IsdbsFrontendSettings.CODERATE_3_4)
                        .setSymbolRate(667)
                        .setRolloff(IsdbsFrontendSettings.ROLLOFF_0_35)
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_ISDBS, settings.getType());
        assertEquals(8, settings.getFrequency());
        assertEquals(3, settings.getStreamId());
        assertEquals(
                IsdbsFrontendSettings.STREAM_ID_TYPE_RELATIVE_NUMBER, settings.getStreamIdType());
        assertEquals(IsdbsFrontendSettings.MODULATION_AUTO, settings.getModulation());
        assertEquals(IsdbsFrontendSettings.CODERATE_3_4, settings.getCodeRate());
        assertEquals(667, settings.getSymbolRate());
        assertEquals(IsdbsFrontendSettings.ROLLOFF_0_35, settings.getRolloff());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testIsdbtFrontendSettings() throws Exception {
        IsdbtFrontendSettings settings =
                IsdbtFrontendSettings
                        .builder()
                        .setFrequency(9)
                        .setModulation(IsdbtFrontendSettings.MODULATION_MOD_64QAM)
                        .setBandwidth(IsdbtFrontendSettings.BANDWIDTH_8MHZ)
                        .setMode(IsdbtFrontendSettings.MODE_2)
                        .setCodeRate(DvbtFrontendSettings.CODERATE_7_8)
                        .setGuardInterval(DvbtFrontendSettings.GUARD_INTERVAL_1_4)
                        .setServiceAreaId(10)
                        .build();

        settings.setSpectralInversion(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL);
        settings.setEndFrequency(100);

        assertEquals(FrontendSettings.TYPE_ISDBT, settings.getType());
        assertEquals(9, settings.getFrequency());
        assertEquals(IsdbtFrontendSettings.MODULATION_MOD_64QAM, settings.getModulation());
        assertEquals(IsdbtFrontendSettings.BANDWIDTH_8MHZ, settings.getBandwidth());
        assertEquals(IsdbtFrontendSettings.MODE_2, settings.getMode());
        assertEquals(DvbtFrontendSettings.CODERATE_7_8, settings.getCodeRate());
        assertEquals(DvbtFrontendSettings.GUARD_INTERVAL_1_4, settings.getGuardInterval());
        assertEquals(10, settings.getServiceAreaId());
        if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1)) {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_NORMAL,
                    settings.getFrontendSpectralInversion());
            assertEquals(100, settings.getEndFrequency());
        } else {
            assertEquals(FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED,
                    settings.getFrontendSpectralInversion());
            assertEquals(Tuner.INVALID_FRONTEND_SETTING_FREQUENCY, settings.getEndFrequency());
        }
    }

    @Test
    public void testDtmbFrontendSettings() throws Exception {
        if (!TunerVersionChecker.checkHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1,
                TAG + ": testDtmbFrontendSettings")) {
            return;
        }
        DtmbFrontendSettings settings =
                DtmbFrontendSettings
                        .builder()
                        .setFrequency(6)
                        .setModulation(DtmbFrontendSettings.MODULATION_CONSTELLATION_4QAM)
                        .setCodeRate(DtmbFrontendSettings.CODERATE_2_5)
                        .setTransmissionMode(DtmbFrontendSettings.TRANSMISSION_MODE_C1)
                        .setBandwidth(DtmbFrontendSettings.BANDWIDTH_8MHZ)
                        .setTimeInterleaveMode(
                                DtmbFrontendSettings.TIME_INTERLEAVE_MODE_TIMER_INT_240)
                        .setGuardInterval(DtmbFrontendSettings.GUARD_INTERVAL_PN_945_VARIOUS)
                        .build();
        assertEquals(FrontendSettings.TYPE_DTMB, settings.getType());
        assertEquals(6, settings.getFrequency());
        assertEquals(DtmbFrontendSettings.TRANSMISSION_MODE_C1, settings.getTransmissionMode());
        assertEquals(DtmbFrontendSettings.BANDWIDTH_8MHZ, settings.getBandwidth());
        assertEquals(DtmbFrontendSettings.MODULATION_CONSTELLATION_4QAM, settings.getModulation());
        assertEquals(DtmbFrontendSettings.TIME_INTERLEAVE_MODE_TIMER_INT_240,
                settings.getTimeInterleaveMode());
        assertEquals(DtmbFrontendSettings.CODERATE_2_5, settings.getCodeRate());
        assertEquals(DtmbFrontendSettings.GUARD_INTERVAL_PN_945_VARIOUS,
                settings.getGuardInterval());
    }

    @Test
    public void testFrontendInfo() throws Exception {
        List<Integer> ids = mTuner.getFrontendIds();
        List<FrontendInfo> infos = mTuner.getAvailableFrontendInfos();
        Map<Integer, FrontendInfo> infoMap = new HashMap<>();
        for (FrontendInfo info : infos) {
            infoMap.put(info.getId(), info);
        }
        for (int id : ids) {
            FrontendInfo info = mTuner.getFrontendInfoById(id);
            FrontendInfo infoFromMap = infoMap.get(id);
            assertNotNull(info);
            assertThat(info).isEqualTo(infoFromMap);
            assertEquals(id, info.getId());
            assertTrue(info.getFrequencyRange().getLower() > 0);
            assertTrue(info.getSymbolRateRange().getLower() >= 0);
            assertTrue(info.getAcquireRange() > 0);
            info.getExclusiveGroupId();
            info.getStatusCapabilities();

            FrontendCapabilities caps = info.getFrontendCapabilities();
            if (info.getType() <= FrontendSettings.TYPE_ISDBT) {
                assertNotNull(caps);
            }
            switch(info.getType()) {
                case FrontendSettings.TYPE_ANALOG:
                    testAnalogFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_ATSC3:
                    testAtsc3FrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_ATSC:
                    testAtscFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_DVBC:
                    testDvbcFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_DVBS:
                    testDvbsFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_DVBT:
                    testDvbtFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_ISDBS3:
                    testIsdbs3FrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_ISDBS:
                    testIsdbsFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_ISDBT:
                    testIsdbtFrontendCapabilities(caps);
                    break;
                case FrontendSettings.TYPE_DTMB:
                    testDtmbFrontendCapabilities(caps);
                    break;
                default:
                    break;
            }
            infoMap.remove(id);
        }
        assertTrue(infoMap.isEmpty());
    }

    private void testAnalogFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof AnalogFrontendCapabilities);
        AnalogFrontendCapabilities analogCaps = (AnalogFrontendCapabilities) caps;
        analogCaps.getSignalTypeCapability();
        analogCaps.getSifStandardCapability();
    }

    private void testAtsc3FrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof Atsc3FrontendCapabilities);
        Atsc3FrontendCapabilities atsc3Caps = (Atsc3FrontendCapabilities) caps;
        atsc3Caps.getBandwidthCapability();
        atsc3Caps.getModulationCapability();
        atsc3Caps.getTimeInterleaveModeCapability();
        atsc3Caps.getPlpCodeRateCapability();
        atsc3Caps.getFecCapability();
        atsc3Caps.getDemodOutputFormatCapability();
    }

    private void testAtscFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof AtscFrontendCapabilities);
        AtscFrontendCapabilities atscCaps = (AtscFrontendCapabilities) caps;
        atscCaps.getModulationCapability();
    }

    private void testDvbcFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof DvbcFrontendCapabilities);
        DvbcFrontendCapabilities dvbcCaps = (DvbcFrontendCapabilities) caps;
        dvbcCaps.getModulationCapability();
        // getFecCapability is deprecated starting Android 12. Use getCodeRateCapability instead.
        dvbcCaps.getCodeRateCapability();
        dvbcCaps.getFecCapability();
        dvbcCaps.getAnnexCapability();
    }

    private void testDvbsFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof DvbsFrontendCapabilities);
        DvbsFrontendCapabilities dvbsCaps = (DvbsFrontendCapabilities) caps;
        dvbsCaps.getModulationCapability();
        dvbsCaps.getInnerFecCapability();
        dvbsCaps.getStandardCapability();
    }

    private void testDvbtFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof DvbtFrontendCapabilities);
        DvbtFrontendCapabilities dvbtCaps = (DvbtFrontendCapabilities) caps;
        dvbtCaps.getTransmissionModeCapability();
        dvbtCaps.getBandwidthCapability();
        dvbtCaps.getConstellationCapability();
        dvbtCaps.getCodeRateCapability();
        dvbtCaps.getHierarchyCapability();
        dvbtCaps.getGuardIntervalCapability();
        dvbtCaps.isT2Supported();
        dvbtCaps.isMisoSupported();
    }

    private void testIsdbs3FrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof Isdbs3FrontendCapabilities);
        Isdbs3FrontendCapabilities isdbs3Caps = (Isdbs3FrontendCapabilities) caps;
        isdbs3Caps.getModulationCapability();
        isdbs3Caps.getCodeRateCapability();
    }

    private void testIsdbsFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof IsdbsFrontendCapabilities);
        IsdbsFrontendCapabilities isdbsCaps = (IsdbsFrontendCapabilities) caps;
        isdbsCaps.getModulationCapability();
        isdbsCaps.getCodeRateCapability();
    }

    private void testIsdbtFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof IsdbtFrontendCapabilities);
        IsdbtFrontendCapabilities isdbtCaps = (IsdbtFrontendCapabilities) caps;
        isdbtCaps.getModeCapability();
        isdbtCaps.getBandwidthCapability();
        isdbtCaps.getModulationCapability();
        isdbtCaps.getCodeRateCapability();
        isdbtCaps.getGuardIntervalCapability();
    }

    private void testDtmbFrontendCapabilities(FrontendCapabilities caps) throws Exception {
        assertTrue(caps instanceof DtmbFrontendCapabilities);
        DtmbFrontendCapabilities dtmbCaps = (DtmbFrontendCapabilities) caps;
        dtmbCaps.getTimeInterleaveModeCapability();
        dtmbCaps.getBandwidthCapability();
        dtmbCaps.getModulationCapability();
        dtmbCaps.getCodeRateCapability();
        dtmbCaps.getTransmissionModeCapability();
        dtmbCaps.getGuardIntervalCapability();
    }

    private boolean hasTuner() {
        return mContext.getPackageManager().hasSystemFeature("android.hardware.tv.tuner");
    }
}
