Merge "Add retry in setProp test." into android14-tests-dev am: 2c12f0e9ae

Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/2934133

Change-Id: I0639e2f1bc6152c37e7fc6fac76d271871195b32
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Yu Shan 2024-01-31 02:21:18 +00:00 committed by Automerger Merge Worker
commit 83a9e12f6d

View file

@ -35,20 +35,22 @@
#include <chrono>
#include <mutex>
#include <thread>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using ::aidl::android::hardware::automotive::vehicle::IVehicle;
using ::aidl::android::hardware::automotive::vehicle::StatusCode;
using ::aidl::android::hardware::automotive::vehicle::SubscribeOptions;
using ::aidl::android::hardware::automotive::vehicle::VehicleArea;
using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyAccess;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyChangeMode;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyGroup;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyStatus;
using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
using ::android::getAidlHalInstanceNames;
using ::android::uptimeMillis;
using ::android::base::ScopedLockAssertion;
using ::android::base::StringPrintf;
using ::android::frameworks::automotive::vhal::ErrorCode;
@ -57,11 +59,14 @@ using ::android::frameworks::automotive::vhal::IHalPropConfig;
using ::android::frameworks::automotive::vhal::IHalPropValue;
using ::android::frameworks::automotive::vhal::ISubscriptionCallback;
using ::android::frameworks::automotive::vhal::IVhalClient;
using ::android::frameworks::automotive::vhal::VhalClientResult;
using ::android::hardware::getAllHalInstanceNames;
using ::android::hardware::Sanitize;
using ::android::hardware::automotive::vehicle::toInt;
constexpr int32_t kInvalidProp = 0x31600207;
// The timeout for retrying getting prop value after setting prop value.
constexpr int64_t kRetryGetPropAfterSetPropTimeoutMillis = 10'000;
struct ServiceDescriptor {
std::string name;
@ -118,6 +123,10 @@ class VtsVehicleCallback final : public ISubscriptionCallback {
class VtsHalAutomotiveVehicleTargetTest : public testing::TestWithParam<ServiceDescriptor> {
protected:
bool checkIsSupported(int32_t propertyId);
VehiclePropertyStatus getStatus(const IHalPropValue& halPropValue);
bool isUnavailable(const VhalClientResult<std::unique_ptr<IHalPropValue>>& result);
bool isResultOkayWithValue(const VhalClientResult<std::unique_ptr<IHalPropValue>>& result,
int32_t value);
public:
void verifyProperty(VehicleProperty propId, VehiclePropertyAccess access,
@ -231,6 +240,41 @@ TEST_P(VtsHalAutomotiveVehicleTargetTest, getInvalidProp) {
"Expect failure to get property for invalid prop: %" PRId32, kInvalidProp);
}
VehiclePropertyStatus VtsHalAutomotiveVehicleTargetTest::getStatus(
const IHalPropValue& halPropValue) {
if (mVhalClient->isAidlVhal()) {
return reinterpret_cast<
const aidl::android::hardware::automotive::vehicle::VehiclePropValue*>(
halPropValue.toVehiclePropValue())
->status;
}
return static_cast<VehiclePropertyStatus>(
reinterpret_cast<const android::hardware::automotive::vehicle::V2_0::VehiclePropValue*>(
halPropValue.toVehiclePropValue())
->status);
}
bool VtsHalAutomotiveVehicleTargetTest::isResultOkayWithValue(
const VhalClientResult<std::unique_ptr<IHalPropValue>>& result, int32_t value) {
return result.ok() && result.value() != nullptr &&
getStatus(*(result.value())) == VehiclePropertyStatus::AVAILABLE &&
result.value()->getInt32Values().size() == 1 &&
result.value()->getInt32Values()[0] == value;
}
bool VtsHalAutomotiveVehicleTargetTest::isUnavailable(
const VhalClientResult<std::unique_ptr<IHalPropValue>>& result) {
if (!result.ok()) {
return result.error().code() == ErrorCode::NOT_AVAILABLE_FROM_VHAL;
}
if (result.value() != nullptr &&
getStatus(*(result.value())) == VehiclePropertyStatus::UNAVAILABLE) {
return true;
}
return false;
}
// Test set() on read_write properties.
TEST_P(VtsHalAutomotiveVehicleTargetTest, setProp) {
ALOGD("VtsHalAutomotiveVehicleTargetTest::setProp");
@ -258,6 +302,14 @@ TEST_P(VtsHalAutomotiveVehicleTargetTest, setProp) {
auto propToGet = mVhalClient->createHalPropValue(propId);
auto getValueResult = mVhalClient->getValueSync(*propToGet);
if (isUnavailable(getValueResult)) {
ALOGW("getProperty for %" PRId32
" returns NOT_AVAILABLE, "
"skip testing setProp",
propId);
return;
}
ASSERT_TRUE(getValueResult.ok())
<< StringPrintf("Failed to get value for property: %" PRId32 ", error: %s",
propId, getValueResult.error().message().c_str());
@ -270,17 +322,48 @@ TEST_P(VtsHalAutomotiveVehicleTargetTest, setProp) {
"Expect exactly 1 int value for boolean property: %" PRId32 ", got %zu", propId,
intValueSize);
int setValue = value.getInt32Values()[0] == 1 ? 0 : 1;
int32_t setValue = value.getInt32Values()[0] == 1 ? 0 : 1;
auto propToSet = mVhalClient->createHalPropValue(propId);
propToSet->setInt32Values({setValue});
auto setValueResult = mVhalClient->setValueSync(*propToSet);
if (!setValueResult.ok() &&
setValueResult.error().code() == ErrorCode::NOT_AVAILABLE_FROM_VHAL) {
ALOGW("setProperty for %" PRId32
" returns NOT_AVAILABLE, "
"skip verifying getProperty returns the same value",
propId);
return;
}
ASSERT_TRUE(setValueResult.ok())
<< StringPrintf("Failed to set value for property: %" PRId32 ", error: %s",
propId, setValueResult.error().message().c_str());
// Retry getting the value until we pass the timeout. getValue might not return
// the expected value immediately since setValue is async.
auto timeoutMillis = uptimeMillis() + kRetryGetPropAfterSetPropTimeoutMillis;
// check set success
while (true) {
getValueResult = mVhalClient->getValueSync(*propToGet);
if (isResultOkayWithValue(getValueResult, setValue)) {
break;
}
if (uptimeMillis() >= timeoutMillis) {
// Reach timeout, the following assert should fail.
break;
}
// Sleep for 100ms between each getValueSync retry.
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
if (isUnavailable(getValueResult)) {
ALOGW("getProperty for %" PRId32
" returns NOT_AVAILABLE, "
"skip verifying the return value",
propId);
return;
}
ASSERT_TRUE(getValueResult.ok())
<< StringPrintf("Failed to get value for property: %" PRId32 ", error: %s",
propId, getValueResult.error().message().c_str());