Add step and cancel tests for default bcradio HAL

Added unit tests for step and cancel methods in the default AIDL
broadcast radio HAL implementation.

Bug: 316630344
Test: atest DefaultBroadcastRadioHalTestCase
Change-Id: I83b7e9321ebd8bad1eb035d4f23bedce47712511
diff --git a/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp b/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
index 8e85a1b..5fce61a 100644
--- a/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
+++ b/broadcastradio/aidl/default/test/DefaultBroadcastRadioHalTest.cpp
@@ -117,6 +117,21 @@
         }
     }
 
+    bool getAmFmBandRange(utils::FrequencyBand band, AmFmBandRange* res) {
+        AmFmRegionConfig config;
+        auto halResult = mBroadcastRadioHal->getAmFmRegionConfig(/* full= */ false, &config);
+        if (!halResult.isOk()) {
+            return false;
+        }
+        for (const auto& range : config.ranges) {
+            if (utils::getBand(range.lowerBound) == band) {
+                *res = range;
+                return true;
+            }
+        }
+        return false;
+    }
+
     std::shared_ptr<BroadcastRadio> mBroadcastRadioHal;
     std::shared_ptr<MockBroadcastRadioCallback> mTunerCallback;
 };
@@ -246,4 +261,91 @@
     ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
 }
 
+TEST_F(DefaultBroadcastRadioHalTest, StepUp) {
+    AmFmBandRange fmRange;
+    ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
+    ProgramSelector nextChannelSel =
+            utils::makeSelectorAmfm(kFmSel1.primaryId.value + fmRange.spacing);
+    ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+    mTunerCallback->reset();
+    ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
+    verifyUpdatedProgramInfo(kFmSel1);
+
+    auto halResult = mBroadcastRadioHal->step(/* in_directionUp= */ true);
+
+    ASSERT_TRUE(halResult.isOk());
+    verifyUpdatedProgramInfo(nextChannelSel);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StepUpFromUpperBound) {
+    AmFmBandRange fmRange;
+    ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
+    ProgramSelector upperBoundSel = utils::makeSelectorAmfm(fmRange.upperBound);
+    ProgramSelector lowerBoundSel = utils::makeSelectorAmfm(fmRange.lowerBound);
+    ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+    mTunerCallback->reset();
+    ASSERT_TRUE(mBroadcastRadioHal->tune(upperBoundSel).isOk());
+    verifyUpdatedProgramInfo(upperBoundSel);
+
+    auto halResult = mBroadcastRadioHal->step(/* in_directionUp= */ true);
+
+    ASSERT_TRUE(halResult.isOk());
+    verifyUpdatedProgramInfo(lowerBoundSel);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StepDown) {
+    AmFmBandRange fmRange;
+    ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
+    ProgramSelector nextChannelSel =
+            utils::makeSelectorAmfm(kFmSel1.primaryId.value - fmRange.spacing);
+    ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+    mTunerCallback->reset();
+    ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
+    verifyUpdatedProgramInfo(kFmSel1);
+
+    auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
+
+    ASSERT_TRUE(halResult.isOk());
+    verifyUpdatedProgramInfo(nextChannelSel);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StepDownFromLowerBound) {
+    AmFmBandRange fmRange;
+    ASSERT_TRUE(getAmFmBandRange(utils::FrequencyBand::FM, &fmRange));
+    ProgramSelector upperBoundSel = utils::makeSelectorAmfm(fmRange.upperBound);
+    ProgramSelector lowerBoundSel = utils::makeSelectorAmfm(fmRange.lowerBound);
+    ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+    mTunerCallback->reset();
+    ASSERT_TRUE(mBroadcastRadioHal->tune(lowerBoundSel).isOk());
+    verifyUpdatedProgramInfo(lowerBoundSel);
+
+    auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
+
+    ASSERT_TRUE(halResult.isOk());
+    verifyUpdatedProgramInfo(upperBoundSel);
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, StepWithoutTunerCallback) {
+    ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+    mTunerCallback->reset();
+    ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
+    verifyUpdatedProgramInfo(kFmSel1);
+    mBroadcastRadioHal->unsetTunerCallback();
+
+    auto halResult = mBroadcastRadioHal->step(/* directionUp= */ false);
+
+    ASSERT_EQ(halResult.getServiceSpecificError(), utils::resultToInt(Result::INVALID_STATE));
+}
+
+TEST_F(DefaultBroadcastRadioHalTest, Cancel) {
+    ASSERT_TRUE(mBroadcastRadioHal->setTunerCallback(mTunerCallback).isOk());
+    mTunerCallback->reset();
+    ASSERT_TRUE(mBroadcastRadioHal->tune(kFmSel1).isOk());
+
+    auto halResult = mBroadcastRadioHal->cancel();
+
+    ASSERT_TRUE(halResult.isOk());
+    mTunerCallback->reset();
+}
+
 }  // namespace aidl::android::hardware::broadcastradio