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