blob: ea2f985766d39febc5d2b00efde93fdf9e126cac [file] [log] [blame]
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -08001/*
2 * Copyright (C) 2021 The Android Open Source Probject
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 "UsbAidlTest"
18#include <android-base/logging.h>
19
20#include <aidl/android/hardware/usb/IUsb.h>
21#include <aidl/android/hardware/usb/IUsbCallback.h>
22#include <aidl/android/hardware/usb/BnUsbCallback.h>
23#include <aidl/android/hardware/usb/PortDataRole.h>
24#include <aidl/android/hardware/usb/PortMode.h>
25#include <aidl/android/hardware/usb/PortPowerRole.h>
26#include <aidl/android/hardware/usb/PortRole.h>
27#include <aidl/android/hardware/usb/PortStatus.h>
28#include <aidl/android/hardware/usb/Status.h>
29#include <aidl/Vintf.h>
30#include <aidl/Gtest.h>
31
32#include <android/binder_auto_utils.h>
33#include <android/binder_manager.h>
34#include <android/binder_process.h>
35#include <gtest/gtest.h>
36
37#include <log/log.h>
38#include <stdlib.h>
39#include <chrono>
40#include <condition_variable>
41#include <mutex>
42
43#define TIMEOUT_PERIOD 10
44
45using ::aidl::android::hardware::usb::BnUsbCallback;
46using ::aidl::android::hardware::usb::IUsb;
47using ::aidl::android::hardware::usb::IUsbCallback;
48using ::aidl::android::hardware::usb::PortDataRole;
49using ::aidl::android::hardware::usb::PortMode;
50using ::aidl::android::hardware::usb::PortPowerRole;
51using ::aidl::android::hardware::usb::PortRole;
52using ::aidl::android::hardware::usb::PortStatus;
53using ::aidl::android::hardware::usb::Status;
54
55using ::ndk::ScopedAStatus;
56using ::ndk::SpAIBinder;
57using std::vector;
58using std::shared_ptr;
59using std::string;
60
61// The main test class for the USB aidl hal
62class UsbAidlTest : public testing::TestWithParam<std::string> {
63 public:
64 // Callback class for the USB aidl hal.
65 // Usb Hal will call this object upon role switch or port query.
66 class UsbCallback : public BnUsbCallback {
67 UsbAidlTest& parent_;
68 int cookie;
69
70 public:
71 UsbCallback(UsbAidlTest& parent, int cookie)
72 : parent_(parent), cookie(cookie){};
73
74 virtual ~UsbCallback() = default;
75
76 // Callback method for the port status.
77 ScopedAStatus notifyPortStatusChange(const vector<PortStatus>& currentPortStatus,
78 Status retval) override {
79 if (retval == Status::SUCCESS && currentPortStatus.size() > 0) {
80 parent_.usb_last_port_status.portName =
81 currentPortStatus[0].portName.c_str();
82 parent_.usb_last_port_status.currentDataRole =
83 currentPortStatus[0].currentDataRole;
84 parent_.usb_last_port_status.currentPowerRole =
85 currentPortStatus[0].currentPowerRole;
86 parent_.usb_last_port_status.currentMode =
87 currentPortStatus[0].currentMode;
88 }
89 parent_.usb_last_cookie = cookie;
90 return ScopedAStatus::ok();
91 }
92
93 // Callback method for the status of role switch operation.
94 ScopedAStatus notifyRoleSwitchStatus(const string& /*portName*/, const PortRole& newRole,
95 Status retval, int64_t transactionId) override {
96 parent_.usb_last_status = retval;
97 parent_.usb_last_cookie = cookie;
98 parent_.usb_last_port_role = newRole;
99 parent_.usb_role_switch_done = true;
100 parent_.last_transactionId = transactionId;
101 parent_.notify();
102 return ScopedAStatus::ok();
103 }
104
105 // Callback method for the status of enableUsbData operation
106 ScopedAStatus notifyEnableUsbDataStatus(const string& /*portName*/, bool /*enable*/,
107 Status /*retval*/, int64_t transactionId) override {
108 parent_.last_transactionId = transactionId;
109 parent_.usb_last_cookie = cookie;
110 parent_.enable_usb_data_done = true;
111 parent_.notify();
112 return ScopedAStatus::ok();
113 }
114
Badhri Jagan Sridharanf8832352022-01-23 09:17:04 -0800115 // Callback method for the status of enableUsbData operation
116 ScopedAStatus notifyEnableUsbDataWhileDockedStatus(const string& /*portName*/,
117 Status /*retval*/,
118 int64_t transactionId) override {
119 parent_.last_transactionId = transactionId;
120 parent_.usb_last_cookie = cookie;
121 parent_.enable_usb_data_while_docked_done = true;
122 parent_.notify();
123 return ScopedAStatus::ok();
124 }
125
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800126 // Callback method for the status of enableContaminantPresenceDetection
127 ScopedAStatus notifyContaminantEnabledStatus(const string& /*portName*/, bool /*enable*/,
128 Status /*retval*/, int64_t transactionId) override {
129 parent_.last_transactionId = transactionId;
130 parent_.usb_last_cookie = cookie;
131 parent_.enable_contaminant_done = true;
132 parent_.notify();
133 return ScopedAStatus::ok();
134 }
135
136 // Callback method for the status of queryPortStatus operation
137 ScopedAStatus notifyQueryPortStatus(const string& /*portName*/, Status /*retval*/,
138 int64_t transactionId) override {
139 parent_.last_transactionId = transactionId;
140 parent_.notify();
141 return ScopedAStatus::ok();
142 }
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800143
144 // Callback method for the status of limitPowerTransfer operation
145 ScopedAStatus notifyLimitPowerTransferStatus(const string& /*portName*/, bool /*limit*/,
146 Status /*retval*/, int64_t transactionId) override {
147 parent_.last_transactionId = transactionId;
148 parent_.usb_last_cookie = cookie;
149 parent_.limit_power_transfer_done = true;
150 parent_.notify();
151 return ScopedAStatus::ok();
152 }
Ricky Niua9040402022-01-05 20:03:09 +0800153
154 // Callback method for the status of resetUsbPortStatus operation
155 ScopedAStatus notifyResetUsbPortStatus(const string& /*portName*/, Status /*retval*/,
156 int64_t transactionId) override {
157 ALOGI("enter notifyResetUsbPortStatus");
158 parent_.last_transactionId = transactionId;
159 parent_.usb_last_cookie = cookie;
160 parent_.reset_usb_port_done = true;
161 parent_.notify();
162 return ScopedAStatus::ok();
163 }
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800164 };
165
166 virtual void SetUp() override {
167 ALOGI("Setup");
168 usb = IUsb::fromBinder(
169 SpAIBinder(AServiceManager_waitForService(GetParam().c_str())));
170 ASSERT_NE(usb, nullptr);
171
172 usb_cb_2 = ::ndk::SharedRefBase::make<UsbCallback>(*this, 2);
173 ASSERT_NE(usb_cb_2, nullptr);
174 const auto& ret = usb->setCallback(usb_cb_2);
175 ASSERT_TRUE(ret.isOk());
176 }
177
178 virtual void TearDown() override { ALOGI("Teardown"); }
179
180 // Used as a mechanism to inform the test about data/event callback.
181 inline void notify() {
182 std::unique_lock<std::mutex> lock(usb_mtx);
183 usb_count++;
184 usb_cv.notify_one();
185 }
186
187 // Test code calls this function to wait for data/event callback.
188 inline std::cv_status wait() {
189 std::unique_lock<std::mutex> lock(usb_mtx);
190
191 std::cv_status status = std::cv_status::no_timeout;
192 auto now = std::chrono::system_clock::now();
193 while (usb_count == 0) {
194 status =
195 usb_cv.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD));
196 if (status == std::cv_status::timeout) {
197 ALOGI("timeout");
198 return status;
199 }
200 }
201 usb_count--;
202 return status;
203 }
204
205 // USB aidl hal Proxy
206 shared_ptr<IUsb> usb;
207
208 // Callback objects for usb aidl
209 // Methods of these objects are called to notify port status updates.
210 shared_ptr<IUsbCallback> usb_cb_1, usb_cb_2;
211
212 // The last conveyed status of the USB ports.
213 // Stores information of currentt_data_role, power_role for all the USB ports
214 PortStatus usb_last_port_status;
215
216 // Status of the last role switch operation.
217 Status usb_last_status;
218
219 // Port role information of the last role switch operation.
220 PortRole usb_last_port_role;
221
222 // Flag to indicate the invocation of role switch callback.
223 bool usb_role_switch_done;
224
225 // Flag to indicate the invocation of notifyContaminantEnabledStatus callback.
226 bool enable_contaminant_done;
227
228 // Flag to indicate the invocation of notifyEnableUsbDataStatus callback.
229 bool enable_usb_data_done;
230
Badhri Jagan Sridharanf8832352022-01-23 09:17:04 -0800231 // Flag to indicate the invocation of notifyEnableUsbDataWhileDockedStatus callback.
232 bool enable_usb_data_while_docked_done;
233
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800234 // Flag to indicate the invocation of notifyLimitPowerTransferStatus callback.
235 bool limit_power_transfer_done;
236
Ricky Niua9040402022-01-05 20:03:09 +0800237 // Flag to indicate the invocation of notifyResetUsbPort callback.
238 bool reset_usb_port_done;
239
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800240 // Stores the cookie of the last invoked usb callback object.
241 int usb_last_cookie;
242
243 // Last transaction ID that was recorded.
244 int64_t last_transactionId;
245 // synchronization primitives to coordinate between main test thread
246 // and the callback thread.
247 std::mutex usb_mtx;
248 std::condition_variable usb_cv;
249 int usb_count = 0;
250};
251
252/*
253 * Test to see if setCallback succeeds.
254 * Callback object is created and registered.
255 */
256TEST_P(UsbAidlTest, setCallback) {
257 ALOGI("UsbAidlTest setCallback start");
258 usb_cb_1 = ::ndk::SharedRefBase::make<UsbCallback>(*this, 1);
259 ASSERT_NE(usb_cb_1, nullptr);
260 const auto& ret = usb->setCallback(usb_cb_1);
261 ASSERT_TRUE(ret.isOk());
262 ALOGI("UsbAidlTest setCallback end");
263}
264
265/*
266 * Check to see if querying type-c
267 * port status succeeds.
268 * The callback parameters are checked to see if the transaction id
269 * matches.
270 */
271TEST_P(UsbAidlTest, queryPortStatus) {
272 ALOGI("UsbAidlTest queryPortStatus start");
273 int64_t transactionId = rand() % 10000;
274 const auto& ret = usb->queryPortStatus(transactionId);
275 ASSERT_TRUE(ret.isOk());
276 EXPECT_EQ(std::cv_status::no_timeout, wait());
277 EXPECT_EQ(2, usb_last_cookie);
278 EXPECT_EQ(transactionId, last_transactionId);
279 ALOGI("UsbAidlTest queryPortStatus end: %s", usb_last_port_status.portName.c_str());
280}
281
282/*
283 * Trying to switch a non-existent port should fail.
284 * This test case tried to switch the port with empty
285 * name which is expected to fail.
286 * The callback parameters are checked to see if the transaction id
287 * matches.
288 */
289TEST_P(UsbAidlTest, switchEmptyPort) {
290 ALOGI("UsbAidlTest switchEmptyPort start");
291 PortRole role;
292 role.set<PortRole::powerRole>(PortPowerRole::SOURCE);
293 int64_t transactionId = rand() % 10000;
294 const auto& ret = usb->switchRole("", role, transactionId);
295 ASSERT_TRUE(ret.isOk());
296 EXPECT_EQ(std::cv_status::no_timeout, wait());
297 EXPECT_EQ(Status::ERROR, usb_last_status);
298 EXPECT_EQ(transactionId, last_transactionId);
299 EXPECT_EQ(2, usb_last_cookie);
300 ALOGI("UsbAidlTest switchEmptyPort end");
301}
302
303/*
304 * Test switching the power role of usb port.
305 * Test case queries the usb ports present in device.
306 * If there is at least one usb port, a power role switch
307 * to SOURCE is attempted for the port.
308 * The callback parameters are checked to see if the transaction id
309 * matches.
310 */
311TEST_P(UsbAidlTest, switchPowerRole) {
312 ALOGI("UsbAidlTest switchPowerRole start");
313 PortRole role;
314 role.set<PortRole::powerRole>(PortPowerRole::SOURCE);
315 int64_t transactionId = rand() % 10000;
316 const auto& ret = usb->queryPortStatus(transactionId);
317 ASSERT_TRUE(ret.isOk());
318 EXPECT_EQ(std::cv_status::no_timeout, wait());
319 EXPECT_EQ(2, usb_last_cookie);
320 EXPECT_EQ(transactionId, last_transactionId);
321
322 if (!usb_last_port_status.portName.empty()) {
323 string portBeingSwitched = usb_last_port_status.portName;
324 ALOGI("switchPower role portname:%s", portBeingSwitched.c_str());
325 usb_role_switch_done = false;
326 transactionId = rand() % 10000;
327 const auto& ret = usb->switchRole(portBeingSwitched, role, transactionId);
328 ASSERT_TRUE(ret.isOk());
329
330 std::cv_status waitStatus = wait();
331 while (waitStatus == std::cv_status::no_timeout &&
332 usb_role_switch_done == false)
333 waitStatus = wait();
334
335 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
336 EXPECT_EQ(2, usb_last_cookie);
337 EXPECT_EQ(transactionId, last_transactionId);
338 }
339 ALOGI("UsbAidlTest switchPowerRole end");
340}
341
342/*
343 * Test switching the data role of usb port.
344 * Test case queries the usb ports present in device.
345 * If there is at least one usb port, a data role switch
346 * to device is attempted for the port.
347 * The callback parameters are checked to see if transaction id
348 * matches.
349 */
350TEST_P(UsbAidlTest, switchDataRole) {
351 ALOGI("UsbAidlTest switchDataRole start");
352 PortRole role;
353 role.set<PortRole::dataRole>(PortDataRole::DEVICE);
354 int64_t transactionId = rand() % 10000;
355 const auto& ret = usb->queryPortStatus(transactionId);
356 ASSERT_TRUE(ret.isOk());
357 EXPECT_EQ(std::cv_status::no_timeout, wait());
358 EXPECT_EQ(2, usb_last_cookie);
359 EXPECT_EQ(transactionId, last_transactionId);
360
361 if (!usb_last_port_status.portName.empty()) {
362 string portBeingSwitched = usb_last_port_status.portName;
363 ALOGI("portname:%s", portBeingSwitched.c_str());
364 usb_role_switch_done = false;
365 transactionId = rand() % 10000;
366 const auto& ret = usb->switchRole(portBeingSwitched, role, transactionId);
367 ASSERT_TRUE(ret.isOk());
368
369 std::cv_status waitStatus = wait();
370 while (waitStatus == std::cv_status::no_timeout &&
371 usb_role_switch_done == false)
372 waitStatus = wait();
373
374 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
375 EXPECT_EQ(2, usb_last_cookie);
376 EXPECT_EQ(transactionId, last_transactionId);
377 }
378 ALOGI("UsbAidlTest switchDataRole end");
379}
380
381/*
382 * Test enabling contaminant presence detection of the port.
383 * Test case queries the usb ports present in device.
384 * If there is at least one usb port, enabling contaminant detection
385 * is attempted for the port.
386 * The callback parameters are checked to see if transaction id
387 * matches.
388 */
389TEST_P(UsbAidlTest, enableContaminantPresenceDetection) {
390 ALOGI("UsbAidlTest enableContaminantPresenceDetection start");
391 int64_t transactionId = rand() % 10000;
392 const auto& ret = usb->queryPortStatus(transactionId);
393 ASSERT_TRUE(ret.isOk());
394 EXPECT_EQ(std::cv_status::no_timeout, wait());
395 EXPECT_EQ(2, usb_last_cookie);
396 EXPECT_EQ(transactionId, last_transactionId);
397
398 if (!usb_last_port_status.portName.empty()) {
399 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
400 enable_contaminant_done = false;
401 transactionId = rand() % 10000;
402 const auto& ret = usb->enableContaminantPresenceDetection(usb_last_port_status.portName,
403 true, transactionId);
404 ASSERT_TRUE(ret.isOk());
405
406 std::cv_status waitStatus = wait();
407 while (waitStatus == std::cv_status::no_timeout &&
408 enable_contaminant_done == false)
409 waitStatus = wait();
410
411 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
412 EXPECT_EQ(2, usb_last_cookie);
413 EXPECT_EQ(transactionId, last_transactionId);
414 }
415 ALOGI("UsbAidlTest enableContaminantPresenceDetection end");
416}
417
418/*
419 * Test enabling Usb data of the port.
420 * Test case queries the usb ports present in device.
421 * If there is at least one usb port, enabling Usb data is attempted
422 * for the port.
423 * The callback parameters are checked to see if transaction id
424 * matches.
425 */
426TEST_P(UsbAidlTest, enableUsbData) {
427 ALOGI("UsbAidlTest enableUsbData start");
428 int64_t transactionId = rand() % 10000;
429 const auto& ret = usb->queryPortStatus(transactionId);
430 ASSERT_TRUE(ret.isOk());
431 EXPECT_EQ(std::cv_status::no_timeout, wait());
432 EXPECT_EQ(2, usb_last_cookie);
433 EXPECT_EQ(transactionId, last_transactionId);
434
435 if (!usb_last_port_status.portName.empty()) {
436 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
437 enable_usb_data_done = false;
438 transactionId = rand() % 10000;
439 const auto& ret = usb->enableUsbData(usb_last_port_status.portName, true, transactionId);
440 ASSERT_TRUE(ret.isOk());
441
442 std::cv_status waitStatus = wait();
443 while (waitStatus == std::cv_status::no_timeout &&
444 enable_usb_data_done == false)
445 waitStatus = wait();
446
447 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
448 EXPECT_EQ(2, usb_last_cookie);
449 EXPECT_EQ(transactionId, last_transactionId);
450 }
451 ALOGI("UsbAidlTest enableUsbData end");
452}
453
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800454/*
Badhri Jagan Sridharanf8832352022-01-23 09:17:04 -0800455 * Test enabling Usb data while being docked.
456 * Test case queries the usb ports present in device.
457 * If there is at least one usb port, enabling Usb data while docked
458 * is attempted for the port.
459 * The callback parameters are checked to see if transaction id
460 * matches.
461 */
462TEST_P(UsbAidlTest, enableUsbDataWhileDocked) {
463 ALOGI("UsbAidlTest enableUsbDataWhileDocked start");
464 int64_t transactionId = rand() % 10000;
465 const auto& ret = usb->queryPortStatus(transactionId);
466 ASSERT_TRUE(ret.isOk());
467 EXPECT_EQ(std::cv_status::no_timeout, wait());
468 EXPECT_EQ(2, usb_last_cookie);
469 EXPECT_EQ(transactionId, last_transactionId);
470
471 if (!usb_last_port_status.portName.empty()) {
472 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
473 enable_usb_data_while_docked_done = false;
474 transactionId = rand() % 10000;
475 const auto& ret = usb->enableUsbDataWhileDocked(usb_last_port_status.portName, transactionId);
476 ASSERT_TRUE(ret.isOk());
477
478 std::cv_status waitStatus = wait();
479 while (waitStatus == std::cv_status::no_timeout &&
480 enable_usb_data_while_docked_done == false)
481 waitStatus = wait();
482
483 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
484 EXPECT_EQ(2, usb_last_cookie);
485 EXPECT_EQ(transactionId, last_transactionId);
486 }
487 ALOGI("UsbAidlTest enableUsbDataWhileDocked end");
488}
489
490/*
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800491 * Test enabling Usb data of the port.
492 * Test case queries the usb ports present in device.
493 * If there is at least one usb port, relaxing limit power transfer
494 * is attempted for the port.
495 * The callback parameters are checked to see if transaction id
496 * matches.
497 */
498TEST_P(UsbAidlTest, limitPowerTransfer) {
499 ALOGI("UsbAidlTest limitPowerTransfer start");
500 int64_t transactionId = rand() % 10000;
501 const auto& ret = usb->queryPortStatus(transactionId);
502 ASSERT_TRUE(ret.isOk());
503 EXPECT_EQ(std::cv_status::no_timeout, wait());
504 EXPECT_EQ(2, usb_last_cookie);
505 EXPECT_EQ(transactionId, last_transactionId);
506
507 if (!usb_last_port_status.portName.empty()) {
508 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
509 limit_power_transfer_done = false;
510 transactionId = rand() % 10000;
511 const auto& ret = usb->limitPowerTransfer(usb_last_port_status.portName, false, transactionId);
512 ASSERT_TRUE(ret.isOk());
513
514 std::cv_status waitStatus = wait();
515 while (waitStatus == std::cv_status::no_timeout &&
516 limit_power_transfer_done == false)
517 waitStatus = wait();
518
519 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
520 EXPECT_EQ(2, usb_last_cookie);
521 EXPECT_EQ(transactionId, last_transactionId);
522 }
523 ALOGI("UsbAidlTest limitPowerTransfer end");
524}
525
Ricky Niua9040402022-01-05 20:03:09 +0800526/*
527 * Test reset Usb data of the port.
528 * Test case queries the usb ports present in device.
529 * If there is at least one usb port, reset Usb data for the port.
530 * The callback parameters are checked to see if transaction id
531 * matches.
532 */
533TEST_P(UsbAidlTest, DISABLED_resetUsbPort) {
534 ALOGI("UsbAidlTest resetUsbPort start");
535 int64_t transactionId = rand() % 10000;
536 const auto& ret = usb->queryPortStatus(transactionId);
537 ASSERT_TRUE(ret.isOk());
538 EXPECT_EQ(std::cv_status::no_timeout, wait());
539 EXPECT_EQ(2, usb_last_cookie);
540 EXPECT_EQ(transactionId, last_transactionId);
541
542 if (!usb_last_port_status.portName.empty()) {
543 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
544 reset_usb_port_done = false;
545 transactionId = rand() % 10000;
546 const auto& ret = usb->resetUsbPort(usb_last_port_status.portName, transactionId);
547 ASSERT_TRUE(ret.isOk());
548 ALOGI("UsbAidlTest resetUsbPort ret.isOk");
549
550 std::cv_status waitStatus = wait();
551 while (waitStatus == std::cv_status::no_timeout &&
552 reset_usb_port_done == false)
553 waitStatus = wait();
554
555 ALOGI("UsbAidlTest resetUsbPort wait()");
556 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
557 EXPECT_EQ(2, usb_last_cookie);
558 EXPECT_EQ(transactionId, last_transactionId);
559 }
560 ALOGI("UsbAidlTest resetUsbPort end");
561}
562
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800563GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(UsbAidlTest);
564INSTANTIATE_TEST_SUITE_P(
565 PerInstance, UsbAidlTest,
566 testing::ValuesIn(::android::getAidlHalInstanceNames(IUsb::descriptor)),
567 ::android::PrintInstanceNameToString);
568
569int main(int argc, char** argv) {
570 ::testing::InitGoogleTest(&argc, argv);
571 ABinderProcess_setThreadPoolMaxThreadCount(1);
572 ABinderProcess_startThreadPool();
573 return RUN_ALL_TESTS();
574}