OSDN Git Service

Merge "Empty interface IQuux which is completely unrelated to IBase and IBaz." into...
[android-x86/hardware-interfaces.git] / sensors / 1.0 / vts / functional / VtsHalSensorsV1_0TargetTest.cpp
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
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 <utils/SystemClock.h>
24 #include <VtsHalHidlTargetTestBase.h>
25 #include <hardware/sensors.h>       // for sensor type strings
26
27 #include <algorithm>
28 #include <cinttypes>
29 #include <cmath>
30 #include <memory>
31 #include <mutex>
32 #include <thread>
33 #include <unordered_set>
34 #include <vector>
35
36 #include <sys/mman.h>
37 #include <unistd.h>
38
39 using ::android::hardware::Return;
40 using ::android::hardware::Void;
41 using ::android::hardware::hidl_string;
42 using ::android::sp;
43 using namespace ::android::hardware::sensors::V1_0;
44
45 // Test environment for sensors
46 class SensorsHidlTest;
47 class SensorsHidlEnvironment : public ::testing::Environment {
48  public:
49   // get the test environment singleton
50   static SensorsHidlEnvironment* Instance() {
51     static SensorsHidlEnvironment* instance = new SensorsHidlEnvironment;
52     return instance;
53   }
54
55   virtual void SetUp();
56   virtual void TearDown();
57
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);
61
62   // set sensor event collection status
63   void setCollection(bool enable);
64
65  private:
66   friend SensorsHidlTest;
67   // sensors hidl service
68   sp<ISensors> sensors;
69
70   SensorsHidlEnvironment() {}
71
72   void addEvent(const Event& ev);
73   void startPollingThread();
74   void resetHal();
75   static void pollingThread(SensorsHidlEnvironment* env, std::shared_ptr<bool> stop);
76
77   bool collectionEnabled;
78   std::shared_ptr<bool> stopThread;
79   std::thread pollThread;
80   std::vector<Event> events;
81   std::mutex events_mutex;
82
83   GTEST_DISALLOW_COPY_AND_ASSIGN_(SensorsHidlEnvironment);
84 };
85
86 void SensorsHidlEnvironment::SetUp() {
87   resetHal();
88
89   ASSERT_NE(sensors, nullptr) << "sensors is nullptr, cannot get hidl service";
90
91   collectionEnabled = false;
92   startPollingThread();
93
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));
97 }
98
99 void SensorsHidlEnvironment::TearDown() {
100   if (stopThread) {
101     *stopThread = true;
102   }
103   pollThread.detach();
104 }
105
106 void SensorsHidlEnvironment::resetHal() {
107   // wait upto 100ms * 10 = 1s for hidl service.
108   constexpr auto RETRY_DELAY = std::chrono::milliseconds(100);
109
110   std::string step;
111   bool succeed = false;
112   for (size_t retry = 10; retry > 0; --retry) {
113     // this do ... while is for easy error handling
114     do {
115       step = "getService()";
116       sensors = ISensors::getService();
117       if (sensors == nullptr) {
118         break;
119       }
120
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()) {
126         break;
127       }
128
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]);
136             }
137           }).isOk()) {
138         break;
139       }
140
141       // stop each sensor individually
142       step = "stop each sensor";
143       bool ok = true;
144       for (const auto &i : sensorList) {
145         if (!sensors->activate(i.sensorHandle, false).isOk()) {
146           ok = false;
147           break;
148         }
149       }
150       if (!ok) {
151         break;
152       }
153
154       // mark it done
155       step = "done";
156       succeed = true;
157     } while(0);
158
159     if (succeed) {
160       return;
161     }
162
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);
166   }
167
168   sensors = nullptr;
169 }
170
171 void SensorsHidlEnvironment::catEvents(std::vector<Event>* output) {
172   std::lock_guard<std::mutex> lock(events_mutex);
173   if (output) {
174     output->insert(output->end(), events.begin(), events.end());
175   }
176   events.clear();
177 }
178
179 void SensorsHidlEnvironment::setCollection(bool enable) {
180   std::lock_guard<std::mutex> lock(events_mutex);
181   collectionEnabled = enable;
182 }
183
184 void SensorsHidlEnvironment::addEvent(const Event& ev) {
185   std::lock_guard<std::mutex> lock(events_mutex);
186   if (collectionEnabled) {
187     events.push_back(ev);
188   }
189 }
190
191 void SensorsHidlEnvironment::startPollingThread() {
192   stopThread = std::shared_ptr<bool>(new bool(false));
193   pollThread = std::thread(pollingThread, this, stopThread);
194   events.reserve(128);
195 }
196
197 void SensorsHidlEnvironment::pollingThread(
198     SensorsHidlEnvironment* env, std::shared_ptr<bool> stop) {
199   ALOGD("polling thread start");
200   bool needExit = *stop;
201
202   while(!needExit) {
203     env->sensors->poll(1,
204         [&](auto result, const auto &events, const auto &dynamicSensorsAdded) {
205           if (result != Result::OK
206               || (events.size() == 0 && dynamicSensorsAdded.size() == 0)
207               || *stop) {
208             needExit = true;
209             return;
210           }
211
212           if (events.size() > 0) {
213             env->addEvent(events[0]);
214           }
215         });
216   }
217   ALOGD("polling thread end");
218 }
219
220 class SensorsTestSharedMemory {
221  public:
222   static SensorsTestSharedMemory* create(SharedMemType type, size_t size);
223   SharedMemInfo getSharedMemInfo() const;
224   char * getBuffer() const;
225   std::vector<Event> parseEvents(int64_t lastCounter = -1, size_t offset = 0) const;
226   virtual ~SensorsTestSharedMemory();
227  private:
228   SensorsTestSharedMemory(SharedMemType type, size_t size);
229
230   SharedMemType mType;
231   native_handle_t* mNativeHandle;
232   size_t mSize;
233   char* mBuffer;
234
235   DISALLOW_COPY_AND_ASSIGN(SensorsTestSharedMemory);
236 };
237
238 SharedMemInfo SensorsTestSharedMemory::getSharedMemInfo() const {
239   SharedMemInfo mem = {
240     .type = mType,
241     .format = SharedMemFormat::SENSORS_EVENT,
242     .size = static_cast<uint32_t>(mSize),
243     .memoryHandle = mNativeHandle
244   };
245   return mem;
246 }
247
248 char * SensorsTestSharedMemory::getBuffer() const {
249   return mBuffer;
250 }
251
252 std::vector<Event> SensorsTestSharedMemory::parseEvents(int64_t lastCounter, size_t offset) const {
253
254   constexpr size_t kEventSize = static_cast<size_t>(SensorsEventFormatOffset::TOTAL_LENGTH);
255   constexpr size_t kOffsetSize = static_cast<size_t>(SensorsEventFormatOffset::SIZE_FIELD);
256   constexpr size_t kOffsetToken = static_cast<size_t>(SensorsEventFormatOffset::REPORT_TOKEN);
257   constexpr size_t kOffsetType = static_cast<size_t>(SensorsEventFormatOffset::SENSOR_TYPE);
258   constexpr size_t kOffsetAtomicCounter =
259       static_cast<size_t>(SensorsEventFormatOffset::ATOMIC_COUNTER);
260   constexpr size_t kOffsetTimestamp = static_cast<size_t>(SensorsEventFormatOffset::TIMESTAMP);
261   constexpr size_t kOffsetData = static_cast<size_t>(SensorsEventFormatOffset::DATA);
262
263   std::vector<Event> events;
264   std::vector<float> data(16);
265
266   while (offset + kEventSize <= mSize) {
267     int64_t atomicCounter = *reinterpret_cast<uint32_t *>(mBuffer + offset + kOffsetAtomicCounter);
268     if (atomicCounter <= lastCounter) {
269       break;
270     }
271
272     int32_t size = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetSize);
273     if (size != kEventSize) {
274       // unknown error, events parsed may be wrong, remove all
275       events.clear();
276       break;
277     }
278
279     int32_t token = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetToken);
280     int32_t type = *reinterpret_cast<int32_t *>(mBuffer + offset + kOffsetType);
281     int64_t timestamp = *reinterpret_cast<int64_t *>(mBuffer + offset + kOffsetTimestamp);
282
283     ALOGV("offset = %zu, cnt %" PRId64 ", token %" PRId32 ", type %" PRId32 ", timestamp %" PRId64,
284         offset, atomicCounter, token, type, timestamp);
285
286     Event event = {
287       .timestamp = timestamp,
288       .sensorHandle = token,
289       .sensorType = static_cast<SensorType>(type),
290     };
291     event.u.data = android::hardware::hidl_array<float, 16>
292         (reinterpret_cast<float*>(mBuffer + offset + kOffsetData));
293
294     events.push_back(event);
295
296     lastCounter = atomicCounter;
297     offset += kEventSize;
298   }
299
300   return events;
301 }
302
303 SensorsTestSharedMemory::SensorsTestSharedMemory(SharedMemType type, size_t size)
304     : mType(type), mSize(0), mBuffer(nullptr) {
305   native_handle_t *handle = nullptr;
306   char *buffer = nullptr;
307   switch(type) {
308     case SharedMemType::ASHMEM: {
309       int fd;
310       handle = ::native_handle_create(1 /*nFds*/, 0/*nInts*/);
311       if (handle != nullptr) {
312         handle->data[0] = fd = ::ashmem_create_region("SensorsTestSharedMemory", size);
313         if (handle->data[0] > 0) {
314           // memory is pinned by default
315           buffer = static_cast<char *>
316               (::mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
317           if (buffer != reinterpret_cast<char*>(MAP_FAILED)) {
318             break;
319           }
320           ::native_handle_close(handle);
321         }
322         ::native_handle_delete(handle);
323         handle = nullptr;
324       }
325       break;
326     }
327     case SharedMemType::GRALLOC: {
328
329       break;
330     }
331     default:
332       break;
333   }
334
335   if (buffer != nullptr) {
336     mNativeHandle = handle;
337     mSize = size;
338     mBuffer = buffer;
339   }
340 }
341
342 SensorsTestSharedMemory::~SensorsTestSharedMemory() {
343   switch(mType) {
344     case SharedMemType::ASHMEM: {
345       if (mSize != 0) {
346         ::munmap(mBuffer, mSize);
347         mBuffer = nullptr;
348
349         ::native_handle_close(mNativeHandle);
350         ::native_handle_delete(mNativeHandle);
351
352         mNativeHandle = nullptr;
353         mSize = 0;
354       }
355       break;
356     }
357     default: {
358       if (mNativeHandle != nullptr || mSize != 0 || mBuffer != nullptr) {
359         ALOGE("SensorsTestSharedMemory %p not properly destructed: "
360             "type %d, native handle %p, size %zu, buffer %p",
361             this, static_cast<int>(mType), mNativeHandle, mSize, mBuffer);
362       }
363       break;
364     }
365   }
366 }
367
368 SensorsTestSharedMemory* SensorsTestSharedMemory::create(SharedMemType type, size_t size) {
369   constexpr size_t kMaxSize = 128*1024*1024; // sensor test should not need more than 128M
370   if (size == 0 || size >= kMaxSize) {
371     return nullptr;
372   }
373
374   auto m = new SensorsTestSharedMemory(type, size);
375   if (m->mSize != size || m->mBuffer == nullptr) {
376     delete m;
377     m = nullptr;
378   }
379   return m;
380 }
381
382 class SensorEventsChecker {
383  public:
384   virtual bool check(const std::vector<Event> &events, std::string *out) const = 0;
385   virtual ~SensorEventsChecker() {}
386 };
387
388 class NullChecker : public SensorEventsChecker {
389  public:
390   virtual bool check(const std::vector<Event> &, std::string *) const {
391     return true;
392   }
393 };
394
395 class SensorEventPerEventChecker : public SensorEventsChecker {
396  public:
397   virtual bool checkEvent(const Event &event, std::string *out) const = 0;
398   virtual bool check(const std::vector<Event> &events, std::string *out) const {
399     for (const auto &e : events) {
400       if (!checkEvent(e, out)) {
401         return false;
402       }
403     }
404     return true;
405   }
406 };
407
408 class Vec3NormChecker : public SensorEventPerEventChecker {
409  public:
410   Vec3NormChecker(float min, float max) : mRange(min, max) {}
411   static Vec3NormChecker byNominal(float nominal, float allowedError) {
412     return Vec3NormChecker(nominal - allowedError, nominal + allowedError);
413   }
414
415   virtual bool checkEvent(const Event &event, std::string *out) const {
416     Vec3 v = event.u.vec3;
417     float norm = std::sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
418     if (norm < mRange.first || norm > mRange.second) {
419       if (out != nullptr) {
420         std::ostringstream ss;
421         ss << "Event @ " << event.timestamp << " (" << v.x << ", " << v.y << ", " << v.z << ")"
422            << " has norm " << norm << ", which is beyond range"
423            << " [" << mRange.first << ", " << mRange.second << "]";
424         *out = ss.str();
425       }
426       return false;
427     }
428     return true;
429   }
430  protected:
431   std::pair<float, float> mRange;
432 };
433
434 // The main test class for SENSORS HIDL HAL.
435 class SensorsHidlTest : public ::testing::VtsHalHidlTargetTestBase {
436  public:
437   virtual void SetUp() override {
438   }
439
440   virtual void TearDown() override {
441     // stop all sensors
442     for (auto s : mSensorHandles) {
443       S()->activate(s, false);
444     }
445     mSensorHandles.clear();
446
447     // stop all direct report and channels
448     for (auto c : mDirectChannelHandles) {
449       // disable all reports
450       S()->configDirectReport(-1, c, RateLevel::STOP, [] (auto, auto){});
451       S()->unregisterDirectChannel(c);
452     }
453     mDirectChannelHandles.clear();
454   }
455
456  protected:
457   SensorInfo defaultSensorByType(SensorType type);
458   std::vector<SensorInfo> getSensorsList();
459   std::vector<Event> collectEvents(useconds_t timeLimitUs, size_t nEventLimit,
460         bool clearBeforeStart = true, bool changeCollection = true);
461
462   // implementation wrapper
463   Return<void> getSensorsList(ISensors::getSensorsList_cb _hidl_cb) {
464     return S()->getSensorsList(_hidl_cb);
465   }
466
467   Return<Result> activate(
468           int32_t sensorHandle, bool enabled);
469
470   Return<Result> batch(
471           int32_t sensorHandle,
472           int64_t samplingPeriodNs,
473           int64_t maxReportLatencyNs) {
474     return S()->batch(sensorHandle, samplingPeriodNs, maxReportLatencyNs);
475   }
476
477   Return<Result> flush(int32_t sensorHandle) {
478     return S()->flush(sensorHandle);
479   }
480
481   Return<Result> injectSensorData(const Event& event) {
482     return S()->injectSensorData(event);
483   }
484
485   Return<void> registerDirectChannel(
486           const SharedMemInfo& mem, ISensors::registerDirectChannel_cb _hidl_cb);
487
488   Return<Result> unregisterDirectChannel(int32_t channelHandle) {
489     return S()->unregisterDirectChannel(channelHandle);
490   }
491
492   Return<void> configDirectReport(
493           int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
494           ISensors::configDirectReport_cb _hidl_cb) {
495     return S()->configDirectReport(sensorHandle, channelHandle, rate, _hidl_cb);
496   }
497
498   inline sp<ISensors>& S() {
499     return SensorsHidlEnvironment::Instance()->sensors;
500   }
501
502   inline static SensorFlagBits extractReportMode(uint64_t flag) {
503     return (SensorFlagBits) (flag
504         & ((uint64_t) SensorFlagBits::CONTINUOUS_MODE
505           | (uint64_t) SensorFlagBits::ON_CHANGE_MODE
506           | (uint64_t) SensorFlagBits::ONE_SHOT_MODE
507           | (uint64_t) SensorFlagBits::SPECIAL_REPORTING_MODE));
508   }
509
510   inline static bool isMetaSensorType(SensorType type) {
511     return (type == SensorType::META_DATA
512             || type == SensorType::DYNAMIC_SENSOR_META
513             || type == SensorType::ADDITIONAL_INFO);
514   }
515
516   inline static bool isValidType(SensorType type) {
517     return (int32_t) type > 0;
518   }
519
520   void testStreamingOperation(SensorType type,
521                               std::chrono::nanoseconds samplingPeriod,
522                               std::chrono::seconds duration,
523                               const SensorEventsChecker &checker);
524   void testSamplingRateHotSwitchOperation(SensorType type);
525   void testBatchingOperation(SensorType type);
526   void testDirectReportOperation(
527       SensorType type, SharedMemType memType, RateLevel rate, const SensorEventsChecker &checker);
528
529   static void assertTypeMatchStringType(SensorType type, const hidl_string& stringType);
530   static void assertTypeMatchReportMode(SensorType type, SensorFlagBits reportMode);
531   static void assertDelayMatchReportMode(
532           int32_t minDelay, int32_t maxDelay, SensorFlagBits reportMode);
533   static SensorFlagBits expectedReportModeForType(SensorType type);
534   static bool isDirectReportRateSupported(SensorInfo sensor, RateLevel rate);
535   static bool isDirectChannelTypeSupported(SensorInfo sensor, SharedMemType type);
536
537   // checkers
538   static const Vec3NormChecker sAccelNormChecker;
539   static const Vec3NormChecker sGyroNormChecker;
540
541   // all sensors and direct channnels used
542   std::unordered_set<int32_t> mSensorHandles;
543   std::unordered_set<int32_t> mDirectChannelHandles;
544 };
545
546 const Vec3NormChecker SensorsHidlTest::sAccelNormChecker(
547         Vec3NormChecker::byNominal(GRAVITY_EARTH, 0.5f/*m/s^2*/));
548 const Vec3NormChecker SensorsHidlTest::sGyroNormChecker(
549         Vec3NormChecker::byNominal(0.f, 0.1f/*rad/s*/));
550
551 Return<Result> SensorsHidlTest::activate(int32_t sensorHandle, bool enabled) {
552   // If activating a sensor, add the handle in a set so that when test fails it can be turned off.
553   // The handle is not removed when it is deactivating on purpose so that it is not necessary to
554   // check the return value of deactivation. Deactivating a sensor more than once does not have
555   // negative effect.
556   if (enabled) {
557     mSensorHandles.insert(sensorHandle);
558   }
559   return S()->activate(sensorHandle, enabled);
560 }
561
562 Return<void> SensorsHidlTest::registerDirectChannel(
563     const SharedMemInfo& mem, ISensors::registerDirectChannel_cb cb) {
564   // If registeration of a channel succeeds, add the handle of channel to a set so that it can be
565   // unregistered when test fails. Unregister a channel does not remove the handle on purpose.
566   // Unregistering a channel more than once should not have negative effect.
567   S()->registerDirectChannel(mem,
568       [&] (auto result, auto channelHandle) {
569         if (result == Result::OK) {
570           mDirectChannelHandles.insert(channelHandle);
571         }
572         cb(result, channelHandle);
573       });
574   return Void();
575 }
576
577 std::vector<Event> SensorsHidlTest::collectEvents(useconds_t timeLimitUs, size_t nEventLimit,
578       bool clearBeforeStart, bool changeCollection) {
579   std::vector<Event> events;
580   constexpr useconds_t SLEEP_GRANULARITY = 100*1000; //granularity 100 ms
581
582   ALOGI("collect max of %zu events for %d us, clearBeforeStart %d",
583         nEventLimit, timeLimitUs, clearBeforeStart);
584
585   if (changeCollection) {
586     SensorsHidlEnvironment::Instance()->setCollection(true);
587   }
588   if (clearBeforeStart) {
589     SensorsHidlEnvironment::Instance()->catEvents(nullptr);
590   }
591
592   while (timeLimitUs > 0) {
593     useconds_t duration = std::min(SLEEP_GRANULARITY, timeLimitUs);
594     usleep(duration);
595     timeLimitUs -= duration;
596
597     SensorsHidlEnvironment::Instance()->catEvents(&events);
598     if (events.size() >= nEventLimit) {
599       break;
600     }
601     ALOGV("time to go = %d, events to go = %d",
602           (int)timeLimitUs, (int)(nEventLimit - events.size()));
603   }
604
605   if (changeCollection) {
606     SensorsHidlEnvironment::Instance()->setCollection(false);
607   }
608   return events;
609 }
610
611 void SensorsHidlTest::assertTypeMatchStringType(SensorType type, const hidl_string& stringType) {
612
613   if (type >= SensorType::DEVICE_PRIVATE_BASE) {
614     return;
615   }
616
617   switch (type) {
618 #define CHECK_TYPE_STRING_FOR_SENSOR_TYPE(type) \
619     case SensorType::type: ASSERT_STREQ(SENSOR_STRING_TYPE_ ## type, stringType.c_str()); break;
620     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ACCELEROMETER);
621     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ACCELEROMETER_UNCALIBRATED);
622     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ADDITIONAL_INFO);
623     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(AMBIENT_TEMPERATURE);
624     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(DEVICE_ORIENTATION);
625     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(DYNAMIC_SENSOR_META);
626     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GAME_ROTATION_VECTOR);
627     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GEOMAGNETIC_ROTATION_VECTOR);
628     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GLANCE_GESTURE);
629     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GRAVITY);
630     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GYROSCOPE);
631     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(GYROSCOPE_UNCALIBRATED);
632     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(HEART_BEAT);
633     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(HEART_RATE);
634     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LIGHT);
635     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LINEAR_ACCELERATION);
636     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(LOW_LATENCY_OFFBODY_DETECT);
637     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MAGNETIC_FIELD);
638     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MAGNETIC_FIELD_UNCALIBRATED);
639     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(MOTION_DETECT);
640     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ORIENTATION);
641     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PICK_UP_GESTURE);
642     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(POSE_6DOF);
643     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PRESSURE);
644     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(PROXIMITY);
645     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(RELATIVE_HUMIDITY);
646     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(ROTATION_VECTOR);
647     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(SIGNIFICANT_MOTION);
648     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STATIONARY_DETECT);
649     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STEP_COUNTER);
650     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(STEP_DETECTOR);
651     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(TEMPERATURE);
652     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(TILT_DETECTOR);
653     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(WAKE_GESTURE);
654     CHECK_TYPE_STRING_FOR_SENSOR_TYPE(WRIST_TILT_GESTURE);
655     default:
656       FAIL() << "Type " << static_cast<int>(type) << " in android defined range is not checked, "
657              << "stringType = " << stringType;
658 #undef CHECK_TYPE_STRING_FOR_SENSOR_TYPE
659   }
660 }
661
662 void SensorsHidlTest::assertTypeMatchReportMode(SensorType type, SensorFlagBits reportMode) {
663   if (type >= SensorType::DEVICE_PRIVATE_BASE) {
664     return;
665   }
666
667   SensorFlagBits expected = expectedReportModeForType(type);
668
669   ASSERT_TRUE(expected == (SensorFlagBits) -1 || expected == reportMode)
670       << "reportMode=" << static_cast<int>(reportMode)
671       << "expected=" << static_cast<int>(expected);
672 }
673
674 void SensorsHidlTest::assertDelayMatchReportMode(
675     int32_t minDelay, int32_t maxDelay, SensorFlagBits reportMode) {
676   switch(reportMode) {
677     case SensorFlagBits::CONTINUOUS_MODE:
678       ASSERT_LT(0, minDelay);
679       ASSERT_LE(0, maxDelay);
680       break;
681     case SensorFlagBits::ON_CHANGE_MODE:
682       ASSERT_LE(0, minDelay);
683       ASSERT_LE(0, maxDelay);
684       break;
685     case SensorFlagBits::ONE_SHOT_MODE:
686       ASSERT_EQ(-1, minDelay);
687       ASSERT_EQ(0, maxDelay);
688       break;
689     case SensorFlagBits::SPECIAL_REPORTING_MODE:
690       // do not enforce anything for special reporting mode
691       break;
692     default:
693       FAIL() << "Report mode " << static_cast<int>(reportMode) << " not checked";
694   }
695 }
696
697 // return -1 means no expectation for this type
698 SensorFlagBits SensorsHidlTest::expectedReportModeForType(SensorType type) {
699   switch (type) {
700     case SensorType::ACCELEROMETER:
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;
716
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::MOTION_DETECT:
724     case SensorType::STEP_COUNTER:
725     case SensorType::LOW_LATENCY_OFFBODY_DETECT:
726       return SensorFlagBits::ON_CHANGE_MODE;
727
728     case SensorType::SIGNIFICANT_MOTION:
729     case SensorType::WAKE_GESTURE:
730     case SensorType::GLANCE_GESTURE:
731     case SensorType::PICK_UP_GESTURE:
732       return SensorFlagBits::ONE_SHOT_MODE;
733
734     case SensorType::STEP_DETECTOR:
735     case SensorType::TILT_DETECTOR:
736     case SensorType::WRIST_TILT_GESTURE:
737     case SensorType::DYNAMIC_SENSOR_META:
738       return SensorFlagBits::SPECIAL_REPORTING_MODE;
739
740     default:
741       ALOGW("Type %d is not implemented in expectedReportModeForType", (int)type);
742       return (SensorFlagBits)-1;
743   }
744 }
745
746 bool SensorsHidlTest::isDirectReportRateSupported(SensorInfo sensor, RateLevel rate) {
747   unsigned int r =
748       static_cast<unsigned int>(sensor.flags & SensorFlagBits::MASK_DIRECT_REPORT)
749         >> static_cast<unsigned int>(SensorFlagShift::DIRECT_REPORT);
750   return r >= static_cast<unsigned int>(rate);
751 }
752
753 bool SensorsHidlTest::isDirectChannelTypeSupported(SensorInfo sensor, SharedMemType type) {
754   switch (type) {
755     case SharedMemType::ASHMEM:
756       return (sensor.flags & SensorFlagBits::DIRECT_CHANNEL_ASHMEM) != 0;
757     case SharedMemType::GRALLOC:
758       return (sensor.flags & SensorFlagBits::DIRECT_CHANNEL_GRALLOC) != 0;
759     default:
760       return false;
761   }
762 }
763
764 SensorInfo SensorsHidlTest::defaultSensorByType(SensorType type) {
765   SensorInfo ret;
766
767   ret.type = (SensorType) -1;
768   S()->getSensorsList(
769       [&] (const auto &list) {
770         const size_t count = list.size();
771         for (size_t i = 0; i < count; ++i) {
772           if (list[i].type == type) {
773             ret = list[i];
774             return;
775           }
776         }
777       });
778
779   return ret;
780 }
781
782 std::vector<SensorInfo> SensorsHidlTest::getSensorsList() {
783   std::vector<SensorInfo> ret;
784
785   S()->getSensorsList(
786       [&] (const auto &list) {
787         const size_t count = list.size();
788         ret.reserve(list.size());
789         for (size_t i = 0; i < count; ++i) {
790           ret.push_back(list[i]);
791         }
792       });
793
794   return ret;
795 }
796
797 // Test if sensor list returned is valid
798 TEST_F(SensorsHidlTest, SensorListValid) {
799   S()->getSensorsList(
800       [&] (const auto &list) {
801         const size_t count = list.size();
802         for (size_t i = 0; i < count; ++i) {
803           const auto &s = list[i];
804           SCOPED_TRACE(::testing::Message() << i << "/" << count << ": "
805                        << " handle=0x" << std::hex << std::setw(8) << std::setfill('0')
806                        << s.sensorHandle << std::dec
807                        << " type=" << static_cast<int>(s.type)
808                        << " name=" << s.name);
809
810           // Test non-empty type string
811           EXPECT_FALSE(s.typeAsString.empty());
812
813           // Test defined type matches defined string type
814           EXPECT_NO_FATAL_FAILURE(assertTypeMatchStringType(s.type, s.typeAsString));
815
816           // Test if all sensor has name and vendor
817           EXPECT_FALSE(s.name.empty());
818           EXPECT_FALSE(s.vendor.empty());
819
820           // Test power > 0, maxRange > 0
821           EXPECT_LE(0, s.power);
822           EXPECT_LT(0, s.maxRange);
823
824           // Info type, should have no sensor
825           EXPECT_FALSE(
826               s.type == SensorType::ADDITIONAL_INFO
827               || s.type == SensorType::META_DATA);
828
829           // Test fifoMax >= fifoReserved
830           EXPECT_GE(s.fifoMaxEventCount, s.fifoReservedEventCount)
831               << "max=" << s.fifoMaxEventCount << " reserved=" << s.fifoReservedEventCount;
832
833           // Test Reporting mode valid
834           EXPECT_NO_FATAL_FAILURE(assertTypeMatchReportMode(s.type, extractReportMode(s.flags)));
835
836           // Test min max are in the right order
837           EXPECT_LE(s.minDelay, s.maxDelay);
838           // Test min/max delay matches reporting mode
839           EXPECT_NO_FATAL_FAILURE(
840               assertDelayMatchReportMode(s.minDelay, s.maxDelay, extractReportMode(s.flags)));
841         }
842       });
843 }
844
845 // Test if sensor list returned is valid
846 TEST_F(SensorsHidlTest, SetOperationMode) {
847     std::vector<SensorInfo> sensorList = getSensorsList();
848
849     bool needOperationModeSupport =
850         std::any_of(sensorList.begin(), sensorList.end(),
851                     [] (const auto& s) {
852                       return (s.flags & SensorFlagBits::DATA_INJECTION) != 0;
853                     });
854     if (!needOperationModeSupport) {
855       return;
856     }
857
858     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
859     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::DATA_INJECTION));
860     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
861 }
862
863 // Test if sensor list returned is valid
864 TEST_F(SensorsHidlTest, InjectSensorEventData) {
865     std::vector<SensorInfo> sensorList = getSensorsList();
866     std::vector<SensorInfo> sensorSupportInjection;
867
868     bool needOperationModeSupport =
869         std::any_of(sensorList.begin(), sensorList.end(),
870                     [&sensorSupportInjection] (const auto& s) {
871                       bool ret = (s.flags & SensorFlagBits::DATA_INJECTION) != 0;
872                       if (ret) {
873                         sensorSupportInjection.push_back(s);
874                       }
875                       return ret;
876                     });
877     if (!needOperationModeSupport) {
878       return;
879     }
880
881     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
882     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::DATA_INJECTION));
883
884     for (const auto &s : sensorSupportInjection) {
885       switch (s.type) {
886         case SensorType::ACCELEROMETER:
887         case SensorType::GYROSCOPE:
888         case SensorType::MAGNETIC_FIELD: {
889           usleep(100000); // sleep 100ms
890
891           Event dummy;
892           dummy.timestamp = android::elapsedRealtimeNano();
893           dummy.sensorType = s.type;
894           dummy.sensorHandle = s.sensorHandle;
895           Vec3 v = {1, 2, 3, SensorStatus::ACCURACY_HIGH};
896           dummy.u.vec3 = v;
897
898           EXPECT_EQ(Result::OK, S()->injectSensorData(dummy));
899           break;
900         }
901         default:
902           break;
903       }
904     }
905     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
906 }
907
908 void SensorsHidlTest::testStreamingOperation(SensorType type,
909                                              std::chrono::nanoseconds samplingPeriod,
910                                              std::chrono::seconds duration,
911                                              const SensorEventsChecker &checker) {
912   std::vector<Event> events;
913
914   const int64_t samplingPeriodInNs = samplingPeriod.count();
915   const int64_t batchingPeriodInNs = 0; // no batching
916   const useconds_t minTimeUs = std::chrono::microseconds(duration).count();
917   const size_t minNEvent = duration / samplingPeriod;
918
919   SensorInfo sensor = defaultSensorByType(type);
920
921   if (!isValidType(sensor.type)) {
922     // no default sensor of this type
923     return;
924   }
925
926   if (std::chrono::microseconds(sensor.minDelay) > samplingPeriod) {
927     // rate not supported
928     return;
929   }
930
931   int32_t handle = sensor.sensorHandle;
932
933   ASSERT_EQ(batch(handle, samplingPeriodInNs, batchingPeriodInNs), Result::OK);
934   ASSERT_EQ(activate(handle, 1), Result::OK);
935   events = collectEvents(minTimeUs, minNEvent, true /*clearBeforeStart*/);
936   ASSERT_EQ(activate(handle, 0), Result::OK);
937
938   ALOGI("Collected %zu samples", events.size());
939
940   ASSERT_GT(events.size(), 0u);
941
942   size_t nRealEvent = 0;
943   bool handleMismatchReported = false;
944   bool metaSensorTypeErrorReported = false;
945   for (auto & e : events) {
946     if (e.sensorType == type) {
947       // avoid generating hundreds of error
948       if (!handleMismatchReported) {
949         EXPECT_EQ(e.sensorHandle, handle)
950             << (handleMismatchReported = true,
951                 "Event of the same type must come from the sensor registered");
952       }
953       ++ nRealEvent;
954     } else {
955       // avoid generating hundreds of error
956       if (!metaSensorTypeErrorReported) {
957         EXPECT_TRUE(isMetaSensorType(e.sensorType))
958             << (metaSensorTypeErrorReported = true,
959                 "Only meta types are allowed besides the type registered");
960       }
961     }
962   }
963
964   std::string s;
965   EXPECT_TRUE(checker.check(events, &s)) << s;
966
967   EXPECT_GE(nRealEvent, minNEvent / 2); // make sure returned events are not all meta
968 }
969
970 // Test if sensor hal can do UI speed accelerometer streaming properly
971 TEST_F(SensorsHidlTest, AccelerometerStreamingOperationSlow) {
972   testStreamingOperation(SensorType::ACCELEROMETER,
973                          std::chrono::milliseconds(200),
974                          std::chrono::seconds(5),
975                          sAccelNormChecker);
976 }
977
978 // Test if sensor hal can do normal speed accelerometer streaming properly
979 TEST_F(SensorsHidlTest, AccelerometerStreamingOperationNormal) {
980   testStreamingOperation(SensorType::ACCELEROMETER,
981                          std::chrono::milliseconds(20),
982                          std::chrono::seconds(5),
983                          sAccelNormChecker);
984 }
985
986 // Test if sensor hal can do game speed accelerometer streaming properly
987 TEST_F(SensorsHidlTest, AccelerometerStreamingOperationFast) {
988   testStreamingOperation(SensorType::ACCELEROMETER,
989                          std::chrono::milliseconds(5),
990                          std::chrono::seconds(5),
991                          sAccelNormChecker);
992 }
993
994 // Test if sensor hal can do UI speed gyroscope streaming properly
995 TEST_F(SensorsHidlTest, GyroscopeStreamingOperationSlow) {
996   testStreamingOperation(SensorType::GYROSCOPE,
997                          std::chrono::milliseconds(200),
998                          std::chrono::seconds(5),
999                          sGyroNormChecker);
1000 }
1001
1002 // Test if sensor hal can do normal speed gyroscope streaming properly
1003 TEST_F(SensorsHidlTest, GyroscopeStreamingOperationNormal) {
1004   testStreamingOperation(SensorType::GYROSCOPE,
1005                          std::chrono::milliseconds(20),
1006                          std::chrono::seconds(5),
1007                          sGyroNormChecker);
1008 }
1009
1010 // Test if sensor hal can do game speed gyroscope streaming properly
1011 TEST_F(SensorsHidlTest, GyroscopeStreamingOperationFast) {
1012   testStreamingOperation(SensorType::GYROSCOPE,
1013                          std::chrono::milliseconds(5),
1014                          std::chrono::seconds(5),
1015                          sGyroNormChecker);
1016 }
1017
1018 // Test if sensor hal can do UI speed magnetometer streaming properly
1019 TEST_F(SensorsHidlTest, MagnetometerStreamingOperationSlow) {
1020   testStreamingOperation(SensorType::MAGNETIC_FIELD,
1021                          std::chrono::milliseconds(200),
1022                          std::chrono::seconds(5),
1023                          NullChecker());
1024 }
1025
1026 // Test if sensor hal can do normal speed magnetometer streaming properly
1027 TEST_F(SensorsHidlTest, MagnetometerStreamingOperationNormal) {
1028   testStreamingOperation(SensorType::MAGNETIC_FIELD,
1029                          std::chrono::milliseconds(20),
1030                          std::chrono::seconds(5),
1031                          NullChecker());
1032 }
1033
1034 // Test if sensor hal can do game speed magnetometer streaming properly
1035 TEST_F(SensorsHidlTest, MagnetometerStreamingOperationFast) {
1036   testStreamingOperation(SensorType::MAGNETIC_FIELD,
1037                          std::chrono::milliseconds(5),
1038                          std::chrono::seconds(5),
1039                          NullChecker());
1040 }
1041
1042 void SensorsHidlTest::testSamplingRateHotSwitchOperation(SensorType type) {
1043   std::vector<Event> events1, events2;
1044
1045   constexpr int64_t batchingPeriodInNs = 0; // no batching
1046   constexpr size_t minNEvent = 50;
1047
1048   SensorInfo sensor = defaultSensorByType(type);
1049
1050   if (!isValidType(sensor.type)) {
1051     // no default sensor of this type
1052     return;
1053   }
1054
1055   int32_t handle = sensor.sensorHandle;
1056   int64_t minSamplingPeriodInNs = sensor.minDelay * 1000ll;
1057   int64_t maxSamplingPeriodInNs = sensor.maxDelay * 1000ll;
1058
1059   if (minSamplingPeriodInNs == maxSamplingPeriodInNs) {
1060     // only support single rate
1061     return;
1062   }
1063
1064   ASSERT_EQ(batch(handle, minSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
1065   ASSERT_EQ(activate(handle, 1), Result::OK);
1066
1067   usleep(500000); // sleep 0.5 sec to wait for change rate to happen
1068   events1 = collectEvents(sensor.minDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
1069
1070   ASSERT_EQ(batch(handle, maxSamplingPeriodInNs, batchingPeriodInNs), Result::OK);
1071
1072   usleep(500000); // sleep 0.5 sec to wait for change rate to happen
1073   events2 = collectEvents(sensor.maxDelay * minNEvent, minNEvent, true /*clearBeforeStart*/);
1074
1075   ASSERT_EQ(activate(handle, 0), Result::OK);
1076
1077   ALOGI("Collected %zu fast samples and %zu slow samples", events1.size(), events2.size());
1078
1079   ASSERT_GT(events1.size(), 0u);
1080   ASSERT_GT(events2.size(), 0u);
1081
1082   int64_t minDelayAverageInterval, maxDelayAverageInterval;
1083
1084   size_t nEvent = 0;
1085   int64_t prevTimestamp = -1;
1086   int64_t timestampInterval = 0;
1087   for (auto & e : events1) {
1088     if (e.sensorType == type) {
1089       ASSERT_EQ(e.sensorHandle, handle);
1090       if (prevTimestamp > 0) {
1091         timestampInterval += e.timestamp - prevTimestamp;
1092       }
1093       prevTimestamp = e.timestamp;
1094       ++ nEvent;
1095     }
1096   }
1097   ASSERT_GT(nEvent, 2u);
1098   minDelayAverageInterval = timestampInterval / (nEvent - 1);
1099
1100   nEvent = 0;
1101   prevTimestamp = -1;
1102   timestampInterval = 0;
1103   for (auto & e : events2) {
1104     if (e.sensorType == type) {
1105       ASSERT_EQ(e.sensorHandle, handle);
1106       if (prevTimestamp > 0) {
1107         timestampInterval += e.timestamp - prevTimestamp;
1108       }
1109       prevTimestamp = e.timestamp;
1110       ++ nEvent;
1111     }
1112   }
1113   ASSERT_GT(nEvent, 2u);
1114   maxDelayAverageInterval = timestampInterval / (nEvent - 1);
1115
1116   // change of rate is significant.
1117   EXPECT_GT((maxDelayAverageInterval - minDelayAverageInterval), minDelayAverageInterval / 10);
1118
1119   // fastest rate sampling time is close to spec
1120   ALOGI("minDelayAverageInterval = %" PRId64, minDelayAverageInterval);
1121   EXPECT_LT(std::abs(minDelayAverageInterval - minSamplingPeriodInNs),
1122       minSamplingPeriodInNs / 10);
1123 }
1124
1125 // Test if sensor hal can do accelerometer sampling rate switch properly when sensor is active
1126 TEST_F(SensorsHidlTest, AccelerometerSamplingPeriodHotSwitchOperation) {
1127   testSamplingRateHotSwitchOperation(SensorType::ACCELEROMETER);
1128 }
1129
1130 // Test if sensor hal can do gyroscope sampling rate switch properly when sensor is active
1131 TEST_F(SensorsHidlTest, GyroscopeSamplingPeriodHotSwitchOperation) {
1132   testSamplingRateHotSwitchOperation(SensorType::GYROSCOPE);
1133 }
1134
1135 // Test if sensor hal can do magnetometer sampling rate switch properly when sensor is active
1136 TEST_F(SensorsHidlTest, MagnetometerSamplingPeriodHotSwitchOperation) {
1137   testSamplingRateHotSwitchOperation(SensorType::MAGNETIC_FIELD);
1138 }
1139
1140 void SensorsHidlTest::testBatchingOperation(SensorType type) {
1141   std::vector<Event> events;
1142
1143   constexpr int64_t maxBatchingTestTimeNs = 30ull * 1000 * 1000 * 1000;
1144   constexpr int64_t oneSecondInNs = 1ull * 1000 * 1000 * 1000;
1145
1146   SensorInfo sensor = defaultSensorByType(type);
1147
1148   if (!isValidType(sensor.type)) {
1149     // no default sensor of this type
1150     return;
1151   }
1152
1153   int32_t handle = sensor.sensorHandle;
1154   int64_t minSamplingPeriodInNs = sensor.minDelay * 1000ll;
1155   uint32_t minFifoCount = sensor.fifoReservedEventCount;
1156   int64_t batchingPeriodInNs = minFifoCount * minSamplingPeriodInNs;
1157
1158   if (batchingPeriodInNs < oneSecondInNs) {
1159     // batching size too small to test reliably
1160     return;
1161   }
1162
1163   batchingPeriodInNs = std::min(batchingPeriodInNs, maxBatchingTestTimeNs);
1164
1165   ALOGI("Test batching for %d ms", (int)(batchingPeriodInNs / 1000 / 1000));
1166
1167   int64_t allowedBatchDeliverTimeNs =
1168       std::max(oneSecondInNs, batchingPeriodInNs / 10);
1169
1170   ASSERT_EQ(batch(handle, minSamplingPeriodInNs, INT64_MAX), Result::OK);
1171   ASSERT_EQ(activate(handle, 1), Result::OK);
1172
1173   usleep(500000); // sleep 0.5 sec to wait for initialization
1174   ASSERT_EQ(flush(handle), Result::OK);
1175
1176   // wait for 80% of the reserved batching period
1177   // there should not be any significant amount of events
1178   // since collection is not enabled all events will go down the drain
1179   usleep(batchingPeriodInNs / 1000 * 8 / 10);
1180
1181   SensorsHidlEnvironment::Instance()->setCollection(true);
1182   // 0.8 + 0.3 times the batching period
1183   // plus some time for the event to deliver
1184   events = collectEvents(
1185       batchingPeriodInNs / 1000 * 3 / 10,
1186         minFifoCount, true /*clearBeforeStart*/, false /*change collection*/);
1187
1188   ASSERT_EQ(flush(handle), Result::OK);
1189
1190   events = collectEvents(allowedBatchDeliverTimeNs / 1000,
1191         minFifoCount, true /*clearBeforeStart*/, false /*change collection*/);
1192
1193   SensorsHidlEnvironment::Instance()->setCollection(false);
1194   ASSERT_EQ(activate(handle, 0), Result::OK);
1195
1196   size_t nEvent = 0;
1197   for (auto & e : events) {
1198     if (e.sensorType == type && e.sensorHandle == handle) {
1199       ++ nEvent;
1200     }
1201   }
1202
1203   // at least reach 90% of advertised capacity
1204   ASSERT_GT(nEvent, (size_t)(batchingPeriodInNs / minSamplingPeriodInNs * 9 / 10));
1205 }
1206
1207 // Test if sensor hal can do accelerometer batching properly
1208 TEST_F(SensorsHidlTest, AccelerometerBatchingOperation) {
1209   testBatchingOperation(SensorType::ACCELEROMETER);
1210 }
1211
1212 // Test if sensor hal can do gyroscope batching properly
1213 TEST_F(SensorsHidlTest, GyroscopeBatchingOperation) {
1214   testBatchingOperation(SensorType::GYROSCOPE);
1215 }
1216
1217 // Test if sensor hal can do magnetometer batching properly
1218 TEST_F(SensorsHidlTest, MagnetometerBatchingOperation) {
1219   testBatchingOperation(SensorType::MAGNETIC_FIELD);
1220 }
1221
1222 void SensorsHidlTest::testDirectReportOperation(
1223     SensorType type, SharedMemType memType, RateLevel rate, const SensorEventsChecker &checker) {
1224   constexpr size_t kEventSize = static_cast<size_t>(SensorsEventFormatOffset::TOTAL_LENGTH);
1225   constexpr size_t kNEvent = 500;
1226   constexpr size_t kMemSize = kEventSize * kNEvent;
1227
1228   constexpr float kNormalNominal = 50;
1229   constexpr float kFastNominal = 200;
1230   constexpr float kVeryFastNominal = 800;
1231
1232   constexpr float kNominalTestTimeSec = 1.f;
1233   constexpr float kMaxTestTimeSec = kNominalTestTimeSec + 0.5f; // 0.5 second for initialization
1234
1235   SensorInfo sensor = defaultSensorByType(type);
1236
1237   if (!isDirectReportRateSupported(sensor, rate)) {
1238     return;
1239   }
1240
1241   if (!isDirectChannelTypeSupported(sensor, memType)) {
1242     return;
1243   }
1244
1245   std::unique_ptr<SensorsTestSharedMemory>
1246       mem(SensorsTestSharedMemory::create(memType, kMemSize));
1247   ASSERT_NE(mem, nullptr);
1248
1249   char* buffer = mem->getBuffer();
1250   // fill memory with data
1251   for (size_t i = 0; i < kMemSize; ++i) {
1252     buffer[i] = '\xcc';
1253   }
1254
1255   int32_t channelHandle;
1256   registerDirectChannel(mem->getSharedMemInfo(),
1257       [&channelHandle] (auto result, auto channelHandle_) {
1258           ASSERT_EQ(result, Result::OK);
1259           channelHandle = channelHandle_;
1260       });
1261
1262   // check memory is zeroed
1263   for (size_t i = 0; i < kMemSize; ++i) {
1264     ASSERT_EQ(buffer[i], '\0');
1265   }
1266
1267   int32_t eventToken;
1268   configDirectReport(sensor.sensorHandle, channelHandle, rate,
1269       [&eventToken] (auto result, auto token) {
1270           ASSERT_EQ(result, Result::OK);
1271           eventToken = token;
1272       });
1273
1274   usleep(static_cast<useconds_t>(kMaxTestTimeSec * 1e6f));
1275   auto events = mem->parseEvents();
1276
1277   // find norminal rate
1278   float nominalFreq = 0.f;
1279   switch (rate) {
1280       case RateLevel::NORMAL:
1281           nominalFreq = kNormalNominal;
1282           break;
1283       case RateLevel::FAST:
1284           nominalFreq = kFastNominal;
1285           break;
1286       case RateLevel::VERY_FAST:
1287           nominalFreq = kVeryFastNominal;
1288           break;
1289       case RateLevel::STOP:
1290           FAIL();
1291   }
1292
1293   // allowed to be between 55% and 220% of nominal freq
1294   ASSERT_GT(events.size(), static_cast<size_t>(nominalFreq * 0.55f * kNominalTestTimeSec));
1295   ASSERT_LT(events.size(), static_cast<size_t>(nominalFreq * 2.2f * kMaxTestTimeSec));
1296
1297   int64_t lastTimestamp = 0;
1298   bool typeErrorReported = false;
1299   bool tokenErrorReported = false;
1300   bool timestampErrorReported = false;
1301   for (auto &e : events) {
1302     if (!typeErrorReported) {
1303       EXPECT_EQ(type, e.sensorType)
1304           << (typeErrorReported = true, "Type in event does not match type of sensor registered.");
1305     }
1306     if (!tokenErrorReported) {
1307       EXPECT_EQ(eventToken, e.sensorHandle)
1308           << (tokenErrorReported = true,
1309             "Event token does not match that retured from configDirectReport");
1310     }
1311     if (!timestampErrorReported) {
1312       EXPECT_GT(e.timestamp, lastTimestamp)
1313           << (timestampErrorReported = true, "Timestamp not monotonically increasing");
1314     }
1315     lastTimestamp = e.timestamp;
1316   }
1317
1318   std::string s;
1319   EXPECT_TRUE(checker.check(events, &s)) << s;
1320
1321   // stop sensor and unregister channel
1322   configDirectReport(sensor.sensorHandle, channelHandle, RateLevel::STOP,
1323         [&eventToken] (auto result, auto) {
1324             EXPECT_EQ(result, Result::OK);
1325         });
1326   EXPECT_EQ(unregisterDirectChannel(channelHandle), Result::OK);
1327 }
1328
1329 // Test sensor event direct report with ashmem for accel sensor at normal rate
1330 TEST_F(SensorsHidlTest, AccelerometerAshmemDirectReportOperationNormal) {
1331   testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::NORMAL,
1332                             sAccelNormChecker);
1333 }
1334
1335 // Test sensor event direct report with ashmem for accel sensor at fast rate
1336 TEST_F(SensorsHidlTest, AccelerometerAshmemDirectReportOperationFast) {
1337   testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::FAST,
1338                             sAccelNormChecker);
1339 }
1340
1341 // Test sensor event direct report with ashmem for accel sensor at very fast rate
1342 TEST_F(SensorsHidlTest, AccelerometerAshmemDirectReportOperationVeryFast) {
1343   testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::VERY_FAST,
1344                             sAccelNormChecker);
1345 }
1346
1347 // Test sensor event direct report with ashmem for gyro sensor at normal rate
1348 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReportOperationNormal) {
1349   testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::NORMAL,
1350                             sGyroNormChecker);
1351 }
1352
1353 // Test sensor event direct report with ashmem for gyro sensor at fast rate
1354 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReportOperationFast) {
1355   testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::FAST,
1356                             sGyroNormChecker);
1357 }
1358
1359 // Test sensor event direct report with ashmem for gyro sensor at very fast rate
1360 TEST_F(SensorsHidlTest, GyroscopeAshmemDirectReportOperationVeryFast) {
1361   testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::VERY_FAST,
1362                             sGyroNormChecker);
1363 }
1364
1365 // Test sensor event direct report with ashmem for mag sensor at normal rate
1366 TEST_F(SensorsHidlTest, MagnetometerAshmemDirectReportOperationNormal) {
1367   testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::NORMAL,
1368                             NullChecker());
1369 }
1370
1371 // Test sensor event direct report with ashmem for mag sensor at fast rate
1372 TEST_F(SensorsHidlTest, MagnetometerAshmemDirectReportOperationFast) {
1373   testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::FAST,
1374                             NullChecker());
1375 }
1376
1377 // Test sensor event direct report with ashmem for mag sensor at very fast rate
1378 TEST_F(SensorsHidlTest, MagnetometerAshmemDirectReportOperationVeryFast) {
1379   testDirectReportOperation(
1380       SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::VERY_FAST, NullChecker());
1381 }
1382
1383 int main(int argc, char **argv) {
1384   ::testing::AddGlobalTestEnvironment(SensorsHidlEnvironment::Instance());
1385   ::testing::InitGoogleTest(&argc, argv);
1386   int status = RUN_ALL_TESTS();
1387   ALOGI("Test result = %d", status);
1388   return status;
1389 }
1390 // vim: set ts=2 sw=2