1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "usbd_interrupt_transfer_test.h"
17
18 #include <iostream>
19 #include <vector>
20
21 #include "UsbSubTest.h"
22 #include "hdf_log.h"
23 #include "securec.h"
24 #include "usb_ddk.h"
25 #include "usb_ddk_interface.h"
26 #include "usbd_type.h"
27 #include "usbd_wrapper.h"
28 #include "v2_0/iusb_host_interface.h"
29 #include "v2_0/iusb_port_interface.h"
30 #include "v2_0/usb_types.h"
31
32 const int SLEEP_TIME = 3;
33 const uint8_t BUS_NUM_INVALID = 255;
34 const uint8_t DEV_ADDR_INVALID = 255;
35 const uint32_t MAX_BUFFER_LENGTH = 255;
36 const uint8_t INTERFACEID_OK = 1;
37 const uint8_t INTERFACEID_INTERRUPT = 0;
38 const uint8_t PIPE_ENDPOINTID_INVALID = 244;
39 const uint8_t PIPE_INTERFACEID_INVALID = 244;
40 const uint8_t POINTID_INTERRUPT_IN = 129;
41 const int32_t DEFAULT_PORT_ID = 1;
42 const int32_t DEFAULT_ROLE_HOST = 1;
43 // data interface have 2 point : 1->bulk_out 2->bulk_in
44 static const uint8_t POINTID_BULK_IN = USB_ENDPOINT_DIR_IN | 2;
45 static const uint8_t POINTID_BULK_OUT = USB_ENDPOINT_DIR_OUT | 1;
46 const int32_t TRANSFER_TIME_OUT = 1000;
47
48 using namespace testing::ext;
49 using namespace OHOS;
50 using namespace OHOS::USB;
51 using namespace std;
52 using namespace OHOS::HDI::Usb::V2_0;
53 using namespace OHOS::HDI::Usb::V2_0;
54
55 namespace OHOS::USB::UsbdInterruptTransfer {
56 UsbDev UsbdInterruptTransferTest::dev_ = {0, 0};
57 sptr<UsbSubTest> UsbdInterruptTransferTest::subscriber_ = nullptr;
58 sptr<OHOS::HDI::Usb::V2_0::IUsbHostInterface> g_usbHostInterface = nullptr;
59 sptr<OHOS::HDI::Usb::V2_0::IUsbPortInterface> g_usbPortInterface = nullptr;
60
SwitchErrCode(int32_t ret)61 int32_t SwitchErrCode(int32_t ret)
62 {
63 return ret == HDF_ERR_NOT_SUPPORT ? HDF_SUCCESS : ret;
64 }
65
SetUpTestCase(void)66 void UsbdInterruptTransferTest::SetUpTestCase(void)
67 {
68 g_usbHostInterface = OHOS::HDI::Usb::V2_0::IUsbHostInterface::Get(true);
69 g_usbPortInterface = OHOS::HDI::Usb::V2_0::IUsbPortInterface::Get();
70 if (g_usbHostInterface == nullptr) {
71 HDF_LOGE("%{public}s:IUsbInterface::Get() failed.", __func__);
72 exit(0);
73 }
74
75 auto ret = g_usbPortInterface->SetPortRole(DEFAULT_PORT_ID, DEFAULT_ROLE_HOST, DEFAULT_ROLE_HOST);
76 sleep(SLEEP_TIME);
77 HDF_LOGI("UsbdInterruptTransferTest::[Device] %{public}d SetPortRole=%{public}d", __LINE__, ret);
78 ret = SwitchErrCode(ret);
79 ASSERT_EQ(0, ret);
80 if (ret != 0) {
81 exit(0);
82 }
83
84 subscriber_ = new UsbSubTest();
85 if (subscriber_ == nullptr) {
86 HDF_LOGE("%{public}s:UsbSubTest new failed.", __func__);
87 exit(0);
88 }
89 if (g_usbHostInterface->BindUsbdHostSubscriber(subscriber_) != HDF_SUCCESS) {
90 HDF_LOGE("%{public}s: bind usbd subscriber_ failed", __func__);
91 exit(0);
92 }
93
94 std::cout << "please connect device, press enter to continue" << std::endl;
95 int c;
96 do {
97 c = getchar();
98 } while (c != '\n' && c != EOF);
99
100 dev_ = {subscriber_->busNum_, subscriber_->devAddr_};
101 ret = g_usbHostInterface->OpenDevice(dev_);
102 HDF_LOGI("UsbdInterruptTransferTest:: %{public}d OpenDevice=%{public}d", __LINE__, ret);
103 ASSERT_EQ(0, ret);
104 }
105
TearDownTestCase(void)106 void UsbdInterruptTransferTest::TearDownTestCase(void)
107 {
108 g_usbHostInterface->UnbindUsbdHostSubscriber(subscriber_);
109 dev_ = {subscriber_->busNum_, subscriber_->devAddr_};
110 auto ret = g_usbHostInterface->CloseDevice(dev_);
111 HDF_LOGI("UsbdInterruptTransferTest:: %{public}d Close=%{public}d", __LINE__, ret);
112 ASSERT_EQ(0, ret);
113 }
114
SetUp(void)115 void UsbdInterruptTransferTest::SetUp(void) {}
116
TearDown(void)117 void UsbdInterruptTransferTest::TearDown(void) {}
118
119 /**
120 * @tc.name: InterruptTransferRead001
121 * @tc.desc: Test functions to InterruptTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
122 * std::vector<uint8_t> &data);
123 * @tc.desc: Positive test: parameters correctly
124 * @tc.type: FUNC
125 */
126 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferRead001, TestSize.Level1)
127 {
128 struct UsbDev dev = dev_;
129 uint8_t interfaceId = INTERFACEID_INTERRUPT;
130 uint8_t pointid = POINTID_INTERRUPT_IN;
131 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
132 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead001 %{public}d ClaimInterface=%{public}d",
133 __LINE__, ret);
134 ASSERT_EQ(0, ret);
135 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
136 std::vector<uint8_t> bufferData(MAX_BUFFER_LENGTH);
137 ret = g_usbHostInterface->InterruptTransferRead(dev, pipe, TRANSFER_TIME_OUT, bufferData);
138 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead001 %{public}d InterruptTransferRead=%{public}d",
139 __LINE__, ret);
140 EXPECT_EQ(0, ret);
141 }
142
143 /**
144 * @tc.name: UsbdInterruptTransferRead002
145 * @tc.desc: Test functions to InterruptTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
146 * std::vector<uint8_t> &data);
147 * @tc.desc: Negative test: parameters exception, busNum error
148 * @tc.type: FUNC
149 */
150 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferRead002, TestSize.Level1)
151 {
152 struct UsbDev dev = dev_;
153 uint8_t interfaceId = INTERFACEID_OK;
154 uint8_t pointid = POINTID_BULK_IN;
155 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
156 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead002 %{public}d ClaimInterface=%{public}d",
157 __LINE__, ret);
158 ASSERT_EQ(0, ret);
159 dev.busNum = BUS_NUM_INVALID;
160 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
161 std::vector<uint8_t> bufferData(MAX_BUFFER_LENGTH);
162 ret = g_usbHostInterface->InterruptTransferRead(dev, pipe, TRANSFER_TIME_OUT, bufferData);
163 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead002 %{public}d InterruptTransferRead=%{public}d",
164 __LINE__, ret);
165 EXPECT_NE(ret, 0);
166 }
167
168 /**
169 * @tc.name: UsbdInterruptTransferRead003
170 * @tc.desc: Test functions to InterruptTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
171 * std::vector<uint8_t> &data);
172 * @tc.desc: Negative test: parameters exception, devAddr error
173 * @tc.type: FUNC
174 */
175 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferRead003, TestSize.Level1)
176 {
177 struct UsbDev dev = dev_;
178 uint8_t interfaceId = INTERFACEID_OK;
179 uint8_t pointid = POINTID_BULK_IN;
180 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
181 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead003 %{public}d ClaimInterface=%{public}d",
182 __LINE__, ret);
183 ASSERT_EQ(0, ret);
184 dev.devAddr = DEV_ADDR_INVALID;
185 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
186 std::vector<uint8_t> bufferData(MAX_BUFFER_LENGTH);
187 ret = g_usbHostInterface->InterruptTransferRead(dev, pipe, TRANSFER_TIME_OUT, bufferData);
188 EXPECT_NE(ret, 0);
189 }
190
191 /**
192 * @tc.name: UsbdInterruptTransferRead004
193 * @tc.desc: Test functions to InterruptTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
194 * std::vector<uint8_t> &data);
195 * @tc.desc: Negative test: parameters exception, intfId error
196 * @tc.type: FUNC
197 */
198 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferRead004, TestSize.Level1)
199 {
200 struct UsbDev dev = dev_;
201 uint8_t interfaceId = INTERFACEID_OK;
202 uint8_t pointid = POINTID_BULK_IN;
203 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
204 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead004 %{public}d ClaimInterface=%{public}d",
205 __LINE__, ret);
206 ASSERT_EQ(0, ret);
207 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
208 pipe.intfId = PIPE_INTERFACEID_INVALID;
209 std::vector<uint8_t> bufferData(MAX_BUFFER_LENGTH);
210 ret = g_usbHostInterface->InterruptTransferRead(dev, pipe, TRANSFER_TIME_OUT, bufferData);
211 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead004 %{public}d InterruptTransferRead=%{public}d",
212 __LINE__, ret);
213 EXPECT_NE(ret, 0);
214 }
215
216 /**
217 * @tc.name: UsbdInterruptTransferRead005
218 * @tc.desc: Test functions to InterruptTransferRead(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
219 * std::vector<uint8_t> &data);
220 * @tc.desc: Negative test: parameters exception, endpointId error
221 * @tc.type: FUNC
222 */
223 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferRead005, TestSize.Level1)
224 {
225 struct UsbDev dev = dev_;
226 uint8_t interfaceId = INTERFACEID_OK;
227 uint8_t pointid = POINTID_BULK_IN;
228 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
229 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead005 %{public}d ClaimInterface=%{public}d",
230 __LINE__, ret);
231 ASSERT_EQ(0, ret);
232 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
233 pipe.endpointId = PIPE_ENDPOINTID_INVALID;
234 std::vector<uint8_t> bufferData(MAX_BUFFER_LENGTH);
235 ret = g_usbHostInterface->InterruptTransferRead(dev, pipe, TRANSFER_TIME_OUT, bufferData);
236 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferRead005 %{public}d InterruptTransferRead=%{public}d",
237 __LINE__, ret);
238 EXPECT_NE(ret, 0);
239 }
240
241 /**
242 * @tc.name: UsbdInterruptTransferWrite002
243 * @tc.desc: Test functions to InterruptTransferWrite(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
244 * std::vector<uint8_t> &data);
245 * @tc.desc: Negative test: parameters exception, busNum error
246 * @tc.type: FUNC
247 */
248 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferWrite002, TestSize.Level1)
249 {
250 struct UsbDev dev = dev_;
251 uint8_t interfaceId = INTERFACEID_OK;
252 uint8_t pointid = POINTID_BULK_OUT;
253 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
254 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite002 %{public}d ClaimInterface=%{public}d",
255 __LINE__, ret);
256 ASSERT_EQ(0, ret);
257 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
258 dev.busNum = BUS_NUM_INVALID;
259 std::vector<uint8_t> bufferData = {'i', 'n', 't', 'w', 'r', 'i', 't', 'e', '0', '2'};
260 ret = g_usbHostInterface->InterruptTransferWrite(dev, pipe, TRANSFER_TIME_OUT, bufferData);
261 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite002 %{public}d InterruptTransferWrite=%{public}d",
262 __LINE__, ret);
263 EXPECT_NE(ret, 0);
264 }
265
266 /**
267 * @tc.name: UsbdInterruptTransferWrite003
268 * @tc.desc: Test functions to InterruptTransferWrite(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
269 * std::vector<uint8_t> &data);
270 * @tc.desc: Negative test: parameters exception, devAddr error
271 * @tc.type: FUNC
272 */
273 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferWrite003, TestSize.Level1)
274 {
275 struct UsbDev dev = dev_;
276 uint8_t interfaceId = INTERFACEID_OK;
277 uint8_t pointid = POINTID_BULK_OUT;
278 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
279 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite003 %{public}d ClaimInterface=%{public}d",
280 __LINE__, ret);
281 ASSERT_EQ(0, ret);
282 dev.devAddr = DEV_ADDR_INVALID;
283 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
284 std::vector<uint8_t> bufferData = {'i', 'n', 't', 'w', 'r', 'i', 't', 'e', '0', '3'};
285 ret = g_usbHostInterface->InterruptTransferWrite(dev, pipe, TRANSFER_TIME_OUT, bufferData);
286 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite003 %{public}d InterruptTransferWrite=%{public}d",
287 __LINE__, ret);
288 EXPECT_NE(ret, 0);
289 }
290
291 /**
292 * @tc.name: UsbdInterruptTransferWrite004
293 * @tc.desc: Test functions to InterruptTransferWrite(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
294 * std::vector<uint8_t> &data);
295 * @tc.desc: Negative test: parameters exception, intfId error
296 * @tc.type: FUNC
297 */
298 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferWrite004, TestSize.Level1)
299 {
300 struct UsbDev dev = dev_;
301 uint8_t interfaceId = INTERFACEID_OK;
302 uint8_t pointid = POINTID_BULK_OUT;
303 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
304 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite004 %{public}d ClaimInterface=%{public}d",
305 __LINE__, ret);
306 ASSERT_EQ(0, ret);
307 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
308 pipe.intfId = PIPE_INTERFACEID_INVALID;
309 std::vector<uint8_t> bufferData = {'i', 'n', 't', 'w', 'r', 'i', 't', 'e', '0', '4'};
310 ret = g_usbHostInterface->InterruptTransferWrite(dev, pipe, TRANSFER_TIME_OUT, bufferData);
311 HDF_LOGI(
312 "UsbdInterruptTransferTest::UsbdInterruptTransferWrite004 %{public}d InterruptTransferWrite=%{public}d",
313 __LINE__, ret);
314 EXPECT_NE(ret, 0);
315 }
316
317 /**
318 * @tc.name: UsbdInterruptTransferWrite005
319 * @tc.desc: Test functions to InterruptTransferWrite(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
320 * std::vector<uint8_t> &data);
321 * @tc.desc: Negative test: parameters exception, endpointId error
322 * @tc.type: FUNC
323 */
324 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferWrite005, TestSize.Level1)
325 {
326 struct UsbDev dev = dev_;
327 uint8_t interfaceId = INTERFACEID_OK;
328 uint8_t pointid = POINTID_BULK_OUT;
329 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
330 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite005 %{public}d ClaimInterface=%{public}d",
331 __LINE__, ret);
332 ASSERT_EQ(0, ret);
333 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
334 pipe.endpointId = PIPE_ENDPOINTID_INVALID;
335 std::vector<uint8_t> bufferData = {'i', 'n', 't', 'w', 'r', 'i', 't', 'e', '0', '5'};
336 ret = g_usbHostInterface->InterruptTransferWrite(dev, pipe, TRANSFER_TIME_OUT, bufferData);
337 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite005 %{public}d InterruptTransferWrite=%{public}d",
338 __LINE__, ret);
339 EXPECT_NE(ret, 0);
340 }
341
342 /**
343 * @tc.name: UsbdInterruptTransferWrite006
344 * @tc.desc: Test functions to InterruptTransferWrite(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
345 * std::vector<uint8_t> &data);
346 * @tc.desc: Negative test: parameters exception, busNum && devAddr error
347 * @tc.type: FUNC
348 */
349 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferWrite006, TestSize.Level1)
350 {
351 struct UsbDev dev = dev_;
352 uint8_t interfaceId = INTERFACEID_OK;
353 uint8_t pointid = POINTID_BULK_OUT;
354 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
355 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite006 %{public}d ClaimInterface=%{public}d",
356 __LINE__, ret);
357 ASSERT_EQ(0, ret);
358 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
359 dev.busNum = BUS_NUM_INVALID;
360 dev.devAddr = DEV_ADDR_INVALID;
361 std::vector<uint8_t> bufferData = {'i', 'n', 't', 'w', 'r', 'i', 't', 'e', '0', '6'};
362 ret = g_usbHostInterface->InterruptTransferWrite(dev, pipe, TRANSFER_TIME_OUT, bufferData);
363 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite006 %{public}d InterruptTransferWrite=%{public}d",
364 __LINE__, ret);
365 EXPECT_NE(ret, 0);
366 }
367
368 /**
369 * @tc.name: UsbdInterruptTransferWrite007
370 * @tc.desc: Test functions to InterruptTransferWrite(const UsbDev &dev, const UsbPipe &pipe, int32_t timeout,
371 * std::vector<uint8_t> &data);
372 * @tc.desc: Negative test: parameters exception, ClaimInterface failed first
373 * @tc.type: FUNC
374 */
375 HWTEST_F(UsbdInterruptTransferTest, UsbdInterruptTransferWrite007, TestSize.Level1)
376 {
377 struct UsbDev dev = dev_;
378 uint8_t interfaceId = INTERFACEID_OK;
379 uint8_t pointid = PIPE_ENDPOINTID_INVALID;
380 auto ret = g_usbHostInterface->ClaimInterface(dev, interfaceId, 1);
381 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite007 %{public}d ClaimInterface=%{public}d",
382 __LINE__, ret);
383 ASSERT_EQ(0, ret);
384 OHOS::HDI::Usb::V2_0::UsbPipe pipe = {interfaceId, pointid};
385 std::vector<uint8_t> bufferData = {'i', 'n', 't', 'w', 'r', 'i', 't', 'e', '0', '7'};
386 ret = g_usbHostInterface->InterruptTransferWrite(dev, pipe, TRANSFER_TIME_OUT, bufferData);
387 HDF_LOGI("UsbdInterruptTransferTest::UsbdInterruptTransferWrite007 %{public}d InterruptTransferWrite=%{public}d",
388 __LINE__, ret);
389 EXPECT_NE(ret, 0);
390 }
391 } // namespace
392