xref: /aosp_15_r20/hardware/interfaces/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "MockBroadcastRadioCallback.h"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include <BroadcastRadio.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <VirtualRadio.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <broadcastradio-utils-aidl/Utils.h>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <gtest/gtest.h>
25*4d7e907cSAndroid Build Coastguard Worker 
26*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::broadcastradio {
27*4d7e907cSAndroid Build Coastguard Worker 
28*4d7e907cSAndroid Build Coastguard Worker namespace {
29*4d7e907cSAndroid Build Coastguard Worker using ::std::vector;
30*4d7e907cSAndroid Build Coastguard Worker 
31*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kAmFreq1 = 560u;
32*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kAmFreq2 = 680u;
33*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kAmHdFreq = 1170u;
34*4d7e907cSAndroid Build Coastguard Worker constexpr uint64_t kAmHdSid = 0xB0000001u;
35*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kFmFreq1 = 94900u;
36*4d7e907cSAndroid Build Coastguard Worker constexpr uint64_t kFmHdSid1 = 0xA0000001u;
37*4d7e907cSAndroid Build Coastguard Worker constexpr uint64_t kFmHdSid2 = 0xA0000002u;
38*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kFmHdFreq1 = 98500u;
39*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kFmHdSubChannel0 = 0u;
40*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kFmHdSubChannel1 = 1u;
41*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kFmFreq2 = 99100u;
42*4d7e907cSAndroid Build Coastguard Worker constexpr uint32_t kFmHdFreq2 = 101100u;
43*4d7e907cSAndroid Build Coastguard Worker 
44*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kAmSel1 = utils::makeSelectorAmfm(kAmFreq1);
45*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kAmSel2 = utils::makeSelectorAmfm(kAmFreq2);
46*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kAmHdSel = utils::makeSelectorHd(kAmHdSid, kFmHdSubChannel0, kAmHdFreq);
47*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kFmSel1 = utils::makeSelectorAmfm(kFmFreq1);
48*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kFmSel2 = utils::makeSelectorAmfm(kFmFreq2);
49*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kFmHdFreq1Sel1 =
50*4d7e907cSAndroid Build Coastguard Worker         utils::makeSelectorHd(kFmHdSid1, kFmHdSubChannel0, kFmHdFreq1);
51*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kFmHdFreq1Sel2 =
52*4d7e907cSAndroid Build Coastguard Worker         utils::makeSelectorHd(kFmHdSid1, kFmHdSubChannel1, kFmHdFreq1);
53*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kFmHdFreq2Sel1 =
54*4d7e907cSAndroid Build Coastguard Worker         utils::makeSelectorHd(kFmHdSid2, kFmHdSubChannel0, kFmHdFreq2);
55*4d7e907cSAndroid Build Coastguard Worker const ProgramSelector kFmHdFreq2Sel2 =
56*4d7e907cSAndroid Build Coastguard Worker         utils::makeSelectorHd(kFmHdSid2, kFmHdSubChannel1, kFmHdFreq2);
57*4d7e907cSAndroid Build Coastguard Worker 
getAmFmMockTestRadio()58*4d7e907cSAndroid Build Coastguard Worker const VirtualRadio& getAmFmMockTestRadio() {
59*4d7e907cSAndroid Build Coastguard Worker     static VirtualRadio amFmRadioMockTestRadio(
60*4d7e907cSAndroid Build Coastguard Worker             "AM/FM radio mock for test",
61*4d7e907cSAndroid Build Coastguard Worker             {
62*4d7e907cSAndroid Build Coastguard Worker                     {kAmSel1, "ProgramAm1", "ArtistAm1", "TitleAm1"},
63*4d7e907cSAndroid Build Coastguard Worker                     {kAmSel2, "ProgramAm2", "ArtistAm2", "TitleAm2"},
64*4d7e907cSAndroid Build Coastguard Worker                     {kFmSel1, "ProgramFm1", "ArtistFm1", "TitleFm1"},
65*4d7e907cSAndroid Build Coastguard Worker                     {kFmSel2, "ProgramFm2", "ArtistFm2", "TitleFm2"},
66*4d7e907cSAndroid Build Coastguard Worker                     {kAmHdSel, "ProgramAmHd1", "ArtistAmHd1", "TitleAmHd1"},
67*4d7e907cSAndroid Build Coastguard Worker                     {kFmHdFreq1Sel1, "ProgramFmHd1", "ArtistFmHd1", "TitleFmHd1"},
68*4d7e907cSAndroid Build Coastguard Worker                     {kFmHdFreq1Sel2, "ProgramFmHd2", "ArtistFmHd2", "TitleFmHd2"},
69*4d7e907cSAndroid Build Coastguard Worker                     {kFmHdFreq2Sel1, "ProgramFmHd3", "ArtistFmHd3", "TitleFmHd3"},
70*4d7e907cSAndroid Build Coastguard Worker                     {kFmHdFreq2Sel2, "ProgramFmHd4", "ArtistFmHd4", "TitleFmHd4"},
71*4d7e907cSAndroid Build Coastguard Worker             });
72*4d7e907cSAndroid Build Coastguard Worker     return amFmRadioMockTestRadio;
73*4d7e907cSAndroid Build Coastguard Worker }
74*4d7e907cSAndroid Build Coastguard Worker 
getSignalAcquisitionFlags(const ProgramInfo & info)75*4d7e907cSAndroid Build Coastguard Worker int getSignalAcquisitionFlags(const ProgramInfo& info) {
76*4d7e907cSAndroid Build Coastguard Worker     return (info.infoFlags &
77*4d7e907cSAndroid Build Coastguard Worker             (ProgramInfo::FLAG_SIGNAL_ACQUISITION | ProgramInfo::FLAG_HD_SIS_ACQUISITION |
78*4d7e907cSAndroid Build Coastguard Worker              ProgramInfo::FLAG_HD_AUDIO_ACQUISITION)) >>
79*4d7e907cSAndroid Build Coastguard Worker            6;
80*4d7e907cSAndroid Build Coastguard Worker }
81*4d7e907cSAndroid Build Coastguard Worker 
82*4d7e907cSAndroid Build Coastguard Worker }  // namespace
83*4d7e907cSAndroid Build Coastguard Worker 
84*4d7e907cSAndroid Build Coastguard Worker class DefaultBroadcastRadioHalTest : public testing::Test {
85*4d7e907cSAndroid Build Coastguard Worker   public:
SetUp()86*4d7e907cSAndroid Build Coastguard Worker     void SetUp() override {
87*4d7e907cSAndroid Build Coastguard Worker         ::android::base::SetDefaultTag("BcRadioAidlDef.test");
88*4d7e907cSAndroid Build Coastguard Worker         const VirtualRadio& amFmRadioMockTest = getAmFmMockTestRadio();
89*4d7e907cSAndroid Build Coastguard Worker         mBroadcastRadioHal = ::ndk::SharedRefBase::make<BroadcastRadio>(amFmRadioMockTest);
90*4d7e907cSAndroid Build Coastguard Worker         mTunerCallback = ndk::SharedRefBase::make<MockBroadcastRadioCallback>();
91*4d7e907cSAndroid Build Coastguard Worker     }
92*4d7e907cSAndroid Build Coastguard Worker 
TearDown()93*4d7e907cSAndroid Build Coastguard Worker     void TearDown() override {
94*4d7e907cSAndroid Build Coastguard Worker         mBroadcastRadioHal->unsetTunerCallback();
95*4d7e907cSAndroid Build Coastguard Worker         EXPECT_FALSE(mTunerCallback->isTunerFailed());
96*4d7e907cSAndroid Build Coastguard Worker     }
97*4d7e907cSAndroid Build Coastguard Worker 
verifyUpdatedProgramInfo(const ProgramSelector & sel)98*4d7e907cSAndroid Build Coastguard Worker     void verifyUpdatedProgramInfo(const ProgramSelector& sel) {
99*4d7e907cSAndroid Build Coastguard Worker         ASSERT_TRUE(mTunerCallback->waitOnCurrentProgramInfoChangedCallback());
100*4d7e907cSAndroid Build Coastguard Worker         ProgramInfo infoCb1 = mTunerCallback->getCurrentProgramInfo();
101*4d7e907cSAndroid Build Coastguard Worker         mTunerCallback->reset();
102*4d7e907cSAndroid Build Coastguard Worker         if (sel.primaryId.type == IdentifierType::HD_STATION_ID_EXT) {
103*4d7e907cSAndroid Build Coastguard Worker             EXPECT_TRUE(mTunerCallback->waitOnCurrentProgramInfoChangedCallback());
104*4d7e907cSAndroid Build Coastguard Worker             ProgramInfo infoCb2 = mTunerCallback->getCurrentProgramInfo();
105*4d7e907cSAndroid Build Coastguard Worker             mTunerCallback->reset();
106*4d7e907cSAndroid Build Coastguard Worker             EXPECT_TRUE(mTunerCallback->waitOnCurrentProgramInfoChangedCallback());
107*4d7e907cSAndroid Build Coastguard Worker             ProgramInfo infoCb3 = mTunerCallback->getCurrentProgramInfo();
108*4d7e907cSAndroid Build Coastguard Worker             mTunerCallback->reset();
109*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(infoCb1.selector, sel);
110*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(getSignalAcquisitionFlags(infoCb1), 0b001);
111*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(infoCb2.selector, sel);
112*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(getSignalAcquisitionFlags(infoCb2), 0b011);
113*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(infoCb3.selector, sel);
114*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(getSignalAcquisitionFlags(infoCb3), 0b111);
115*4d7e907cSAndroid Build Coastguard Worker         } else {
116*4d7e907cSAndroid Build Coastguard Worker             EXPECT_EQ(infoCb1.selector, sel);
117*4d7e907cSAndroid Build Coastguard Worker         }
118*4d7e907cSAndroid Build Coastguard Worker     }
119*4d7e907cSAndroid Build Coastguard Worker 
getAmFmBandRange(utils::FrequencyBand band,AmFmBandRange * res)120*4d7e907cSAndroid Build Coastguard Worker     bool getAmFmBandRange(utils::FrequencyBand band, AmFmBandRange* res) {
121*4d7e907cSAndroid Build Coastguard Worker         AmFmRegionConfig config;
122*4d7e907cSAndroid Build Coastguard Worker         auto halResult = mBroadcastRadioHal->getAmFmRegionConfig(/* full= */ false, &config);
123*4d7e907cSAndroid Build Coastguard Worker         if (!halResult.isOk()) {
124*4d7e907cSAndroid Build Coastguard Worker             return false;
125*4d7e907cSAndroid Build Coastguard Worker         }
126*4d7e907cSAndroid Build Coastguard Worker         for (const auto& range : config.ranges) {
127*4d7e907cSAndroid Build Coastguard Worker             if (utils::getBand(range.lowerBound) == band) {
128*4d7e907cSAndroid Build Coastguard Worker                 *res = range;
129*4d7e907cSAndroid Build Coastguard Worker                 return true;
130*4d7e907cSAndroid Build Coastguard Worker             }
131*4d7e907cSAndroid Build Coastguard Worker         }
132*4d7e907cSAndroid Build Coastguard Worker         return false;
133*4d7e907cSAndroid Build Coastguard Worker     }
134*4d7e907cSAndroid Build Coastguard Worker 
getProgramList()135*4d7e907cSAndroid Build Coastguard Worker     std::optional<utils::ProgramInfoSet> getProgramList() {
136*4d7e907cSAndroid Build Coastguard Worker         ProgramFilter emptyFilter = {};
137*4d7e907cSAndroid Build Coastguard Worker         return getProgramList(emptyFilter);
138*4d7e907cSAndroid Build Coastguard Worker     }
139*4d7e907cSAndroid Build Coastguard Worker 
getProgramList(const ProgramFilter & filter)140*4d7e907cSAndroid Build Coastguard Worker     std::optional<utils::ProgramInfoSet> getProgramList(const ProgramFilter& filter) {
141*4d7e907cSAndroid Build Coastguard Worker         mTunerCallback->reset();
142*4d7e907cSAndroid Build Coastguard Worker 
143*4d7e907cSAndroid Build Coastguard Worker         auto startResult = mBroadcastRadioHal->startProgramListUpdates(filter);
144*4d7e907cSAndroid Build Coastguard Worker 
145*4d7e907cSAndroid Build Coastguard Worker         EXPECT_TRUE(startResult.isOk());
146*4d7e907cSAndroid Build Coastguard Worker 
147*4d7e907cSAndroid Build Coastguard Worker         if (!startResult.isOk()) {
148*4d7e907cSAndroid Build Coastguard Worker             return std::nullopt;
149*4d7e907cSAndroid Build Coastguard Worker         }
150*4d7e907cSAndroid Build Coastguard Worker         EXPECT_TRUE(mTunerCallback->waitProgramReady());
151*4d7e907cSAndroid Build Coastguard Worker 
152*4d7e907cSAndroid Build Coastguard Worker         auto stopResult = mBroadcastRadioHal->stopProgramListUpdates();
153*4d7e907cSAndroid Build Coastguard Worker 
154*4d7e907cSAndroid Build Coastguard Worker         EXPECT_TRUE(stopResult.isOk());
155*4d7e907cSAndroid Build Coastguard Worker 
156*4d7e907cSAndroid Build Coastguard Worker         return mTunerCallback->getProgramList();
157*4d7e907cSAndroid Build Coastguard Worker     }
158*4d7e907cSAndroid Build Coastguard Worker 
switchToFmBand()159*4d7e907cSAndroid Build Coastguard Worker     void switchToFmBand() {
160*4d7e907cSAndroid Build Coastguard Worker         ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
161*4d7e907cSAndroid Build Coastguard Worker         mTunerCallback->reset();
162*4d7e907cSAndroid Build Coastguard Worker         ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
163*4d7e907cSAndroid Build Coastguard Worker         verifyUpdatedProgramInfo(kFmSel1);
164*4d7e907cSAndroid Build Coastguard Worker     }
165*4d7e907cSAndroid Build Coastguard Worker 
166*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<BroadcastRadio> mBroadcastRadioHal;
167*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<MockBroadcastRadioCallback> mTunerCallback;
168*4d7e907cSAndroid Build Coastguard Worker };
169*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,GetAmFmRegionConfig)170*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, GetAmFmRegionConfig) {
171*4d7e907cSAndroid Build Coastguard Worker     AmFmRegionConfig config;
172*4d7e907cSAndroid Build Coastguard Worker 
173*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->getAmFmRegionConfig(/* full= */ false, &config);
174*4d7e907cSAndroid Build Coastguard Worker 
175*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
176*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(config.fmDeemphasis, AmFmRegionConfig::DEEMPHASIS_D50);
177*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(config.fmRds, AmFmRegionConfig::RDS);
178*4d7e907cSAndroid Build Coastguard Worker }
179*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,GetAmFmRegionConfigWithFullBand)180*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, GetAmFmRegionConfigWithFullBand) {
181*4d7e907cSAndroid Build Coastguard Worker     AmFmRegionConfig config;
182*4d7e907cSAndroid Build Coastguard Worker 
183*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->getAmFmRegionConfig(/* full= */ true, &config);
184*4d7e907cSAndroid Build Coastguard Worker 
185*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
186*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(config.fmDeemphasis,
187*4d7e907cSAndroid Build Coastguard Worker               AmFmRegionConfig::DEEMPHASIS_D50 | AmFmRegionConfig::DEEMPHASIS_D75);
188*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(config.fmRds, AmFmRegionConfig::RDS | AmFmRegionConfig::RBDS);
189*4d7e907cSAndroid Build Coastguard Worker }
190*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,GetDabRegionConfig)191*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, GetDabRegionConfig) {
192*4d7e907cSAndroid Build Coastguard Worker     vector<DabTableEntry> config;
193*4d7e907cSAndroid Build Coastguard Worker 
194*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->getDabRegionConfig(&config);
195*4d7e907cSAndroid Build Coastguard Worker 
196*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
197*4d7e907cSAndroid Build Coastguard Worker     ASSERT_FALSE(config.empty());
198*4d7e907cSAndroid Build Coastguard Worker }
199*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,GetImage)200*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, GetImage) {
201*4d7e907cSAndroid Build Coastguard Worker     vector<uint8_t> img;
202*4d7e907cSAndroid Build Coastguard Worker 
203*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->getImage(BroadcastRadio::INVALID_IMAGE, &img);
204*4d7e907cSAndroid Build Coastguard Worker 
205*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
206*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(img.empty());
207*4d7e907cSAndroid Build Coastguard Worker }
208*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,GetProperties)209*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, GetProperties) {
210*4d7e907cSAndroid Build Coastguard Worker     vector<VirtualProgram> mockPrograms = getAmFmMockTestRadio().getProgramList();
211*4d7e907cSAndroid Build Coastguard Worker     Properties prop;
212*4d7e907cSAndroid Build Coastguard Worker 
213*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->getProperties(&prop);
214*4d7e907cSAndroid Build Coastguard Worker 
215*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
216*4d7e907cSAndroid Build Coastguard Worker     ASSERT_FALSE(prop.supportedIdentifierTypes.empty());
217*4d7e907cSAndroid Build Coastguard Worker     std::unordered_set<IdentifierType> supportedTypeSet;
218*4d7e907cSAndroid Build Coastguard Worker     for (const auto& supportedType : prop.supportedIdentifierTypes) {
219*4d7e907cSAndroid Build Coastguard Worker         supportedTypeSet.insert(supportedType);
220*4d7e907cSAndroid Build Coastguard Worker     }
221*4d7e907cSAndroid Build Coastguard Worker     for (const auto& program : mockPrograms) {
222*4d7e907cSAndroid Build Coastguard Worker         EXPECT_NE(supportedTypeSet.find(program.selector.primaryId.type), supportedTypeSet.end());
223*4d7e907cSAndroid Build Coastguard Worker     }
224*4d7e907cSAndroid Build Coastguard Worker }
225*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SetTunerCallback)226*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SetTunerCallback) {
227*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->setTunerCallback(mTunerCallback);
228*4d7e907cSAndroid Build Coastguard Worker 
229*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
230*4d7e907cSAndroid Build Coastguard Worker }
231*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SetTunerCallbackWithNull)232*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SetTunerCallbackWithNull) {
233*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->setTunerCallback(nullptr);
234*4d7e907cSAndroid Build Coastguard Worker 
235*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_ARGUMENTS));
236*4d7e907cSAndroid Build Coastguard Worker }
237*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,UnsetTunerCallbackWithNull)238*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, UnsetTunerCallbackWithNull) {
239*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
240*4d7e907cSAndroid Build Coastguard Worker 
241*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->unsetTunerCallback();
242*4d7e907cSAndroid Build Coastguard Worker 
243*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
244*4d7e907cSAndroid Build Coastguard Worker }
245*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,TuneWithAmFmSelectorInProgramList)246*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, TuneWithAmFmSelectorInProgramList) {
247*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
248*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
249*4d7e907cSAndroid Build Coastguard Worker 
250*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->tune(kFmSel1);
251*4d7e907cSAndroid Build Coastguard Worker 
252*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
253*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mTunerCallback->waitOnCurrentProgramInfoChangedCallback());
254*4d7e907cSAndroid Build Coastguard Worker     ProgramInfo infoCb = mTunerCallback->getCurrentProgramInfo();
255*4d7e907cSAndroid Build Coastguard Worker     EXPECT_EQ(infoCb.selector, kFmSel1);
256*4d7e907cSAndroid Build Coastguard Worker }
257*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,TuneWithHdSelectorInProgramList)258*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, TuneWithHdSelectorInProgramList) {
259*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
260*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
261*4d7e907cSAndroid Build Coastguard Worker 
262*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->tune(kFmHdFreq1Sel2);
263*4d7e907cSAndroid Build Coastguard Worker 
264*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
265*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,TuneWitFrequencyOfHdProgramInProgramList)268*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, TuneWitFrequencyOfHdProgramInProgramList) {
269*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
270*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
271*4d7e907cSAndroid Build Coastguard Worker 
272*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->tune(
273*4d7e907cSAndroid Build Coastguard Worker             utils::makeSelectorAmfm(utils::getHdFrequency(kFmHdFreq1Sel1)));
274*4d7e907cSAndroid Build Coastguard Worker 
275*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
276*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
277*4d7e907cSAndroid Build Coastguard Worker }
278*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,TuneWithInvalidSelector)279*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, TuneWithInvalidSelector) {
280*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
281*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector invalidSelector = {utils::makeIdentifier(IdentifierType::AMFM_FREQUENCY_KHZ, 0),
282*4d7e907cSAndroid Build Coastguard Worker                                        {}};
283*4d7e907cSAndroid Build Coastguard Worker 
284*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->tune(invalidSelector);
285*4d7e907cSAndroid Build Coastguard Worker 
286*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_ARGUMENTS));
287*4d7e907cSAndroid Build Coastguard Worker }
288*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,TuneWithoutTunerCallback)289*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, TuneWithoutTunerCallback) {
290*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->tune(kFmSel1);
291*4d7e907cSAndroid Build Coastguard Worker 
292*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
293*4d7e907cSAndroid Build Coastguard Worker }
294*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StepUp)295*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StepUp) {
296*4d7e907cSAndroid Build Coastguard Worker     AmFmBandRange fmRange;
297*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
298*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector nextChannelSel =
299*4d7e907cSAndroid Build Coastguard Worker             utils::makeSelectorAmfm(kFmSel1.primaryId.value + fmRange.spacing);
300*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
301*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
302*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
303*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmSel1);
304*4d7e907cSAndroid Build Coastguard Worker 
305*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->step(/* in_directionUp= */ true);
306*4d7e907cSAndroid Build Coastguard Worker 
307*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
308*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(nextChannelSel);
309*4d7e907cSAndroid Build Coastguard Worker }
310*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StepUpFromUpperBound)311*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StepUpFromUpperBound) {
312*4d7e907cSAndroid Build Coastguard Worker     AmFmBandRange fmRange;
313*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
314*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector upperBoundSel = utils::makeSelectorAmfm(fmRange.upperBound);
315*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector lowerBoundSel = utils::makeSelectorAmfm(fmRange.lowerBound);
316*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
317*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
318*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(upperBoundSel).isOk());
319*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(upperBoundSel);
320*4d7e907cSAndroid Build Coastguard Worker 
321*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->step(/* in_directionUp= */ true);
322*4d7e907cSAndroid Build Coastguard Worker 
323*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
324*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(lowerBoundSel);
325*4d7e907cSAndroid Build Coastguard Worker }
326*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StepDown)327*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StepDown) {
328*4d7e907cSAndroid Build Coastguard Worker     AmFmBandRange fmRange;
329*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
330*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector nextChannelSel =
331*4d7e907cSAndroid Build Coastguard Worker             utils::makeSelectorAmfm(kFmSel1.primaryId.value - fmRange.spacing);
332*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
333*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
334*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
335*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmSel1);
336*4d7e907cSAndroid Build Coastguard Worker 
337*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
338*4d7e907cSAndroid Build Coastguard Worker 
339*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
340*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(nextChannelSel);
341*4d7e907cSAndroid Build Coastguard Worker }
342*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StepDownFromLowerBound)343*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StepDownFromLowerBound) {
344*4d7e907cSAndroid Build Coastguard Worker     AmFmBandRange fmRange;
345*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
346*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector upperBoundSel = utils::makeSelectorAmfm(fmRange.upperBound);
347*4d7e907cSAndroid Build Coastguard Worker     ProgramSelector lowerBoundSel = utils::makeSelectorAmfm(fmRange.lowerBound);
348*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
349*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
350*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(lowerBoundSel).isOk());
351*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(lowerBoundSel);
352*4d7e907cSAndroid Build Coastguard Worker 
353*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
354*4d7e907cSAndroid Build Coastguard Worker 
355*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
356*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(upperBoundSel);
357*4d7e907cSAndroid Build Coastguard Worker }
358*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StepWithoutTunerCallback)359*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StepWithoutTunerCallback) {
360*4d7e907cSAndroid Build Coastguard Worker     switchToFmBand();
361*4d7e907cSAndroid Build Coastguard Worker     mBroadcastRadioHal->unsetTunerCallback();
362*4d7e907cSAndroid Build Coastguard Worker 
363*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
364*4d7e907cSAndroid Build Coastguard Worker 
365*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
366*4d7e907cSAndroid Build Coastguard Worker }
367*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekUpWithoutSkipSubchannel)368*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekUpWithoutSkipSubchannel) {
369*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
370*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
371*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel1).isOk());
372*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
373*4d7e907cSAndroid Build Coastguard Worker 
374*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ true, /* skipSubChannel= */ false);
375*4d7e907cSAndroid Build Coastguard Worker 
376*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
377*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
378*4d7e907cSAndroid Build Coastguard Worker }
379*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekUpWithSkipSubchannel)380*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekUpWithSkipSubchannel) {
381*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
382*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
383*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel1).isOk());
384*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
385*4d7e907cSAndroid Build Coastguard Worker 
386*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ true, /* skipSubChannel= */ true);
387*4d7e907cSAndroid Build Coastguard Worker 
388*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
389*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmSel2);
390*4d7e907cSAndroid Build Coastguard Worker }
391*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekUpFromLastProgramInProgramList)392*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekUpFromLastProgramInProgramList) {
393*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
394*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
395*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq2Sel1).isOk());
396*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq2Sel1);
397*4d7e907cSAndroid Build Coastguard Worker 
398*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ true, /* skipSubChannel= */ true);
399*4d7e907cSAndroid Build Coastguard Worker 
400*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
401*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmSel1);
402*4d7e907cSAndroid Build Coastguard Worker }
403*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekDownWithoutSkipSubchannel)404*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekDownWithoutSkipSubchannel) {
405*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
406*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
407*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel2).isOk());
408*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
409*4d7e907cSAndroid Build Coastguard Worker 
410*4d7e907cSAndroid Build Coastguard Worker     auto halResult =
411*4d7e907cSAndroid Build Coastguard Worker             mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ false);
412*4d7e907cSAndroid Build Coastguard Worker 
413*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
414*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel1);
415*4d7e907cSAndroid Build Coastguard Worker }
416*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekDownWithSkipSubchannel)417*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekDownWithSkipSubchannel) {
418*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
419*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
420*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmHdFreq1Sel2).isOk());
421*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq1Sel2);
422*4d7e907cSAndroid Build Coastguard Worker 
423*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ true);
424*4d7e907cSAndroid Build Coastguard Worker 
425*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
426*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmSel1);
427*4d7e907cSAndroid Build Coastguard Worker }
428*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekDownWithFirstProgramInProgramList)429*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekDownWithFirstProgramInProgramList) {
430*4d7e907cSAndroid Build Coastguard Worker     switchToFmBand();
431*4d7e907cSAndroid Build Coastguard Worker 
432*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ true);
433*4d7e907cSAndroid Build Coastguard Worker 
434*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
435*4d7e907cSAndroid Build Coastguard Worker     verifyUpdatedProgramInfo(kFmHdFreq2Sel1);
436*4d7e907cSAndroid Build Coastguard Worker }
437*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SeekWithoutTunerCallback)438*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SeekWithoutTunerCallback) {
439*4d7e907cSAndroid Build Coastguard Worker     switchToFmBand();
440*4d7e907cSAndroid Build Coastguard Worker     mBroadcastRadioHal->unsetTunerCallback();
441*4d7e907cSAndroid Build Coastguard Worker 
442*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->seek(/* directionUp= */ false, /* skipSubChannel= */ true);
443*4d7e907cSAndroid Build Coastguard Worker 
444*4d7e907cSAndroid Build Coastguard Worker     ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
445*4d7e907cSAndroid Build Coastguard Worker }
446*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,Cancel)447*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, Cancel) {
448*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
449*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
450*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
451*4d7e907cSAndroid Build Coastguard Worker 
452*4d7e907cSAndroid Build Coastguard Worker     auto halResult = mBroadcastRadioHal->cancel();
453*4d7e907cSAndroid Build Coastguard Worker 
454*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(halResult.isOk());
455*4d7e907cSAndroid Build Coastguard Worker     mTunerCallback->reset();
456*4d7e907cSAndroid Build Coastguard Worker }
457*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,SetConfigFlag)458*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, SetConfigFlag) {
459*4d7e907cSAndroid Build Coastguard Worker     ConfigFlag flag = ConfigFlag::FORCE_MONO;
460*4d7e907cSAndroid Build Coastguard Worker 
461*4d7e907cSAndroid Build Coastguard Worker     auto setResult = mBroadcastRadioHal->setConfigFlag(flag, /* value= */ true);
462*4d7e907cSAndroid Build Coastguard Worker 
463*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(setResult.isOk());
464*4d7e907cSAndroid Build Coastguard Worker }
465*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,GetConfigFlag)466*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, GetConfigFlag) {
467*4d7e907cSAndroid Build Coastguard Worker     bool gotValue = false;
468*4d7e907cSAndroid Build Coastguard Worker     ConfigFlag flag = ConfigFlag::FORCE_MONO;
469*4d7e907cSAndroid Build Coastguard Worker     mBroadcastRadioHal->setConfigFlag(flag, /* value= */ true);
470*4d7e907cSAndroid Build Coastguard Worker 
471*4d7e907cSAndroid Build Coastguard Worker     auto getResult = mBroadcastRadioHal->isConfigFlagSet(flag, &gotValue);
472*4d7e907cSAndroid Build Coastguard Worker 
473*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(getResult.isOk());
474*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(gotValue);
475*4d7e907cSAndroid Build Coastguard Worker }
476*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StartProgramListUpdatesWithEmptyFilter)477*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StartProgramListUpdatesWithEmptyFilter) {
478*4d7e907cSAndroid Build Coastguard Worker     switchToFmBand();
479*4d7e907cSAndroid Build Coastguard Worker 
480*4d7e907cSAndroid Build Coastguard Worker     auto programList = getProgramList();
481*4d7e907cSAndroid Build Coastguard Worker 
482*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(programList.has_value());
483*4d7e907cSAndroid Build Coastguard Worker     for (auto it = programList->begin(); it != programList->end(); it++) {
484*4d7e907cSAndroid Build Coastguard Worker         EXPECT_EQ(utils::getBand(utils::getAmFmFrequency(it->selector)), utils::FrequencyBand::FM);
485*4d7e907cSAndroid Build Coastguard Worker     }
486*4d7e907cSAndroid Build Coastguard Worker }
487*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StartProgramListUpdatesWithAmFmFilter)488*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StartProgramListUpdatesWithAmFmFilter) {
489*4d7e907cSAndroid Build Coastguard Worker     ProgramFilter amFmFilter = {.identifierTypes = {IdentifierType::AMFM_FREQUENCY_KHZ},
490*4d7e907cSAndroid Build Coastguard Worker                                 .identifiers = {},
491*4d7e907cSAndroid Build Coastguard Worker                                 .includeCategories = false,
492*4d7e907cSAndroid Build Coastguard Worker                                 .excludeModifications = false};
493*4d7e907cSAndroid Build Coastguard Worker     switchToFmBand();
494*4d7e907cSAndroid Build Coastguard Worker 
495*4d7e907cSAndroid Build Coastguard Worker     auto programList = getProgramList(amFmFilter);
496*4d7e907cSAndroid Build Coastguard Worker 
497*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(programList.has_value());
498*4d7e907cSAndroid Build Coastguard Worker     for (auto it = programList->begin(); it != programList->end(); it++) {
499*4d7e907cSAndroid Build Coastguard Worker         EXPECT_TRUE(utils::hasId(it->selector, IdentifierType::AMFM_FREQUENCY_KHZ));
500*4d7e907cSAndroid Build Coastguard Worker         EXPECT_EQ(utils::getBand(utils::getAmFmFrequency(it->selector)), utils::FrequencyBand::FM);
501*4d7e907cSAndroid Build Coastguard Worker     }
502*4d7e907cSAndroid Build Coastguard Worker }
503*4d7e907cSAndroid Build Coastguard Worker 
TEST_F(DefaultBroadcastRadioHalTest,StartProgramListUpdatesWhenHdIsDisabled)504*4d7e907cSAndroid Build Coastguard Worker TEST_F(DefaultBroadcastRadioHalTest, StartProgramListUpdatesWhenHdIsDisabled) {
505*4d7e907cSAndroid Build Coastguard Worker     switchToFmBand();
506*4d7e907cSAndroid Build Coastguard Worker     mBroadcastRadioHal->setConfigFlag(ConfigFlag::FORCE_ANALOG_FM, /* value= */ true);
507*4d7e907cSAndroid Build Coastguard Worker 
508*4d7e907cSAndroid Build Coastguard Worker     auto programList = getProgramList();
509*4d7e907cSAndroid Build Coastguard Worker 
510*4d7e907cSAndroid Build Coastguard Worker     ASSERT_TRUE(programList.has_value());
511*4d7e907cSAndroid Build Coastguard Worker     for (auto it = programList->begin(); it != programList->end(); it++) {
512*4d7e907cSAndroid Build Coastguard Worker         EXPECT_FALSE(utils::hasId(it->selector, IdentifierType::HD_STATION_ID_EXT));
513*4d7e907cSAndroid Build Coastguard Worker         EXPECT_EQ(utils::getBand(utils::getAmFmFrequency(it->selector)), utils::FrequencyBand::FM);
514*4d7e907cSAndroid Build Coastguard Worker     }
515*4d7e907cSAndroid Build Coastguard Worker }
516*4d7e907cSAndroid Build Coastguard Worker 
517*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::broadcastradio
518