Loading broadcastradio/1.0/default/BroadcastRadio.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ void BroadcastRadio::onFirstRef() 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); Loading broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp +59 −29 Original line number Diff line number Diff line Loading @@ -48,21 +48,42 @@ using ::android::hardware::broadcastradio::V1_0::ProgramInfo; 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()); Loading Loading @@ -175,9 +196,9 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { } 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) { Loading Loading @@ -208,9 +229,12 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { 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; Loading @@ -225,13 +249,6 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { 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 { Loading Loading @@ -331,7 +348,8 @@ bool BroadcastRadioHidlTest::checkAntenna() * - 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()); } Loading @@ -342,7 +360,8 @@ TEST_F(BroadcastRadioHidlTest, GetProperties) { * - 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()); } Loading @@ -353,7 +372,8 @@ TEST_F(BroadcastRadioHidlTest, OpenTuner) { * - 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()); Loading @@ -366,7 +386,8 @@ TEST_F(BroadcastRadioHidlTest, ReopenTuner) { * - 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; Loading @@ -389,7 +410,8 @@ TEST_F(BroadcastRadioHidlTest, OpenTunerTwice) { * - 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; Loading Loading @@ -422,7 +444,8 @@ TEST_F(BroadcastRadioHidlTest, SetAndGetConfiguration) { * - 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. Loading Loading @@ -456,7 +479,8 @@ TEST_F(BroadcastRadioHidlTest, SetConfigurationFails) { * - the tuned callback is received within kTuneCallbacktimeoutNs ns * - skipping sub-channel or not does not fail the call */ TEST_F(BroadcastRadioHidlTest, Scan) { TEST_P(BroadcastRadioHidlTest, Scan) { RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); ASSERT_TRUE(checkAntenna()); // test scan UP Loading @@ -483,7 +507,8 @@ TEST_F(BroadcastRadioHidlTest, Scan) { * - the tuned callback is received within kTuneCallbacktimeoutNs ns * - skipping sub-channel or not does not fail the call */ TEST_F(BroadcastRadioHidlTest, Step) { TEST_P(BroadcastRadioHidlTest, Step) { RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); ASSERT_TRUE(checkAntenna()); // test step UP Loading @@ -509,7 +534,8 @@ TEST_F(BroadcastRadioHidlTest, Step) { * - 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()); Loading Loading @@ -566,7 +592,8 @@ TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { * - 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()); Loading Loading @@ -595,9 +622,12 @@ TEST_F(BroadcastRadioHidlTest, TuneFailsOutOfBounds) { 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); Loading Loading
broadcastradio/1.0/default/BroadcastRadio.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ void BroadcastRadio::onFirstRef() 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); Loading
broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp +59 −29 Original line number Diff line number Diff line Loading @@ -48,21 +48,42 @@ using ::android::hardware::broadcastradio::V1_0::ProgramInfo; 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()); Loading Loading @@ -175,9 +196,9 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { } 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) { Loading Loading @@ -208,9 +229,12 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { 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; Loading @@ -225,13 +249,6 @@ class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase { 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 { Loading Loading @@ -331,7 +348,8 @@ bool BroadcastRadioHidlTest::checkAntenna() * - 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()); } Loading @@ -342,7 +360,8 @@ TEST_F(BroadcastRadioHidlTest, GetProperties) { * - 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()); } Loading @@ -353,7 +372,8 @@ TEST_F(BroadcastRadioHidlTest, OpenTuner) { * - 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()); Loading @@ -366,7 +386,8 @@ TEST_F(BroadcastRadioHidlTest, ReopenTuner) { * - 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; Loading @@ -389,7 +410,8 @@ TEST_F(BroadcastRadioHidlTest, OpenTunerTwice) { * - 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; Loading Loading @@ -422,7 +444,8 @@ TEST_F(BroadcastRadioHidlTest, SetAndGetConfiguration) { * - 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. Loading Loading @@ -456,7 +479,8 @@ TEST_F(BroadcastRadioHidlTest, SetConfigurationFails) { * - the tuned callback is received within kTuneCallbacktimeoutNs ns * - skipping sub-channel or not does not fail the call */ TEST_F(BroadcastRadioHidlTest, Scan) { TEST_P(BroadcastRadioHidlTest, Scan) { RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); ASSERT_TRUE(checkAntenna()); // test scan UP Loading @@ -483,7 +507,8 @@ TEST_F(BroadcastRadioHidlTest, Scan) { * - the tuned callback is received within kTuneCallbacktimeoutNs ns * - skipping sub-channel or not does not fail the call */ TEST_F(BroadcastRadioHidlTest, Step) { TEST_P(BroadcastRadioHidlTest, Step) { RETURN_IF_SKIPPED; ASSERT_EQ(true, openTuner()); ASSERT_TRUE(checkAntenna()); // test step UP Loading @@ -509,7 +534,8 @@ TEST_F(BroadcastRadioHidlTest, Step) { * - 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()); Loading Loading @@ -566,7 +592,8 @@ TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) { * - 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()); Loading Loading @@ -595,9 +622,12 @@ TEST_F(BroadcastRadioHidlTest, TuneFailsOutOfBounds) { 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); Loading