blob: 480c826cceb4189e1d4c271c36d77c35248a1c77 [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
RD Babiera6c94dde2022-11-09 22:55:47 +000045using ::aidl::android::hardware::usb::AltModeData;
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -080046using ::aidl::android::hardware::usb::BnUsbCallback;
RD Babiera3a8b5ee2022-09-16 20:53:14 +000047using ::aidl::android::hardware::usb::ComplianceWarning;
RD Babiera6c94dde2022-11-09 22:55:47 +000048using ::aidl::android::hardware::usb::DisplayPortAltModePinAssignment;
49using ::aidl::android::hardware::usb::DisplayPortAltModeStatus;
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -080050using ::aidl::android::hardware::usb::IUsb;
51using ::aidl::android::hardware::usb::IUsbCallback;
RD Babiera6c94dde2022-11-09 22:55:47 +000052using ::aidl::android::hardware::usb::PlugOrientation;
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -080053using ::aidl::android::hardware::usb::PortDataRole;
54using ::aidl::android::hardware::usb::PortMode;
55using ::aidl::android::hardware::usb::PortPowerRole;
56using ::aidl::android::hardware::usb::PortRole;
57using ::aidl::android::hardware::usb::PortStatus;
58using ::aidl::android::hardware::usb::Status;
Badhri Jagan Sridharana6aaccc2022-12-12 09:02:21 +000059using ::aidl::android::hardware::usb::UsbDataStatus;
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -080060
61using ::ndk::ScopedAStatus;
62using ::ndk::SpAIBinder;
63using std::vector;
64using std::shared_ptr;
65using std::string;
66
67// The main test class for the USB aidl hal
68class UsbAidlTest : public testing::TestWithParam<std::string> {
69 public:
70 // Callback class for the USB aidl hal.
71 // Usb Hal will call this object upon role switch or port query.
72 class UsbCallback : public BnUsbCallback {
73 UsbAidlTest& parent_;
74 int cookie;
75
76 public:
77 UsbCallback(UsbAidlTest& parent, int cookie)
78 : parent_(parent), cookie(cookie){};
79
80 virtual ~UsbCallback() = default;
81
82 // Callback method for the port status.
83 ScopedAStatus notifyPortStatusChange(const vector<PortStatus>& currentPortStatus,
84 Status retval) override {
85 if (retval == Status::SUCCESS && currentPortStatus.size() > 0) {
86 parent_.usb_last_port_status.portName =
87 currentPortStatus[0].portName.c_str();
88 parent_.usb_last_port_status.currentDataRole =
89 currentPortStatus[0].currentDataRole;
90 parent_.usb_last_port_status.currentPowerRole =
91 currentPortStatus[0].currentPowerRole;
92 parent_.usb_last_port_status.currentMode =
93 currentPortStatus[0].currentMode;
94 }
95 parent_.usb_last_cookie = cookie;
96 return ScopedAStatus::ok();
97 }
98
99 // Callback method for the status of role switch operation.
100 ScopedAStatus notifyRoleSwitchStatus(const string& /*portName*/, const PortRole& newRole,
101 Status retval, int64_t transactionId) override {
102 parent_.usb_last_status = retval;
103 parent_.usb_last_cookie = cookie;
104 parent_.usb_last_port_role = newRole;
105 parent_.usb_role_switch_done = true;
106 parent_.last_transactionId = transactionId;
107 parent_.notify();
108 return ScopedAStatus::ok();
109 }
110
111 // Callback method for the status of enableUsbData operation
112 ScopedAStatus notifyEnableUsbDataStatus(const string& /*portName*/, bool /*enable*/,
113 Status /*retval*/, int64_t transactionId) override {
114 parent_.last_transactionId = transactionId;
115 parent_.usb_last_cookie = cookie;
116 parent_.enable_usb_data_done = true;
117 parent_.notify();
118 return ScopedAStatus::ok();
119 }
120
Badhri Jagan Sridharanf8832352022-01-23 09:17:04 -0800121 // Callback method for the status of enableUsbData operation
122 ScopedAStatus notifyEnableUsbDataWhileDockedStatus(const string& /*portName*/,
123 Status /*retval*/,
124 int64_t transactionId) override {
125 parent_.last_transactionId = transactionId;
126 parent_.usb_last_cookie = cookie;
127 parent_.enable_usb_data_while_docked_done = true;
128 parent_.notify();
129 return ScopedAStatus::ok();
130 }
131
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800132 // Callback method for the status of enableContaminantPresenceDetection
133 ScopedAStatus notifyContaminantEnabledStatus(const string& /*portName*/, bool /*enable*/,
134 Status /*retval*/, int64_t transactionId) override {
135 parent_.last_transactionId = transactionId;
136 parent_.usb_last_cookie = cookie;
137 parent_.enable_contaminant_done = true;
138 parent_.notify();
139 return ScopedAStatus::ok();
140 }
141
142 // Callback method for the status of queryPortStatus operation
143 ScopedAStatus notifyQueryPortStatus(const string& /*portName*/, Status /*retval*/,
144 int64_t transactionId) override {
145 parent_.last_transactionId = transactionId;
146 parent_.notify();
147 return ScopedAStatus::ok();
148 }
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800149
150 // Callback method for the status of limitPowerTransfer operation
151 ScopedAStatus notifyLimitPowerTransferStatus(const string& /*portName*/, bool /*limit*/,
152 Status /*retval*/, int64_t transactionId) override {
153 parent_.last_transactionId = transactionId;
154 parent_.usb_last_cookie = cookie;
155 parent_.limit_power_transfer_done = true;
156 parent_.notify();
157 return ScopedAStatus::ok();
158 }
Ricky Niua9040402022-01-05 20:03:09 +0800159
160 // Callback method for the status of resetUsbPortStatus operation
161 ScopedAStatus notifyResetUsbPortStatus(const string& /*portName*/, Status /*retval*/,
162 int64_t transactionId) override {
163 ALOGI("enter notifyResetUsbPortStatus");
164 parent_.last_transactionId = transactionId;
165 parent_.usb_last_cookie = cookie;
166 parent_.reset_usb_port_done = true;
167 parent_.notify();
168 return ScopedAStatus::ok();
169 }
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800170 };
171
172 virtual void SetUp() override {
173 ALOGI("Setup");
174 usb = IUsb::fromBinder(
175 SpAIBinder(AServiceManager_waitForService(GetParam().c_str())));
176 ASSERT_NE(usb, nullptr);
177
178 usb_cb_2 = ::ndk::SharedRefBase::make<UsbCallback>(*this, 2);
179 ASSERT_NE(usb_cb_2, nullptr);
180 const auto& ret = usb->setCallback(usb_cb_2);
181 ASSERT_TRUE(ret.isOk());
182 }
183
184 virtual void TearDown() override { ALOGI("Teardown"); }
185
186 // Used as a mechanism to inform the test about data/event callback.
187 inline void notify() {
188 std::unique_lock<std::mutex> lock(usb_mtx);
189 usb_count++;
190 usb_cv.notify_one();
191 }
192
193 // Test code calls this function to wait for data/event callback.
194 inline std::cv_status wait() {
195 std::unique_lock<std::mutex> lock(usb_mtx);
196
197 std::cv_status status = std::cv_status::no_timeout;
198 auto now = std::chrono::system_clock::now();
199 while (usb_count == 0) {
200 status =
201 usb_cv.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD));
202 if (status == std::cv_status::timeout) {
203 ALOGI("timeout");
204 return status;
205 }
206 }
207 usb_count--;
208 return status;
209 }
210
211 // USB aidl hal Proxy
212 shared_ptr<IUsb> usb;
213
214 // Callback objects for usb aidl
215 // Methods of these objects are called to notify port status updates.
216 shared_ptr<IUsbCallback> usb_cb_1, usb_cb_2;
217
218 // The last conveyed status of the USB ports.
219 // Stores information of currentt_data_role, power_role for all the USB ports
220 PortStatus usb_last_port_status;
221
222 // Status of the last role switch operation.
223 Status usb_last_status;
224
225 // Port role information of the last role switch operation.
226 PortRole usb_last_port_role;
227
228 // Flag to indicate the invocation of role switch callback.
229 bool usb_role_switch_done;
230
231 // Flag to indicate the invocation of notifyContaminantEnabledStatus callback.
232 bool enable_contaminant_done;
233
234 // Flag to indicate the invocation of notifyEnableUsbDataStatus callback.
235 bool enable_usb_data_done;
236
Badhri Jagan Sridharanf8832352022-01-23 09:17:04 -0800237 // Flag to indicate the invocation of notifyEnableUsbDataWhileDockedStatus callback.
238 bool enable_usb_data_while_docked_done;
239
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800240 // Flag to indicate the invocation of notifyLimitPowerTransferStatus callback.
241 bool limit_power_transfer_done;
242
Ricky Niua9040402022-01-05 20:03:09 +0800243 // Flag to indicate the invocation of notifyResetUsbPort callback.
244 bool reset_usb_port_done;
245
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800246 // Stores the cookie of the last invoked usb callback object.
247 int usb_last_cookie;
248
249 // Last transaction ID that was recorded.
250 int64_t last_transactionId;
251 // synchronization primitives to coordinate between main test thread
252 // and the callback thread.
253 std::mutex usb_mtx;
254 std::condition_variable usb_cv;
255 int usb_count = 0;
RD Babieraff0f61b2023-01-10 22:25:23 +0000256
257 // Stores usb version
258 int32_t usb_version;
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800259};
260
261/*
262 * Test to see if setCallback succeeds.
263 * Callback object is created and registered.
264 */
265TEST_P(UsbAidlTest, setCallback) {
266 ALOGI("UsbAidlTest setCallback start");
267 usb_cb_1 = ::ndk::SharedRefBase::make<UsbCallback>(*this, 1);
268 ASSERT_NE(usb_cb_1, nullptr);
269 const auto& ret = usb->setCallback(usb_cb_1);
270 ASSERT_TRUE(ret.isOk());
271 ALOGI("UsbAidlTest setCallback end");
272}
273
274/*
275 * Check to see if querying type-c
276 * port status succeeds.
277 * The callback parameters are checked to see if the transaction id
278 * matches.
279 */
280TEST_P(UsbAidlTest, queryPortStatus) {
281 ALOGI("UsbAidlTest queryPortStatus start");
282 int64_t transactionId = rand() % 10000;
283 const auto& ret = usb->queryPortStatus(transactionId);
284 ASSERT_TRUE(ret.isOk());
285 EXPECT_EQ(std::cv_status::no_timeout, wait());
286 EXPECT_EQ(2, usb_last_cookie);
287 EXPECT_EQ(transactionId, last_transactionId);
288 ALOGI("UsbAidlTest queryPortStatus end: %s", usb_last_port_status.portName.c_str());
289}
290
291/*
Badhri Jagan Sridharana6aaccc2022-12-12 09:02:21 +0000292 * Query port status to Check to see whether only one of DISABLED_DOCK,
293 * DISABLED_DOCK_DEVICE_MODE, DISABLED_DOCK_HOST_MODE is set at the most.
294 * The callback parameters are checked to see if the transaction id
295 * matches.
296 */
297TEST_P(UsbAidlTest, DisabledDataStatusCheck) {
298 int disabledCount = 0;
299
300 ALOGI("UsbAidlTest DataStatusCheck start");
RD Babieraff0f61b2023-01-10 22:25:23 +0000301 auto retVersion = usb->getInterfaceVersion(&usb_version);
302 ASSERT_TRUE(retVersion.isOk()) << retVersion;
303 if (usb_version < 2) {
304 ALOGI("UsbAidlTest skipping DataStatusCheck on older interface versions");
305 GTEST_SKIP();
306 }
Badhri Jagan Sridharana6aaccc2022-12-12 09:02:21 +0000307 int64_t transactionId = rand() % 10000;
308 const auto& ret = usb->queryPortStatus(transactionId);
309 ASSERT_TRUE(ret.isOk());
310 EXPECT_EQ(std::cv_status::no_timeout, wait());
311 EXPECT_EQ(2, usb_last_cookie);
312 EXPECT_EQ(transactionId, last_transactionId);
313 ALOGI("UsbAidlTest DataStatusCheck portName: %s", usb_last_port_status.portName.c_str());
314 if (usb_last_port_status.usbDataStatus.size() > 1) {
315 for (UsbDataStatus dataStatus : usb_last_port_status.usbDataStatus) {
316 if (dataStatus == UsbDataStatus::DISABLED_DOCK ||
317 dataStatus == UsbDataStatus::DISABLED_DOCK_DEVICE_MODE ||
318 dataStatus == UsbDataStatus::DISABLED_DOCK_HOST_MODE) {
319 disabledCount++;
320 }
321 }
322 }
Badhri Jagan Sridharan6dcb4172023-01-04 22:45:03 +0000323 EXPECT_GE(1, disabledCount);
Badhri Jagan Sridharana6aaccc2022-12-12 09:02:21 +0000324 ALOGI("UsbAidlTest DataStatusCheck end");
325}
326
327/*
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800328 * Trying to switch a non-existent port should fail.
329 * This test case tried to switch the port with empty
330 * name which is expected to fail.
331 * The callback parameters are checked to see if the transaction id
332 * matches.
333 */
334TEST_P(UsbAidlTest, switchEmptyPort) {
335 ALOGI("UsbAidlTest switchEmptyPort start");
336 PortRole role;
337 role.set<PortRole::powerRole>(PortPowerRole::SOURCE);
338 int64_t transactionId = rand() % 10000;
339 const auto& ret = usb->switchRole("", role, transactionId);
340 ASSERT_TRUE(ret.isOk());
341 EXPECT_EQ(std::cv_status::no_timeout, wait());
342 EXPECT_EQ(Status::ERROR, usb_last_status);
343 EXPECT_EQ(transactionId, last_transactionId);
344 EXPECT_EQ(2, usb_last_cookie);
345 ALOGI("UsbAidlTest switchEmptyPort end");
346}
347
348/*
349 * Test switching the power role of usb port.
350 * Test case queries the usb ports present in device.
351 * If there is at least one usb port, a power role switch
352 * to SOURCE is attempted for the port.
353 * The callback parameters are checked to see if the transaction id
354 * matches.
355 */
356TEST_P(UsbAidlTest, switchPowerRole) {
357 ALOGI("UsbAidlTest switchPowerRole start");
358 PortRole role;
359 role.set<PortRole::powerRole>(PortPowerRole::SOURCE);
360 int64_t transactionId = rand() % 10000;
361 const auto& ret = usb->queryPortStatus(transactionId);
362 ASSERT_TRUE(ret.isOk());
363 EXPECT_EQ(std::cv_status::no_timeout, wait());
364 EXPECT_EQ(2, usb_last_cookie);
365 EXPECT_EQ(transactionId, last_transactionId);
366
367 if (!usb_last_port_status.portName.empty()) {
368 string portBeingSwitched = usb_last_port_status.portName;
369 ALOGI("switchPower role portname:%s", portBeingSwitched.c_str());
370 usb_role_switch_done = false;
371 transactionId = rand() % 10000;
372 const auto& ret = usb->switchRole(portBeingSwitched, role, transactionId);
373 ASSERT_TRUE(ret.isOk());
374
375 std::cv_status waitStatus = wait();
376 while (waitStatus == std::cv_status::no_timeout &&
377 usb_role_switch_done == false)
378 waitStatus = wait();
379
380 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
381 EXPECT_EQ(2, usb_last_cookie);
382 EXPECT_EQ(transactionId, last_transactionId);
383 }
384 ALOGI("UsbAidlTest switchPowerRole end");
385}
386
387/*
388 * Test switching the data role of usb port.
389 * Test case queries the usb ports present in device.
390 * If there is at least one usb port, a data role switch
391 * to device is attempted for the port.
392 * The callback parameters are checked to see if transaction id
393 * matches.
394 */
395TEST_P(UsbAidlTest, switchDataRole) {
396 ALOGI("UsbAidlTest switchDataRole start");
397 PortRole role;
398 role.set<PortRole::dataRole>(PortDataRole::DEVICE);
399 int64_t transactionId = rand() % 10000;
400 const auto& ret = usb->queryPortStatus(transactionId);
401 ASSERT_TRUE(ret.isOk());
402 EXPECT_EQ(std::cv_status::no_timeout, wait());
403 EXPECT_EQ(2, usb_last_cookie);
404 EXPECT_EQ(transactionId, last_transactionId);
405
406 if (!usb_last_port_status.portName.empty()) {
407 string portBeingSwitched = usb_last_port_status.portName;
408 ALOGI("portname:%s", portBeingSwitched.c_str());
409 usb_role_switch_done = false;
410 transactionId = rand() % 10000;
411 const auto& ret = usb->switchRole(portBeingSwitched, role, transactionId);
412 ASSERT_TRUE(ret.isOk());
413
414 std::cv_status waitStatus = wait();
415 while (waitStatus == std::cv_status::no_timeout &&
416 usb_role_switch_done == false)
417 waitStatus = wait();
418
419 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
420 EXPECT_EQ(2, usb_last_cookie);
421 EXPECT_EQ(transactionId, last_transactionId);
422 }
423 ALOGI("UsbAidlTest switchDataRole end");
424}
425
426/*
427 * Test enabling contaminant presence detection of the port.
428 * Test case queries the usb ports present in device.
429 * If there is at least one usb port, enabling contaminant detection
430 * is attempted for the port.
431 * The callback parameters are checked to see if transaction id
432 * matches.
433 */
434TEST_P(UsbAidlTest, enableContaminantPresenceDetection) {
435 ALOGI("UsbAidlTest enableContaminantPresenceDetection start");
436 int64_t transactionId = rand() % 10000;
437 const auto& ret = usb->queryPortStatus(transactionId);
438 ASSERT_TRUE(ret.isOk());
439 EXPECT_EQ(std::cv_status::no_timeout, wait());
440 EXPECT_EQ(2, usb_last_cookie);
441 EXPECT_EQ(transactionId, last_transactionId);
442
443 if (!usb_last_port_status.portName.empty()) {
444 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
445 enable_contaminant_done = false;
446 transactionId = rand() % 10000;
447 const auto& ret = usb->enableContaminantPresenceDetection(usb_last_port_status.portName,
448 true, transactionId);
449 ASSERT_TRUE(ret.isOk());
450
451 std::cv_status waitStatus = wait();
452 while (waitStatus == std::cv_status::no_timeout &&
453 enable_contaminant_done == false)
454 waitStatus = wait();
455
456 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
457 EXPECT_EQ(2, usb_last_cookie);
458 EXPECT_EQ(transactionId, last_transactionId);
459 }
460 ALOGI("UsbAidlTest enableContaminantPresenceDetection end");
461}
462
463/*
464 * Test enabling Usb data of the port.
465 * Test case queries the usb ports present in device.
466 * If there is at least one usb port, enabling Usb data is attempted
467 * for the port.
468 * The callback parameters are checked to see if transaction id
469 * matches.
470 */
471TEST_P(UsbAidlTest, enableUsbData) {
472 ALOGI("UsbAidlTest enableUsbData start");
473 int64_t transactionId = rand() % 10000;
474 const auto& ret = usb->queryPortStatus(transactionId);
475 ASSERT_TRUE(ret.isOk());
476 EXPECT_EQ(std::cv_status::no_timeout, wait());
477 EXPECT_EQ(2, usb_last_cookie);
478 EXPECT_EQ(transactionId, last_transactionId);
479
480 if (!usb_last_port_status.portName.empty()) {
481 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
482 enable_usb_data_done = false;
483 transactionId = rand() % 10000;
484 const auto& ret = usb->enableUsbData(usb_last_port_status.portName, true, transactionId);
485 ASSERT_TRUE(ret.isOk());
486
487 std::cv_status waitStatus = wait();
488 while (waitStatus == std::cv_status::no_timeout &&
489 enable_usb_data_done == false)
490 waitStatus = wait();
491
492 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
493 EXPECT_EQ(2, usb_last_cookie);
494 EXPECT_EQ(transactionId, last_transactionId);
495 }
496 ALOGI("UsbAidlTest enableUsbData end");
497}
498
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800499/*
Badhri Jagan Sridharanf8832352022-01-23 09:17:04 -0800500 * Test enabling Usb data while being docked.
501 * Test case queries the usb ports present in device.
502 * If there is at least one usb port, enabling Usb data while docked
503 * is attempted for the port.
504 * The callback parameters are checked to see if transaction id
505 * matches.
506 */
507TEST_P(UsbAidlTest, enableUsbDataWhileDocked) {
508 ALOGI("UsbAidlTest enableUsbDataWhileDocked start");
509 int64_t transactionId = rand() % 10000;
510 const auto& ret = usb->queryPortStatus(transactionId);
511 ASSERT_TRUE(ret.isOk());
512 EXPECT_EQ(std::cv_status::no_timeout, wait());
513 EXPECT_EQ(2, usb_last_cookie);
514 EXPECT_EQ(transactionId, last_transactionId);
515
516 if (!usb_last_port_status.portName.empty()) {
517 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
518 enable_usb_data_while_docked_done = false;
519 transactionId = rand() % 10000;
520 const auto& ret = usb->enableUsbDataWhileDocked(usb_last_port_status.portName, transactionId);
521 ASSERT_TRUE(ret.isOk());
522
523 std::cv_status waitStatus = wait();
524 while (waitStatus == std::cv_status::no_timeout &&
525 enable_usb_data_while_docked_done == false)
526 waitStatus = wait();
527
528 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
529 EXPECT_EQ(2, usb_last_cookie);
530 EXPECT_EQ(transactionId, last_transactionId);
531 }
532 ALOGI("UsbAidlTest enableUsbDataWhileDocked end");
533}
534
535/*
Badhri Jagan Sridharan6f67c562022-01-17 19:13:08 -0800536 * Test enabling Usb data of the port.
537 * Test case queries the usb ports present in device.
538 * If there is at least one usb port, relaxing limit power transfer
539 * is attempted for the port.
540 * The callback parameters are checked to see if transaction id
541 * matches.
542 */
543TEST_P(UsbAidlTest, limitPowerTransfer) {
544 ALOGI("UsbAidlTest limitPowerTransfer start");
545 int64_t transactionId = rand() % 10000;
546 const auto& ret = usb->queryPortStatus(transactionId);
547 ASSERT_TRUE(ret.isOk());
548 EXPECT_EQ(std::cv_status::no_timeout, wait());
549 EXPECT_EQ(2, usb_last_cookie);
550 EXPECT_EQ(transactionId, last_transactionId);
551
552 if (!usb_last_port_status.portName.empty()) {
553 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
554 limit_power_transfer_done = false;
555 transactionId = rand() % 10000;
556 const auto& ret = usb->limitPowerTransfer(usb_last_port_status.portName, false, transactionId);
557 ASSERT_TRUE(ret.isOk());
558
559 std::cv_status waitStatus = wait();
560 while (waitStatus == std::cv_status::no_timeout &&
561 limit_power_transfer_done == false)
562 waitStatus = wait();
563
564 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
565 EXPECT_EQ(2, usb_last_cookie);
566 EXPECT_EQ(transactionId, last_transactionId);
567 }
568 ALOGI("UsbAidlTest limitPowerTransfer end");
569}
570
Ricky Niua9040402022-01-05 20:03:09 +0800571/*
572 * Test reset Usb data of the port.
573 * Test case queries the usb ports present in device.
574 * If there is at least one usb port, reset Usb data for the port.
575 * The callback parameters are checked to see if transaction id
576 * matches.
577 */
578TEST_P(UsbAidlTest, DISABLED_resetUsbPort) {
579 ALOGI("UsbAidlTest resetUsbPort start");
580 int64_t transactionId = rand() % 10000;
581 const auto& ret = usb->queryPortStatus(transactionId);
582 ASSERT_TRUE(ret.isOk());
583 EXPECT_EQ(std::cv_status::no_timeout, wait());
584 EXPECT_EQ(2, usb_last_cookie);
585 EXPECT_EQ(transactionId, last_transactionId);
586
587 if (!usb_last_port_status.portName.empty()) {
588 ALOGI("portname:%s", usb_last_port_status.portName.c_str());
589 reset_usb_port_done = false;
590 transactionId = rand() % 10000;
591 const auto& ret = usb->resetUsbPort(usb_last_port_status.portName, transactionId);
592 ASSERT_TRUE(ret.isOk());
593 ALOGI("UsbAidlTest resetUsbPort ret.isOk");
594
595 std::cv_status waitStatus = wait();
596 while (waitStatus == std::cv_status::no_timeout &&
597 reset_usb_port_done == false)
598 waitStatus = wait();
599
600 ALOGI("UsbAidlTest resetUsbPort wait()");
601 EXPECT_EQ(std::cv_status::no_timeout, waitStatus);
602 EXPECT_EQ(2, usb_last_cookie);
603 EXPECT_EQ(transactionId, last_transactionId);
604 }
605 ALOGI("UsbAidlTest resetUsbPort end");
606}
607
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000608/*
609 * Test charger compliance warning
610 * The test asserts that complianceWarnings is
611 * empty when the feature is not supported. i.e.
612 * supportsComplianceWarning is false.
613 */
614TEST_P(UsbAidlTest, nonCompliantChargerStatus) {
RD Babieraff0f61b2023-01-10 22:25:23 +0000615 ALOGI("UsbAidlTest nonCompliantChargerStatus start");
616 auto retVersion = usb->getInterfaceVersion(&usb_version);
617 ASSERT_TRUE(retVersion.isOk()) << retVersion;
618 if (usb_version < 2) {
619 ALOGI("UsbAidlTest skipping nonCompliantChargerStatus on older interface versions");
620 GTEST_SKIP();
621 }
622 int64_t transactionId = rand() % 10000;
623 const auto& ret = usb->queryPortStatus(transactionId);
624 ASSERT_TRUE(ret.isOk());
625 EXPECT_EQ(std::cv_status::no_timeout, wait());
626 EXPECT_EQ(2, usb_last_cookie);
627 EXPECT_EQ(transactionId, last_transactionId);
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000628
RD Babieraff0f61b2023-01-10 22:25:23 +0000629 if (!usb_last_port_status.supportsComplianceWarnings) {
630 EXPECT_TRUE(usb_last_port_status.complianceWarnings.empty());
631 }
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000632
RD Babieraff0f61b2023-01-10 22:25:23 +0000633 ALOGI("UsbAidlTest nonCompliantChargerStatus end");
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000634}
635
636/*
637 * Test charger compliance warning values
638 * The test asserts that complianceWarning values
639 * are valid.
640 */
641TEST_P(UsbAidlTest, nonCompliantChargerValues) {
RD Babieraff0f61b2023-01-10 22:25:23 +0000642 ALOGI("UsbAidlTest nonCompliantChargerValues start");
643 auto retVersion = usb->getInterfaceVersion(&usb_version);
644 ASSERT_TRUE(retVersion.isOk()) << retVersion;
645 if (usb_version < 2) {
646 ALOGI("UsbAidlTest skipping nonCompliantChargerValues on older interface versions");
647 GTEST_SKIP();
648 }
649 int64_t transactionId = rand() % 10000;
650 const auto& ret = usb->queryPortStatus(transactionId);
651 ASSERT_TRUE(ret.isOk());
652 EXPECT_EQ(std::cv_status::no_timeout, wait());
653 EXPECT_EQ(2, usb_last_cookie);
654 EXPECT_EQ(transactionId, last_transactionId);
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000655
RD Babieraff0f61b2023-01-10 22:25:23 +0000656 // Current compliance values range from [1, 4]
657 if (usb_last_port_status.supportsComplianceWarnings) {
658 for (auto warning : usb_last_port_status.complianceWarnings) {
659 EXPECT_TRUE((int)warning >= (int)ComplianceWarning::OTHER);
660 EXPECT_TRUE((int)warning <= (int)ComplianceWarning::MISSING_RP);
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000661 }
RD Babieraff0f61b2023-01-10 22:25:23 +0000662 }
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000663
RD Babieraff0f61b2023-01-10 22:25:23 +0000664 ALOGI("UsbAidlTest nonCompliantChargerValues end");
RD Babiera3a8b5ee2022-09-16 20:53:14 +0000665}
666
RD Babiera6c94dde2022-11-09 22:55:47 +0000667/*
668 * Test PlugOrientation Values are within range in PortStatus
669 */
670TEST_P(UsbAidlTest, plugOrientationValues) {
RD Babieraff0f61b2023-01-10 22:25:23 +0000671 ALOGI("UsbAidlTest plugOrientationValues start");
672 auto retVersion = usb->getInterfaceVersion(&usb_version);
673 ASSERT_TRUE(retVersion.isOk()) << retVersion;
674 if (usb_version < 2) {
675 ALOGI("UsbAidlTest skipping plugOrientationValues on older interface versions");
676 GTEST_SKIP();
677 }
678 int64_t transactionId = rand() % 10000;
679 const auto& ret = usb->queryPortStatus(transactionId);
680 ASSERT_TRUE(ret.isOk());
681 EXPECT_EQ(std::cv_status::no_timeout, wait());
682 EXPECT_EQ(2, usb_last_cookie);
683 EXPECT_EQ(transactionId, last_transactionId);
RD Babiera6c94dde2022-11-09 22:55:47 +0000684
RD Babieraff0f61b2023-01-10 22:25:23 +0000685 EXPECT_TRUE((int)usb_last_port_status.plugOrientation >= (int)PlugOrientation::UNKNOWN);
686 EXPECT_TRUE((int)usb_last_port_status.plugOrientation <= (int)PlugOrientation::PLUGGED_FLIPPED);
RD Babiera6c94dde2022-11-09 22:55:47 +0000687}
688
689/*
690 * Test DisplayPortAltMode Values when DisplayPort Alt Mode
691 * is active.
692 */
693TEST_P(UsbAidlTest, dpAltModeValues) {
RD Babieraff0f61b2023-01-10 22:25:23 +0000694 ALOGI("UsbAidlTest dpAltModeValues start");
695 auto retVersion = usb->getInterfaceVersion(&usb_version);
696 ASSERT_TRUE(retVersion.isOk()) << retVersion;
697 if (usb_version < 2) {
698 ALOGI("UsbAidlTest skipping dpAltModeValues on older interface versions");
699 GTEST_SKIP();
700 }
701 int64_t transactionId = rand() % 10000;
702 const auto& ret = usb->queryPortStatus(transactionId);
703 ASSERT_TRUE(ret.isOk());
704 EXPECT_EQ(std::cv_status::no_timeout, wait());
705 EXPECT_EQ(2, usb_last_cookie);
706 EXPECT_EQ(transactionId, last_transactionId);
RD Babiera6c94dde2022-11-09 22:55:47 +0000707
RD Babieraff0f61b2023-01-10 22:25:23 +0000708 // Discover DisplayPort Alt Mode
709 for (AltModeData altMode : usb_last_port_status.supportedAltModes) {
710 if (altMode.getTag() == AltModeData::displayPortAltModeData) {
711 AltModeData::DisplayPortAltModeData displayPortAltModeData =
712 altMode.get<AltModeData::displayPortAltModeData>();
713 EXPECT_TRUE((int)displayPortAltModeData.partnerSinkStatus >=
714 (int)DisplayPortAltModeStatus::UNKNOWN);
715 EXPECT_TRUE((int)displayPortAltModeData.partnerSinkStatus <=
716 (int)DisplayPortAltModeStatus::ENABLED);
RD Babiera6c94dde2022-11-09 22:55:47 +0000717
RD Babieraff0f61b2023-01-10 22:25:23 +0000718 EXPECT_TRUE((int)displayPortAltModeData.cableStatus >=
719 (int)DisplayPortAltModeStatus::UNKNOWN);
720 EXPECT_TRUE((int)displayPortAltModeData.cableStatus <=
721 (int)DisplayPortAltModeStatus::ENABLED);
RD Babiera6c94dde2022-11-09 22:55:47 +0000722
RD Babieraff0f61b2023-01-10 22:25:23 +0000723 EXPECT_TRUE((int)displayPortAltModeData.pinAssignment >=
724 (int)DisplayPortAltModePinAssignment::NONE);
725 EXPECT_TRUE((int)displayPortAltModeData.pinAssignment <=
726 (int)DisplayPortAltModePinAssignment::F);
RD Babiera6c94dde2022-11-09 22:55:47 +0000727 }
RD Babieraff0f61b2023-01-10 22:25:23 +0000728 }
RD Babiera6c94dde2022-11-09 22:55:47 +0000729
RD Babieraff0f61b2023-01-10 22:25:23 +0000730 ALOGI("UsbAidlTest dpAltModeValues end");
RD Babiera6c94dde2022-11-09 22:55:47 +0000731}
732
Badhri Jagan Sridharanaef9dec2021-12-27 14:02:56 -0800733GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(UsbAidlTest);
734INSTANTIATE_TEST_SUITE_P(
735 PerInstance, UsbAidlTest,
736 testing::ValuesIn(::android::getAidlHalInstanceNames(IUsb::descriptor)),
737 ::android::PrintInstanceNameToString);
738
739int main(int argc, char** argv) {
740 ::testing::InitGoogleTest(&argc, argv);
741 ABinderProcess_setThreadPoolMaxThreadCount(1);
742 ABinderProcess_startThreadPool();
743 return RUN_ALL_TESTS();
744}