From 2c0d2f175bbaaa81b6dca39096885ff8bdcde9a5 Mon Sep 17 00:00:00 2001 From: Daniel Bright Date: Thu, 4 Mar 2021 13:31:28 -0800 Subject: [PATCH] Get Radio Hal Capabilities in VTS * Created utility method in v1_6 HAL to access radio hal capabilities * Created static library to support getting the capaiblities response * Created RadioResponseWaiter to encapsulate the notify \ wait logic used when waiting for an asynchronous response from the HAL * Usage: if (getRadioHalCapabilities().modemReducedFeatureSet1) { ... } Bug: 181895757 Test: Accessed default hal capabilities Change-Id: Ie0a727d4e9d268ad03cf3fa793aa456a95c89f5b Merged-In: Ie0a727d4e9d268ad03cf3fa793aa456a95c89f5b --- radio/1.0/vts/functional/vts_test_util.cpp | 33 ++++++++++- radio/1.0/vts/functional/vts_test_util.h | 24 +++++++- radio/1.6/vts/functional/Android.bp | 8 ++- .../vts/functional/radio_hidl_hal_test.cpp | 57 +++++++++---------- .../functional/radio_hidl_hal_utils_v1_6.h | 31 +++------- radio/1.6/vts/functional/radio_response.cpp | 2 +- radio/config/1.3/vts/functional/Android.bp | 23 ++++++++ .../functional/radio_config_hidl_hal_test.cpp | 29 ---------- .../functional/radio_config_hidl_hal_utils.h | 25 +++----- .../vts/functional/radio_config_response.cpp | 7 ++- 10 files changed, 134 insertions(+), 105 deletions(-) diff --git a/radio/1.0/vts/functional/vts_test_util.cpp b/radio/1.0/vts/functional/vts_test_util.cpp index 9a2d089899..fc372011ed 100644 --- a/radio/1.0/vts/functional/vts_test_util.cpp +++ b/radio/1.0/vts/functional/vts_test_util.cpp @@ -19,6 +19,8 @@ #include #include "VtsCoreUtil.h" +#define WAIT_TIMEOUT_PERIOD 75 + int GetRandomSerialNumber() { return rand(); } @@ -99,4 +101,33 @@ bool isVoiceEmergencyOnly(RegState state) { ::android::hardware::radio::V1_0::RegState::NOT_REG_MT_SEARCHING_OP_EM == state || ::android::hardware::radio::V1_0::RegState::REG_DENIED_EM == state || ::android::hardware::radio::V1_0::RegState::UNKNOWN_EM == state; -} \ No newline at end of file +} + +/* + * Notify that the response message is received. + */ +void RadioResponseWaiter::notify(int receivedSerial) { + std::unique_lock lock(mtx_); + if (serial == receivedSerial) { + count_++; + cv_.notify_one(); + } +} + +/* + * Wait till the response message is notified or till WAIT_TIMEOUT_PERIOD. + */ +std::cv_status RadioResponseWaiter::wait() { + std::unique_lock lock(mtx_); + + std::cv_status status = std::cv_status::no_timeout; + auto now = std::chrono::system_clock::now(); + while (count_ == 0) { + status = cv_.wait_until(lock, now + std::chrono::seconds(WAIT_TIMEOUT_PERIOD)); + if (status == std::cv_status::timeout) { + return status; + } + } + count_--; + return status; +} diff --git a/radio/1.0/vts/functional/vts_test_util.h b/radio/1.0/vts/functional/vts_test_util.h index 218e8236b0..08f7ba38bd 100644 --- a/radio/1.0/vts/functional/vts_test_util.h +++ b/radio/1.0/vts/functional/vts_test_util.h @@ -14,6 +14,8 @@ * limitations under the License. */ +#pragma once + #include #include @@ -81,4 +83,24 @@ bool isVoiceEmergencyOnly(RegState state); /* * Check if voice status is in service. */ -bool isVoiceInService(RegState state); \ No newline at end of file +bool isVoiceInService(RegState state); + +/** + * Used when waiting for an asynchronous response from the HAL. + */ +class RadioResponseWaiter { + protected: + std::mutex mtx_; + std::condition_variable cv_; + int count_; + + public: + /* Serial number for radio request */ + int serial; + + /* Used as a mechanism to inform the test about data/event callback */ + void notify(int receivedSerial); + + /* Test code calls this function to wait for response */ + std::cv_status wait(); +}; diff --git a/radio/1.6/vts/functional/Android.bp b/radio/1.6/vts/functional/Android.bp index dde718b32c..65b0dd03ba 100644 --- a/radio/1.6/vts/functional/Android.bp +++ b/radio/1.6/vts/functional/Android.bp @@ -36,6 +36,7 @@ cc_test { ], static_libs: [ "RadioVtsTestUtilBase", + "RadioConfigVtsTestResponse", "android.hardware.radio@1.6", "android.hardware.radio@1.5", "android.hardware.radio@1.4", @@ -45,8 +46,13 @@ cc_test { "android.hardware.radio@1.0", "android.hardware.radio.config@1.0", "android.hardware.radio.config@1.1", + "android.hardware.radio.config@1.2", + "android.hardware.radio.config@1.3", + ], + header_libs: [ + "radio.util.header@1.0", + "radio.config.util.header@1.3", ], - header_libs: ["radio.util.header@1.0"], test_suites: [ "general-tests", "vts", diff --git a/radio/1.6/vts/functional/radio_hidl_hal_test.cpp b/radio/1.6/vts/functional/radio_hidl_hal_test.cpp index 59f768201d..6255f66f69 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_test.cpp +++ b/radio/1.6/vts/functional/radio_hidl_hal_test.cpp @@ -45,35 +45,6 @@ void RadioHidlTest_v1_6::SetUp() { EXPECT_EQ(CardState::PRESENT, cardStatus.base.base.base.cardState); } -/* - * Notify that the response message is received. - */ -void RadioHidlTest_v1_6::notify(int receivedSerial) { - std::unique_lock lock(mtx_); - if (serial == receivedSerial) { - count_++; - cv_.notify_one(); - } -} - -/* - * Wait till the response message is notified or till TIMEOUT_PERIOD. - */ -std::cv_status RadioHidlTest_v1_6::wait() { - std::unique_lock lock(mtx_); - - std::cv_status status = std::cv_status::no_timeout; - auto now = std::chrono::system_clock::now(); - while (count_ == 0) { - status = cv_.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD)); - if (status == std::cv_status::timeout) { - return status; - } - } - count_--; - return status; -} - void RadioHidlTest_v1_6::clearPotentialEstablishedCalls() { // Get the current call Id to hangup the established emergency call. serial = GetRandomSerialNumber(); @@ -108,3 +79,31 @@ void RadioHidlTest_v1_6::getDataCallList() { radio_v1_6->getDataCallList_1_6(serial); EXPECT_EQ(std::cv_status::no_timeout, wait()); } + +/** + * Specific features on the Radio Hal rely on Radio Hal Capabilities. The VTS + * tests related to that features must not run if the related capability is + * disabled. + *

