blob: c990b237fe8d6b62f2c9df00298a33601c4fd2dd [file] [log] [blame]
Badhri Jagan Sridharan9b0a2c62017-05-30 20:26:13 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "VtsHalUsbV1_0TargetTest"
18#include <android-base/logging.h>
19
20#include <android/hardware/usb/1.0/types.h>
21#include <android/hardware/usb/1.1/IUsb.h>
22#include <android/hardware/usb/1.1/IUsbCallback.h>
23#include <android/hardware/usb/1.1/types.h>
24
25#include <VtsHalHidlTargetCallbackBase.h>
26#include <VtsHalHidlTargetTestBase.h>
Zhuoyao Zhangf5b45792018-02-08 21:11:52 -080027#include <VtsHalHidlTargetTestEnvBase.h>
Badhri Jagan Sridharan9b0a2c62017-05-30 20:26:13 -070028#include <log/log.h>
29#include <stdlib.h>
30#include <chrono>
31#include <condition_variable>
32#include <mutex>
33
34using ::android::hardware::usb::V1_1::IUsbCallback;
35using ::android::hardware::usb::V1_0::IUsb;
36using ::android::hardware::usb::V1_0::PortDataRole;
37using ::android::hardware::usb::V1_0::PortMode;
38using ::android::hardware::usb::V1_1::PortMode_1_1;
39using ::android::hardware::usb::V1_0::PortPowerRole;
40using ::android::hardware::usb::V1_0::PortRole;
41using ::android::hardware::usb::V1_0::PortRoleType;
42using ::android::hardware::usb::V1_0::PortStatus;
43using ::android::hardware::usb::V1_1::PortStatus_1_1;
44using ::android::hardware::usb::V1_0::Status;
45using ::android::hidl::base::V1_0::IBase;
46using ::android::hardware::hidl_array;
47using ::android::hardware::hidl_memory;
48using ::android::hardware::hidl_string;
49using ::android::hardware::hidl_vec;
50using ::android::hardware::Return;
51using ::android::hardware::Void;
52using ::android::sp;
53
54constexpr char kCallbackNameNotifyPortStatusChange_1_1[] = "notifyPortStatusChange_1_1";
55
56// Worst case wait time 20secs
57#define WAIT_FOR_TIMEOUT std::chrono::milliseconds(20000)
58
59class UsbClientCallbackArgs {
60 public:
61 // The last conveyed status of the USB ports.
62 // Stores information of currentt_data_role, power_role for all the USB ports
63 PortStatus_1_1 usb_last_port_status;
64
65 // Status of the last role switch operation.
66 Status usb_last_status;
67
68 // Identifier for the usb callback object.
69 // Stores the cookie of the last invoked usb callback object.
70 int last_usb_cookie;
71};
72
73// Callback class for the USB HIDL hal.
74// Usb Hal will call this object upon role switch or port query.
75class UsbCallback : public ::testing::VtsHalHidlTargetCallbackBase<UsbClientCallbackArgs>,
76 public IUsbCallback {
77 int cookie;
78
79 public:
80 UsbCallback(int cookie) : cookie(cookie){};
81
82 virtual ~UsbCallback() = default;
83
84 // V1_0 Callback method for the port status.
85 // This should not be called so not signalling the Test here assuming that
86 // the test thread will timeout
87 Return<void> notifyPortStatusChange(const hidl_vec<PortStatus>& /* currentPortStatus */,
88 Status /*retval*/) override {
89 return Void();
90 };
91
92 // This callback methode should be used.
93 Return<void> notifyPortStatusChange_1_1(const hidl_vec<PortStatus_1_1>& currentPortStatus,
94 Status retval) override {
95 UsbClientCallbackArgs arg;
96 if (retval == Status::SUCCESS) {
97 arg.usb_last_port_status.status.supportedModes =
98 currentPortStatus[0].status.supportedModes;
99 arg.usb_last_port_status.status.currentMode = currentPortStatus[0].status.currentMode;
100 }
101 arg.usb_last_status = retval;
102 arg.last_usb_cookie = cookie;
103
104 NotifyFromCallback(kCallbackNameNotifyPortStatusChange_1_1, arg);
105 return Void();
106 }
107
108 // Callback method for the status of role switch operation.
109 // RoleSwitch operation has not changed since V1_0 so leaving
110 // the callback blank here.
111 Return<void> notifyRoleSwitchStatus(const hidl_string& /*portName*/,
112 const PortRole& /*newRole*/, Status /*retval*/) override {
113 return Void();
114 };
115};
116
Zhuoyao Zhangf5b45792018-02-08 21:11:52 -0800117// Test environment for Usb HIDL HAL.
118class UsbHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
119 public:
120 // get the test environment singleton
121 static UsbHidlEnvironment* Instance() {
122 static UsbHidlEnvironment* instance = new UsbHidlEnvironment;
123 return instance;
124 }
125
126 virtual void registerTestServices() override { registerTestService<IUsb>(); }
127};
128
Badhri Jagan Sridharan9b0a2c62017-05-30 20:26:13 -0700129// The main test class for the USB hidl HAL
130class UsbHidlTest : public ::testing::VtsHalHidlTargetTestBase {
131 public:
132 virtual void SetUp() override {
133 ALOGI(__FUNCTION__);
Zhuoyao Zhangf5b45792018-02-08 21:11:52 -0800134 usb = ::testing::VtsHalHidlTargetTestBase::getService<IUsb>(
135 UsbHidlEnvironment::Instance()->getServiceName<IUsb>());
Badhri Jagan Sridharan9b0a2c62017-05-30 20:26:13 -0700136 ASSERT_NE(usb, nullptr);
137
138 usb_cb_2 = new UsbCallback(2);
139 ASSERT_NE(usb_cb_2, nullptr);
140 usb_cb_2->SetWaitTimeout(kCallbackNameNotifyPortStatusChange_1_1, WAIT_FOR_TIMEOUT);
141 Return<void> ret = usb->setCallback(usb_cb_2);
142 ASSERT_TRUE(ret.isOk());
143 }
144
145 virtual void TearDown() override { ALOGI("Teardown"); }
146
147 // USB hidl hal Proxy
148 sp<IUsb> usb;
149
150 // Callback objects for usb hidl
151 // Methods of these objects are called to notify port status updates.
152 sp<UsbCallback> usb_cb_1;
153 sp<UsbCallback> usb_cb_2;
154};
155
156/*
157 * Test to see if setCallback on V1_1 callback object succeeds.
158 * Callback oject is created and registered.
159 * Check to see if the hidl transaction succeeded.
160 */
161TEST_F(UsbHidlTest, setCallback) {
162 usb_cb_1 = new UsbCallback(1);
163 ASSERT_NE(usb_cb_1, nullptr);
164 Return<void> ret = usb->setCallback(usb_cb_1);
165 ASSERT_TRUE(ret.isOk());
166}
167
168/*
169 * Check to see if querying type-c
170 * port status succeeds.
171 * HAL service should call notifyPortStatusChange_1_1
172 * instead of notifyPortStatusChange of V1_0 interface
173 */
174TEST_F(UsbHidlTest, queryPortStatus) {
175 Return<void> ret = usb->queryPortStatus();
176 ASSERT_TRUE(ret.isOk());
177 auto res = usb_cb_2->WaitForCallback(kCallbackNameNotifyPortStatusChange_1_1);
178 EXPECT_TRUE(res.no_timeout);
179 EXPECT_EQ(2, res.args->last_usb_cookie);
180 EXPECT_EQ(PortMode::NONE, res.args->usb_last_port_status.status.currentMode);
181 EXPECT_EQ(PortMode::NONE, res.args->usb_last_port_status.status.supportedModes);
182 EXPECT_EQ(Status::SUCCESS, res.args->usb_last_status);
183}
184
185int main(int argc, char** argv) {
Zhuoyao Zhangf5b45792018-02-08 21:11:52 -0800186 ::testing::AddGlobalTestEnvironment(UsbHidlEnvironment::Instance());
Badhri Jagan Sridharan9b0a2c62017-05-30 20:26:13 -0700187 ::testing::InitGoogleTest(&argc, argv);
Zhuoyao Zhangf5b45792018-02-08 21:11:52 -0800188 UsbHidlEnvironment::Instance()->init(&argc, argv);
Badhri Jagan Sridharan9b0a2c62017-05-30 20:26:13 -0700189 int status = RUN_ALL_TESTS();
190 ALOGI("Test result = %d", status);
191 return status;
192}