diff --git a/radio/1.0/vts/functional/vts_test_util.cpp b/radio/1.0/vts/functional/vts_test_util.cpp index 7a21a40004..9a2d089899 100644 --- a/radio/1.0/vts/functional/vts_test_util.cpp +++ b/radio/1.0/vts/functional/vts_test_util.cpp @@ -17,6 +17,7 @@ #include #include +#include "VtsCoreUtil.h" int GetRandomSerialNumber() { return rand(); @@ -78,4 +79,24 @@ bool deviceSupportsFeature(const char* feature) { __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "Feature %s: %ssupported", feature, hasFeature ? "" : "not "); return hasFeature; +} + +bool isDsDsEnabled() { + return testing::checkSubstringInCommandOutput("getprop persist.radio.multisim.config", "dsds"); +} + +bool isTsTsEnabled() { + return testing::checkSubstringInCommandOutput("getprop persist.radio.multisim.config", "tsts"); +} + +bool isVoiceInService(RegState state) { + return ::android::hardware::radio::V1_0::RegState::REG_HOME == state || + ::android::hardware::radio::V1_0::RegState::REG_ROAMING == state; +} + +bool isVoiceEmergencyOnly(RegState state) { + return ::android::hardware::radio::V1_0::RegState::NOT_REG_MT_NOT_SEARCHING_OP_EM == 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 diff --git a/radio/1.0/vts/functional/vts_test_util.h b/radio/1.0/vts/functional/vts_test_util.h index df8dd7718b..1625f11d5d 100644 --- a/radio/1.0/vts/functional/vts_test_util.h +++ b/radio/1.0/vts/functional/vts_test_util.h @@ -21,6 +21,7 @@ #include using ::android::hardware::radio::V1_0::RadioError; +using ::android::hardware::radio::V1_0::RegState; using ::android::hardware::radio::V1_0::SapResultCode; using namespace std; @@ -55,3 +56,23 @@ int GetRandomSerialNumber(); * Check if device supports feature. */ bool deviceSupportsFeature(const char* feature); + +/* + * Check if device is in DSDS. + */ +bool isDsDsEnabled(); + +/* + * Check if device is in TSTS. + */ +bool isTsTsEnabled(); + +/* + * Check if voice status is in emergency only. + */ +bool isVoiceEmergencyOnly(RegState state); + +/* + * Check if voice status is in service. + */ +bool isVoiceInService(RegState state); \ No newline at end of file diff --git a/radio/1.4/vts/functional/radio_hidl_hal_api.cpp b/radio/1.4/vts/functional/radio_hidl_hal_api.cpp index 3ba9b9db9d..1b254a1edf 100644 --- a/radio/1.4/vts/functional/radio_hidl_hal_api.cpp +++ b/radio/1.4/vts/functional/radio_hidl_hal_api.cpp @@ -56,7 +56,21 @@ TEST_P(RadioHidlTest_v1_4, emergencyDial) { EXPECT_EQ(serial, radioRsp_v1_4->rspInfo.serial); ALOGI("emergencyDial, rspInfo.error = %s\n", toString(radioRsp_v1_4->rspInfo.error).c_str()); - EXPECT_EQ(RadioError::NONE, radioRsp_v1_4->rspInfo.error); + + ::android::hardware::radio::V1_0::RadioError rspEmergencyDial = radioRsp_v1_4->rspInfo.error; + // In DSDS or TSTS, we only check the result if the current slot is IN_SERVICE + // or Emergency_Only. + if (isDsDsEnabled() || isTsTsEnabled()) { + serial = GetRandomSerialNumber(); + radio_v1_4->getVoiceRegistrationState(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + if (isVoiceEmergencyOnly(radioRsp_v1_4->voiceRegResp.regState) || + isVoiceInService(radioRsp_v1_4->voiceRegResp.regState)) { + EXPECT_EQ(RadioError::NONE, rspEmergencyDial); + } + } else { + EXPECT_EQ(RadioError::NONE, rspEmergencyDial); + } // Give some time for modem to establish the emergency call channel. sleep(MODEM_EMERGENCY_CALL_ESTABLISH_TIME); @@ -95,8 +109,21 @@ TEST_P(RadioHidlTest_v1_4, emergencyDial_withServices) { ALOGI("emergencyDial_withServices, rspInfo.error = %s\n", toString(radioRsp_v1_4->rspInfo.error).c_str()); - EXPECT_EQ(RadioError::NONE, radioRsp_v1_4->rspInfo.error); + ::android::hardware::radio::V1_0::RadioError rspEmergencyDial = radioRsp_v1_4->rspInfo.error; + // In DSDS or TSTS, we only check the result if the current slot is IN_SERVICE + // or Emergency_Only. + if (isDsDsEnabled() || isTsTsEnabled()) { + serial = GetRandomSerialNumber(); + radio_v1_4->getVoiceRegistrationState(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + if (isVoiceEmergencyOnly(radioRsp_v1_4->voiceRegResp.regState) || + isVoiceInService(radioRsp_v1_4->voiceRegResp.regState)) { + EXPECT_EQ(RadioError::NONE, rspEmergencyDial); + } + } else { + EXPECT_EQ(RadioError::NONE, rspEmergencyDial); + } // Give some time for modem to establish the emergency call channel. sleep(MODEM_EMERGENCY_CALL_ESTABLISH_TIME); @@ -134,7 +161,21 @@ TEST_P(RadioHidlTest_v1_4, emergencyDial_withEmergencyRouting) { ALOGI("emergencyDial_withEmergencyRouting, rspInfo.error = %s\n", toString(radioRsp_v1_4->rspInfo.error).c_str()); - EXPECT_EQ(RadioError::NONE, radioRsp_v1_4->rspInfo.error); + ::android::hardware::radio::V1_0::RadioError rspEmergencyDial = radioRsp_v1_4->rspInfo.error; + + // In DSDS or TSTS, we only check the result if the current slot is IN_SERVICE + // or Emergency_Only. + if (isDsDsEnabled() || isTsTsEnabled()) { + serial = GetRandomSerialNumber(); + radio_v1_4->getVoiceRegistrationState(serial); + EXPECT_EQ(std::cv_status::no_timeout, wait()); + if (isVoiceEmergencyOnly(radioRsp_v1_4->voiceRegResp.regState) || + isVoiceInService(radioRsp_v1_4->voiceRegResp.regState)) { + EXPECT_EQ(RadioError::NONE, rspEmergencyDial); + } + } else { + EXPECT_EQ(RadioError::NONE, rspEmergencyDial); + } // Give some time for modem to establish the emergency call channel. sleep(MODEM_EMERGENCY_CALL_ESTABLISH_TIME); diff --git a/radio/1.4/vts/functional/radio_hidl_hal_utils_v1_4.h b/radio/1.4/vts/functional/radio_hidl_hal_utils_v1_4.h index 53a584545c..8eee811f7e 100644 --- a/radio/1.4/vts/functional/radio_hidl_hal_utils_v1_4.h +++ b/radio/1.4/vts/functional/radio_hidl_hal_utils_v1_4.h @@ -64,6 +64,7 @@ class RadioResponse_v1_4 : public ::android::hardware::radio::V1_4::IRadioRespon // Call hidl_vec<::android::hardware::radio::V1_2::Call> currentCalls; + ::android::hardware::radio::V1_2::VoiceRegStateResult voiceRegResp; // Modem bool isModemEnabled; diff --git a/radio/1.4/vts/functional/radio_response.cpp b/radio/1.4/vts/functional/radio_response.cpp index d0aae47554..3e93bf4d15 100644 --- a/radio/1.4/vts/functional/radio_response.cpp +++ b/radio/1.4/vts/functional/radio_response.cpp @@ -762,8 +762,9 @@ Return RadioResponse_v1_4::getCellInfoListResponse_1_2( Return RadioResponse_v1_4::getVoiceRegistrationStateResponse_1_2( const RadioResponseInfo& info, - const ::android::hardware::radio::V1_2::VoiceRegStateResult& /*voiceRegResponse*/) { + const ::android::hardware::radio::V1_2::VoiceRegStateResult& voiceRegResponse) { rspInfo = info; + voiceRegResp = voiceRegResponse; parent_v1_4.notify(info.serial); return Void(); }