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 <VtsHalHidlTargetTestBase.h>
19 #include <android-base/logging.h>
20 #include <android/hardware/sensors/1.0/ISensors.h>
21 #include <android/hardware/sensors/1.0/types.h>
22 #include <cutils/ashmem.h>
23 #include <hardware/sensors.h> // for sensor type strings
25 #include <utils/SystemClock.h>
33 #include <unordered_set>
39 using ::android::hardware::Return;
40 using ::android::hardware::Void;
41 using ::android::hardware::hidl_string;
43 using namespace ::android::hardware::sensors::V1_0;
45 // Test environment for sensors
46 class SensorsHidlTest;
47 class SensorsHidlEnvironment : public ::testing::Environment {
49 // get the test environment singleton
50 static SensorsHidlEnvironment* Instance() {
51 static SensorsHidlEnvironment* instance = new SensorsHidlEnvironment;
56 virtual void TearDown();
58 // Get and clear all events collected so far (like "cat" shell command).
59 // If output is nullptr, it clears all collected events.
60 void catEvents(std::vector<Event>* output);
62 // set sensor event collection status
63 void setCollection(bool enable);
66 friend SensorsHidlTest;
67 // sensors hidl service
70 SensorsHidlEnvironment() {}
72 void addEvent(const Event& ev);
73 void startPollingThread();
75 static void pollingThread(SensorsHidlEnvironment* env, std::shared_ptr<bool> stop);
77 bool collectionEnabled;
78 std::shared_ptr<bool> stopThread;
79 std::thread pollThread;
80 std::vector<Event> events;
81 std::mutex events_mutex;
83 GTEST_DISALLOW_COPY_AND_ASSIGN_(SensorsHidlEnvironment);
86 void SensorsHidlEnvironment::SetUp() {
89 ASSERT_NE(sensors, nullptr) << "sensors is nullptr, cannot get hidl service";
91 collectionEnabled = false;
94 // In case framework just stopped for test and there is sensor events in the pipe,
95 // wait some time for those events to be cleared to avoid them messing up the test.
96 std::this_thread::sleep_for(std::chrono::seconds(3));
99 void SensorsHidlEnvironment::TearDown() {
106 void SensorsHidlEnvironment::resetHal() {
107 // wait upto 100ms * 10 = 1s for hidl service.
108 constexpr auto RETRY_DELAY = std::chrono::milliseconds(100);
111 bool succeed = false;
112 for (size_t retry = 10; retry > 0; --retry) {
113 // this do ... while is for easy error handling
115 step = "getService()";
116 sensors = ISensors::getService();
117 if (sensors == nullptr) {
121 step = "poll() check";
122 // Poke ISensor service. If it has lingering connection from previous generation of
123 // system server, it will kill itself. There is no intention to handle the poll result,
124 // which will be done since the size is 0.
125 if(!sensors->poll(0, [](auto, const auto &, const auto &) {}).isOk()) {
129 step = "getSensorList";
130 std::vector<SensorInfo> sensorList;
131 if (!sensors->getSensorsList(
132 [&] (const ::android::hardware::hidl_vec<SensorInfo> &list) {
133 sensorList.reserve(list.size());
134 for (size_t i = 0; i < list.size(); ++i) {
135 sensorList.push_back(list[i]);
141 // stop each sensor individually
142 step = "stop each sensor";
144 for (const auto &i : sensorList) {
145 if (!sensors->activate(i.sensorHandle, false).isOk()) {
163 // Delay 100ms before retry, hidl service is expected to come up in short time after crash.
164 ALOGI("%s unsuccessful, try again soon (remaining retry %zu).", step.c_str(), retry - 1);
165 std::this_thread::sleep_for(RETRY_DELAY);
171 void SensorsHidlEnvironment::catEvents(std::vector<Event>* output) {
172 std::lock_guard<std::mutex> lock(events_mutex);
174 output->insert(output->end(), events.begin(), events.end());
179 void SensorsHidlEnvironment::setCollection(bool enable) {
180 std::lock_guard<std::mutex> lock(events_mutex);
181 collectionEnabled = enable;
184 void SensorsHidlEnvironment::addEvent(const Event& ev) {
185 std::lock_guard<std::mutex> lock(events_mutex);
186 if (collectionEnabled) {
187 events.push_back(ev);
191 void SensorsHidlEnvironment::startPollingThread() {
192 stopThread = std::shared_ptr<bool>(new bool(false));
193 pollThread = std::thread(pollingThread, this, stopThread);
197 void SensorsHidlEnvironment::pollingThread(
198 SensorsHidlEnvironment* env, std::shared_ptr<bool> stop) {
199 ALOGD("polling thread start");
200 bool needExit = *stop;
203 env->sensors->poll(64, [&](auto result, const auto& events, const auto& dynamicSensorsAdded) {
204 if (result != Result::OK
205 || (events.size() == 0 && dynamicSensorsAdded.size() == 0)
211 for (const auto& e : events) {
216 ALOGD("polling thread end");
219 class SensorsTestSharedMemory {
221 static SensorsTestSharedMemory* create(SharedMemType type, size_t size);
222 SharedMemInfo getSharedMemInfo() const;
223 char * getBuffer() const;
224 std::vector<Event> parseEvents(int64_t lastCounter = -1, size_t offset = 0) const;
225 virtual ~SensorsTestSharedMemory();
227 SensorsTestSharedMemory(SharedMemType type, size_t size);
230 native_handle_t* mNativeHandle;
234 DISALLOW_COPY_AND_ASSIGN(SensorsTestSharedMemory);
237 SharedMemInfo SensorsTestSharedMemory::getSharedMemInfo() const {
238 SharedMemInfo mem = {
240 .format = SharedMemFormat::SENSORS_EVENT,
241 .size = static_cast<uint32_t>(mSize),
242 .memoryHandle = mNativeHandle
247 char * SensorsTestSharedMemory::getBuffer() const {
251 std::vector<Event> SensorsTestSharedMemory::parseEvents(int64_t lastCounter, size_t offset) const {
253 constexpr size_t kEventSize = static_cast<size_t>(SensorsEventFormatOffset::TOTAL_LENGTH);
254 constexpr size_t kOffsetSize = static_cast<size_t>(SensorsEventFormatOffset::SIZE_FIELD);
255 constexpr size_t kOffsetToken = static_cast<size_t>(SensorsEventFormatOffset::REPORT_TOKEN);
256 constexpr size_t kOffsetType = static_cast<size_t>(SensorsEventFormatOffset::SENSOR_TYPE);
257 constexpr size_t kOffsetAtomicCounter =
258 static_cast<size_t>(SensorsEventFormatOffset::ATOMIC_COUNTER);
259 constexpr size_t kOffsetTimestamp = static_cast<size_t>(SensorsEventFormatOffset::TIMESTAMP);
260 constexpr size_t kOffsetData = static_cast<size_t>(SensorsEventFormatOffset::DATA);
262 std::vector<Event> events;
263 std::vector<float> data(16);
265 while (offset + kEventSize <= mSize) {
266 int64_t atomicCounter = *reinterpret_cast<uint32_t *>(mBuffer + offset + kOffsetAtomicCounter);
267 if (atomicCounter <= lastCounter) {
271 int32_t size = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetSize);
272 if (size != kEventSize) {
273 // unknown error, events parsed may be wrong, remove all
278 int32_t token = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetToken);
279 int32_t type = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetType);
280 int64_t timestamp = *reinterpret_cast<int64_t *>(mBuffer + offset + kOffsetTimestamp);
282 ALOGV("offset = %zu, cnt %" PRId64 ", token %" PRId32 ", type %" PRId32 ", timestamp %" PRId64,
283 offset, atomicCounter, token, type, timestamp);
286 .timestamp = timestamp,
287 .sensorHandle = token,
288 .sensorType = static_cast<SensorType>(type),
290 event.u.data = android::hardware::hidl_array<float, 16>
291 (reinterpret_cast<float*>(mBuffer + offset + kOffsetData));
293 events.push_back(event);
295 lastCounter = atomicCounter;
296 offset += kEventSize;
302 SensorsTestSharedMemory::SensorsTestSharedMemory(SharedMemType type, size_t size)
303 : mType(type), mSize(0), mBuffer(nullptr) {
304 native_handle_t *handle = nullptr;
305 char *buffer = nullptr;
307 case SharedMemType::ASHMEM: {
309 handle = ::native_handle_create(1 /*nFds*/, 0/*nInts*/);
310 if (handle != nullptr) {
311 handle->data[0] = fd = ::ashmem_create_region("SensorsTestSharedMemory", size);
312 if (handle->data[0] > 0) {
313 // memory is pinned by default
314 buffer = static_cast<char *>
315 (::mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
316 if (buffer != reinterpret_cast<char*>(MAP_FAILED)) {
319 ::native_handle_close(handle);
321 ::native_handle_delete(handle);
326 case SharedMemType::GRALLOC: {
334 if (buffer != nullptr) {
335 mNativeHandle = handle;
341 SensorsTestSharedMemory::~SensorsTestSharedMemory() {
343 case SharedMemType::ASHMEM: {
345 ::munmap(mBuffer, mSize);
348 ::native_handle_close(mNativeHandle);
349 ::native_handle_delete(mNativeHandle);
351 mNativeHandle = nullptr;
357 if (mNativeHandle != nullptr || mSize != 0 || mBuffer != nullptr) {
358 ALOGE("SensorsTestSharedMemory %p not properly destructed: "
359 "type %d, native handle %p, size %zu, buffer %p",
360 this, static_cast<int>(mType), mNativeHandle, mSize, mBuffer);
367 SensorsTestSharedMemory* SensorsTestSharedMemory::create(SharedMemType type, size_t size) {
368 constexpr size_t kMaxSize = 128*1024*1024; // sensor test should not need more than 128M
369 if (size == 0 || size >= kMaxSize) {
373 auto m = new SensorsTestSharedMemory(type, size);
374 if (m->mSize != size || m->mBuffer == nullptr) {
381 class SensorEventsChecker {
383 virtual bool check(const std::vector<Event> &events, std::string *out) const = 0;
384 virtual ~SensorEventsChecker() {}
387 class NullChecker : public SensorEventsChecker {
389 virtual bool check(const std::vector<Event> &, std::string *) const {
394 class SensorEventPerEventChecker : public SensorEventsChecker {
396 virtual bool checkEvent(const Event &event, std::string *out) const = 0;
397 virtual bool check(const std::vector<Event> &events, std::string *out) const {
398 for (const auto &e : events) {
399 if (!checkEvent(e, out)) {
407 class Vec3NormChecker : public SensorEventPerEventChecker {
409 Vec3NormChecker(float min, float max) : mRange(min, max) {}
410 static Vec3NormChecker byNominal(float nominal, float allowedError) {
411 return Vec3NormChecker(nominal - allowedError, nominal + allowedError);
414 virtual bool checkEvent(const Event &event, std::string *out) const {
415 Vec3 v = event.u.vec3;
416 float norm = std::sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
417 if (norm < mRange.first || norm > mRange.second) {
418 if (out != nullptr) {
419 std::ostringstream ss;
420 ss << "Event @ " << event.timestamp << " (" << v.x << ", " << v.y << ", " << v.z << ")"
421 << " has norm " << norm << ", which is beyond range"
422 << " [" << mRange.first << ", " << mRange.second << "]";
430 std::pair<float, float> mRange;
433 // The main test class for SENSORS HIDL HAL.
434 class SensorsHidlTest : public ::testing::VtsHalHidlTargetTestBase {
436 virtual void SetUp() override {
439 virtual void TearDown() override {
441 for (auto s : mSensorHandles) {
442 S()->activate(s, false);
444 mSensorHandles.clear();
446 // stop all direct report and channels
447 for (auto c : mDirectChannelHandles) {
448 // disable all reports
449 S()->configDirectReport(-1, c, RateLevel::STOP, [] (auto, auto){});
450 S()->unregisterDirectChannel(c);
452 mDirectChannelHandles.clear();
456 SensorInfo defaultSensorByType(SensorType type);
457 std::vector<SensorInfo> getSensorsList();
458 std::vector<Event> collectEvents(useconds_t timeLimitUs, size_t nEventLimit,
459 bool clearBeforeStart = true, bool changeCollection = true);
461 // implementation wrapper
462 Return<void> getSensorsList(ISensors::getSensorsList_cb _hidl_cb) {
463 return S()->getSensorsList(_hidl_cb);
466 Return<Result> activate(
467 int32_t sensorHandle, bool enabled);
469 Return<Result> batch(
470 int32_t sensorHandle,
471 int64_t samplingPeriodNs,
472 int64_t maxReportLatencyNs) {
473 return S()->batch(sensorHandle, samplingPeriodNs, maxReportLatencyNs);
476 Return<Result> flush(int32_t sensorHandle) {
477 return S()->flush(sensorHandle);
480 Return<Result> injectSensorData(const Event& event) {
481 return S()->injectSensorData(event);
484 Return<void> registerDirectChannel(
485 const SharedMemInfo& mem, ISensors::registerDirectChannel_cb _hidl_cb);
487 Return<Result> unregisterDirectChannel(int32_t channelHandle) {
488 return S()->unregisterDirectChannel(channelHandle);
491 Return<void> configDirectReport(
492 int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
493 ISensors::configDirectReport_cb _hidl_cb) {
494 return S()->configDirectReport(sensorHandle, channelHandle, rate, _hidl_cb);
497 inline sp<ISensors>& S() {
498 return SensorsHidlEnvironment::Instance()->sensors;
501 inline static SensorFlagBits extractReportMode(uint64_t flag) {
502 return (SensorFlagBits) (flag
503 & ((uint64_t) SensorFlagBits::CONTINUOUS_MODE
504 | (uint64_t) SensorFlagBits::ON_CHANGE_MODE
505 | (uint64_t) SensorFlagBits::ONE_SHOT_MODE
506 | (uint64_t) SensorFlagBits::SPECIAL_REPORTING_MODE));
509 inline static bool isMetaSensorType(SensorType type) {
510 return (type == SensorType::META_DATA
511 || type == SensorType::DYNAMIC_SENSOR_META
512 || type == SensorType::ADDITIONAL_INFO);
515 inline static bool isValidType(SensorType type) {
516 return (int32_t) type > 0;
519 void testStreamingOperation(SensorType type,
520 std::chrono::nanoseconds samplingPeriod,
521 std::chrono::seconds duration,
522 const SensorEventsChecker &checker);
523 void testSamplingRateHotSwitchOperation(SensorType type);
524 void testBatchingOperation(SensorType type);
525 void testDirectReportOperation(
526 SensorType type, SharedMemType memType, RateLevel rate, const SensorEventsChecker &checker);
528 static void assertTypeMatchStringType(SensorType type, const hidl_string& stringType);
529 static void assertTypeMatchReportMode(SensorType type, SensorFlagBits reportMode);
530 static void assertDelayMatchReportMode(
531 int32_t minDelay, int32_t maxDelay, SensorFlagBits reportMode);
532 static SensorFlagBits expectedReportModeForType(SensorType type);
533 static bool isDirectReportRateSupported(SensorInfo sensor, RateLevel rate);
534 static bool isDirectChannelTypeSupported(SensorInfo sensor, SharedMemType type);
537 static const Vec3NormChecker sAccelNormChecker;
538 static const Vec3NormChecker sGyroNormChecker;
540 // all sensors and direct channnels used
541 std::unordered_set<int32_t> mSensorHandles;
542 std::unordered_set<int32_t> mDirectChannelHandles;
545 const Vec3NormChecker SensorsHidlTest::sAccelNormChecker(
546 Vec3NormChecker::byNominal(GRAVITY_EARTH, 0.5f/*m/s^2*/));
547 const Vec3NormChecker SensorsHidlTest::sGyroNormChecker(
548 Vec3NormChecker::byNominal(0.f, 0.1f/*rad/s*/));
550 Return<Result> SensorsHidlTest::activate(int32_t sensorHandle, bool enabled) {
551 // If activating a sensor, add the handle in a set so that when test fails it can be turned off.
552 // The handle is not removed when it is deactivating on purpose so that it is not necessary to
553 // check the return value of deactivation. Deactivating a sensor more than once does not have
556 mSensorHandles.insert(sensorHandle);
558 return S()->activate(sensorHandle, enabled);
561 Return<void> SensorsHidlTest::registerDirectChannel(
562 const SharedMemInfo& mem, ISensors::registerDirectChannel_cb cb) {
563 // If registeration of a channel succeeds, add the handle of channel to a set so that it can be
564 // unregistered when test fails. Unregister a channel does not remove the handle on purpose.
565 // Unregistering a channel more than once should not have negative effect.
566 S()->registerDirectChannel(mem,
567 [&] (auto result, auto channelHandle) {
568 if (result == Result::OK) {
569 mDirectChannelHandles.insert(channelHandle);
571 cb(result, channelHandle);
576 std::vector<Event> SensorsHidlTest::collectEvents(useconds_t timeLimitUs, size_t nEventLimit,
577 bool clearBeforeStart, bool changeCollection) {
578 std::vector<Event> events;
579 constexpr useconds_t SLEEP_GRANULARITY = 100*1000; //granularity 100 ms
581 ALOGI("collect max of %zu events for %d us, clearBeforeStart %d",
582 nEventLimit, timeLimitUs, clearBeforeStart);
584 if (changeCollection) {
585 SensorsHidlEnvironment::Instance()->setCollection(true);
587 if (clearBeforeStart) {
588 SensorsHidlEnvironment::Instance()->catEvents(nullptr);
591 while (timeLimitUs > 0) {
592 useconds_t duration = std::min(SLEEP_GRANULARITY, timeLimitUs);
594 timeLimitUs -= duration;
596 SensorsHidlEnvironment::Instance()->catEvents(&events);
597 if (events.size() >= nEventLimit) {
600 ALOGV("time to go = %d, events to go = %d",
601 (int)timeLimitUs, (int)(nEventLimit - events.size()));
604 if (changeCollection) {
605 SensorsHidlEnvironment::Instance()->setCollection(false);
610 void SensorsHidlTest::assertTypeMatchStringType(SensorType type, const hidl_string& stringType) {
612 if (type >= SensorType::DEVICE_PRIVATE_BASE) {
617 #define CHECK_TYPE_STRING_FOR_SENSOR_TYPE(type) \
618 case SensorType::type: ASSERT_STREQ(SENSOR_STRING_TYPE_ ## type, stringType.c_str()); break;
619 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ACCELEROMETER);
620 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ACCELEROMETER_UNCALIBRATED);
621 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ADDITIONAL_INFO);
622 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(AMBIENT_TEMPERATURE);
623 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(DEVICE_ORIENTATION);
624 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(DYNAMIC_SENSOR_META);
625 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GAME_ROTATION_VECTOR);
626 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GEOMAGNETIC_ROTATION_VECTOR);
627 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GLANCE_GESTURE);
628 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GRAVITY);
629 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GYROSCOPE);
630 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GYROSCOPE_UNCALIBRATED);
631 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(HEART_BEAT);
632 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(HEART_RATE);
633 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LIGHT);
634 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LINEAR_ACCELERATION);
635 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LOW_LATENCY_OFFBODY_DETECT);
636 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MAGNETIC_FIELD);
637 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MAGNETIC_FIELD_UNCALIBRATED);
638 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MOTION_DETECT);
639 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ORIENTATION);
640 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PICK_UP_GESTURE);
641 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(POSE_6DOF);
642 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PRESSURE);
643 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PROXIMITY);
644 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(RELATIVE_HUMIDITY);
645 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ROTATION_VECTOR);
646 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(SIGNIFICANT_MOTION);
647 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STATIONARY_DETECT);
648 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STEP_COUNTER);
649 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STEP_DETECTOR);
650 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(TEMPERATURE);
651 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(TILT_DETECTOR);
652 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(WAKE_GESTURE);
653 CHECK_TYPE_STRING_FOR_SENSOR_TYPE(WRIST_TILT_GESTURE);
655 FAIL() << "Type " << static_cast<int>(type) << " in android defined range is not checked, "
656 << "stringType = " << stringType;
657 #undef CHECK_TYPE_STRING_FOR_SENSOR_TYPE
661 void SensorsHidlTest::assertTypeMatchReportMode(SensorType type, SensorFlagBits reportMode) {
662 if (type >= SensorType::DEVICE_PRIVATE_BASE) {
666 SensorFlagBits expected = expectedReportModeForType(type);
668 ASSERT_TRUE(expected == (SensorFlagBits) -1 || expected == reportMode)
669 << "reportMode=" << static_cast<int>(reportMode)
670 << "expected=" << static_cast<int>(expected);
673 void SensorsHidlTest::assertDelayMatchReportMode(
674 int32_t minDelay, int32_t maxDelay, SensorFlagBits reportMode) {
676 case SensorFlagBits::CONTINUOUS_MODE:
677 ASSERT_LT(0, minDelay);
678 ASSERT_LE(0, maxDelay);
680 case SensorFlagBits::ON_CHANGE_MODE:
681 ASSERT_LE(0, minDelay);
682 ASSERT_LE(0, maxDelay);
684 case SensorFlagBits::ONE_SHOT_MODE:
685 ASSERT_EQ(-1, minDelay);
686 ASSERT_EQ(0, maxDelay);
688 case SensorFlagBits::SPECIAL_REPORTING_MODE:
689 // do not enforce anything for special reporting mode
692 FAIL() << "Report mode " << static_cast<int>(reportMode) << " not checked";
696 // return -1 means no expectation for this type
697 SensorFlagBits SensorsHidlTest::expectedReportModeForType(SensorType type) {
699 case SensorType::ACCELEROMETER:
700 case SensorType::ACCELEROMETER_UNCALIBRATED:
701 case SensorType::GYROSCOPE:
702 case SensorType::MAGNETIC_FIELD:
703 case SensorType::ORIENTATION:
704 case SensorType::PRESSURE:
705 case SensorType::TEMPERATURE:
706 case SensorType::GRAVITY:
707 case SensorType::LINEAR_ACCELERATION:
708 case SensorType::ROTATION_VECTOR:
709 case SensorType::MAGNETIC_FIELD_UNCALIBRATED:
710 case SensorType::GAME_ROTATION_VECTOR:
711 case SensorType::GYROSCOPE_UNCALIBRATED:
712 case SensorType::GEOMAGNETIC_ROTATION_VECTOR:
713 case SensorType::POSE_6DOF:
714 case SensorType::HEART_BEAT:
715 return SensorFlagBits::CONTINUOUS_MODE;
717 case SensorType::LIGHT:
718 case SensorType::PROXIMITY:
719 case SensorType::RELATIVE_HUMIDITY:
720 case SensorType::AMBIENT_TEMPERATURE:
721 case SensorType::HEART_RATE:
722 case SensorType::DEVICE_ORIENTATION:
723 case SensorType::STEP_COUNTER:
724 case SensorType::LOW_LATENCY_OFFBODY_DETECT:
725 return SensorFlagBits::ON_CHANGE_MODE;
727 case SensorType::SIGNIFICANT_MOTION:
728 case SensorType::WAKE_GESTURE:
729 case SensorType::GLANCE_GESTURE:
730 case SensorType::PICK_UP_GESTURE:
731 case SensorType::MOTION_DETECT:
732 case SensorType::STATIONARY_DETECT:
733 return SensorFlagBits::ONE_SHOT_MODE;
735 case SensorType::STEP_DETECTOR:
736 case SensorType::TILT_DETECTOR:
737 case SensorType::WRIST_TILT_GESTURE:
738 case SensorType::DYNAMIC_SENSOR_META:
739 return SensorFlagBits::SPECIAL_REPORTING_MODE;
742 ALOGW("Type %d is not implemented in expectedReportModeForType", (int)type);
743 return (SensorFlagBits)-1;
747 bool SensorsHidlTest::isDirectReportRateSupported(SensorInfo sensor, RateLevel rate) {
749 static_cast<unsigned int>(sensor.flags & SensorFlagBits::MASK_DIRECT_REPORT)
750 >> static_cast<unsigned int>(SensorFlagShift::DIRECT_REPORT);
751 return r >= static_cast<unsigned int>(rate);
754 bool SensorsHidlTest::isDirectChannelTypeSupported(SensorInfo sensor, SharedMemType type) {
756 case SharedMemType::ASHMEM:
757 return (sensor.flags & SensorFlagBits::DIRECT_CHANNEL_ASHMEM) != 0;
758 case SharedMemType::GRALLOC:
759 return (sensor.flags & SensorFlagBits::DIRECT_CHANNEL_GRALLOC) != 0;
765 SensorInfo SensorsHidlTest::defaultSensorByType(SensorType type) {
768 ret.type = (SensorType) -1;
770 [&] (const auto &list) {
771 const size_t count = list.size();
772 for (size_t i = 0; i < count; ++i) {
773 if (list[i].type == type) {
783 std::vector<SensorInfo> SensorsHidlTest::getSensorsList() {
784 std::vector<SensorInfo> ret;
787 [&] (const auto &list) {
788 const size_t count = list.size();
789 ret.reserve(list.size());
790 for (size_t i = 0; i < count; ++i) {
791 ret.push_back(list[i]);
798 // Test if sensor list returned is valid
799 TEST_F(SensorsHidlTest, SensorListValid) {
801 [&] (const auto &list) {
802 const size_t count = list.size();
803 for (size_t i = 0; i < count; ++i) {
804 const auto &s = list[i];
805 SCOPED_TRACE(::testing::Message() << i << "/" << count << ": "
806 << " handle=0x" << std::hex << std::setw(8) << std::setfill('0')
807 << s.sensorHandle << std::dec
808 << " type=" << static_cast<int>(s.type)
809 << " name=" << s.name);
811 // Test non-empty type string
812 EXPECT_FALSE(s.typeAsString.empty());
814 // Test defined type matches defined string type
815 EXPECT_NO_FATAL_FAILURE(assertTypeMatchStringType(s.type, s.typeAsString));
817 // Test if all sensor has name and vendor
818 EXPECT_FALSE(s.name.empty());
819 EXPECT_FALSE(s.vendor.empty());
821 // Test power > 0, maxRange > 0
822 EXPECT_LE(0, s.power);
823 EXPECT_LT(0, s.maxRange);
825 // Info type, should have no sensor
827 s.type == SensorType::ADDITIONAL_INFO
828 || s.type == SensorType::META_DATA);
830 // Test fifoMax >= fifoReserved
831 EXPECT_GE(s.fifoMaxEventCount, s.fifoReservedEventCount)
832 << "max=" << s.fifoMaxEventCount << " reserved=" << s.fifoReservedEventCount;
834 // Test Reporting mode valid
835 EXPECT_NO_FATAL_FAILURE(assertTypeMatchReportMode(s.type, extractReportMode(s.flags)));
837 // Test min max are in the right order
838 EXPECT_LE(s.minDelay, s.maxDelay);
839 // Test min/max delay matches reporting mode
840 EXPECT_NO_FATAL_FAILURE(
841 assertDelayMatchReportMode(s.minDelay, s.maxDelay, extractReportMode(s.flags)));
846 // Test if sensor list returned is valid
847 TEST_F(SensorsHidlTest, SetOperationMode) {
848 std::vector<SensorInfo> sensorList = getSensorsList();
850 bool needOperationModeSupport =
851 std::any_of(sensorList.begin(), sensorList.end(),
853 return (s.flags & SensorFlagBits::DATA_INJECTION) != 0;
855 if (!needOperationModeSupport) {
859 ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
860 ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::DATA_INJECTION));
861 ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
864 // Test if sensor list returned is valid
865 TEST_F(SensorsHidlTest, InjectSensorEventData) {
866 std::vector<SensorInfo> sensorList = getSensorsList();
867 std::vector<SensorInfo> sensorSupportInjection;
869 bool needOperationModeSupport =
870 std::any_of(sensorList.begin(), sensorList.end(),
871 [&sensorSupportInjection] (const auto& s) {
872 bool ret = (s.flags & SensorFlagBits::DATA_INJECTION) != 0;
874 sensorSupportInjection.push_back(s);
878 if (!needOperationModeSupport) {
882 ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
883 ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::DATA_INJECTION));
885 for (const auto &s : sensorSupportInjection) {
887 case SensorType::ACCELEROMETER:
888 case SensorType::GYROSCOPE:
889 case SensorType::MAGNETIC_FIELD: {
890 usleep(100000); // sleep 100ms
893 dummy.timestamp = android::elapsedRealtimeNano();
894 dummy.sensorType = s.type;
895 dummy.sensorHandle = s.sensorHandle;
896 Vec3 v = {1, 2, 3, SensorStatus::ACCURACY_HIGH};
899 EXPECT_EQ(Result::OK, S()->injectSensorData(dummy));
906 ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
909 void SensorsHidlTest::testStreamingOperation(SensorType type,
910 std::chrono::nanoseconds samplingPeriod,
911 std::chrono::seconds duration,
912 const SensorEventsChecker &checker) {
913 std::vector<Event> events;
915 const int64_t samplingPeriodInNs = samplingPeriod.count();
916 const int64_t batchingPeriodInNs = 0; // no batching
917 const useconds_t minTimeUs = std::chrono::microseconds(duration).count();
918 const size_t minNEvent = duration / samplingPeriod;
920 SensorInfo sensor = defaultSensorByType(type);
922 if (!isValidType(sensor.type)) {
923 // no default sensor of this type
927 if (std::chrono::microseconds(sensor.minDelay) > samplingPeriod) {
928 // rate not supported
932 int32_t handle = sensor.sensorHandle;
934 ASSERT_EQ(batch(handle, samplingPeriodInNs, batchingPeriodInNs), Result::OK);
935 ASSERT_EQ(activate(handle, 1), Result::OK);
936 events = collectEvents(minTimeUs, minNEvent, true /*clearBeforeStart*/);
937 ASSERT_EQ(activate(handle, 0), Result::OK);
939 ALOGI("Collected %zu samples", events.size());
941 ASSERT_GT(events.size(), 0u);
943 size_t nRealEvent = 0;
944 bool handleMismatchReported = false;
945 bool metaSensorTypeErrorReported = false;
946 for (auto & e : events) {
947 if (e.sensorType == type) {
948 // avoid generating hundreds of error
949 if (!handleMismatchReported) {
950 EXPECT_EQ(e.sensorHandle, handle)
951 << (handleMismatchReported = true,
952 "Event of the same type must come from the sensor registered");
956 // avoid generating hundreds of error
957 if (!metaSensorTypeErrorReported) {
958 EXPECT_TRUE(isMetaSensorType(e.sensorType))
959 << (metaSensorTypeErrorReported = true,
960 "Only meta types are allowed besides the type registered");
966 EXPECT_TRUE(checker.check(events, &s)) << s;
968 EXPECT_GE(nRealEvent, minNEvent / 2); // make sure returned events are not all meta
971 // Test if sensor hal can do UI speed accelerometer streaming properly
972 TEST_F(SensorsHidlTest, AccelerometerStreamingOperationSlow) {
973 testStreamingOperation(SensorType::ACCELEROMETER,
974 std::chrono::milliseconds(200),
975 std::chrono::seconds(5),
979 // Test if sensor hal can do normal speed accelerometer streaming properly
980 TEST_F(SensorsHidlTest, AccelerometerStreamingOperationNormal) {
981 testStreamingOperation(SensorType::ACCELEROMETER,
982 std::chrono::milliseconds(20),
983 std::chrono::seconds(5),
987 // Test if sensor hal can do game speed accelerometer streaming properly
988 TEST_F(SensorsHidlTest, AccelerometerStreamingOperationFast) {
989 testStreamingOperation(SensorType::ACCELEROMETER,
990 std::chrono::milliseconds(5),
991 std::chrono::seconds(5),
995 // Test if sensor hal can do UI speed gyroscope streaming properly
996 TEST_F(SensorsHidlTest, GyroscopeStreamingOperationSlow) {
997 testStreamingOperation(SensorType::GYROSCOPE,
998 std::chrono::milliseconds(200),
999 std::chrono::seconds(5),
1003 // Test if sensor hal can do normal speed gyroscope streaming properly
1004 TEST_F(SensorsHidlTest, GyroscopeStreamingOperationNormal) {
1005 testStreamingOperation(SensorType::GYROSCOPE,
1006 std::chrono::milliseconds(20),
1007 std::chrono::seconds(5),
1011 // Test if sensor hal can do game speed gyroscope streaming properly
1012 TEST_F(SensorsHidlTest, GyroscopeStreamingOperationFast) {
1013 testStreamingOperation(SensorType::GYROSCOPE,
1014 std::chrono::milliseconds(5),
1015 std::chrono::seconds(5),
1019 // Test if sensor hal can do UI speed magnetometer streaming properly
1020 TEST_F(SensorsHidlTest, MagnetometerStreamingOperationSlow) {
1021 testStreamingOperation(SensorType::MAGNETIC_FIELD,
1022 std::chrono::milliseconds(200),
1023 std::chrono::seconds(5),
1027 // Test if sensor hal can do normal speed magnetometer streaming properly
1028 TEST_F(SensorsHidlTest, MagnetometerStreamingOperationNormal) {
1029 testStreamingOperation(SensorType::MAGNETIC_FIELD,
1030 std::chrono::milliseconds(20),
1031 std::chrono::seconds(5),
1035 // Test if sensor hal can do game speed magnetometer streaming properly
1036 TEST_F(SensorsHidlTest, MagnetometerStreamingOperationFast) {
1037 testStreamingOperation(SensorType::MAGNETIC_FIELD,
1038 std::chrono::milliseconds(5),
1039 std::chrono::seconds(5),
1043 void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
1044 std::vector<Event> events1, events2;
1046 constexpr int64_t batchingPeriodInNs = 0; // no batching
1047 constexpr size_t minNEvent = 50;
1049 SensorInfo sensor = defaultSensorByType(type);
1051 if (!isValidType(sensor.type)) {
1052 // no default sensor of this type
1056 int32_t handle = sensor.sensorHandle;
1057 int64_t minSamplingPeriodInNs = sensor.minDelay * 1000ll;
1058 int64_t maxSamplingPeriodInNs = sensor.maxDelay * 1000ll;
1060 if (minSamplingPeriodInNs == maxSamplingPeriodInNs) {
1061 // only support single rate
1065 ASSERT_EQ(batch(handle, minSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
1066 ASSERT_EQ(activate(handle, 1), Result::OK);
1068 usleep(500000); // sleep 0.5 sec to wait for change rate to happen
1069 events1 = collectEvents(sensor.minDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
1071 ASSERT_EQ(batch(handle, maxSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
1073 usleep(500000); // sleep 0.5 sec to wait for change rate to happen
1074 events2 = collectEvents(sensor.maxDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
1076 ASSERT_EQ(activate(handle, 0), Result::OK);
1078 ALOGI("Collected %zu fast samples and %zu slow samples", events1.size(), events2.size());
1080 ASSERT_GT(events1.size(), 0u);
1081 ASSERT_GT(events2.size(), 0u);
1083 int64_t minDelayAverageInterval, maxDelayAverageInterval;
1086 int64_t prevTimestamp = -1;
1087 int64_t timestampInterval = 0;
1088 for (auto & e : events1) {
1089 if (e.sensorType == type) {
1090 ASSERT_EQ(e.sensorHandle, handle);
1091 if (prevTimestamp > 0) {
1092 timestampInterval += e.timestamp - prevTimestamp;
1094 prevTimestamp = e.timestamp;
1098 ASSERT_GT(nEvent, 2u);
1099 minDelayAverageInterval = timestampInterval / (nEvent - 1);
1103 timestampInterval = 0;
1104 for (auto & e : events2) {
1105 if (e.sensorType == type) {
1106 ASSERT_EQ(e.sensorHandle, handle);
1107 if (prevTimestamp > 0) {
1108 timestampInterval += e.timestamp - prevTimestamp;
1110 prevTimestamp = e.timestamp;
1114 ASSERT_GT(nEvent, 2u);
1115 maxDelayAverageInterval = timestampInterval / (nEvent - 1);
1117 // change of rate is significant.
1118 EXPECT_GT((maxDelayAverageInterval - minDelayAverageInterval), minDelayAverageInterval / 10);
1120 // fastest rate sampling time is close to spec
1121 ALOGI("minDelayAverageInterval = %" PRId64, minDelayAverageInterval);
1122 EXPECT_LT(std::abs(minDelayAverageInterval - minSamplingPeriodInNs),
1123 minSamplingPeriodInNs / 10);
1126 // Test if sensor hal can do accelerometer sampling rate switch properly when sensor is active
1127 TEST_F(SensorsHidlTest, AccelerometerSamplingPeriodHotSwitchOperation) {
1128 testSamplingRateHotSwitchOperation(SensorType::ACCELEROMETER);
1131 // Test if sensor hal can do gyroscope sampling rate switch properly when sensor is active
1132 TEST_F(SensorsHidlTest, GyroscopeSamplingPeriodHotSwitchOperation) {
1133 testSamplingRateHotSwitchOperation(SensorType::GYROSCOPE);
1136 // Test if sensor hal can do magnetometer sampling rate switch properly when sensor is active
1137 TEST_F(SensorsHidlTest, MagnetometerSamplingPeriodHotSwitchOperation) {
1138 testSamplingRateHotSwitchOperation(SensorType::MAGNETIC_FIELD);
1141 void SensorsHidlTest::testBatchingOperation(SensorType type) {
1142 std::vector<Event> events;
1144 constexpr int64_t maxBatchingTestTimeNs = 30ull * 1000 * 1000 * 1000;
1145 constexpr int64_t oneSecondInNs = 1ull * 1000 * 1000 * 1000;
1147 SensorInfo sensor = defaultSensorByType(type);
1149 if (!isValidType(sensor.type)) {
1150 // no default sensor of this type
1154 int32_t handle = sensor.sensorHandle;
1155 int64_t minSamplingPeriodInNs = sensor.minDelay * 1000ll;
1156 uint32_t minFifoCount = sensor.fifoReservedEventCount;
1157 int64_t batchingPeriodInNs = minFifoCount * minSamplingPeriodInNs;
1159 if (batchingPeriodInNs < oneSecondInNs) {
1160 // batching size too small to test reliably
1164 batchingPeriodInNs = std::min(batchingPeriodInNs, maxBatchingTestTimeNs);
1166 ALOGI("Test batching for %d ms", (int)(batchingPeriodInNs / 1000 / 1000));
1168 int64_t allowedBatchDeliverTimeNs =
1169 std::max(oneSecondInNs, batchingPeriodInNs / 10);
1171 ASSERT_EQ(batch(handle, minSamplingPeriodInNs, INT64_MAX), Result::OK);
1172 ASSERT_EQ(activate(handle, 1), Result::OK);
1174 usleep(500000); // sleep 0.5 sec to wait for initialization
1175 ASSERT_EQ(flush(handle), Result::OK);
1177 // wait for 80% of the reserved batching period
1178 // there should not be any significant amount of events
1179 // since collection is not enabled all events will go down the drain
1180 usleep(batchingPeriodInNs / 1000 * 8 / 10);
1182 SensorsHidlEnvironment::Instance()->setCollection(true);
1183 // clean existing collections
1184 collectEvents(0 /*timeLimitUs*/, 0/*nEventLimit*/,
1185 true /*clearBeforeStart*/, false /*change collection*/);
1187 // 0.8 + 0.2 times the batching period
1188 usleep(batchingPeriodInNs / 1000 * 8 / 10);
1189 ASSERT_EQ(flush(handle), Result::OK);
1191 // plus some time for the event to deliver
1192 events = collectEvents(allowedBatchDeliverTimeNs / 1000,
1193 minFifoCount, false /*clearBeforeStart*/, false /*change collection*/);
1195 SensorsHidlEnvironment::Instance()->setCollection(false);
1196 ASSERT_EQ(activate(handle, 0), Result::OK);
1199 for (auto & e : events) {
1200 if (e.sensorType == type && e.sensorHandle == handle) {
1205 // at least reach 90% of advertised capacity
1206 ASSERT_GT(nEvent, (size_t)(minFifoCount * 9 / 10));
1209 // Test if sensor hal can do accelerometer batching properly
1210 TEST_F(SensorsHidlTest, AccelerometerBatchingOperation) {
1211 testBatchingOperation(SensorType::ACCELEROMETER);
1214 // Test if sensor hal can do gyroscope batching properly
1215 TEST_F(SensorsHidlTest, GyroscopeBatchingOperation) {
1216 testBatchingOperation(SensorType::GYROSCOPE);
1219 // Test if sensor hal can do magnetometer batching properly
1220 TEST_F(SensorsHidlTest, MagnetometerBatchingOperation) {
1221 testBatchingOperation(SensorType::MAGNETIC_FIELD);
1224 void SensorsHidlTest::testDirectReportOperation(
1225 SensorType type, SharedMemType memType, RateLevel rate, const SensorEventsChecker &checker) {
1226 constexpr size_t kEventSize = static_cast<size_t>(SensorsEventFormatOffset::TOTAL_LENGTH);
1227 constexpr size_t kNEvent = 500;
1228 constexpr size_t kMemSize = kEventSize * kNEvent;
1230 constexpr float kNormalNominal = 50;
1231 constexpr float kFastNominal = 200;
1232 constexpr float kVeryFastNominal = 800;
1234 constexpr float kNominalTestTimeSec = 1.f;
1235 constexpr float kMaxTestTimeSec = kNominalTestTimeSec + 0.5f; // 0.5 second for initialization
1237 SensorInfo sensor = defaultSensorByType(type);
1239 if (!isDirectReportRateSupported(sensor, rate)) {
1243 if (!isDirectChannelTypeSupported(sensor, memType)) {
1247 std::unique_ptr<SensorsTestSharedMemory>
1248 mem(SensorsTestSharedMemory::create(memType, kMemSize));
1249 ASSERT_NE(mem, nullptr);
1251 char* buffer = mem->getBuffer();
1252 // fill memory with data
1253 for (size_t i = 0; i < kMemSize; ++i) {
1257 int32_t channelHandle;
1258 registerDirectChannel(mem->getSharedMemInfo(),
1259 [&channelHandle] (auto result, auto channelHandle_) {
1260 ASSERT_EQ(result, Result::OK);
1261 channelHandle = channelHandle_;
1264 // check memory is zeroed
1265 for (size_t i = 0; i < kMemSize; ++i) {
1266 ASSERT_EQ(buffer[i], '\0');
1270 configDirectReport(sensor.sensorHandle, channelHandle, rate,
1271 [&eventToken] (auto result, auto token) {
1272 ASSERT_EQ(result, Result::OK);
1276 usleep(static_cast<useconds_t>(kMaxTestTimeSec * 1e6f));
1277 auto events = mem->parseEvents();
1279 // find norminal rate
1280 float nominalFreq = 0.f;
1282 case RateLevel::NORMAL:
1283 nominalFreq = kNormalNominal;
1285 case RateLevel::FAST:
1286 nominalFreq = kFastNominal;
1288 case RateLevel::VERY_FAST:
1289 nominalFreq = kVeryFastNominal;
1291 case RateLevel::STOP:
1295 // allowed to be between 55% and 220% of nominal freq
1296 ASSERT_GT(events.size(), static_cast<size_t>(nominalFreq * 0.55f * kNominalTestTimeSec));
1297 ASSERT_LT(events.size(), static_cast<size_t>(nominalFreq * 2.2f * kMaxTestTimeSec));
1299 int64_t lastTimestamp = 0;
1300 bool typeErrorReported = false;
1301 bool tokenErrorReported = false;
1302 bool timestampErrorReported = false;
1303 for (auto &e : events) {
1304 if (!typeErrorReported) {
1305 EXPECT_EQ(type, e.sensorType)
1306 << (typeErrorReported = true, "Type in event does not match type of sensor registered.");
1308 if (!tokenErrorReported) {
1309 EXPECT_EQ(eventToken, e.sensorHandle)
1310 << (tokenErrorReported = true,
1311 "Event token does not match that retured from configDirectReport");
1313 if (!timestampErrorReported) {
1314 EXPECT_GT(e.timestamp, lastTimestamp)
1315 << (timestampErrorReported = true, "Timestamp not monotonically increasing");
1317 lastTimestamp = e.timestamp;
1321 EXPECT_TRUE(checker.check(events, &s)) << s;
1323 // stop sensor and unregister channel
1324 configDirectReport(sensor.sensorHandle, channelHandle, RateLevel::STOP,
1325 [&eventToken] (auto result, auto) {
1326 EXPECT_EQ(result, Result::OK);
1328 EXPECT_EQ(unregisterDirectChannel(channelHandle), Result::OK);
1331 // Test sensor event direct report with ashmem for accel sensor at normal rate
1332 TEST_F(SensorsHidlTest, AccelerometerAshmemDirectReportOperationNormal) {
1333 testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::NORMAL,
1337 // Test sensor event direct report with ashmem for accel sensor at fast rate
1338 TEST_F(SensorsHidlTest, AccelerometerAshmemDirectReportOperationFast) {
1339 testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::FAST,
1343 // Test sensor event direct report with ashmem for accel sensor at very fast rate
1344 TEST_F(SensorsHidlTest, AccelerometerAshmemDirectReportOperationVeryFast) {
1345 testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::VERY_FAST,
1349 // Test sensor event direct report with ashmem for gyro sensor at normal rate
1350 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReportOperationNormal) {
1351 testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::NORMAL,
1355 // Test sensor event direct report with ashmem for gyro sensor at fast rate
1356 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReportOperationFast) {
1357 testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::FAST,
1361 // Test sensor event direct report with ashmem for gyro sensor at very fast rate
1362 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReportOperationVeryFast) {
1363 testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::VERY_FAST,
1367 // Test sensor event direct report with ashmem for mag sensor at normal rate
1368 TEST_F(SensorsHidlTest, MagnetometerAshmemDirectReportOperationNormal) {
1369 testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::NORMAL,
1373 // Test sensor event direct report with ashmem for mag sensor at fast rate
1374 TEST_F(SensorsHidlTest, MagnetometerAshmemDirectReportOperationFast) {
1375 testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::FAST,
1379 // Test sensor event direct report with ashmem for mag sensor at very fast rate
1380 TEST_F(SensorsHidlTest, MagnetometerAshmemDirectReportOperationVeryFast) {
1381 testDirectReportOperation(
1382 SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::VERY_FAST, NullChecker());
1385 int main(int argc, char **argv) {
1386 ::testing::AddGlobalTestEnvironment(SensorsHidlEnvironment::Instance());
1387 ::testing::InitGoogleTest(&argc, argv);
1388 int status = RUN_ALL_TESTS();
1389 ALOGI("Test result = %d", status);
1392 // vim: set ts=2 sw=2