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