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