Fix a flaky test in FakeVehicleHalValueGeneratorsTest.
Fix a flaky test which might be caused by when the lock is waked
up, we might have more events than what we want. Furthermore, we
have to clear existing events after unregistering event generator.
Test: atest FakeVehicleHalValueGeneratorTest 10 times on cf_auto
Bug: 221084327
Change-Id: I65e87fa62b8538164fcdd60a9df871a9817f4f8e
Merged-In: I65e87fa62b8538164fcdd60a9df871a9817f4f8e
(cherry picked from commit 6ae468c1e39f72456416697ee7cf483dcf0c6f3b)
diff --git a/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/include/JsonFakeValueGenerator.h b/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/include/JsonFakeValueGenerator.h
index 947eb4f..d421ac5 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/include/JsonFakeValueGenerator.h
+++ b/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/include/JsonFakeValueGenerator.h
@@ -56,7 +56,7 @@
private:
size_t mEventIndex = 0;
std::vector<aidl::android::hardware::automotive::vehicle::VehiclePropValue> mEvents;
- long mLastEventTimestamp = 0;
+ int64_t mLastEventTimestamp = 0;
int32_t mNumOfIterations = 0;
void setBit(std::vector<uint8_t>& bytes, size_t idx);
diff --git a/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/src/JsonFakeValueGenerator.cpp b/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/src/JsonFakeValueGenerator.cpp
index ae92797..d4d52a5 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/src/JsonFakeValueGenerator.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/src/JsonFakeValueGenerator.cpp
@@ -213,7 +213,7 @@
if (mLastEventTimestamp == 0) {
mLastEventTimestamp = elapsedRealtimeNano();
} else {
- long nextEventTime = 0;
+ int64_t nextEventTime = 0;
if (mEventIndex > 0) {
// All events (start from 2nd one) are supposed to happen in the future with a delay
// equals to the duration between previous and current event.
diff --git a/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/test/FakeVehicleHalValueGeneratorsTest.cpp b/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/test/FakeVehicleHalValueGeneratorsTest.cpp
index 674b078..cdfa8b2 100644
--- a/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/test/FakeVehicleHalValueGeneratorsTest.cpp
+++ b/automotive/vehicle/aidl/impl/fake_impl/GeneratorHub/test/FakeVehicleHalValueGeneratorsTest.cpp
@@ -66,7 +66,7 @@
std::unique_lock<std::mutex> uniqueLock(mEventsLock);
bool result = mCv.wait_for(uniqueLock, 10s, [this, count] {
ScopedLockAssertion lockAssertion(mEventsLock);
- return mEvents.size() == count;
+ return mEvents.size() >= count;
});
ASSERT_TRUE(result) << "didn't receive enough events";
@@ -126,7 +126,8 @@
for (size_t i = 0; i < eventCount; i++) {
events.push_back(VehiclePropValue{
.prop = static_cast<int32_t>(i),
- .timestamp = timestamp + static_cast<int64_t>(50 * i),
+ // Generate 1 event every 1ms.
+ .timestamp = timestamp + static_cast<int64_t>(1000000 * i),
});
}
generator->setEvents(events);
@@ -148,7 +149,8 @@
for (size_t i = 0; i < eventCount; i++) {
events.push_back(VehiclePropValue{
.prop = static_cast<int32_t>(i),
- .timestamp = timestamp + static_cast<int64_t>(50 * i),
+ // Generate 1 event every 1ms.
+ .timestamp = timestamp + static_cast<int64_t>(1000000 * i),
});
}
generator->setEvents(events);
@@ -158,8 +160,12 @@
waitForEvents(1);
getHub()->unregisterGenerator(0);
+ clearEvents();
- ASSERT_LE(getEvents().size(), 2u)
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+
+ // It is possible that one last event would be generated after unregistering.
+ ASSERT_LE(getEvents().size(), 1u)
<< "Must stop generating event after generator is unregistered";
}
@@ -176,7 +182,6 @@
waitForEvents(10);
auto events = getEvents();
- ASSERT_EQ(events.size(), 10u);
int value = 30;
for (size_t i = 0; i < 10; i++) {
EXPECT_EQ(std::vector<float>({static_cast<float>(value)}), events[i].value.floatValues);
@@ -196,7 +201,7 @@
waitForEvents(10);
auto events = getEvents();
- ASSERT_EQ(events.size(), 10u);
+
int value = 30;
for (size_t i = 0; i < 10; i++) {
EXPECT_EQ(std::vector<int32_t>({value}), events[i].value.int32Values);
@@ -216,8 +221,7 @@
waitForEvents(10);
auto events = getEvents();
- // We should get 10 events ideally, but let's be safe here.
- ASSERT_EQ(events.size(), 10u);
+
int value = 30;
for (size_t i = 0; i < 10; i++) {
EXPECT_EQ(std::vector<int64_t>({value}), events[i].value.int64Values);
@@ -237,7 +241,7 @@
waitForEvents(10);
auto events = getEvents();
- ASSERT_EQ(events.size(), 10u);
+
int value = 50;
for (size_t i = 0; i < 10; i++) {
EXPECT_EQ(std::vector<float>({static_cast<float>(value)}), events[i].value.floatValues);
@@ -258,7 +262,6 @@
waitForEvents(10);
auto events = getEvents();
- ASSERT_EQ(events.size(), 10u);
// Init value would be set to middleValue if given initValue is not valid.
int value = 50;
@@ -269,7 +272,7 @@
}
TEST_F(FakeVehicleHalValueGeneratorsTest, testJsonFakeValueGenerator) {
- long currentTime = elapsedRealtimeNano();
+ int64_t currentTime = elapsedRealtimeNano();
std::unique_ptr<JsonFakeValueGenerator> generator =
std::make_unique<JsonFakeValueGenerator>(getTestFilePath("prop.json"), 2);
@@ -306,7 +309,7 @@
waitForEvents(expectedValues.size());
auto events = getEvents();
- long lastEventTime = currentTime;
+ int64_t lastEventTime = currentTime;
for (auto& event : events) {
EXPECT_GT(event.timestamp, lastEventTime);
lastEventTime = event.timestamp;
@@ -325,7 +328,7 @@
}
TEST_F(FakeVehicleHalValueGeneratorsTest, testJsonFakeValueGeneratorUsingRequest) {
- long currentTime = elapsedRealtimeNano();
+ int64_t currentTime = elapsedRealtimeNano();
VehiclePropValue request = {.value = {
.stringValue = getTestFilePath("prop.json"),
@@ -367,7 +370,7 @@
waitForEvents(expectedValues.size());
auto events = getEvents();
- long lastEventTime = currentTime;
+ int64_t lastEventTime = currentTime;
for (auto& event : events) {
EXPECT_GT(event.timestamp, lastEventTime);
lastEventTime = event.timestamp;