1014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 2014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Copyright (C) 2017 The Android Open Source Project 3014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * 4014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Licensed under the Apache License, Version 2.0 (the "License"); 5014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * you may not use this file except in compliance with the License. 6014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * You may obtain a copy of the License at 7014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * 8014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * http://www.apache.org/licenses/LICENSE-2.0 9014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * 10014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Unless required by applicable law or agreed to in writing, software 11014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * distributed under the License is distributed on an "AS IS" BASIS, 12014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * See the License for the specific language governing permissions and 14014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * limitations under the License. 15014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 16014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 17e5b08a319be5fac35a2d917865594e38197f6cdfTri Vo#define LOG_TAG "VtsHalUsbV1_0TargetTest" 18014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <android-base/logging.h> 19014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 20014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <android/hardware/usb/1.0/IUsb.h> 21014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <android/hardware/usb/1.0/IUsbCallback.h> 22014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <android/hardware/usb/1.0/types.h> 23014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 24ed2bb4e8f851688c09f7639a9183b1285aa0967cYuexi Ma#include <VtsHalHidlTargetTestBase.h> 25f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang#include <VtsHalHidlTargetTestEnvBase.h> 263eb7df74b8eae5c902039d1b76402350715a0944Steven Moreland#include <log/log.h> 27014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <stdlib.h> 28014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <chrono> 29014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <condition_variable> 30014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#include <mutex> 31014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 32014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan#define TIMEOUT_PERIOD 10 33014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 34014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::IUsbCallback; 35014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::IUsb; 36014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::PortDataRole; 37014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::PortMode; 38014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::PortPowerRole; 39014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::PortRole; 40014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::PortRoleType; 41014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::PortStatus; 42014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::usb::V1_0::Status; 43014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hidl::base::V1_0::IBase; 44014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::hidl_array; 45014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::hidl_memory; 46014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::hidl_string; 47014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::hidl_vec; 48014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::Return; 49014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::hardware::Void; 50014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanusing ::android::sp; 51014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 52f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang// Test environment for Usb HIDL HAL. 53f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhangclass UsbHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { 54f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang public: 55f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang // get the test environment singleton 56f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang static UsbHidlEnvironment* Instance() { 57f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang static UsbHidlEnvironment* instance = new UsbHidlEnvironment; 58f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang return instance; 59f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang } 60f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang 61f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang virtual void registerTestServices() override { registerTestService<IUsb>(); } 62f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang}; 63f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang 64014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan// The main test class for the USB hidl HAL 65ed2bb4e8f851688c09f7639a9183b1285aa0967cYuexi Maclass UsbHidlTest : public ::testing::VtsHalHidlTargetTestBase { 66014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan public: 67014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Callback class for the USB HIDL hal. 68014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Usb Hal will call this object upon role switch or port query. 69014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan class UsbCallback : public IUsbCallback { 70014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan UsbHidlTest& parent_; 71014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan int cookie; 72014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 73014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan public: 74014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan UsbCallback(UsbHidlTest& parent, int cookie) 75014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan : parent_(parent), cookie(cookie){}; 76014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 77014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan virtual ~UsbCallback() = default; 78014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 79014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Callback method for the port status. 80014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> notifyPortStatusChange( 81014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan const hidl_vec<PortStatus>& currentPortStatus, Status retval) override { 82014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (retval == Status::SUCCESS) { 83014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_port_status.portName = 84014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan currentPortStatus[0].portName.c_str(); 85014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_port_status.currentDataRole = 86014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan currentPortStatus[0].currentDataRole; 87014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_port_status.currentPowerRole = 88014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan currentPortStatus[0].currentPowerRole; 89014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_port_status.currentMode = 90014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan currentPortStatus[0].currentMode; 91014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 92014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_cookie = cookie; 93014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.notify(); 94014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan return Void(); 95014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan }; 96014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 97014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Callback method for the status of role switch operation. 98014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> notifyRoleSwitchStatus(const hidl_string& /*portName*/, 99014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan const PortRole& newRole, 100014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Status retval) override { 101014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_status = retval; 102014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_cookie = cookie; 103014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_last_port_role = newRole; 104014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.usb_role_switch_done = true; 105014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan parent_.notify(); 106014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan return Void(); 107014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan }; 108014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan }; 109014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 110014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan virtual void SetUp() override { 111014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("Setup"); 112f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang usb = ::testing::VtsHalHidlTargetTestBase::getService<IUsb>( 113f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang UsbHidlEnvironment::Instance()->getServiceName<IUsb>()); 114014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_NE(usb, nullptr); 115014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 116014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_cb_2 = new UsbCallback(*this, 2); 117014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_NE(usb_cb_2, nullptr); 118014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->setCallback(usb_cb_2); 119014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 120014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 121014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 122014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan virtual void TearDown() override { ALOGI("Teardown"); } 123014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 124014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Used as a mechanism to inform the test about data/event callback. 125014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan inline void notify() { 126014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::unique_lock<std::mutex> lock(usb_mtx); 127014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_count++; 128014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_cv.notify_one(); 129014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 130014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 131014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Test code calls this function to wait for data/event callback. 132014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan inline std::cv_status wait() { 133014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::unique_lock<std::mutex> lock(usb_mtx); 134014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 135014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::cv_status status = std::cv_status::no_timeout; 136014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan auto now = std::chrono::system_clock::now(); 137014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan while (usb_count == 0) { 138014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan status = 139014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_cv.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD)); 140014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (status == std::cv_status::timeout) { 141014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("timeout"); 142014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan return status; 143014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 144014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 145014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_count--; 146014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan return status; 147014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 148014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 149014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // USB hidl hal Proxy 150014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan sp<IUsb> usb; 151014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 152014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Callback objects for usb hidl 153014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Methods of these objects are called to notify port status updates. 154014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan sp<IUsbCallback> usb_cb_1, usb_cb_2; 155014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 156014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // The last conveyed status of the USB ports. 157014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Stores information of currentt_data_role, power_role for all the USB ports 158014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan PortStatus usb_last_port_status; 159014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 160014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Status of the last role switch operation. 161014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Status usb_last_status; 162014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 163014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Port role information of the last role switch operation. 164014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan PortRole usb_last_port_role; 165014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 166014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Flag to indicate the invocation of role switch callback. 167014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan bool usb_role_switch_done; 168014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 169014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Identifier for the usb callback object. 170014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // Stores the cookie of the last invoked usb callback object. 171014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan int usb_last_cookie; 172014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 173014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // synchronization primitives to coordinate between main test thread 174014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan // and the callback thread. 175014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::mutex usb_mtx; 176014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::condition_variable usb_cv; 1779272727df8c5e42f3afd1315b1018f2af8ccca90Badhri Jagan Sridharan int usb_count = 0; 178014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan}; 179014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 180014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 181014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test to see if setCallback succeeds. 182014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Callback oject is created and registered. 183014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Check to see if the hidl transaction succeeded. 184014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 185014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan SridharanTEST_F(UsbHidlTest, setCallback) { 186014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_cb_1 = new UsbCallback(*this, 1); 187014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_NE(usb_cb_1, nullptr); 188014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->setCallback(usb_cb_1); 189014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 190014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 191014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 192014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 193014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Check to see if querying type-c 194014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * port status succeeds. 195014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 196014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan SridharanTEST_F(UsbHidlTest, queryPortStatus) { 197014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->queryPortStatus(); 198014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 199014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, wait()); 200014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 201014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("rightafter: %s", usb_last_port_status.portName.c_str()); 202014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 203014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 204014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 205014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Trying to switch a non-existent port should fail. 206014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * This test case tried to switch the port with empty 207014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * name which is expected to fail. 208014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 209014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan SridharanTEST_F(UsbHidlTest, switchEmptyPort) { 210014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan struct PortRole role; 211014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.type = PortRoleType::DATA_ROLE; 212014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 213014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->switchRole("", role); 214014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 215014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, wait()); 216014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(Status::ERROR, usb_last_status); 217014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 218014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 219014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 220014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 221014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test switching the mode of usb port. 222014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test case queries the usb ports present in device. 223014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * If there is atleast one usb port, a mode switch 224014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * to DFP is attempted for the port. 225014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * The callback parametes are checked to see if the mode 226014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * switch was successfull. Upon success, Status::SUCCESS 227014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * is expected to be returned. 228014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 229014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan SridharanTEST_F(UsbHidlTest, switchModetoDFP) { 230014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan struct PortRole role; 231014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.type = PortRoleType::MODE; 232014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.role = static_cast<uint32_t>(PortMode::DFP); 233014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 234014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->queryPortStatus(); 235014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 236014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, wait()); 237014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 238014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 239014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (!usb_last_port_status.portName.empty()) { 240014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan hidl_string portBeingSwitched = usb_last_port_status.portName; 241014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("mode portname:%s", portBeingSwitched.c_str()); 242014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_role_switch_done = false; 243014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->switchRole(portBeingSwitched.c_str(), role); 244014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 245014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 246014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::cv_status waitStatus = wait(); 247014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan while (waitStatus == std::cv_status::no_timeout && 248014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_role_switch_done == false) 249014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan waitStatus = wait(); 250014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 251014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, waitStatus); 252014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 253014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 254014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(static_cast<uint32_t>(PortRoleType::MODE), 255014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.type)); 256014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (usb_last_status == Status::SUCCESS) { 257014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(static_cast<uint32_t>(PortMode::DFP), 258014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.role)); 259014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } else { 260014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_NE(static_cast<uint32_t>(PortMode::UFP), 261014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.role)); 262014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 263014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 264014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 265014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 266014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 267014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test switching the power role of usb port. 268014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test case queries the usb ports present in device. 269014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * If there is atleast one usb port, a power role switch 270014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * to SOURCE is attempted for the port. 271014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * The callback parametes are checked to see if the power role 272014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * switch was successfull. Upon success, Status::SUCCESS 273014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * is expected to be returned. 274014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 275014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 276014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan SridharanTEST_F(UsbHidlTest, switchPowerRole) { 277014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan struct PortRole role; 278014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.type = PortRoleType::POWER_ROLE; 279014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.role = static_cast<uint32_t>(PortPowerRole::SOURCE); 280014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 281014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->queryPortStatus(); 282014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 283014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, wait()); 284014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 285014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 286014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (!usb_last_port_status.portName.empty()) { 287014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan hidl_string portBeingSwitched = usb_last_port_status.portName; 288014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("switchPower role portname:%s", portBeingSwitched.c_str()); 289014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_role_switch_done = false; 290014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->switchRole(portBeingSwitched.c_str(), role); 291014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 292014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 293014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::cv_status waitStatus = wait(); 294014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan while (waitStatus == std::cv_status::no_timeout && 295014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_role_switch_done == false) 296014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan waitStatus = wait(); 297014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 298014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, waitStatus); 299014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 300014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 301014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(static_cast<uint32_t>(PortRoleType::POWER_ROLE), 302014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.type)); 303014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (usb_last_status == Status::SUCCESS) { 304014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(static_cast<uint32_t>(PortPowerRole::SOURCE), 305014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.role)); 306014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } else { 307014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_NE(static_cast<uint32_t>(PortPowerRole::SINK), 308014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.role)); 309014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 310014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 311014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 312014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 313014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan/* 314014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test switching the data role of usb port. 315014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * Test case queries the usb ports present in device. 316014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * If there is atleast one usb port, a power role switch 317014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * to HOST is attempted for the port. 318014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * The callback parametes are checked to see if the power role 319014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * switch was successfull. Upon success, Status::SUCCESS 320014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan * is expected to be returned. 321014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan */ 322014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan SridharanTEST_F(UsbHidlTest, switchDataRole) { 323014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan struct PortRole role; 324014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.type = PortRoleType::DATA_ROLE; 325014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan role.role = static_cast<uint32_t>(PortDataRole::HOST); 326014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 327014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->queryPortStatus(); 328014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 329014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, wait()); 330014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 331014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 332014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (!usb_last_port_status.portName.empty()) { 333014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan hidl_string portBeingSwitched = usb_last_port_status.portName; 334014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("portname:%s", portBeingSwitched.c_str()); 335014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_role_switch_done = false; 336014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan Return<void> ret = usb->switchRole(portBeingSwitched.c_str(), role); 337014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ASSERT_TRUE(ret.isOk()); 338014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 339014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan std::cv_status waitStatus = wait(); 340014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan while (waitStatus == std::cv_status::no_timeout && 341014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan usb_role_switch_done == false) 342014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan waitStatus = wait(); 343014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 344014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(std::cv_status::no_timeout, waitStatus); 345014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(2, usb_last_cookie); 346014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 347014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(static_cast<uint32_t>(PortRoleType::DATA_ROLE), 348014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.type)); 349014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan if (usb_last_status == Status::SUCCESS) { 350014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_EQ(static_cast<uint32_t>(PortDataRole::HOST), 351014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.role)); 352014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } else { 353014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan EXPECT_NE(static_cast<uint32_t>(PortDataRole::DEVICE), 354014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan static_cast<uint32_t>(usb_last_port_role.role)); 355014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 356014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan } 357014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 358014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan 359014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharanint main(int argc, char** argv) { 360f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang ::testing::AddGlobalTestEnvironment(UsbHidlEnvironment::Instance()); 361014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ::testing::InitGoogleTest(&argc, argv); 362f5b45790b1c58a1430b3c6d2211781ed5022eff8Zhuoyao Zhang UsbHidlEnvironment::Instance()->init(&argc, argv); 363014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan int status = RUN_ALL_TESTS(); 364014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan ALOGI("Test result = %d", status); 365014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan return status; 366014888453cd50d3a5eb0c8d9ab42ade555012c6cBadhri Jagan Sridharan} 367