• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "SensorsHidlEnvironmentV1_0.h"
18 #include "sensors-vts-utils/SensorsHidlTestBase.h"
19 
20 #include <android/hardware/sensors/1.0/ISensors.h>
21 #include <android/hardware/sensors/1.0/types.h>
22 #include <hidl/GtestPrinter.h>
23 #include <hidl/ServiceManagement.h>
24 #include <log/log.h>
25 #include <utils/SystemClock.h>
26 
27 #include <cinttypes>
28 #include <vector>
29 
30 using ::android::hardware::Return;
31 using ::android::hardware::Void;
32 using ::android::sp;
33 using namespace ::android::hardware::sensors::V1_0;
34 
35 // The main test class for SENSORS HIDL HAL.
36 class SensorsHidlTest : public SensorsHidlTestBase<SensorType, Event, SensorInfo> {
37   public:
SetUp()38     virtual void SetUp() override {
39         mEnvironment = new SensorsHidlEnvironmentV1_0(GetParam());
40         mEnvironment->HidlSetUp();
41         // Ensure that we have a valid environment before performing tests
42         ASSERT_NE(S(), nullptr);
43     }
44 
TearDown()45     virtual void TearDown() override { mEnvironment->HidlTearDown(); }
46 
47   protected:
48     SensorInfo defaultSensorByType(SensorType type) override;
49     std::vector<SensorInfo> getSensorsList();
50     // implementation wrapper
getSensorsList(ISensors::getSensorsList_cb _hidl_cb)51     Return<void> getSensorsList(ISensors::getSensorsList_cb _hidl_cb) override {
52         return S()->getSensorsList(_hidl_cb);
53     }
54 
55     Return<Result> activate(int32_t sensorHandle, bool enabled) override;
56 
batch(int32_t sensorHandle,int64_t samplingPeriodNs,int64_t maxReportLatencyNs)57     Return<Result> batch(int32_t sensorHandle, int64_t samplingPeriodNs,
58                          int64_t maxReportLatencyNs) override {
59         return S()->batch(sensorHandle, samplingPeriodNs, maxReportLatencyNs);
60     }
61 
flush(int32_t sensorHandle)62     Return<Result> flush(int32_t sensorHandle) override { return S()->flush(sensorHandle); }
63 
injectSensorData(const Event & event)64     Return<Result> injectSensorData(const Event& event) override {
65         return S()->injectSensorData(event);
66     }
67 
68     Return<void> registerDirectChannel(const SharedMemInfo& mem,
69                                        ISensors::registerDirectChannel_cb _hidl_cb) override;
70 
unregisterDirectChannel(int32_t channelHandle)71     Return<Result> unregisterDirectChannel(int32_t channelHandle) override {
72         return S()->unregisterDirectChannel(channelHandle);
73     }
74 
configDirectReport(int32_t sensorHandle,int32_t channelHandle,RateLevel rate,ISensors::configDirectReport_cb _hidl_cb)75     Return<void> configDirectReport(int32_t sensorHandle, int32_t channelHandle, RateLevel rate,
76                                     ISensors::configDirectReport_cb _hidl_cb) override {
77         return S()->configDirectReport(sensorHandle, channelHandle, rate, _hidl_cb);
78     }
79 
S()80     inline sp<ISensors>& S() { return mEnvironment->sensors; }
81 
getEnvironment()82     SensorsHidlEnvironmentBase<Event>* getEnvironment() override { return mEnvironment; }
83 
84   private:
85     // Test environment for sensors HAL.
86     SensorsHidlEnvironmentV1_0* mEnvironment;
87 };
88 
activate(int32_t sensorHandle,bool enabled)89 Return<Result> SensorsHidlTest::activate(int32_t sensorHandle, bool enabled) {
90   // If activating a sensor, add the handle in a set so that when test fails it can be turned off.
91   // The handle is not removed when it is deactivating on purpose so that it is not necessary to
92   // check the return value of deactivation. Deactivating a sensor more than once does not have
93   // negative effect.
94   if (enabled) {
95     mSensorHandles.insert(sensorHandle);
96   }
97   return S()->activate(sensorHandle, enabled);
98 }
99 
registerDirectChannel(const SharedMemInfo & mem,ISensors::registerDirectChannel_cb cb)100 Return<void> SensorsHidlTest::registerDirectChannel(
101     const SharedMemInfo& mem, ISensors::registerDirectChannel_cb cb) {
102   // If registeration of a channel succeeds, add the handle of channel to a set so that it can be
103   // unregistered when test fails. Unregister a channel does not remove the handle on purpose.
104   // Unregistering a channel more than once should not have negative effect.
105   S()->registerDirectChannel(mem,
106       [&] (auto result, auto channelHandle) {
107         if (result == Result::OK) {
108           mDirectChannelHandles.insert(channelHandle);
109         }
110         cb(result, channelHandle);
111       });
112   return Void();
113 }
114 
defaultSensorByType(SensorType type)115 SensorInfo SensorsHidlTest::defaultSensorByType(SensorType type) {
116   SensorInfo ret;
117 
118   ret.type = (SensorType) -1;
119   S()->getSensorsList(
120       [&] (const auto &list) {
121         const size_t count = list.size();
122         for (size_t i = 0; i < count; ++i) {
123           if (list[i].type == type) {
124             ret = list[i];
125             return;
126           }
127         }
128       });
129 
130   return ret;
131 }
132 
getSensorsList()133 std::vector<SensorInfo> SensorsHidlTest::getSensorsList() {
134   std::vector<SensorInfo> ret;
135 
136   S()->getSensorsList(
137       [&] (const auto &list) {
138         const size_t count = list.size();
139         ret.reserve(list.size());
140         for (size_t i = 0; i < count; ++i) {
141           ret.push_back(list[i]);
142         }
143       });
144 
145   return ret;
146 }
147 
148 // Test if sensor list returned is valid
TEST_P(SensorsHidlTest,SensorListValid)149 TEST_P(SensorsHidlTest, SensorListValid) {
150     S()->getSensorsList([&](const auto& list) {
151         const size_t count = list.size();
152         for (size_t i = 0; i < count; ++i) {
153             const auto& s = list[i];
154             SCOPED_TRACE(::testing::Message()
155                          << i << "/" << count << ": "
156                          << " handle=0x" << std::hex << std::setw(8) << std::setfill('0')
157                          << s.sensorHandle << std::dec << " type=" << static_cast<int>(s.type)
158                          << " name=" << s.name);
159 
160             // Test non-empty type string
161             EXPECT_FALSE(s.typeAsString.empty());
162 
163             // Test defined type matches defined string type
164             EXPECT_NO_FATAL_FAILURE(assertTypeMatchStringType(s.type, s.typeAsString));
165 
166             // Test if all sensor has name and vendor
167             EXPECT_FALSE(s.name.empty());
168             EXPECT_FALSE(s.vendor.empty());
169 
170             // Test power > 0, maxRange > 0
171             EXPECT_LE(0, s.power);
172             EXPECT_LT(0, s.maxRange);
173 
174             // Info type, should have no sensor
175             EXPECT_FALSE(s.type == SensorType::ADDITIONAL_INFO || s.type == SensorType::META_DATA);
176 
177             // Test fifoMax >= fifoReserved
178             EXPECT_GE(s.fifoMaxEventCount, s.fifoReservedEventCount)
179                     << "max=" << s.fifoMaxEventCount << " reserved=" << s.fifoReservedEventCount;
180 
181             // Test Reporting mode valid
182             EXPECT_NO_FATAL_FAILURE(assertTypeMatchReportMode(s.type, extractReportMode(s.flags)));
183 
184             // Test min max are in the right order
185             EXPECT_LE(s.minDelay, s.maxDelay);
186             // Test min/max delay matches reporting mode
187             EXPECT_NO_FATAL_FAILURE(
188                     assertDelayMatchReportMode(s.minDelay, s.maxDelay, extractReportMode(s.flags)));
189         }
190     });
191 }
192 
193 // Test if sensor list returned is valid
TEST_P(SensorsHidlTest,SetOperationMode)194 TEST_P(SensorsHidlTest, SetOperationMode) {
195     std::vector<SensorInfo> sensorList = getSensorsList();
196 
197     bool needOperationModeSupport =
198         std::any_of(sensorList.begin(), sensorList.end(),
199                     [] (const auto& s) {
200                       return (s.flags & SensorFlagBits::DATA_INJECTION) != 0;
201                     });
202     if (!needOperationModeSupport) {
203       return;
204     }
205 
206     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
207     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::DATA_INJECTION));
208     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
209 }
210 
211 // Test if sensor list returned is valid
TEST_P(SensorsHidlTest,InjectSensorEventData)212 TEST_P(SensorsHidlTest, InjectSensorEventData) {
213     std::vector<SensorInfo> sensorList = getSensorsList();
214     std::vector<SensorInfo> sensorSupportInjection;
215 
216     bool needOperationModeSupport =
217         std::any_of(sensorList.begin(), sensorList.end(),
218                     [&sensorSupportInjection] (const auto& s) {
219                       bool ret = (s.flags & SensorFlagBits::DATA_INJECTION) != 0;
220                       if (ret) {
221                         sensorSupportInjection.push_back(s);
222                       }
223                       return ret;
224                     });
225     if (!needOperationModeSupport) {
226       return;
227     }
228 
229     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
230     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::DATA_INJECTION));
231 
232     for (const auto &s : sensorSupportInjection) {
233       switch (s.type) {
234         case SensorType::ACCELEROMETER:
235         case SensorType::GYROSCOPE:
236         case SensorType::MAGNETIC_FIELD: {
237           usleep(100000); // sleep 100ms
238 
239           Event dummy;
240           dummy.timestamp = android::elapsedRealtimeNano();
241           dummy.sensorType = s.type;
242           dummy.sensorHandle = s.sensorHandle;
243           Vec3 v = {1, 2, 3, SensorStatus::ACCURACY_HIGH};
244           dummy.u.vec3 = v;
245 
246           EXPECT_EQ(Result::OK, S()->injectSensorData(dummy));
247           break;
248         }
249         default:
250           break;
251       }
252     }
253     ASSERT_EQ(Result::OK, S()->setOperationMode(OperationMode::NORMAL));
254 }
255 
256 // Test if sensor hal can do UI speed accelerometer streaming properly
TEST_P(SensorsHidlTest,AccelerometerStreamingOperationSlow)257 TEST_P(SensorsHidlTest, AccelerometerStreamingOperationSlow) {
258     testStreamingOperation(SensorType::ACCELEROMETER, std::chrono::milliseconds(200),
259                            std::chrono::seconds(5), mAccelNormChecker);
260 }
261 
262 // Test if sensor hal can do normal speed accelerometer streaming properly
TEST_P(SensorsHidlTest,AccelerometerStreamingOperationNormal)263 TEST_P(SensorsHidlTest, AccelerometerStreamingOperationNormal) {
264     testStreamingOperation(SensorType::ACCELEROMETER, std::chrono::milliseconds(20),
265                            std::chrono::seconds(5), mAccelNormChecker);
266 }
267 
268 // Test if sensor hal can do game speed accelerometer streaming properly
TEST_P(SensorsHidlTest,AccelerometerStreamingOperationFast)269 TEST_P(SensorsHidlTest, AccelerometerStreamingOperationFast) {
270     testStreamingOperation(SensorType::ACCELEROMETER, std::chrono::milliseconds(5),
271                            std::chrono::seconds(5), mAccelNormChecker);
272 }
273 
274 // Test if sensor hal can do UI speed gyroscope streaming properly
TEST_P(SensorsHidlTest,GyroscopeStreamingOperationSlow)275 TEST_P(SensorsHidlTest, GyroscopeStreamingOperationSlow) {
276     testStreamingOperation(SensorType::GYROSCOPE, std::chrono::milliseconds(200),
277                            std::chrono::seconds(5), mGyroNormChecker);
278 }
279 
280 // Test if sensor hal can do normal speed gyroscope streaming properly
TEST_P(SensorsHidlTest,GyroscopeStreamingOperationNormal)281 TEST_P(SensorsHidlTest, GyroscopeStreamingOperationNormal) {
282     testStreamingOperation(SensorType::GYROSCOPE, std::chrono::milliseconds(20),
283                            std::chrono::seconds(5), mGyroNormChecker);
284 }
285 
286 // Test if sensor hal can do game speed gyroscope streaming properly
TEST_P(SensorsHidlTest,GyroscopeStreamingOperationFast)287 TEST_P(SensorsHidlTest, GyroscopeStreamingOperationFast) {
288     testStreamingOperation(SensorType::GYROSCOPE, std::chrono::milliseconds(5),
289                            std::chrono::seconds(5), mGyroNormChecker);
290 }
291 
292 // Test if sensor hal can do UI speed magnetometer streaming properly
TEST_P(SensorsHidlTest,MagnetometerStreamingOperationSlow)293 TEST_P(SensorsHidlTest, MagnetometerStreamingOperationSlow) {
294     testStreamingOperation(SensorType::MAGNETIC_FIELD, std::chrono::milliseconds(200),
295                            std::chrono::seconds(5), NullChecker<Event>());
296 }
297 
298 // Test if sensor hal can do normal speed magnetometer streaming properly
TEST_P(SensorsHidlTest,MagnetometerStreamingOperationNormal)299 TEST_P(SensorsHidlTest, MagnetometerStreamingOperationNormal) {
300     testStreamingOperation(SensorType::MAGNETIC_FIELD, std::chrono::milliseconds(20),
301                            std::chrono::seconds(5), NullChecker<Event>());
302 }
303 
304 // Test if sensor hal can do game speed magnetometer streaming properly
TEST_P(SensorsHidlTest,MagnetometerStreamingOperationFast)305 TEST_P(SensorsHidlTest, MagnetometerStreamingOperationFast) {
306     testStreamingOperation(SensorType::MAGNETIC_FIELD, std::chrono::milliseconds(5),
307                            std::chrono::seconds(5), NullChecker<Event>());
308 }
309 
310 // Test if sensor hal can do accelerometer sampling rate switch properly when sensor is active
TEST_P(SensorsHidlTest,AccelerometerSamplingPeriodHotSwitchOperation)311 TEST_P(SensorsHidlTest, AccelerometerSamplingPeriodHotSwitchOperation) {
312     testSamplingRateHotSwitchOperation(SensorType::ACCELEROMETER);
313     testSamplingRateHotSwitchOperation(SensorType::ACCELEROMETER, false /*fastToSlow*/);
314 }
315 
316 // Test if sensor hal can do gyroscope sampling rate switch properly when sensor is active
TEST_P(SensorsHidlTest,GyroscopeSamplingPeriodHotSwitchOperation)317 TEST_P(SensorsHidlTest, GyroscopeSamplingPeriodHotSwitchOperation) {
318     testSamplingRateHotSwitchOperation(SensorType::GYROSCOPE);
319     testSamplingRateHotSwitchOperation(SensorType::GYROSCOPE, false /*fastToSlow*/);
320 }
321 
322 // Test if sensor hal can do magnetometer sampling rate switch properly when sensor is active
TEST_P(SensorsHidlTest,MagnetometerSamplingPeriodHotSwitchOperation)323 TEST_P(SensorsHidlTest, MagnetometerSamplingPeriodHotSwitchOperation) {
324     testSamplingRateHotSwitchOperation(SensorType::MAGNETIC_FIELD);
325     testSamplingRateHotSwitchOperation(SensorType::MAGNETIC_FIELD, false /*fastToSlow*/);
326 }
327 
328 // Test if sensor hal can do accelerometer batching properly
TEST_P(SensorsHidlTest,AccelerometerBatchingOperation)329 TEST_P(SensorsHidlTest, AccelerometerBatchingOperation) {
330     testBatchingOperation(SensorType::ACCELEROMETER);
331 }
332 
333 // Test if sensor hal can do gyroscope batching properly
TEST_P(SensorsHidlTest,GyroscopeBatchingOperation)334 TEST_P(SensorsHidlTest, GyroscopeBatchingOperation) {
335     testBatchingOperation(SensorType::GYROSCOPE);
336 }
337 
338 // Test if sensor hal can do magnetometer batching properly
TEST_P(SensorsHidlTest,MagnetometerBatchingOperation)339 TEST_P(SensorsHidlTest, MagnetometerBatchingOperation) {
340     testBatchingOperation(SensorType::MAGNETIC_FIELD);
341 }
342 
343 // Test sensor event direct report with ashmem for accel sensor at normal rate
TEST_P(SensorsHidlTest,AccelerometerAshmemDirectReportOperationNormal)344 TEST_P(SensorsHidlTest, AccelerometerAshmemDirectReportOperationNormal) {
345     testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::NORMAL,
346                               mAccelNormChecker);
347 }
348 
349 // Test sensor event direct report with ashmem for accel sensor at fast rate
TEST_P(SensorsHidlTest,AccelerometerAshmemDirectReportOperationFast)350 TEST_P(SensorsHidlTest, AccelerometerAshmemDirectReportOperationFast) {
351     testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM, RateLevel::FAST,
352                               mAccelNormChecker);
353 }
354 
355 // Test sensor event direct report with ashmem for accel sensor at very fast rate
TEST_P(SensorsHidlTest,AccelerometerAshmemDirectReportOperationVeryFast)356 TEST_P(SensorsHidlTest, AccelerometerAshmemDirectReportOperationVeryFast) {
357     testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::ASHMEM,
358                               RateLevel::VERY_FAST, mAccelNormChecker);
359 }
360 
361 // Test sensor event direct report with ashmem for gyro sensor at normal rate
TEST_P(SensorsHidlTest,GyroscopeAshmemDirectReportOperationNormal)362 TEST_P(SensorsHidlTest, GyroscopeAshmemDirectReportOperationNormal) {
363     testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::NORMAL,
364                               mGyroNormChecker);
365 }
366 
367 // Test sensor event direct report with ashmem for gyro sensor at fast rate
TEST_P(SensorsHidlTest,GyroscopeAshmemDirectReportOperationFast)368 TEST_P(SensorsHidlTest, GyroscopeAshmemDirectReportOperationFast) {
369     testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::FAST,
370                               mGyroNormChecker);
371 }
372 
373 // Test sensor event direct report with ashmem for gyro sensor at very fast rate
TEST_P(SensorsHidlTest,GyroscopeAshmemDirectReportOperationVeryFast)374 TEST_P(SensorsHidlTest, GyroscopeAshmemDirectReportOperationVeryFast) {
375     testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::ASHMEM, RateLevel::VERY_FAST,
376                               mGyroNormChecker);
377 }
378 
379 // Test sensor event direct report with ashmem for mag sensor at normal rate
TEST_P(SensorsHidlTest,MagnetometerAshmemDirectReportOperationNormal)380 TEST_P(SensorsHidlTest, MagnetometerAshmemDirectReportOperationNormal) {
381     testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::NORMAL,
382                               NullChecker<Event>());
383 }
384 
385 // Test sensor event direct report with ashmem for mag sensor at fast rate
TEST_P(SensorsHidlTest,MagnetometerAshmemDirectReportOperationFast)386 TEST_P(SensorsHidlTest, MagnetometerAshmemDirectReportOperationFast) {
387     testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM, RateLevel::FAST,
388                               NullChecker<Event>());
389 }
390 
391 // Test sensor event direct report with ashmem for mag sensor at very fast rate
TEST_P(SensorsHidlTest,MagnetometerAshmemDirectReportOperationVeryFast)392 TEST_P(SensorsHidlTest, MagnetometerAshmemDirectReportOperationVeryFast) {
393     testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::ASHMEM,
394                               RateLevel::VERY_FAST, NullChecker<Event>());
395 }
396 
397 // Test sensor event direct report with gralloc for accel sensor at normal rate
TEST_P(SensorsHidlTest,AccelerometerGrallocDirectReportOperationNormal)398 TEST_P(SensorsHidlTest, AccelerometerGrallocDirectReportOperationNormal) {
399     testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::GRALLOC, RateLevel::NORMAL,
400                               mAccelNormChecker);
401 }
402 
403 // Test sensor event direct report with gralloc for accel sensor at fast rate
TEST_P(SensorsHidlTest,AccelerometerGrallocDirectReportOperationFast)404 TEST_P(SensorsHidlTest, AccelerometerGrallocDirectReportOperationFast) {
405     testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::GRALLOC, RateLevel::FAST,
406                               mAccelNormChecker);
407 }
408 
409 // Test sensor event direct report with gralloc for accel sensor at very fast rate
TEST_P(SensorsHidlTest,AccelerometerGrallocDirectReportOperationVeryFast)410 TEST_P(SensorsHidlTest, AccelerometerGrallocDirectReportOperationVeryFast) {
411     testDirectReportOperation(SensorType::ACCELEROMETER, SharedMemType::GRALLOC,
412                               RateLevel::VERY_FAST, mAccelNormChecker);
413 }
414 
415 // Test sensor event direct report with gralloc for gyro sensor at normal rate
TEST_P(SensorsHidlTest,GyroscopeGrallocDirectReportOperationNormal)416 TEST_P(SensorsHidlTest, GyroscopeGrallocDirectReportOperationNormal) {
417     testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::GRALLOC, RateLevel::NORMAL,
418                               mGyroNormChecker);
419 }
420 
421 // Test sensor event direct report with gralloc for gyro sensor at fast rate
TEST_P(SensorsHidlTest,GyroscopeGrallocDirectReportOperationFast)422 TEST_P(SensorsHidlTest, GyroscopeGrallocDirectReportOperationFast) {
423     testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::GRALLOC, RateLevel::FAST,
424                               mGyroNormChecker);
425 }
426 
427 // Test sensor event direct report with gralloc for gyro sensor at very fast rate
TEST_P(SensorsHidlTest,GyroscopeGrallocDirectReportOperationVeryFast)428 TEST_P(SensorsHidlTest, GyroscopeGrallocDirectReportOperationVeryFast) {
429     testDirectReportOperation(SensorType::GYROSCOPE, SharedMemType::GRALLOC, RateLevel::VERY_FAST,
430                               mGyroNormChecker);
431 }
432 
433 // Test sensor event direct report with gralloc for mag sensor at normal rate
TEST_P(SensorsHidlTest,MagnetometerGrallocDirectReportOperationNormal)434 TEST_P(SensorsHidlTest, MagnetometerGrallocDirectReportOperationNormal) {
435     testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::GRALLOC, RateLevel::NORMAL,
436                               NullChecker<Event>());
437 }
438 
439 // Test sensor event direct report with gralloc for mag sensor at fast rate
TEST_P(SensorsHidlTest,MagnetometerGrallocDirectReportOperationFast)440 TEST_P(SensorsHidlTest, MagnetometerGrallocDirectReportOperationFast) {
441     testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::GRALLOC, RateLevel::FAST,
442                               NullChecker<Event>());
443 }
444 
445 // Test sensor event direct report with gralloc for mag sensor at very fast rate
TEST_P(SensorsHidlTest,MagnetometerGrallocDirectReportOperationVeryFast)446 TEST_P(SensorsHidlTest, MagnetometerGrallocDirectReportOperationVeryFast) {
447     testDirectReportOperation(SensorType::MAGNETIC_FIELD, SharedMemType::GRALLOC,
448                               RateLevel::VERY_FAST, NullChecker<Event>());
449 }
450 
451 INSTANTIATE_TEST_SUITE_P(
452         PerInstance, SensorsHidlTest,
453         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ISensors::descriptor)),
454         android::hardware::PrintInstanceNameToString);
455 // vim: set ts=2 sw=2
456