Merge cherrypicks of ['googleplex-android-review.googlesource.com/33177869'] into 25Q2-release. Change-Id: I56e2f09e82d5a7b0b43d78e26b408332063504d0
diff --git a/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp b/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp index 77e2916..8bef93a 100644 --- a/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp +++ b/sensors/aidl/vts/VtsAidlHalSensorsTargetTest.cpp
@@ -314,6 +314,7 @@ } protected: + std::vector<SensorInfo> getValidSensors(); std::vector<SensorInfo> getNonOneShotSensors(); std::vector<SensorInfo> getNonOneShotAndNonSpecialSensors(); std::vector<SensorInfo> getNonOneShotAndNonOnChangeAndNonSpecialSensors(); @@ -356,6 +357,7 @@ } ndk::ScopedAStatus activate(int32_t sensorHandle, bool enable); + void activateSensors(const std::vector<SensorInfo>& sensors, bool enable); void activateAllSensors(bool enable); ndk::ScopedAStatus batch(int32_t sensorHandle, int64_t samplingPeriodNs, @@ -428,14 +430,30 @@ return getSensors()->activate(sensorHandle, enable); } +void SensorsAidlTest::activateSensors(const std::vector<SensorInfo>& sensors, bool enable) { + for (const SensorInfo& sensorInfo : sensors) { + SCOPED_TRACE(::testing::Message() + << "enable=" << enable << " handle=0x" << std::hex << std::setw(8) + << std::setfill('0') << sensorInfo.sensorHandle << std::dec << " type=" + << sensorInfo.typeAsString << " name=" << sensorInfo.name); + checkIsOk(batch(sensorInfo.sensorHandle, sensorInfo.minDelayUs, + 0 /* maxReportLatencyNs */)); + checkIsOk(activate(sensorInfo.sensorHandle, enable)); + } +} + void SensorsAidlTest::activateAllSensors(bool enable) { - for (const SensorInfo& sensorInfo : getSensorsList()) { - if (isValidType(sensorInfo.type)) { - checkIsOk(batch(sensorInfo.sensorHandle, sensorInfo.minDelayUs, - 0 /* maxReportLatencyNs */)); - checkIsOk(activate(sensorInfo.sensorHandle, enable)); + activateSensors(getValidSensors(), enable); +} + +std::vector<SensorInfo> SensorsAidlTest::getValidSensors() { + std::vector<SensorInfo> validSensors; + for (const SensorInfo& info : getSensorsList()) { + if (isValidType(info.type)) { + validSensors.push_back(info); } } + return validSensors; } std::vector<SensorInfo> SensorsAidlTest::getNonOneShotSensors() { @@ -506,30 +524,39 @@ EventCallback callback; getEnvironment()->registerCallback(&callback); - for (const SensorInfo& sensor : sensors) { - // Configure and activate the sensor - batch(sensor.sensorHandle, sensor.maxDelayUs, 0 /* maxReportLatencyNs */); - activate(sensor.sensorHandle, activateSensor); + constexpr size_t kMaxSensorsToActivateInParallel = 20; + size_t nextStartIndex = 0; + while (nextStartIndex < sensors.size()) { + size_t startIndex = nextStartIndex; + size_t endIndex = std::min(startIndex + kMaxSensorsToActivateInParallel, sensors.size()); + for (size_t i = startIndex; i < endIndex; ++i) { + // Configure and activate the sensor + const SensorInfo& sensor = sensors[i]; + batch(sensor.sensorHandle, sensor.maxDelayUs, 0 /* maxReportLatencyNs */); + activate(sensor.sensorHandle, activateSensor); - // Flush the sensor - for (int32_t i = 0; i < flushCalls; i++) { - SCOPED_TRACE(::testing::Message() - << "Flush " << i << "/" << flushCalls << ": " - << " handle=0x" << std::hex << std::setw(8) << std::setfill('0') - << sensor.sensorHandle << std::dec - << " type=" << static_cast<int>(sensor.type) << " name=" << sensor.name); + // Flush the sensor + for (int32_t i = 0; i < flushCalls; i++) { + SCOPED_TRACE(::testing::Message() + << "Flush " << i << "/" << flushCalls << ": " + << " handle=0x" << std::hex << std::setw(8) << std::setfill('0') + << sensor.sensorHandle << std::dec + << " type=" << static_cast<int>(sensor.type) << " name=" << sensor.name); - EXPECT_EQ(flush(sensor.sensorHandle).isOk(), expectedResult); + EXPECT_EQ(flush(sensor.sensorHandle).isOk(), expectedResult); + } } - } - // Wait up to one second for the flush events - callback.waitForFlushEvents(sensors, flushCalls, std::chrono::milliseconds(1000) /* timeout */); + // Wait up to one second for the flush events + callback.waitForFlushEvents(sensors, flushCalls, std::chrono::milliseconds(1000) /* timeout */); - // Deactivate all sensors after waiting for flush events so pending flush events are not - // abandoned by the HAL. - for (const SensorInfo& sensor : sensors) { - activate(sensor.sensorHandle, false); + // Deactivate all sensors after waiting for flush events so pending flush events are not + // abandoned by the HAL. + for (size_t i = startIndex; i < endIndex; ++i) { + const SensorInfo& sensor = sensors[i]; + activate(sensor.sensorHandle, false); + } + nextStartIndex += kMaxSensorsToActivateInParallel; } getEnvironment()->unregisterCallback(); @@ -724,15 +751,16 @@ return; // Exit early if setting up the new environment failed } - size_t numNonOneShotAndNonSpecialSensors = getNonOneShotAndNonSpecialSensors().size(); - activateAllSensors(true); + const std::vector<SensorInfo> sensors = getNonOneShotAndNonOnChangeAndNonSpecialSensors(); + size_t numNonOneShotAndNonSpecialSensors = sensors.size(); + activateSensors(sensors, true); // Verify that the old environment does not receive any events EXPECT_EQ(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), 0); if (numNonOneShotAndNonSpecialSensors > 0) { // Verify that the new event queue receives sensor events EXPECT_GE(newEnv.get()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents); } - activateAllSensors(false); + activateSensors(sensors, false); // Cleanup the test environment newEnv->TearDown(); @@ -745,21 +773,22 @@ } // Ensure that the original environment is receiving events - activateAllSensors(true); + activateSensors(sensors, true); if (numNonOneShotAndNonSpecialSensors > 0) { EXPECT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents); } - activateAllSensors(false); + activateSensors(sensors, false); } TEST_P(SensorsAidlTest, CleanupConnectionsOnInitialize) { - activateAllSensors(true); + const std::vector<SensorInfo> sensors = getNonOneShotAndNonOnChangeAndNonSpecialSensors(); + activateSensors(sensors, true); // Verify that events are received constexpr useconds_t kCollectionTimeoutUs = 1000 * 1000; // 1s constexpr int32_t kNumEvents = 1; - size_t numNonOneShotAndNonSpecialSensors = getNonOneShotAndNonSpecialSensors().size(); + size_t numNonOneShotAndNonSpecialSensors = sensors.size(); if (numNonOneShotAndNonSpecialSensors > 0) { ASSERT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents); } @@ -775,13 +804,13 @@ // Verify no events are received until sensors are re-activated ASSERT_EQ(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), 0); - activateAllSensors(true); + activateSensors(sensors, true); if (numNonOneShotAndNonSpecialSensors > 0) { ASSERT_GE(getEnvironment()->collectEvents(kCollectionTimeoutUs, kNumEvents).size(), kNumEvents); } // Disable sensors - activateAllSensors(false); + activateSensors(sensors, false); // Restore active sensors prior to clearing the environment mSensorHandles = handles; @@ -846,12 +875,12 @@ checkIsOk(batch(sensor.sensorHandle, samplingPeriodNs, 0 /* maxReportLatencyNs */)); // Activate the sensor - activate(sensor.sensorHandle, true /* enabled */); + activate(sensor.sensorHandle, true /* enable */); // Call batch on an active sensor checkIsOk(batch(sensor.sensorHandle, sensor.maxDelayUs, 0 /* maxReportLatencyNs */)); + activate(sensor.sensorHandle, false /* enable */); } - activateAllSensors(false /* enable */); // Call batch on an invalid sensor SensorInfo sensor = getSensorsList().front(); @@ -910,13 +939,13 @@ } // Activate the sensors so that they start generating events - activateAllSensors(true); + activateSensors(sensors, true); // According to the CDD, the first sample must be generated within 400ms + 2 * sample_time // and the maximum reporting latency is 100ms + 2 * sample_time. Wait a sufficient amount // of time to guarantee that a sample has arrived. callback.waitForEvents(sensors, kFiveHundredMs + (5 * maxMinDelay)); - activateAllSensors(false); + activateSensors(sensors, false); // Save the last received event for each sensor std::map<int32_t, int64_t> lastEventTimestampMap; @@ -935,9 +964,9 @@ // Allow some time to pass, reset the callback, then reactivate the sensors usleep(duration_cast<std::chrono::microseconds>(kOneSecond + (5 * maxMinDelay)).count()); callback.reset(); - activateAllSensors(true); + activateSensors(sensors, true); callback.waitForEvents(sensors, kFiveHundredMs + (5 * maxMinDelay)); - activateAllSensors(false); + activateSensors(sensors, false); getEnvironment()->unregisterCallback();