+ * Typical usage within VTS: + * if (getRadioHalCapabilities().modemReducedFeatureSet) return; + */ +HalDeviceCapabilities RadioHidlTest_v1_6::getRadioHalCapabilities() { + sp<::android::hardware::radio::config::V1_3::IRadioConfig> radioConfig_v1_3 = + ::android::hardware::radio::config::V1_3::IRadioConfig::getService(); + if (radioConfig_v1_3.get() == nullptr) { + // If v1_3 isn't present, the values are initialized to false + HalDeviceCapabilities radioHalCapabilities; + memset(&radioHalCapabilities, 0, sizeof(radioHalCapabilities)); + return radioHalCapabilities; + } else { + // Get radioHalDeviceCapabilities from the radio config + sp radioConfigRsp = new (std::nothrow) RadioConfigResponse(*this); + radioConfig_v1_3->setResponseFunctions(radioConfigRsp, nullptr); + serial = GetRandomSerialNumber(); + + radioConfig_v1_3->getHalDeviceCapabilities(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + return radioConfigRsp->halDeviceCapabilities; + } +} diff --git a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h index f3eaed6be3..7bf8cc5356 100644 --- a/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h +++ b/radio/1.6/vts/functional/radio_hidl_hal_utils_v1_6.h @@ -18,16 +18,12 @@ #include -#include -#include -#include -#include +#include "radio_config_hidl_hal_utils.h" + #include #include #include -#include - #include #include #include @@ -42,14 +38,15 @@ using namespace ::android::hardware::radio::V1_3; using namespace ::android::hardware::radio::V1_2; using namespace ::android::hardware::radio::V1_1; using namespace ::android::hardware::radio::V1_0; +using namespace ::android::hardware::radio::config::V1_3; using ::android::sp; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; using ::android::hardware::Return; using ::android::hardware::Void; +using ::android::hardware::radio::config::V1_3::HalDeviceCapabilities; -#define TIMEOUT_PERIOD 75 #define MODEM_EMERGENCY_CALL_ESTABLISH_TIME 3 #define MODEM_EMERGENCY_CALL_DISCONNECT_TIME 3 @@ -61,7 +58,7 @@ extern ::android::hardware::radio::V1_5::CardStatus cardStatus; /* Callback class for radio response v1_6 */ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioResponse { protected: - RadioHidlTest_v1_6& parent_v1_6; + RadioResponseWaiter& parent_v1_6; public: hidl_vec radioBandModes; @@ -105,7 +102,7 @@ class RadioResponse_v1_6 : public ::android::hardware::radio::V1_6::IRadioRespon ::android::hardware::radio::V1_5::CellIdentity barringCellIdentity; ::android::hardware::hidl_vec<::android::hardware::radio::V1_5::BarringInfo> barringInfos; - RadioResponse_v1_6(RadioHidlTest_v1_6& parent_v1_6); + RadioResponse_v1_6(RadioResponseWaiter& parent_v1_6); virtual ~RadioResponse_v1_6() = default; Return getIccCardStatusResponse( @@ -1079,15 +1076,9 @@ class RadioIndication_v1_6 : public ::android::hardware::radio::V1_6::IRadioIndi }; // The main test class for Radio HIDL. -class RadioHidlTest_v1_6 : public ::testing::TestWithParam { +class RadioHidlTest_v1_6 : public ::testing::TestWithParam, + public RadioResponseWaiter { protected: - std::mutex mtx_; - std::condition_variable cv_; - int count_; - - /* Serial number for radio request */ - int serial; - /* Clear Potential Established Calls */ void clearPotentialEstablishedCalls(); @@ -1100,11 +1091,7 @@ class RadioHidlTest_v1_6 : public ::testing::TestWithParam { public: virtual void SetUp() override; - /* Used as a mechanism to inform the test about data/event callback */ - void notify(int receivedSerial); - - /* Test code calls this function to wait for response */ - std::cv_status wait(); + HalDeviceCapabilities getRadioHalCapabilities(); /* radio service handle */ sp<::android::hardware::radio::V1_6::IRadio> radio_v1_6; diff --git a/radio/1.6/vts/functional/radio_response.cpp b/radio/1.6/vts/functional/radio_response.cpp index 8c8d69831e..6e17064b6f 100644 --- a/radio/1.6/vts/functional/radio_response.cpp +++ b/radio/1.6/vts/functional/radio_response.cpp @@ -18,7 +18,7 @@ ::android::hardware::radio::V1_5::CardStatus cardStatus; -RadioResponse_v1_6::RadioResponse_v1_6(RadioHidlTest_v1_6& parent) : parent_v1_6(parent) {} +RadioResponse_v1_6::RadioResponse_v1_6(RadioResponseWaiter& parent) : parent_v1_6(parent) {} /* 1.0 Apis */ Return RadioResponse_v1_6::getIccCardStatusResponse( diff --git a/radio/config/1.3/vts/functional/Android.bp b/radio/config/1.3/vts/functional/Android.bp index aa3522dead..20c480ff3d 100644 --- a/radio/config/1.3/vts/functional/Android.bp +++ b/radio/config/1.3/vts/functional/Android.bp @@ -46,3 +46,26 @@ cc_test { "vts", ], } + +cc_library_static { + name: "RadioConfigVtsTestResponse", + defaults: ["VtsHalTargetTestDefaults"], + srcs : [ + "radio_config_response.cpp", + "radio_config_hidl_hal_test.cpp", + ], + header_libs: ["radio.util.header@1.0"], + static_libs: ["RadioVtsTestUtilBase"], + shared_libs: [ + "android.hardware.radio@1.0", + "android.hardware.radio.config@1.0", + "android.hardware.radio.config@1.1", + "android.hardware.radio.config@1.2", + "android.hardware.radio.config@1.3", + ], +} + +cc_library_headers { + name: "radio.config.util.header@1.3", + export_include_dirs: ["."], +} diff --git a/radio/config/1.3/vts/functional/radio_config_hidl_hal_test.cpp b/radio/config/1.3/vts/functional/radio_config_hidl_hal_test.cpp index de8365aee8..da614645f5 100644 --- a/radio/config/1.3/vts/functional/radio_config_hidl_hal_test.cpp +++ b/radio/config/1.3/vts/functional/radio_config_hidl_hal_test.cpp @@ -31,32 +31,3 @@ void RadioConfigHidlTest::SetUp() { radioConfig->setResponseFunctions(radioConfigRsp, nullptr); } - -/* - * Notify that the response message is received. - */ -void RadioConfigHidlTest::notify(int receivedSerial) { - std::unique_lock lock(mtx_); - if (serial == receivedSerial) { - count_++; - cv_.notify_one(); - } -} - -/* - * Wait till the response message is notified or till TIMEOUT_PERIOD. - */ -std::cv_status RadioConfigHidlTest::wait() { - std::unique_lock lock(mtx_); - - std::cv_status status = std::cv_status::no_timeout; - auto now = std::chrono::system_clock::now(); - while (count_ == 0) { - status = cv_.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD)); - if (status == std::cv_status::timeout) { - return status; - } - } - count_--; - return status; -} diff --git a/radio/config/1.3/vts/functional/radio_config_hidl_hal_utils.h b/radio/config/1.3/vts/functional/radio_config_hidl_hal_utils.h index 439eb705b6..895ae08c23 100644 --- a/radio/config/1.3/vts/functional/radio_config_hidl_hal_utils.h +++ b/radio/config/1.3/vts/functional/radio_config_hidl_hal_utils.h @@ -14,6 +14,8 @@ * limitations under the License. */ +#pragma once + #include #include @@ -49,7 +51,6 @@ using ::android::hardware::radio::config::V1_3::HalDeviceCapabilities; using ::android::hardware::radio::config::V1_3::IRadioConfig; using ::android::hardware::radio::V1_0::RadioResponseInfo; -#define TIMEOUT_PERIOD 75 #define RADIO_SERVICE_NAME "slot1" class RadioConfigHidlTest; @@ -57,13 +58,14 @@ class RadioConfigHidlTest; /* Callback class for radio config response */ class RadioConfigResponse : public IRadioConfigResponse { protected: - RadioConfigHidlTest& parent; + RadioResponseWaiter& parent; public: RadioResponseInfo rspInfo; PhoneCapability phoneCap; + HalDeviceCapabilities halDeviceCapabilities; - RadioConfigResponse(RadioConfigHidlTest& parent); + RadioConfigResponse(RadioResponseWaiter& parent); virtual ~RadioConfigResponse() = default; Return getSimSlotsStatusResponse( @@ -107,26 +109,13 @@ class RadioConfigIndication : public IRadioConfigIndication { }; // The main test class for Radio config HIDL. -class RadioConfigHidlTest : public ::testing::TestWithParam { - protected: - std::mutex mtx_; - std::condition_variable cv_; - int count_; - +class RadioConfigHidlTest : public ::testing::TestWithParam, + public RadioResponseWaiter { public: virtual void SetUp() override; - /* Used as a mechanism to inform the test about data/event callback */ - void notify(int receivedSerial); - - /* Test code calls this function to wait for response */ - std::cv_status wait(); - void updateSimCardStatus(); - /* Serial number for radio request */ - int serial; - /* radio config service handle */ sp radioConfig; diff --git a/radio/config/1.3/vts/functional/radio_config_response.cpp b/radio/config/1.3/vts/functional/radio_config_response.cpp index 2a8b28ba7c..11e3cce147 100644 --- a/radio/config/1.3/vts/functional/radio_config_response.cpp +++ b/radio/config/1.3/vts/functional/radio_config_response.cpp @@ -18,7 +18,7 @@ // SimSlotStatus slotStatus; -RadioConfigResponse::RadioConfigResponse(RadioConfigHidlTest& parent) : parent(parent) {} +RadioConfigResponse::RadioConfigResponse(RadioResponseWaiter& parent) : parent(parent) {} Return RadioConfigResponse::getSimSlotsStatusResponse( const ::android::hardware::radio::V1_0::RadioResponseInfo& /* info */, @@ -65,6 +65,7 @@ Return RadioConfigResponse::setModemsConfigResponse( Return RadioConfigResponse::getHalDeviceCapabilitiesResponse( const ::android::hardware::radio::V1_6::RadioResponseInfo& /* info */, - const ::android::hardware::radio::config::V1_3::HalDeviceCapabilities& /* capabilities */) { + const ::android::hardware::radio::config::V1_3::HalDeviceCapabilities& capabilities) { + halDeviceCapabilities = capabilities; return Void(); -} \ No newline at end of file +}