Verify all radio classes, instead of FM only.

Also, a bit of code cleanup.

Bug: b/33382424, b/32022455
Test: VTS
Change-Id: Ib314027b256a6ca4bfa75e9de2ba70990a00b4da
diff --git a/broadcastradio/1.0/default/BroadcastRadio.cpp b/broadcastradio/1.0/default/BroadcastRadio.cpp
index 45ffdb2..72cdc19 100644
--- a/broadcastradio/1.0/default/BroadcastRadio.cpp
+++ b/broadcastradio/1.0/default/BroadcastRadio.cpp
@@ -63,6 +63,7 @@
     if (rc != 0) {
         ALOGE("couldn't load radio module %s.%s (%s)",
               RADIO_HARDWARE_MODULE_ID, classString, strerror(-rc));
+        mStatus = Result::INVALID_ARGUMENTS;
         return;
     }
     rc = radio_hw_device_open(mod, &mHwDevice);
diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
index 92d7d1c..46a2f2b 100644
--- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
+++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
@@ -48,21 +48,42 @@
 using ::android::hardware::broadcastradio::V1_0::MetaData;
 
 
+#define RETURN_IF_SKIPPED \
+    if (skipped) { \
+        std::cout << "[  SKIPPED ] This device class is not supported. " << std::endl; \
+        return; \
+    }
+
 // The main test class for Broadcast Radio HIDL HAL.
 
