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