2 * Copyright (C) 2016 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #define LOG_TAG "sensors_hidl_hal_test"
18 #include <android-base/logging.h>
19 #include <android/hardware/sensors/1.0/ISensors.h>
20 #include <android/hardware/sensors/1.0/types.h>
21 #include <android/log.h>
22 #include <cutils/ashmem.h>
23 #include <VtsHalHidlTargetBaseTest.h>
24 #include <hardware/sensors.h> // for sensor type strings
32 #include <unordered_set>
38 using ::android::hardware::Return;
39 using ::android::hardware::Void;
40 using ::android::hardware::hidl_string;
42 using namespace ::android::hardware::sensors::V1_0;
44 // Test environment for sensors
45 class SensorsHidlEnvironment : public ::testing::Environment {
47 // get the test environment singleton
48 static SensorsHidlEnvironment* Instance() {
49 static SensorsHidlEnvironment* instance = new SensorsHidlEnvironment;
53 // sensors hidl service
57 virtual void TearDown();
59 // Get and clear all events collected so far (like "cat" shell command).
60 // If output is nullptr, it clears all collected events.
61 void catEvents(std::vector<Event>* output);
63 // set sensor event collection status
64 void setCollection(bool enable);
67 SensorsHidlEnvironment() {}
69 void addEvent(const Event& ev);
70 void startPollingThread();
71 static void pollingThread(SensorsHidlEnvironment* env, std::shared_ptr<bool> stop);
73 bool collectionEnabled;
74 std::shared_ptr<bool> stopThread;
75 std::thread pollThread;
76 std::vector<Event> events;
77 std::mutex events_mutex;
79 GTEST_DISALLOW_COPY_AND_ASSIGN_(SensorsHidlEnvironment);
82 void SensorsHidlEnvironment::SetUp() {
83 sensors = ::testing::VtsHalHidlTargetBaseTest::getService<ISensors>();
84 ALOGI_IF(sensors, "sensors is not nullptr, %p", sensors.get());
85 ASSERT_NE(sensors, nullptr);
87 collectionEnabled = false;
90 // In case framework just stopped for test and there is sensor events in the pipe,
91 // wait some time for those events to be cleared to avoid them messing up the test.
92 std::this_thread::sleep_for(std::chrono::seconds(3));
95 void SensorsHidlEnvironment::TearDown() {
96 ALOGI("TearDown SensorsHidlEnvironement");
104 void SensorsHidlEnvironment::catEvents(std::vector<Event>* output) {
105 std::lock_guard<std::mutex> lock(events_mutex);
107 output->insert(output->end(), events.begin(), events.end());
112 void SensorsHidlEnvironment::setCollection(bool enable) {
113 std::lock_guard<std::mutex> lock(events_mutex);
114 collectionEnabled = enable;
117 void SensorsHidlEnvironment::addEvent(const Event& ev) {
118 std::lock_guard<std::mutex> lock(events_mutex);
119 if (collectionEnabled) {
120 events.push_back(ev);
124 void SensorsHidlEnvironment::startPollingThread() {
125 stopThread = std::shared_ptr<bool>(new bool(false));
126 pollThread = std::thread(pollingThread, this, stopThread);
130 void SensorsHidlEnvironment::pollingThread(
131 SensorsHidlEnvironment* env, std::shared_ptr<bool> stop) {
132 ALOGD("polling thread start");
133 bool needExit = *stop;
136 env->sensors->poll(1,
137 [&](auto result, const auto &events, const auto &dynamicSensorsAdded) {
138 if (result != Result::OK
139 || (events.size() == 0 && dynamicSensorsAdded.size() == 0)
145 if (events.size() > 0) {
146 env->addEvent(events[0]);
150 ALOGD("polling thread end");
153 class SensorsTestSharedMemory {
155 static SensorsTestSharedMemory* create(SharedMemType type, size_t size);
156 SharedMemInfo getSharedMemInfo() const;
157 char * getBuffer() const;
158 std::vector<Event> parseEvents(int64_t lastCounter = -1, size_t offset = 0) const;
159 virtual ~SensorsTestSharedMemory();
161 SensorsTestSharedMemory(SharedMemType type, size_t size);
164 native_handle_t* mNativeHandle;
168 DISALLOW_COPY_AND_ASSIGN(SensorsTestSharedMemory);
171 SharedMemInfo SensorsTestSharedMemory::getSharedMemInfo() const {
172 SharedMemInfo mem = {
174 .format = SharedMemFormat::SENSORS_EVENT,
175 .size = static_cast<uint32_t>(mSize),
176 .memoryHandle = mNativeHandle
181 char * SensorsTestSharedMemory::getBuffer() const {
185 std::vector<Event> SensorsTestSharedMemory::parseEvents(int64_t lastCounter, size_t offset) const {
187 constexpr size_t kEventSize = static_cast<size_t>(SensorsEventFormatOffset::TOTAL_LENGTH);
188 constexpr size_t kOffsetSize = static_cast<size_t>(SensorsEventFormatOffset::SIZE_FIELD);
189 constexpr size_t kOffsetToken = static_cast<size_t>(SensorsEventFormatOffset::REPORT_TOKEN);
190 constexpr size_t kOffsetType = static_cast<size_t>(SensorsEventFormatOffset::SENSOR_TYPE);
191 constexpr size_t kOffsetAtomicCounter =
192 static_cast<size_t>(SensorsEventFormatOffset::ATOMIC_COUNTER);
193 constexpr size_t kOffsetTimestamp = static_cast<size_t>(SensorsEventFormatOffset::TIMESTAMP);
194 constexpr size_t kOffsetData = static_cast<size_t>(SensorsEventFormatOffset::DATA);
196 std::vector<Event> events;
197 std::vector<float> data(16);
199 while (offset + kEventSize <= mSize) {
200 int64_t atomicCounter = *reinterpret_cast<uint32_t *>(mBuffer + offset + kOffsetAtomicCounter);
201 if (atomicCounter <= lastCounter) {
205 int32_t size = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetSize);
206 if (size != kEventSize) {
207 // unknown error, events parsed may be wrong, remove all
212 int32_t token = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetToken);
213 int32_t type = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetType);
214 int64_t timestamp = *reinterpret_cast<int64_t *>(mBuffer + offset + kOffsetTimestamp);
216 ALOGV("offset = %zu, cnt %" PRId64 ", token %" PRId32 ", type %" PRId32 ", timestamp %" PRId64,
217 offset, atomicCounter, token, type, timestamp);
220 .timestamp = timestamp,
221 .sensorHandle = token,
222 .sensorType = static_cast<SensorType>(type),
224 event.u.data = android::hardware::hidl_array<float, 16>
225 (reinterpret_cast<float*>(mBuffer + offset + kOffsetData));
227 events.push_back(event);
229 lastCounter = atomicCounter;
230 offset += kEventSize;
236 SensorsTestSharedMemory::SensorsTestSharedMemory(SharedMemType type, size_t size)
237 : mType(type), mSize(0), mBuffer(nullptr) {
238 native_handle_t *handle = nullptr;
239 char *buffer = nullptr;
241 case SharedMemType::ASHMEM: {
243 handle = ::native_handle_create(1 /*nFds*/, 0/*nInts*/);
244 if (handle != nullptr) {
245 handle->data[0] = fd = ::ashmem_create_region("SensorsTestSharedMemory", size);
246 if (handle->data[0] > 0) {
247 // memory is pinned by default
248 buffer = static_cast<char *>
249 (::mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
250 if (buffer != reinterpret_cast<char*>(MAP_FAILED)) {
253 ::native_handle_close(handle);
255 ::native_handle_delete(handle);
264 if (buffer != nullptr) {
265 mNativeHandle = handle;
271 SensorsTestSharedMemory::~SensorsTestSharedMemory() {
273 case SharedMemType::ASHMEM: {
275 ::munmap(mBuffer, mSize);
278 ::native_handle_close(mNativeHandle);
279 ::native_handle_delete(mNativeHandle);
281 mNativeHandle = nullptr;
287 if (mNativeHandle != nullptr || mSize != 0 || mBuffer != nullptr) {
288 ALOGE("SensorsTestSharedMemory %p not properly destructed: "
289 "type %d, native handle %p, size %zu, buffer %p",
290 this, static_cast<int>(mType), mNativeHandle, mSize, mBuffer);
297 SensorsTestSharedMemory* SensorsTestSharedMemory::create(SharedMemType type, size_t size) {
298 constexpr size_t kMaxSize = 128*1024*1024; // sensor test should not need more than 128M
299 if (size == 0 || size >= kMaxSize) {
303 auto m = new SensorsTestSharedMemory(type, size);
304 if (m->mSize != size || m->mBuffer == nullptr) {
311 // The main test class for SENSORS HIDL HAL.
312 class SensorsHidlTest : public ::testing::VtsHalHidlTargetBaseTest {
314 virtual void SetUp() override {
317 virtual void TearDown() override {
319 for (auto s : mSensorHandles) {
320 S()->activate(s, false);
322 mSensorHandles.clear();
324 // stop all direct report and channels
325 for (auto c : mDirectChannelHandles) {
326 // disable all reports
327 S()->configDirectReport(-1, c, RateLevel::STOP, [] (auto, auto){});
328 S()->unregisterDirectChannel(c);
330 mDirectChannelHandles.clear();
334 SensorInfo defaultSensorByType(SensorType type);
335 std::vector<Event> collectEvents(useconds_t timeLimitUs, size_t nEventLimit,
336 bool clearBeforeStart = true, bool changeCollection = true);
338 // implementation wrapper
339 Return<void> getSensorsList(ISensors::getSensorsList_cb _hidl_cb) {
340 return S()->getSensorsList(_hidl_cb);
343 Return<Result> activate(
344 int32_t sensorHandle, bool enabled);
346 Return<Result> batch(
347 int32_t sensorHandle,
348 int64_t samplingPeriodNs,
349 int64_t maxReportLatencyNs) {
350 return S()->batch(sensorHandle, samplingPeriodNs, maxReportLatencyNs);
353 Return<Result> flush(int32_t sensorHandle) {
354 return S()->flush(sensorHandle);
357 Return<Result> injectSensorData(const Event& event) {
358 return S()->injectSensorData(event);
361 Return<void> registerDirectChannel(
362 const SharedMemInfo& mem, ISensors::registerDirectChannel_cb _hidl_cb);
364 Return<Result> unregisterDirectChannel(int32_t channelHandle) {
365 return S()->unregisterDirectChannel(channelHandle);
368 Return<void> configDirectReport(
369 int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
370 ISensors::configDirectReport_cb _hidl_cb) {
371 return S()->configDirectReport(sensorHandle, channelHandle, rate, _hidl_cb);
374 inline sp<ISensors>& S() {
375 return SensorsHidlEnvironment::Instance()->sensors;
378 inline static SensorFlagBits extractReportMode(uint64_t flag) {
379 return (SensorFlagBits) (flag
380 & ((uint64_t) SensorFlagBits::CONTINUOUS_MODE
381 | (uint64_t) SensorFlagBits::ON_CHANGE_MODE
382 | (uint64_t) SensorFlagBits::ONE_SHOT_MODE
383 | (uint64_t) SensorFlagBits::SPECIAL_REPORTING_MODE));
386 inline static bool isMetaSensorType(SensorType type) {
387 return (type == SensorType::META_DATA
388 || type == SensorType::DYNAMIC_SENSOR_META
389 || type == SensorType::ADDITIONAL_INFO);
392 inline static bool isValidType(SensorType type) {
393 return (int32_t) type > 0;
396 static bool typeMatchStringType(SensorType type, const hidl_string& stringType);
397 static bool typeMatchReportMode(SensorType type, SensorFlagBits reportMode);
398 static bool delayMatchReportMode(int32_t minDelay, int32_t maxDelay, SensorFlagBits reportMode);
399 static SensorFlagBits expectedReportModeForType(SensorType type);
401 // all sensors and direct channnels used
402 std::unordered_set<int32_t> mSensorHandles;
403 std::unordered_set<int32_t> mDirectChannelHandles;
407 Return<Result> SensorsHidlTest::activate(int32_t sensorHandle, bool enabled) {
408 // If activating a sensor, add the handle in a set so that when test fails it can be turned off.
409 // The handle is not removed when it is deactivating on purpose so that it is not necessary to
410 // check the return value of deactivation. Deactivating a sensor more than once does not have
413 mSensorHandles.insert(sensorHandle);
415 return S()->activate(sensorHandle, enabled);
418 Return<void> SensorsHidlTest::registerDirectChannel(
419 const SharedMemInfo& mem, ISensors::registerDirectChannel_cb cb) {
420 // If registeration of a channel succeeds, add the handle of channel to a set so that it can be
421 // unregistered when test fails. Unregister a channel does not remove the handle on purpose.
422 // Unregistering a channel more than once should not have negative effect.
423 S()->registerDirectChannel(mem,
424 [&] (auto result, auto channelHandle) {
425 if (result == Result::OK) {
426 mDirectChannelHandles.insert(channelHandle);
428 cb(result, channelHandle);
433 std::vector<Event> SensorsHidlTest::collectEvents(useconds_t timeLimitUs, size_t nEventLimit,
434 bool clearBeforeStart, bool changeCollection) {
435 std::vector<Event> events;
436 constexpr useconds_t SLEEP_GRANULARITY = 100*1000; //gradularity 100 ms
438 ALOGI("collect max of %zu events for %d us, clearBeforeStart %d",
439 nEventLimit, timeLimitUs, clearBeforeStart);
441 if (changeCollection) {
442 SensorsHidlEnvironment::Instance()->setCollection(true);
444 if (clearBeforeStart) {
445 SensorsHidlEnvironment::Instance()->catEvents(nullptr);
448 while (timeLimitUs > 0) {
449 useconds_t duration = std::min(SLEEP_GRANULARITY, timeLimitUs);
451 timeLimitUs -= duration;
453 SensorsHidlEnvironment::Instance()->catEvents(&events);
454 if (events.size() >= nEventLimit) {
457 ALOGV("time to go = %d, events to go = %d",
458 (int)timeLimitUs, (int)(nEventLimit - events.size()));
461 if (changeCollection) {
462 SensorsHidlEnvironment::Instance()->setCollection(false);
467 bool SensorsHidlTest::typeMatchStringType(SensorType type, const hidl_string& stringType) {
469 if (type >= SensorType::DEVICE_PRIVATE_BASE) {
475 #define CHECK_TYPE_STRING_FOR_SENSOR_TYPE(type) \
476 case SensorType::type: res = stringType == SENSOR_STRING_TYPE_ ## type;\
479 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ACCELEROMETER);
480 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MAGNETIC_FIELD);
481 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ORIENTATION);
482 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GYROSCOPE);
483 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LIGHT);
484 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PRESSURE);
485 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(TEMPERATURE);
486 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PROXIMITY);
487 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GRAVITY);
488 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LINEAR_ACCELERATION);
489 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ROTATION_VECTOR);
490 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(RELATIVE_HUMIDITY);
491 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(AMBIENT_TEMPERATURE);
492 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MAGNETIC_FIELD_UNCALIBRATED);
493 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GAME_ROTATION_VECTOR);
494 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GYROSCOPE_UNCALIBRATED);
495 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(SIGNIFICANT_MOTION);
496 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STEP_DETECTOR);
497 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STEP_COUNTER);
498 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GEOMAGNETIC_ROTATION_VECTOR);
499 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(HEART_RATE);
500 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(TILT_DETECTOR);
501 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(WAKE_GESTURE);
502 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GLANCE_GESTURE);
503 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PICK_UP_GESTURE);
504 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(WRIST_TILT_GESTURE);
505 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(DEVICE_ORIENTATION);
506 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(POSE_6DOF);
507 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STATIONARY_DETECT);
508 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MOTION_DETECT);
509 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(HEART_BEAT);
510 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(DYNAMIC_SENSOR_META);
511 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ADDITIONAL_INFO);
512 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LOW_LATENCY_OFFBODY_DETECT);
514 ALOGW("Type %d is not checked, stringType = %s", (int)type, stringType.c_str());
515 #undef CHECK_TYPE_STRING_FOR_SENSOR_TYPE
520 bool SensorsHidlTest::typeMatchReportMode(SensorType type, SensorFlagBits reportMode) {
521 if (type >= SensorType::DEVICE_PRIVATE_BASE) {
525 SensorFlagBits expected = expectedReportModeForType(type);
527 return expected == (SensorFlagBits)-1 || expected == reportMode;
530 bool SensorsHidlTest::delayMatchReportMode(
531 int32_t minDelay, int32_t maxDelay, SensorFlagBits reportMode) {
534 case SensorFlagBits::CONTINUOUS_MODE:
535 res = (minDelay > 0) && (maxDelay >= 0);
537 case SensorFlagBits::ON_CHANGE_MODE:
538 //TODO: current implementation does not satisfy minDelay == 0 on Proximity
539 res = (minDelay >= 0) && (maxDelay >= 0);
540 //res = (minDelay == 0) && (maxDelay >= 0);
542 case SensorFlagBits::ONE_SHOT_MODE:
543 res = (minDelay == -1) && (maxDelay == 0);
545 case SensorFlagBits::SPECIAL_REPORTING_MODE:
546 res = (minDelay == 0) && (maxDelay == 0);
555 SensorFlagBits SensorsHidlTest::expectedReportModeForType(SensorType type) {
557 case SensorType::ACCELEROMETER:
558 case SensorType::GYROSCOPE:
559 case SensorType::MAGNETIC_FIELD:
560 case SensorType::ORIENTATION:
561 case SensorType::PRESSURE:
562 case SensorType::TEMPERATURE:
563 case SensorType::GRAVITY:
564 case SensorType::LINEAR_ACCELERATION:
565 case SensorType::ROTATION_VECTOR:
566 case SensorType::MAGNETIC_FIELD_UNCALIBRATED:
567 case SensorType::GAME_ROTATION_VECTOR:
568 case SensorType::GYROSCOPE_UNCALIBRATED:
569 case SensorType::GEOMAGNETIC_ROTATION_VECTOR:
570 case SensorType::POSE_6DOF:
571 case SensorType::HEART_BEAT:
572 return SensorFlagBits::CONTINUOUS_MODE;
574 case SensorType::LIGHT:
575 case SensorType::PROXIMITY:
576 case SensorType::RELATIVE_HUMIDITY:
577 case SensorType::AMBIENT_TEMPERATURE:
578 case SensorType::HEART_RATE:
579 case SensorType::DEVICE_ORIENTATION:
580 case SensorType::MOTION_DETECT:
581 case SensorType::STEP_COUNTER:
582 return SensorFlagBits::ON_CHANGE_MODE;
584 case SensorType::SIGNIFICANT_MOTION:
585 case SensorType::WAKE_GESTURE:
586 case SensorType::GLANCE_GESTURE:
587 case SensorType::PICK_UP_GESTURE:
588 return SensorFlagBits::ONE_SHOT_MODE;
590 case SensorType::STEP_DETECTOR:
591 case SensorType::TILT_DETECTOR:
592 case SensorType::WRIST_TILT_GESTURE:
593 case SensorType::DYNAMIC_SENSOR_META:
594 return SensorFlagBits::SPECIAL_REPORTING_MODE;
597 ALOGW("Type %d is not implemented in expectedReportModeForType", (int)type);
598 return (SensorFlagBits)-1;
602 SensorInfo SensorsHidlTest::defaultSensorByType(SensorType type) {
605 ret.type = (SensorType) -1;
607 [&] (const auto &list) {
608 const size_t count = list.size();
609 for (size_t i = 0; i < count; ++i) {
610 if (list[i].type == type) {
620 // Test if sensor list returned is valid
621 TEST_F(SensorsHidlTest, SensorListValid) {
623 [&] (const auto &list) {
624 const size_t count = list.size();
625 for (size_t i = 0; i < count; ++i) {
627 ALOGV("\t%zu: handle=%#08x type=%d name=%s",
628 i, s.sensorHandle, (int)s.type, s.name.c_str());
630 // Test non-empty type string
631 ASSERT_FALSE(s.typeAsString.empty());
633 // Test defined type matches defined string type
634 ASSERT_TRUE(typeMatchStringType(s.type, s.typeAsString));
636 // Test if all sensor has name and vendor
637 ASSERT_FALSE(s.name.empty());
638 ASSERT_FALSE(s.vendor.empty());
640 // Test power > 0, maxRange > 0
641 ASSERT_GE(s.power, 0);
642 ASSERT_GT(s.maxRange, 0);
644 // Info type, should have no sensor
646 s.type == SensorType::ADDITIONAL_INFO
647 || s.type == SensorType::META_DATA);
649 // Test fifoMax >= fifoReserved
650 ALOGV("max reserve = %d, %d", s.fifoMaxEventCount, s.fifoReservedEventCount);
651 ASSERT_GE(s.fifoMaxEventCount, s.fifoReservedEventCount);
653 // Test Reporting mode valid
654 ASSERT_TRUE(typeMatchReportMode(s.type, extractReportMode(s.flags)));
656 // Test min max are in the right order
657 ASSERT_LE(s.minDelay, s.maxDelay);
658 // Test min/max delay matches reporting mode
659 ASSERT_TRUE(delayMatchReportMode(s.minDelay, s.maxDelay, extractReportMode(s.flags)));
664 // Test if sensor hal can do normal accelerometer streaming properly
665 TEST_F(SensorsHidlTest, NormalAccelerometerStreamingOperation) {
667 std::vector<Event> events;
669 constexpr int64_t samplingPeriodInNs = 20ull*1000*1000; // 20ms
670 constexpr int64_t batchingPeriodInNs = 0; // no batching
671 constexpr useconds_t minTimeUs = 5*1000*1000; // 5 s
672 constexpr size_t minNEvent = 100; // at lease 100 events
673 constexpr SensorType type = SensorType::ACCELEROMETER;
675 SensorInfo sensor = defaultSensorByType(type);
677 if (!isValidType(sensor.type)) {
678 // no default sensor of this type
682 int32_t handle = sensor.sensorHandle;
684 ASSERT_EQ(batch(handle, samplingPeriodInNs, batchingPeriodInNs), Result::OK);
685 ASSERT_EQ(activate(handle, 1), Result::OK);
686 events = collectEvents(minTimeUs, minNEvent, true /*clearBeforeStart*/);
687 ASSERT_EQ(activate(handle, 0), Result::OK);
689 ALOGI("Collected %zu samples", events.size());
691 ASSERT_GT(events.size(), 0u);
693 size_t nRealEvent = 0;
694 for (auto & e : events) {
695 if (e.sensorType == type) {
697 ASSERT_EQ(e.sensorHandle, handle);
701 double gravityNorm = std::sqrt(acc.x * acc.x + acc.y * acc.y + acc.z * acc.z);
702 ALOGV("Norm = %f", gravityNorm);
704 // assert this is earth gravity
705 ASSERT_TRUE(std::fabs(gravityNorm - GRAVITY_EARTH) < 1);
709 ALOGI("Event type %d, handle %d", (int) e.sensorType, (int) e.sensorHandle);
710 // Only meta types are allowed besides the subscribed sensor
711 ASSERT_TRUE(isMetaSensorType(e.sensorType));
715 ASSERT_GE(nRealEvent, minNEvent / 2); // make sure returned events are not all meta
718 // Test if sensor hal can do gyroscope streaming properly
719 TEST_F(SensorsHidlTest, NormalGyroscopeStreamingOperation) {
720 std::vector<Event> events;
722 constexpr int64_t samplingPeriodInNs = 10ull*1000*1000; // 10ms
723 constexpr int64_t batchingPeriodInNs = 0; // no batching
724 constexpr useconds_t minTimeUs = 5*1000*1000; // 5 s
725 constexpr size_t minNEvent = 200;
726 constexpr SensorType type = SensorType::GYROSCOPE;
728 SensorInfo sensor = defaultSensorByType(type);
730 if (!isValidType(sensor.type)) {
731 // no default sensor of this type
735 int32_t handle = sensor.sensorHandle;
737 ASSERT_EQ(batch(handle, samplingPeriodInNs, batchingPeriodInNs), Result::OK);
738 ASSERT_EQ(activate(handle, 1), Result::OK);
739 events = collectEvents(minTimeUs, minNEvent, true /*clearBeforeStart*/);
740 ASSERT_EQ(activate(handle, 0), Result::OK);
742 ALOGI("Collected %zu samples", events.size());
744 ASSERT_GT(events.size(), 0u);
746 size_t nRealEvent = 0;
747 for (auto & e : events) {
748 if (e.sensorType == type) {
750 ASSERT_EQ(e.sensorHandle, handle);
752 Vec3 gyro = e.u.vec3;
754 double gyroNorm = std::sqrt(gyro.x * gyro.x + gyro.y * gyro.y + gyro.z * gyro.z);
755 ALOGV("Gyro Norm = %f", gyroNorm);
757 // assert not drifting
758 ASSERT_TRUE(gyroNorm < 0.1); // < ~5 degree/s
762 ALOGI("Event type %d, handle %d", (int) e.sensorType, (int) e.sensorHandle);
763 // Only meta types are allowed besides the subscribed sensor
764 ASSERT_TRUE(isMetaSensorType(e.sensorType));
768 ASSERT_GE(nRealEvent, minNEvent / 2); // make sure returned events are not all meta
771 // Test if sensor hal can do accelerometer sampling rate switch properly when sensor is active
772 TEST_F(SensorsHidlTest, AccelerometerSamplingPeriodHotSwitchOperation) {
773 std::vector<Event> events1, events2;
775 constexpr int64_t batchingPeriodInNs = 0; // no batching
776 constexpr size_t minNEvent = 50;
777 constexpr SensorType type = SensorType::ACCELEROMETER;
779 SensorInfo sensor = defaultSensorByType(type);
781 if (!isValidType(sensor.type)) {
782 // no default sensor of this type
786 int32_t handle = sensor.sensorHandle;
787 int64_t minSamplingPeriodInNs = sensor.minDelay * 1000ll;
788 int64_t maxSamplingPeriodInNs = sensor.maxDelay * 1000ll;
790 if (minSamplingPeriodInNs == maxSamplingPeriodInNs) {
791 // only support single rate
795 ASSERT_EQ(batch(handle, minSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
796 ASSERT_EQ(activate(handle, 1), Result::OK);
798 usleep(500000); // sleep 0.5 sec to wait for change rate to happen
799 events1 = collectEvents(sensor.minDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
801 ASSERT_EQ(batch(handle, maxSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
803 usleep(500000); // sleep 0.5 sec to wait for change rate to happen
804 events2 = collectEvents(sensor.maxDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
806 ASSERT_EQ(activate(handle, 0), Result::OK);
808 ALOGI("Collected %zu fast samples and %zu slow samples", events1.size(), events2.size());
810 ASSERT_GT(events1.size(), 0u);
811 ASSERT_GT(events2.size(), 0u);
813 int64_t minDelayAverageInterval, maxDelayAverageInterval;
816 int64_t prevTimestamp = -1;
817 int64_t timestampInterval = 0;
818 for (auto & e : events1) {
819 if (e.sensorType == type) {
820 ASSERT_EQ(e.sensorHandle, handle);
821 if (prevTimestamp > 0) {
822 timestampInterval += e.timestamp - prevTimestamp;
824 prevTimestamp = e.timestamp;
828 ASSERT_GT(nEvent, 2u);
829 minDelayAverageInterval = timestampInterval / (nEvent - 1);
833 timestampInterval = 0;
834 for (auto & e : events2) {
835 if (e.sensorType == type) {
836 ASSERT_EQ(e.sensorHandle, handle);
837 if (prevTimestamp > 0) {
838 timestampInterval += e.timestamp - prevTimestamp;
840 prevTimestamp = e.timestamp;
844 ASSERT_GT(nEvent, 2u);
845 maxDelayAverageInterval = timestampInterval / (nEvent - 1);
847 // change of rate is significant.
848 ASSERT_GT((maxDelayAverageInterval - minDelayAverageInterval), minDelayAverageInterval / 10);
850 // fastest rate sampling time is close to spec
851 ALOGI("minDelayAverageInterval = %" PRId64, minDelayAverageInterval);
852 ASSERT_LT(std::abs(minDelayAverageInterval - minSamplingPeriodInNs),
853 minSamplingPeriodInNs / 10);
856 // Test if sensor hal can do normal accelerometer batching properly
857 TEST_F(SensorsHidlTest, AccelerometerBatchingOperation) {
858 std::vector<Event> events;
860 constexpr int64_t oneSecondInNs = 1ull * 1000 * 1000 * 1000;
861 constexpr SensorType type = SensorType::ACCELEROMETER;
862 constexpr int64_t maxBatchingTestTimeNs = 30ull * 1000 * 1000 * 1000;
864 SensorInfo sensor = defaultSensorByType(type);
866 if (!isValidType(sensor.type)) {
867 // no default sensor of this type
871 int32_t handle = sensor.sensorHandle;
872 int64_t minSamplingPeriodInNs = sensor.minDelay * 1000ll;
873 uint32_t minFifoCount = sensor.fifoReservedEventCount;
874 int64_t batchingPeriodInNs = minFifoCount * minSamplingPeriodInNs;
876 if (batchingPeriodInNs < oneSecondInNs) {
877 // batching size too small to test reliably
881 batchingPeriodInNs = std::min(batchingPeriodInNs, maxBatchingTestTimeNs);
883 ALOGI("Test batching for %d ms", (int)(batchingPeriodInNs / 1000 / 1000));
885 int64_t allowedBatchDeliverTimeNs =
886 std::max(oneSecondInNs, batchingPeriodInNs / 10);
888 ASSERT_EQ(batch(handle, minSamplingPeriodInNs, INT64_MAX), Result::OK);
889 ASSERT_EQ(activate(handle, 1), Result::OK);
891 usleep(500000); // sleep 0.5 sec to wait for initialization
892 ASSERT_EQ(flush(handle), Result::OK);
894 // wait for 80% of the reserved batching period
895 // there should not be any significant amount of events
896 // since collection is not enabled all events will go down the drain
897 usleep(batchingPeriodInNs / 1000 * 8 / 10);
899 SensorsHidlEnvironment::Instance()->setCollection(true);
900 // 0.8 + 0.3 times the batching period
901 // plus some time for the event to deliver
902 events = collectEvents(
903 batchingPeriodInNs / 1000 * 3 / 10,
904 minFifoCount, true /*clearBeforeStart*/, false /*change collection*/);
906 ASSERT_EQ(flush(handle), Result::OK);
908 events = collectEvents(allowedBatchDeliverTimeNs / 1000,
909 minFifoCount, true /*clearBeforeStart*/, false /*change collection*/);
911 SensorsHidlEnvironment::Instance()->setCollection(false);
912 ASSERT_EQ(activate(handle, 0), Result::OK);
915 for (auto & e : events) {
916 if (e.sensorType == type && e.sensorHandle == handle) {
921 // at least reach 90% of advertised capacity
922 ASSERT_GT(nEvent, (size_t)(batchingPeriodInNs / minSamplingPeriodInNs * 9 / 10));
925 // Test sensor event direct report with ashmem for gyro sensor
926 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReport) {
928 constexpr SensorType type = SensorType::GYROSCOPE;
929 constexpr size_t kEventSize = 104;
930 constexpr size_t kNEvent = 500;
931 constexpr size_t kMemSize = kEventSize * kNEvent;
933 SensorInfo sensor = defaultSensorByType(type);
935 if (!(sensor.flags | SensorFlagBits::MASK_DIRECT_REPORT)
936 || !(sensor.flags | SensorFlagBits::DIRECT_CHANNEL_ASHMEM)) {
937 // does not declare support
941 std::unique_ptr<SensorsTestSharedMemory>
942 mem(SensorsTestSharedMemory::create(SharedMemType::ASHMEM, kMemSize));
943 ASSERT_NE(mem, nullptr);
945 char* buffer = mem->getBuffer();
946 // fill memory with data
947 for (size_t i = 0; i < kMemSize; ++i) {
951 int32_t channelHandle;
952 registerDirectChannel(mem->getSharedMemInfo(),
953 [&channelHandle] (auto result, auto channelHandle_) {
954 ASSERT_EQ(result, Result::OK);
955 channelHandle = channelHandle_;
958 // check memory is zeroed
959 for (size_t i = 0; i < kMemSize; ++i) {
960 ASSERT_EQ(buffer[i], '\0');
964 configDirectReport(sensor.sensorHandle, channelHandle, RateLevel::NORMAL,
965 [&eventToken] (auto result, auto token) {
966 ASSERT_EQ(result, Result::OK);
970 usleep(1500000); // sleep 1 sec for data, plus 0.5 sec for initialization
971 auto events = mem->parseEvents();
973 // allowed to be 55% of nominal freq (50Hz)
974 ASSERT_GT(events.size(), 50u / 2u);
975 ASSERT_LT(events.size(), static_cast<size_t>(110*1.5));
977 int64_t lastTimestamp = 0;
978 for (auto &e : events) {
979 ASSERT_EQ(e.sensorType, type);
980 ASSERT_EQ(e.sensorHandle, eventToken);
981 ASSERT_GT(e.timestamp, lastTimestamp);
983 Vec3 gyro = e.u.vec3;
984 double gyroNorm = std::sqrt(gyro.x * gyro.x + gyro.y * gyro.y + gyro.z * gyro.z);
985 // assert not drifting
986 ASSERT_TRUE(gyroNorm < 0.1); // < ~5 degree/sa
988 lastTimestamp = e.timestamp;
991 // stop sensor and unregister channel
992 configDirectReport(sensor.sensorHandle, channelHandle, RateLevel::STOP,
993 [&eventToken] (auto result, auto) {
994 ASSERT_EQ(result, Result::OK);
996 ASSERT_EQ(unregisterDirectChannel(channelHandle), Result::OK);
999 int main(int argc, char **argv) {
1000 ::testing::AddGlobalTestEnvironment(SensorsHidlEnvironment::Instance());
1001 ::testing::InitGoogleTest(&argc, argv);
1002 int status = RUN_ALL_TESTS();
1003 ALOGI("Test result = %d", status);
1006 // vim: set ts=2 sw=2