-class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase,
+        public ::testing::WithParamInterface<Class> {
  protected:
     virtual void SetUp() override {
+        ASSERT_EQ(nullptr, mRadio.get());
+
+        radioClass = GetParam();
+        skipped = false;
+
         sp<IBroadcastRadioFactory> factory =
               ::testing::VtsHalHidlTargetTestBase::getService<IBroadcastRadioFactory>();
-        if (factory != 0) {
-            factory->connectModule(Class::AM_FM,
-                             [&](Result retval, const ::android::sp<IBroadcastRadio>& result) {
-                if (retval == Result::OK) {
-                  mRadio = result;
-                }
-            });
+        ASSERT_NE(nullptr, factory.get());
+
+        Result connectResult;
+        factory->connectModule(radioClass, [&](Result ret, const sp<IBroadcastRadio>& radio) {
+            connectResult = ret;
+            mRadio = radio;
+            onCallback_l();
+        });
+        EXPECT_EQ(true, waitForCallback(kConnectCallbacktimeoutNs));
+        mCallbackCalled = false;
+
+        if (connectResult == Result::INVALID_ARGUMENTS) {
+            skipped = true;
+            return;
         }
+        ASSERT_EQ(connectResult, Result::OK);
+
         mTunerCallback = new MyCallback(this);
         ASSERT_NE(nullptr, mRadio.get());
         ASSERT_NE(nullptr, mTunerCallback.get());
@@ -175,9 +196,9 @@
     }
 
 
-        BroadcastRadioHidlTest() :
-            mCallbackCalled(false), mBoolCallbackData(false),
-            mResultCallbackData(Result::OK), mHwFailure(false) {}
+    BroadcastRadioHidlTest()
+        : mCallbackCalled(false), mBoolCallbackData(false), mResultCallbackData(Result::OK),
+        mHwFailure(false) {}
 
     void onCallback_l() {
         if (!mCallbackCalled) {
@@ -208,9 +229,12 @@
     bool openTuner();
     bool checkAntenna();
 
+    static const nsecs_t kConnectCallbacktimeoutNs = seconds_to_nanoseconds(1);
     static const nsecs_t kConfigCallbacktimeoutNs = seconds_to_nanoseconds(10);
     static const nsecs_t kTuneCallbacktimeoutNs = seconds_to_nanoseconds(30);
 
+    Class radioClass;
+    bool skipped;
     sp<IBroadcastRadio> mRadio;
     Properties mHalProperties;
     sp<ITuner> mTuner;
@@ -225,13 +249,6 @@
     bool mHwFailure;
 };
 
-// A class for test environment setup (kept since this file is a template).
-class BroadcastRadioHidlEnvironment : public ::testing::Environment {
- public:
-    virtual void SetUp() {}
-    virtual void TearDown() {}
-};
-
 namespace android {
 namespace hardware {
 namespace broadcastradio {
@@ -331,7 +348,8 @@
  *  - the implementation supports at least one tuner
  *  - the implementation supports at one band
  */
-TEST_F(BroadcastRadioHidlTest, GetProperties) {
+TEST_P(BroadcastRadioHidlTest, GetProperties) {
+    RETURN_IF_SKIPPED;
     EXPECT_EQ(true, getProperties());
 }
 
@@ -342,7 +360,8 @@
  *  - the HAL implements the method
  *  - the method returns 0 (no error) and a valid ITuner interface
  */
-TEST_F(BroadcastRadioHidlTest, OpenTuner) {
+TEST_P(BroadcastRadioHidlTest, OpenTuner) {
+    RETURN_IF_SKIPPED;
     EXPECT_EQ(true, openTuner());
 }
 
@@ -353,7 +372,8 @@
  *  - ITuner destruction gets propagated through HAL
  *  - the openTuner method works well when called for the second time
  */
-TEST_F(BroadcastRadioHidlTest, ReopenTuner) {
+TEST_P(BroadcastRadioHidlTest, ReopenTuner) {
+    RETURN_IF_SKIPPED;
     EXPECT_TRUE(openTuner());
     mTuner.clear();
     EXPECT_TRUE(openTuner());
@@ -366,7 +386,8 @@
  *  - the openTuner method fails when called for the second time without deleting previous
  *    ITuner instance
  */
-TEST_F(BroadcastRadioHidlTest, OpenTunerTwice) {
+TEST_P(BroadcastRadioHidlTest, OpenTunerTwice) {
+    RETURN_IF_SKIPPED;
     EXPECT_TRUE(openTuner());
 
     Result halResult = Result::NOT_INITIALIZED;
@@ -389,7 +410,8 @@
  *  - the configuration callback is received within kConfigCallbacktimeoutNs ns
  *  - the configuration read back from HAl has the same class Id
  */
-TEST_F(BroadcastRadioHidlTest, SetAndGetConfiguration) {
+TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     // test setConfiguration
     mCallbackCalled = false;
@@ -422,7 +444,8 @@
  *  - the methods returns INVALID_ARGUMENTS on invalid arguments
  *  - the method recovers and succeeds after passing correct arguments
  */
-TEST_F(BroadcastRadioHidlTest, SetConfigurationFails) {
+TEST_P(BroadcastRadioHidlTest, SetConfigurationFails) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
 
     // Let's define a config that's bad for sure.
@@ -455,7 +478,8 @@
  *  - the method returns 0 (no error)
  *  - the tuned callback is received within kTuneCallbacktimeoutNs ns
  */
-TEST_F(BroadcastRadioHidlTest, Scan) {
+TEST_P(BroadcastRadioHidlTest, Scan) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     ASSERT_TRUE(checkAntenna());
     // test scan UP
@@ -481,7 +505,8 @@
  *  - the method returns 0 (no error)
  *  - the tuned callback is received within kTuneCallbacktimeoutNs ns
  */
-TEST_F(BroadcastRadioHidlTest, Step) {
+TEST_P(BroadcastRadioHidlTest, Step) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     ASSERT_TRUE(checkAntenna());
     // test step UP
@@ -507,7 +532,8 @@
  *  - the methods return 0 (no error)
  *  - the tuned callback is received within kTuneCallbacktimeoutNs ns after tune()
  */
-TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) {
+TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     ASSERT_TRUE(checkAntenna());
 
@@ -564,7 +590,8 @@
  *  - the method returns INVALID_ARGUMENTS when applicable
  *  - the method recovers and succeeds after passing correct arguments
  */
-TEST_F(BroadcastRadioHidlTest, TuneFailsOutOfBounds) {
+TEST_P(BroadcastRadioHidlTest, TuneFailsOutOfBounds) {
+    RETURN_IF_SKIPPED;
     ASSERT_TRUE(openTuner());
     ASSERT_TRUE(checkAntenna());
 
@@ -593,9 +620,12 @@
     EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs));
 }
 
+INSTANTIATE_TEST_CASE_P(
+    BroadcastRadioHidlTestCases,
+    BroadcastRadioHidlTest,
+    ::testing::Values(Class::AM_FM, Class::SAT, Class::DT));
 
 int main(int argc, char** argv) {
-  ::testing::AddGlobalTestEnvironment(new BroadcastRadioHidlEnvironment);
   ::testing::InitGoogleTest(&argc, argv);
   int status = RUN_ALL_TESTS();
   ALOGI("Test result = %d", status);