• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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