• 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 "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