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