Augment HotSwitchOperation to test slow to fast case

Originally, SamplingRateHotSwitchOperation only tests the case
in which requested sensor sampling rate goes from fast to slow.
Recent regression demonstrates that it is also worthwhile to test
transition in the other direction, i.e. from slow to fast. This
CL add the slow to fast transition test.

Bug: 65138983
Test: sailfish failed the test before being patched.
Test: sailfish passed after being patched (ag/2824590)
Change-Id: If02509c75f74145544f0a2ce5d2aaec24e7326b8
Merged-In: If02509c75f74145544f0a2ce5d2aaec24e7326b8
This commit is contained in:
Peng Xu 2017-08-30 16:55:13 -07:00
parent 2aef4b48f0
commit 44256a7fbd

View file

@ -561,7 +561,7 @@ class SensorsHidlTest : public ::testing::VtsHalHidlTargetTestBase {
std::chrono::nanoseconds samplingPeriod,
std::chrono::seconds duration,
const SensorEventsChecker &checker);
void testSamplingRateHotSwitchOperation(SensorType type);
void testSamplingRateHotSwitchOperation(SensorType type, bool fastToSlow = true);
void testBatchingOperation(SensorType type);
void testDirectReportOperation(
SensorType type, SharedMemType memType, RateLevel rate, const SensorEventsChecker &checker);
@ -1081,10 +1081,11 @@ TEST_F(SensorsHidlTest, MagnetometerStreamingOperationFast) {
NullChecker());
}
void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type, bool fastToSlow) {
std::vector<Event> events1, events2;
constexpr int64_t batchingPeriodInNs = 0; // no batching
constexpr int64_t collectionTimeoutUs = 60000000; // 60s
constexpr size_t minNEvent = 50;
SensorInfo sensor = defaultSensorByType(type);
@ -1103,17 +1104,23 @@ void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
return;
}
ASSERT_EQ(batch(handle, minSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
int64_t firstCollectionPeriod = fastToSlow ? minSamplingPeriodInNs : maxSamplingPeriodInNs;
int64_t secondCollectionPeriod = !fastToSlow ? minSamplingPeriodInNs : maxSamplingPeriodInNs;
// first collection
ASSERT_EQ(batch(handle, firstCollectionPeriod, batchingPeriodInNs), Result::OK);
ASSERT_EQ(activate(handle, 1), Result::OK);
usleep(500000); // sleep 0.5 sec to wait for change rate to happen
events1 = collectEvents(sensor.minDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
events1 = collectEvents(collectionTimeoutUs, minNEvent);
ASSERT_EQ(batch(handle, maxSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
// second collection, without stop sensor
ASSERT_EQ(batch(handle, secondCollectionPeriod, batchingPeriodInNs), Result::OK);
usleep(500000); // sleep 0.5 sec to wait for change rate to happen
events2 = collectEvents(sensor.maxDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
events2 = collectEvents(collectionTimeoutUs, minNEvent);
// end of collection, stop sensor
ASSERT_EQ(activate(handle, 0), Result::OK);
ALOGI("Collected %zu fast samples and %zu slow samples", events1.size(), events2.size());
@ -1122,11 +1129,13 @@ void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
ASSERT_GT(events2.size(), 0u);
int64_t minDelayAverageInterval, maxDelayAverageInterval;
std::vector<Event> &minDelayEvents(fastToSlow ? events1 : events2);
std::vector<Event> &maxDelayEvents(fastToSlow ? events2 : events1);
size_t nEvent = 0;
int64_t prevTimestamp = -1;
int64_t timestampInterval = 0;
for (auto & e : events1) {
for (auto & e : minDelayEvents) {
if (e.sensorType == type) {
ASSERT_EQ(e.sensorHandle, handle);
if (prevTimestamp > 0) {
@ -1142,7 +1151,7 @@ void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
nEvent = 0;
prevTimestamp = -1;
timestampInterval = 0;
for (auto & e : events2) {
for (auto & e : maxDelayEvents) {
if (e.sensorType == type) {
ASSERT_EQ(e.sensorHandle, handle);
if (prevTimestamp > 0) {
@ -1156,27 +1165,35 @@ void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
maxDelayAverageInterval = timestampInterval / (nEvent - 1);
// change of rate is significant.
ALOGI("min/maxDelayAverageInterval = %" PRId64 " %" PRId64,
minDelayAverageInterval, maxDelayAverageInterval);
EXPECT_GT((maxDelayAverageInterval - minDelayAverageInterval), minDelayAverageInterval / 10);
// fastest rate sampling time is close to spec
ALOGI("minDelayAverageInterval = %" PRId64, minDelayAverageInterval);
EXPECT_LT(std::abs(minDelayAverageInterval - minSamplingPeriodInNs),
minSamplingPeriodInNs / 10);
// slowest rate sampling time is close to spec
EXPECT_LT(std::abs(maxDelayAverageInterval - maxSamplingPeriodInNs),
maxSamplingPeriodInNs / 10);
}
// Test if sensor hal can do accelerometer sampling rate switch properly when sensor is active
TEST_F(SensorsHidlTest, AccelerometerSamplingPeriodHotSwitchOperation) {
testSamplingRateHotSwitchOperation(SensorType::ACCELEROMETER);
testSamplingRateHotSwitchOperation(SensorType::ACCELEROMETER, false /*fastToSlow*/);
}
// Test if sensor hal can do gyroscope sampling rate switch properly when sensor is active
TEST_F(SensorsHidlTest, GyroscopeSamplingPeriodHotSwitchOperation) {
testSamplingRateHotSwitchOperation(SensorType::GYROSCOPE);
testSamplingRateHotSwitchOperation(SensorType::GYROSCOPE, false /*fastToSlow*/);
}
// Test if sensor hal can do magnetometer sampling rate switch properly when sensor is active
TEST_F(SensorsHidlTest, MagnetometerSamplingPeriodHotSwitchOperation) {
testSamplingRateHotSwitchOperation(SensorType::MAGNETIC_FIELD);
testSamplingRateHotSwitchOperation(SensorType::MAGNETIC_FIELD, false /*fastToSlow*/);
}
void SensorsHidlTest::testBatchingOperation(SensorType type) {