• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "usb_submit_transfer_bulk_test.h"
17 
18 #include <thread>
19 #include <mutex>
20 #include <functional>
21 #include <condition_variable>
22 #include <atomic>
23 #include <csignal>
24 #include <iostream>
25 #include <vector>
26 
27 #include "if_system_ability_manager.h"
28 #include "ipc_skeleton.h"
29 #include "iservice_registry.h"
30 #include "iusb_srv.h"
31 #include "system_ability_definition.h"
32 #include "usb_common.h"
33 #include "usb_common_test.h"
34 #include "usb_device_pipe.h"
35 #include "usb_request.h"
36 #include "usb_srv_client.h"
37 #include "v1_2/usb_types.h"
38 #include "usb_errors.h"
39 #include "ashmem.h"
40 
41 using namespace testing::ext;
42 using namespace OHOS::USB;
43 using namespace OHOS;
44 using namespace std;
45 using namespace OHOS::USB::Common;
46 
47 namespace OHOS {
48 namespace USB {
49 namespace SubmitTransfer {
50 constexpr int32_t SLEEP_TIME = 3;
51 constexpr int32_t TIMEOUT = 2000;
52 std::mutex g_mtx;                                     // 全局互斥锁,用于保护共享资源
53 std::condition_variable g_cv;                         // 条件变量,用于线程间的同步
54 std::vector<bool> g_threadSuccessFlags;               // 用于标记每个线程是否成功完成操作
55 std::atomic<int32_t> g_completedThreads(0);           // 用于标记线程完成数量
56 std::atomic<int32_t> g_successCount(0);               // 用于统计 ASSERT_EQ(ret, UEC_OK) 成功的次数
57 
SetUpTestCase(void)58 void UsbSubmitTransferBulkTest::SetUpTestCase(void)
59 {
60     UsbCommonTest::GrantPermissionSysNative();
61     auto &srvClient = UsbSrvClient::GetInstance();
62     auto ret = srvClient.SetPortRole(1, 1, 1);
63     sleep(SLEEP_TIME);
64     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkTest:: [Device] SetPortRole:%{public}d", ret);
65     ret = UsbCommonTest::SwitchErrCode(ret);
66     ASSERT_TRUE(ret == 0);
67     if (ret != 0) {
68         exit(0);
69     }
70     std::cout << "please connect device, press enter to continue" << std::endl;
71     int c;
72     do {
73         c = getchar();
74     } while (c != '\n' && c != EOF);
75     USB_HILOGI(MODULE_USB_SERVICE, "Start UsbSubmitTransferBulkTest");
76 }
77 
TearDownTestCase(void)78 void UsbSubmitTransferBulkTest::TearDownTestCase(void)
79 {
80     USB_HILOGI(MODULE_USB_SERVICE, "End UsbSubmitTransferBulkTest");
81 }
82 
SetUp(void)83 void UsbSubmitTransferBulkTest::SetUp(void) {}
84 
TearDown(void)85 void UsbSubmitTransferBulkTest::TearDown(void) {}
86 
UsbSubmitTransferBulkWriteThreadFunc(int32_t threadId)87 void UsbSubmitTransferBulkWriteThreadFunc(int32_t threadId)
88 {
89     std::unique_lock<std::mutex> lock(g_mtx);
90     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite enter.");
91     vector<UsbDevice> devi;
92     auto &UsbSrvClient = UsbSrvClient::GetInstance();
93     auto ret = UsbSrvClient.GetDevices(devi);
94     EXPECT_TRUE(!(devi.empty())) << "delist NULL";
95     USBDevicePipe pipe;
96     UsbDevice device = devi.front();
97     UsbSrvClient.RequestRight(device.GetName());
98     ret = UsbSrvClient.OpenDevice(device, pipe);
99     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d OpenDevice=%{public}d", __LINE__,
100                ret);
101     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
102     USBEndpoint point = interface.GetEndpoints().front();
103     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d point=%{public}d", __LINE__,
104                point.GetInterfaceId());
105     ret = UsbSrvClient.ClaimInterface(pipe, interface, true);
106     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
107     ASSERT_NE(ashmem, nullptr);
108     const uint8_t dataToWrite[TEN] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
109     ashmem->MapReadAndWriteAshmem();
110     bool writeSuccess = ashmem->WriteToAshmem(dataToWrite, sizeof(dataToWrite), 0);
111     ASSERT_TRUE(writeSuccess);
112     HDI::Usb::V1_2::USBTransferInfo transferInfo;
113     transferInfo.endpoint = 0x01;    // 0x01写 0x81读
114     transferInfo.flags = 0;
115     transferInfo.type = TYPE_BULK; // 开发板仅支持bulk
116     transferInfo.timeOut = TIMEOUT;
117     transferInfo.length = TEN;        // 期望长度
118     transferInfo.userData = 0;
119     transferInfo.numIsoPackets = 0;  // iso传输包数量 iso单包传输最大长度192
120     auto callback = [](const TransferCallbackInfo &info,
121         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {};
122     ret = UsbSrvClient.UsbSubmitTransfer(pipe, transferInfo, callback, ashmem);
123     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbSubmitTransferBulkWrite ret:%{public}d", __LINE__, ret);
124     if (ret == UEC_OK) {
125         g_successCount++;
126     }
127     ASSERT_EQ(ret, UEC_OK);
128     bool close = UsbSrvClient.Close(pipe);
129     EXPECT_TRUE(close);
130     lock.unlock();
131     g_threadSuccessFlags[threadId] = true;
132     g_completedThreads++;
133     g_cv.notify_one();
134     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite end.");
135 }
136 
137 HWTEST_F(UsbSubmitTransferBulkTest, UsbSubmitTransferBulkWriteConcurrent, TestSize.Level1)
138 {
139     int32_t numThreads = 5;  // 并发线程数量
140     g_threadSuccessFlags.resize(numThreads);
141     std::vector<std::thread> threads;
142     // 启动多个线程
143     for (int32_t i = 0; i < numThreads; ++i) {
__anon2351f4f80202() 144         threads.emplace_back([i]() { UsbSubmitTransferBulkWriteThreadFunc(i); });
145     }
146     // 等待所有线程完成
147     std::unique_lock<std::mutex> lock(g_mtx);
__anon2351f4f80302null148     g_cv.wait(lock, [numThreads]{ return g_completedThreads == numThreads; });
149     // 清理资源和验证结果
150     for (auto& t : threads) {
151         t.join();
152     }
153     // 检查是否所有线程都成功完成操作
154     for (int32_t i = 0; i < numThreads; ++i) {
155         EXPECT_TRUE(g_threadSuccessFlags[i]) << "Thread " << i << " did not complete successfully.";
156     }
157     // 检查是否所有的 ASSERT_EQ(ret, UEC_OK) 都成功
158     EXPECT_EQ(g_successCount, numThreads) << "Not all UsbSubmitTransfer calls returned UEC_OK.";
159 }
160 
161 /**
162  * @tc.name: UsbSubmitTransferBulkWrite
163  * @tc.desc: Test the USB data write functionality of UsbSubmitTransfer OK.
164  * @tc.type: FUNC
165  */
166 HWTEST_F(UsbSubmitTransferBulkTest, UsbSubmitTransferBulkWrite, TestSize.Level1)
167 {
168     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite enter.");
169     vector<UsbDevice> devi;
170     auto &UsbSrvClient = UsbSrvClient::GetInstance();
171     auto ret = UsbSrvClient.GetDevices(devi);
172     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d ret=%{public}d", __LINE__, ret);
173     EXPECT_TRUE(!(devi.empty())) << "delist NULL";
174     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d size=%{public}zu", __LINE__,
175                devi.size());
176     USBDevicePipe pipe;
177     UsbDevice device = devi.front();
178     UsbSrvClient.RequestRight(device.GetName());
179     ret = UsbSrvClient.OpenDevice(device, pipe);
180     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d OpenDevice=%{public}d", __LINE__,
181                ret);
182     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
183     USBEndpoint point = interface.GetEndpoints().front();
184     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d point=%{public}d", __LINE__,
185                point.GetInterfaceId());
186     ret = UsbSrvClient.ClaimInterface(pipe, interface, true);
187     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
188     ASSERT_NE(ashmem, nullptr);
189     const uint8_t dataToWrite[TEN] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
190     ashmem->MapReadAndWriteAshmem();
191     bool writeSuccess = ashmem->WriteToAshmem(dataToWrite, sizeof(dataToWrite), 0);
192     ASSERT_TRUE(writeSuccess);
193     HDI::Usb::V1_2::USBTransferInfo transferInfo;
194     transferInfo.endpoint = 0x01;    // 0x01写 0x81读
195     transferInfo.flags = 0;
196     transferInfo.type = TYPE_BULK;
197     transferInfo.timeOut = 2000;
198     transferInfo.length = TEN;        // 期望长度
199     transferInfo.userData = 0;
200     transferInfo.numIsoPackets = 0;  // iso传输包数量 iso单包传输最大长度192
201     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80402(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 202                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
203         USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite cb status:%{public}d,actualLength:%{public}d",
204             info.status, info.actualLength);
205     };
206     ret = UsbSrvClient.UsbSubmitTransfer(pipe, transferInfo, callback, ashmem);
207     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbSubmitTransferBulkWrite ret:%{public}d", __LINE__, ret);
208     ASSERT_EQ(ret, UEC_OK);
209     bool close = UsbSrvClient.Close(pipe);
210     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite %{public}d close=%{public}d", __LINE__, close);
211     EXPECT_TRUE(close);
212     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite end.");
213 }
214 
215 /**
216  * @tc.name: UsbSubmitTransferBulkWriteParamError
217  * @tc.desc: Test the USB data write functionality of UsbSubmitTransfer OK.
218  * @tc.type: FUNC
219  */
220 HWTEST_F(UsbSubmitTransferBulkTest, UsbSubmitTransferBulkWriteParamError, TestSize.Level1)
221 {
222     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteParamError enter.");
223     vector<UsbDevice> devi;
224     auto &UsbSrvClient = UsbSrvClient::GetInstance();
225     auto ret = UsbSrvClient.GetDevices(devi);
226     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteParamError %{public}d ret=%{public}d", __LINE__, ret);
227     EXPECT_TRUE(!(devi.empty())) << "delist NULL";
228     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteParamError %{public}d size=%{public}zu", __LINE__,
229                devi.size());
230     USBDevicePipe pipe;
231     UsbDevice device = devi.front();
232     UsbSrvClient.RequestRight(device.GetName());
233     ret = UsbSrvClient.OpenDevice(device, pipe);
234     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteParamError %{public}d OpenDevice=%{public}d", __LINE__,
235                ret);
236     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
237     USBEndpoint point = interface.GetEndpoints().front();
238     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteParamError %{public}d point=%{public}d", __LINE__,
239                point.GetInterfaceId());
240     ret = UsbSrvClient.ClaimInterface(pipe, interface, true);
241     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
242     ASSERT_NE(ashmem, nullptr);
243     const uint8_t dataToWrite[TEN] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
244     ashmem->MapReadAndWriteAshmem();
245     bool writeSuccess = ashmem->WriteToAshmem(dataToWrite, sizeof(dataToWrite), 0);
246     ASSERT_TRUE(writeSuccess);
247     HDI::Usb::V1_2::USBTransferInfo transferInfo;
248     transferInfo.endpoint = 0x01;    // 0x01写 0x81读
249     transferInfo.flags = 0;
250     transferInfo.type = 5;              // 错误类型
251     transferInfo.timeOut = 2000;
252     transferInfo.length = TEN;        // 期望长度
253     transferInfo.userData = 0;
254     transferInfo.numIsoPackets = 0;  // iso传输包数量 iso单包传输最大长度192
255     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80502(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 256                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
257         USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWrite cb status:%{public}d,actualLength:%{public}d",
258             info.status, info.actualLength);
259     };
260     ret = UsbSrvClient.UsbSubmitTransfer(pipe, transferInfo, callback, ashmem);
261     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. BulkWriteParamError ret:%{public}d", __LINE__, ret);
262     ASSERT_EQ(ret, OHEC_COMMON_PARAM_ERROR);
263     bool close = UsbSrvClient.Close(pipe);
264     EXPECT_TRUE(close);
265     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteParamError end.");
266 }
267 
268 /**
269  * @tc.name: UsbSubmitTransferBulkReadTimeOut
270  * @tc.desc: Test the USB data read functionality of UsbSubmitTransfer
271  * @tc.type: FUNC
272  */
273 HWTEST_F(UsbSubmitTransferBulkTest, UsbSubmitTransferBulkReadTimeOut, TestSize.Level1)
274 {
275     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkReadTimeOut enter.");
276 
277     vector<UsbDevice> delist;
278     auto &UsbSrvClient = UsbSrvClient::GetInstance();
279     auto ret = UsbSrvClient.GetDevices(delist);
280     EXPECT_TRUE(!(delist.empty())) << "Device list is empty";
281     UsbDevice device = delist.front();
282     ret = UsbSrvClient.RequestRight(device.GetName());
283     USBDevicePipe pip;
284     ret = UsbSrvClient.OpenDevice(device, pip);
285     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
286     USBEndpoint point = interface.GetEndpoints().front();
287     ret = UsbSrvClient.ClaimInterface(pip, interface, true);
288     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkReadTimeOut ClaimInterface ret%{public}d", ret);
289 
290     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
291     ASSERT_NE(ashmem, nullptr);
292     ashmem->MapReadAndWriteAshmem();
293 
294     HDI::Usb::V1_2::USBTransferInfo transferInfo;
295     transferInfo.endpoint = 0x81;    // 0x01写 0x81读
296     transferInfo.flags = 0;
297     transferInfo.type = TYPE_BULK; // 开发板仅支持bulk
298     transferInfo.timeOut = 2000;
299     transferInfo.length = TEN;        // 期望长度
300     transferInfo.userData = 0;
301     transferInfo.numIsoPackets = 0;  // iso传输包数量 iso单包传输最大长度192
302 
303     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80602(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 304                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
305         USB_HILOGI(MODULE_USB_SERVICE,
306             "UsbSubmitTransferBulkReadTimeOut Callback status: %{public}d, actualLength: %{public}d",
307             info.status, info.actualLength);
308     };
309 
310     ret = UsbSrvClient.UsbSubmitTransfer(pip, transferInfo, callback, ashmem);
311     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbSubmitTransferBulkReadTimeOut ret:%{public}d", __LINE__, ret);
312     ASSERT_EQ(ret, UEC_OK);
313 
314     bool close = UsbSrvClient.Close(pip);
315     EXPECT_TRUE(close);
316     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkReadTimeOut end.");
317 }
318 
319 /**
320  * @tc.name: UsbSubmitTransferBulkWriteIOError
321  * @tc.desc: Test the USB data write functionality of UsbSubmitTransfer with invalid endpoint type
322  * @tc.type: FUNC
323  */
324 HWTEST_F(UsbSubmitTransferBulkTest, UsbSubmitTransferBulkWriteIOError, TestSize.Level1)
325 {
326     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteIOError begin.");
327 
328     vector<UsbDevice> delist;
329     auto &UsbSrvClient = UsbSrvClient::GetInstance();
330     auto ret = UsbSrvClient.GetDevices(delist);
331     EXPECT_TRUE(!(delist.empty())) << "Device list is empty";
332     UsbDevice device = delist.front();
333     ret = UsbSrvClient.RequestRight(device.GetName());
334     USBDevicePipe pip;
335     ret = UsbSrvClient.OpenDevice(device, pip);
336     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
337     USBEndpoint point = interface.GetEndpoints().front();
338     ret = UsbSrvClient.ClaimInterface(pip, interface, true);
339     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbSubmitTransferBulkWriteIOError ret:%{public}d",
340         __LINE__, ret);
341 
342     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
343     ASSERT_NE(ashmem, nullptr);
344     const uint8_t dataToWrite[TEN] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
345     ashmem->MapReadAndWriteAshmem();
346     bool writeSuccess = ashmem->WriteToAshmem(dataToWrite, sizeof(dataToWrite), 0);
347     ASSERT_TRUE(writeSuccess);
348     HDI::Usb::V1_2::USBTransferInfo transferInfo;
349     transferInfo.endpoint = 0xFF;    //无效参数
350     transferInfo.flags = 0;
351     transferInfo.type = TYPE_BULK; // 开发板仅支持bulk
352     transferInfo.timeOut = 2000;
353     transferInfo.length = TEN;        // 期望长度
354     transferInfo.userData = 0;
355     transferInfo.numIsoPackets = 0;  // iso传输包数量 iso单包传输最大长度192
356 
357     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80702(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 358                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
359         USB_HILOGI(MODULE_USB_SERVICE,
360             "UsbSubmitTransferBulkWriteIOError cb status: %{public}d, actualLength: %{public}d",
361             info.status, info.actualLength);
362     };
363     ret = UsbSrvClient.UsbSubmitTransfer(pip, transferInfo, callback, ashmem);
364     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbSubmitTransferBulkWriteIOError ret=%{public}d",
365         __LINE__, ret);
366     ASSERT_EQ(ret, USB_SUBMIT_TRANSFER_IO_ERROR);
367     bool close = UsbSrvClient.Close(pip);
368     EXPECT_TRUE(close);
369     USB_HILOGI(MODULE_USB_SERVICE, "UsbSubmitTransferBulkWriteIOError end.");
370 }
371 
372 /**
373  * @tc.name: UsbCancelTransferBulkWrite
374  * @tc.desc: Test the functionality of UsbCancelTransfer for write operation
375  * @tc.type: FUNC
376  */
377 HWTEST_F(UsbSubmitTransferBulkTest, UsbCancelTransferBulkWrite, TestSize.Level1)
378 {
379     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWrite enter.");
380     vector<UsbDevice> delist;
381     auto &UsbSrvClient = UsbSrvClient::GetInstance();
382     auto ret = UsbSrvClient.GetDevices(delist);
383     EXPECT_TRUE(!(delist.empty())) << "Device list is empty";
384     UsbDevice device = delist.front();
385     ret = UsbSrvClient.RequestRight(device.GetName());
386     USBDevicePipe pip;
387     ret = UsbSrvClient.OpenDevice(device, pip);
388 
389     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
390     USBEndpoint point = interface.GetEndpoints().front();
391     ret = UsbSrvClient.ClaimInterface(pip, interface, true);
392     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWrite ClaimInterface %{public}d ret:%{public}d",
393         __LINE__, ret);
394 
395     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
396     ASSERT_NE(ashmem, nullptr);
397     const uint8_t dataToWrite[TEN] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
398     ashmem->MapReadAndWriteAshmem();
399     bool writeSuccess = ashmem->WriteToAshmem(dataToWrite, TEN, 0);
400     ASSERT_TRUE(writeSuccess);
401 
402     HDI::Usb::V1_2::USBTransferInfo transferInfo;
403     transferInfo.endpoint = 0x01;    // 写操作
404     transferInfo.flags = 0;
405     transferInfo.type = TYPE_BULK; // 开发板不支持ISO传输类型
406     transferInfo.timeOut = 0;        // 设置超时时间
407     transferInfo.length = TEN;        // 设置传输数据的长度
408     transferInfo.userData = 0;
409     transferInfo.numIsoPackets = 0;  // 只有type为1有iso
410 
411     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80802(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 412                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
413         USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWrite cb status:%{public}d,actualLength:%{public}d",
414             info.status, info.actualLength);
415     };
416     ret = UsbSrvClient.UsbSubmitTransfer(pip, transferInfo, callback, ashmem);
417     ASSERT_EQ(ret, UEC_OK);
418     // 取消写操作
419     ret = UsbSrvClient.UsbCancelTransfer(pip, transferInfo.endpoint);
420     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbCancelTransferBulkWrite ret:%{public}d", __LINE__, ret);
421     if (ret == USB_SUBMIT_TRANSFER_NOT_FOUND_ERROR) {
422         USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. Transfer has been canceled ret:%{public}d", __LINE__, ret);
423         ret = UEC_OK;
424     }
425     ASSERT_EQ(ret, UEC_OK);
426 
427     bool close = UsbSrvClient.Close(pip);
428     EXPECT_TRUE(close);
429     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWrite end.");
430 }
431 
432 /**
433  * @tc.name: UsbCancelTransferBulkWriteNotFound
434  * @tc.desc: Test the functionality of UsbCancelTransfer for write operation
435  * @tc.type: FUNC
436  */
437 HWTEST_F(UsbSubmitTransferBulkTest, UsbCancelTransferBulkWriteNotFound, TestSize.Level1)
438 {
439     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWriteNotFound enter.");
440     vector<UsbDevice> delist;
441     auto &UsbSrvClient = UsbSrvClient::GetInstance();
442     auto ret = UsbSrvClient.GetDevices(delist);
443     EXPECT_TRUE(!(delist.empty())) << "Device list is empty";
444     UsbDevice device = delist.front();
445     ret = UsbSrvClient.RequestRight(device.GetName());
446     USBDevicePipe pip;
447     ret = UsbSrvClient.OpenDevice(device, pip);
448 
449     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
450     USBEndpoint point = interface.GetEndpoints().front();
451     ret = UsbSrvClient.ClaimInterface(pip, interface, true);
452     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWrite ClaimInterface %{public}d ret:%{public}d",
453         __LINE__, ret);
454 
455     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
456     ASSERT_NE(ashmem, nullptr);
457     const uint8_t dataToWrite[TEN] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
458     ashmem->MapReadAndWriteAshmem();
459     bool writeSuccess = ashmem->WriteToAshmem(dataToWrite, TEN, 0);
460     ASSERT_TRUE(writeSuccess);
461 
462     HDI::Usb::V1_2::USBTransferInfo transferInfo;
463     transferInfo.endpoint = 0x01;    // 写操作
464     transferInfo.flags = 0;
465     transferInfo.type = TYPE_BULK; // 开发板不支持ISO传输类型
466     transferInfo.timeOut = 0;        // 设置超时时间
467     transferInfo.length = TEN;        // 设置传输数据的长度
468     transferInfo.userData = 0;
469     transferInfo.numIsoPackets = 0;  // 只有type为1有iso
470 
471     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80902(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 472                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
473         USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWrite cb status:%{public}d,actualLength:%{public}d",
474             info.status, info.actualLength);
475     };
476     ret = UsbSrvClient.UsbSubmitTransfer(pip, transferInfo, callback, ashmem);
477     ASSERT_EQ(ret, UEC_OK);
478     // 取消写操作
479     UsbSrvClient.UsbCancelTransfer(pip, transferInfo.endpoint);
480     // 再次调用取消
481     ret = UsbSrvClient.UsbCancelTransfer(pip, transferInfo.endpoint);
482     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbCancelTransferBulkWrite ret:%{public}d", __LINE__, ret);
483     ASSERT_EQ(ret, USB_SUBMIT_TRANSFER_NOT_FOUND_ERROR);
484 
485     bool close = UsbSrvClient.Close(pip);
486     EXPECT_TRUE(close);
487     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkWriteNotFound end.");
488 }
489 
490 /**
491  * @tc.name: UsbCancelTransferBulkRead
492  * @tc.desc: Test the functionality of UsbCancelTransfer for read operation
493  * @tc.type: FUNC
494  */
495 HWTEST_F(UsbSubmitTransferBulkTest, UsbCancelTransferBulkRead, TestSize.Level1)
496 {
497     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkRead enter.");
498     vector<UsbDevice> delist;
499     auto &UsbSrvClient = UsbSrvClient::GetInstance();
500     auto ret = UsbSrvClient.GetDevices(delist);
501     EXPECT_TRUE(!(delist.empty())) << "Device list is empty";
502     UsbDevice device = delist.front();
503     ret = UsbSrvClient.RequestRight(device.GetName());
504     USBDevicePipe pip;
505     ret = UsbSrvClient.OpenDevice(device, pip);
506     UsbInterface interface = device.GetConfigs().front().GetInterfaces().at(0);
507     USBEndpoint point = interface.GetEndpoints().front();
508     ret = UsbSrvClient.ClaimInterface(pip, interface, true);
509     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbCancelTransferBulkRead ClaimInterface ret: %{public}d",
510         __LINE__, ret);
511 
512     sptr<Ashmem> ashmem = Ashmem::CreateAshmem("usb_shared_memory", TEN);
513     ASSERT_NE(ashmem, nullptr);
514     ashmem->MapReadAndWriteAshmem();
515 
516     HDI::Usb::V1_2::USBTransferInfo transferInfo;
517     transferInfo.endpoint = 0x81;    // 读操作
518     transferInfo.flags = 0;
519     transferInfo.type = TYPE_BULK; // 开发板不支持ISO传输类型
520     transferInfo.timeOut = 0;        // 设置超时时间
521     transferInfo.length = TEN;        // 设置传输数据的长度
522     transferInfo.userData = 0;
523     transferInfo.numIsoPackets = 0;  // 只有type为1有iso
524 
525     auto callback = [](const TransferCallbackInfo &info,
__anon2351f4f80a02(const TransferCallbackInfo &info, const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) 526                         const std::vector<HDI::Usb::V1_2::UsbIsoPacketDescriptor> &packets, uint64_t userData) {
527         USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkRead cb status:%{public}d,actualLength: %{public}d",
528             info.status, info.actualLength);
529     };
530 
531     ret = UsbSrvClient.UsbSubmitTransfer(pip, transferInfo, callback, ashmem);
532     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbCancelTransferBulkRead ret: %{public}d", __LINE__, ret);
533     ASSERT_EQ(ret, UEC_OK);
534 
535     // 取消读操作
536     ret = UsbSrvClient.UsbCancelTransfer(pip, transferInfo.endpoint);
537     USB_HILOGI(MODULE_USB_SERVICE, "%{public}d line. UsbCancelTransferBulkRead ret: %{public}d", __LINE__, ret);
538     ASSERT_EQ(ret, UEC_OK);
539 
540     bool close = UsbSrvClient.Close(pip);
541     EXPECT_TRUE(close);
542     USB_HILOGI(MODULE_USB_SERVICE, "UsbCancelTransferBulkRead end.");
543 }
544 
545 } // namespace SubmitTransfer
546 } // namespace USB
547 } // namespace OHOS