1/*
2 * Copyright (c) 2021-2024 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#include <iostream>
16#include <vector>
17
18#include "hdf_log.h"
19#include "usbd_device_test.h"
20#include "v1_1/iusb_interface.h"
21#include "v1_1/usb_types.h"
22
23using namespace testing::ext;
24using namespace OHOS;
25using namespace OHOS::USB;
26using namespace std;
27using namespace OHOS::HDI::Usb::V1_0;
28using namespace OHOS::HDI::Usb::V1_1;
29
30const int SLEEP_TIME = 3;
31const uint8_t BUS_NUM_INVALID = 255;
32const uint8_t DEV_ADDR_INVALID = 255;
33sptr<UsbSubscriberTest> UsbdDeviceTest::subscriber_ = nullptr;
34
35namespace {
36sptr<OHOS::HDI::Usb::V1_1::IUsbInterface> g_usbInterface = nullptr;
37
38struct UsbDev UsbdDeviceTest::dev_ = { 0, 0 };
39
40int32_t SwitchErrCode(int32_t ret)
41{
42    return ret == HDF_ERR_NOT_SUPPORT ? HDF_SUCCESS : ret;
43}
44
45void UsbdDeviceTest::SetUpTestCase(void)
46{
47    g_usbInterface = OHOS::HDI::Usb::V1_1::IUsbInterface::Get();
48    if (g_usbInterface == nullptr) {
49        HDF_LOGE("%{public}s:IUsbInterface::Get() failed.", __func__);
50        exit(0);
51    }
52    auto ret = g_usbInterface->SetPortRole(1, 1, 1);
53    sleep(SLEEP_TIME);
54    HDF_LOGI("UsbdDeviceTest::[Device] %{public}d SetPortRole=%{public}d", __LINE__, ret);
55    ret = SwitchErrCode(ret);
56    ASSERT_EQ(0, ret);
57    if (ret != 0) {
58        exit(0);
59    }
60
61    subscriber_ = new UsbSubscriberTest();
62    if (g_usbInterface->BindUsbdSubscriber(subscriber_) != HDF_SUCCESS) {
63        HDF_LOGE("%{public}s: bind usbd subscriber_ failed\n", __func__);
64        exit(0);
65    }
66    dev_ = { subscriber_->busNum_, subscriber_->devAddr_ };
67
68    std::cout << "please connect device, press enter to continue" << std::endl;
69    int c;
70    while ((c = getchar()) != '\n' && c != EOF) {
71    }
72}
73
74void UsbdDeviceTest::TearDownTestCase(void)
75{
76    g_usbInterface->UnbindUsbdSubscriber(subscriber_);
77}
78
79void UsbdDeviceTest::SetUp(void) {}
80
81void UsbdDeviceTest::TearDown(void) {}
82
83/**
84 * @tc.name: SUB_USB_HostManager_HDI_Func_0100
85 * @tc.desc: Test functions to OpenDevice
86 * @tc.desc: int32_t OpenDevice(const UsbDev &dev);
87 * @tc.desc: Positive test: parameters correctly
88 * @tc.type: FUNC
89 */
90HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Func_0100, Function | MediumTest | Level1)
91{
92    struct UsbDev dev = dev_;
93    auto ret = g_usbInterface->OpenDevice(dev);
94    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result =%{public}d", __LINE__, ret);
95    ASSERT_EQ(0, ret);
96}
97
98/**
99 * @tc.name: SUB_USB_HostManager_HDI_Compatibility_0100
100 * @tc.desc: Test functions to OpenDevice
101 * @tc.desc: int32_t OpenDevice(const UsbDev &dev);
102 * @tc.desc: Negative test: parameters exception, busNum error
103 * @tc.type: FUNC
104 */
105HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Compatibility_0100, Function | MediumTest | Level1)
106{
107    struct UsbDev dev = { BUS_NUM_INVALID, dev_.devAddr };
108    auto ret = g_usbInterface->OpenDevice(dev);
109    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
110    ASSERT_NE(ret, 0);
111}
112
113/**
114 * @tc.name: SUB_USB_HostManager_HDI_Compatibility_0200
115 * @tc.desc: Test functions to OpenDevice
116 * @tc.desc: int32_t OpenDevice(const UsbDev &dev);
117 * @tc.desc: Negative test: parameters exception, devAddr error
118 * @tc.type: FUNC
119 */
120HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Compatibility_0200, Function | MediumTest | Level1)
121{
122    struct UsbDev dev = { dev_.busNum, DEV_ADDR_INVALID };
123    auto ret = g_usbInterface->OpenDevice(dev);
124    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
125    ASSERT_NE(ret, 0);
126}
127
128/**
129 * @tc.name: SUB_USB_HostManager_HDI_Compatibility_0300
130 * @tc.desc: Test functions to OpenDevice
131 * @tc.desc: int32_t OpenDevice(const UsbDev &dev);
132 * @tc.desc: Negative test: parameters exception, busNum && devAddr error
133 * @tc.type: FUNC
134 */
135HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Compatibility_0300, Function | MediumTest | Level1)
136{
137    struct UsbDev dev = { BUS_NUM_INVALID, DEV_ADDR_INVALID };
138    auto ret = g_usbInterface->OpenDevice(dev);
139    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
140    ASSERT_NE(ret, 0);
141}
142
143/**********************************************************************************************************/
144
145/**
146 * @tc.name: SUB_USB_HostManager_HDI_Func_1400
147 * @tc.desc: Test functions to CloseDevice
148 * @tc.desc: int32_t CloseDevice(const UsbDev &dev);
149 * @tc.desc: Positive test: parameters correctly
150 * @tc.type: FUNC
151 */
152HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Func_1400, Function | MediumTest | Level1)
153{
154    struct UsbDev dev = dev_;
155    auto ret = g_usbInterface->OpenDevice(dev);
156    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
157    ASSERT_EQ(0, ret);
158    ret = g_usbInterface->CloseDevice(dev);
159    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
160    ASSERT_EQ(0, ret);
161}
162
163/**
164 * @tc.name: SUB_USB_HostManager_HDI_Compatibility_7000
165 * @tc.desc: Test functions to CloseDevice
166 * @tc.desc: int32_t CloseDevice(const UsbDev &dev);
167 * @tc.desc: Negative test: parameters exception, busNum error
168 * @tc.type: FUNC
169 */
170HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Compatibility_7000, Function | MediumTest | Level1)
171{
172    struct UsbDev dev = dev_;
173    auto ret = g_usbInterface->OpenDevice(dev);
174    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
175    ASSERT_EQ(0, ret);
176    dev.busNum = BUS_NUM_INVALID;
177    ret = g_usbInterface->CloseDevice(dev);
178    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
179    ASSERT_NE(ret, 0);
180    dev = dev_;
181    g_usbInterface->CloseDevice(dev);
182}
183
184/**
185 * @tc.name: SUB_USB_HostManager_HDI_Compatibility_7100
186 * @tc.desc: Test functions to CloseDevice
187 * @tc.desc: int32_t CloseDevice(const UsbDev &dev);
188 * @tc.desc: Negative test: parameters exception, devAddr error
189 * @tc.type: FUNC
190 */
191HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Compatibility_7100, Function | MediumTest | Level1)
192{
193    struct UsbDev dev = dev_;
194    auto ret = g_usbInterface->OpenDevice(dev);
195    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
196    ASSERT_EQ(0, ret);
197    dev.devAddr = DEV_ADDR_INVALID;
198    ret = g_usbInterface->CloseDevice(dev);
199    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
200    ASSERT_NE(ret, 0);
201    dev = dev_;
202    g_usbInterface->CloseDevice(dev);
203}
204
205/**
206 * @tc.name: SUB_USB_HostManager_HDI_Compatibility_7200
207 * @tc.desc: Test functions to CloseDevice
208 * @tc.desc: int32_t CloseDevice(const UsbDev &dev);
209 * @tc.desc: Negative test: parameters exception, busNum && devAddr error
210 * @tc.type: FUNC
211 */
212HWTEST_F(UsbdDeviceTest, SUB_USB_HostManager_HDI_Compatibility_7200, Function | MediumTest | Level1)
213{
214    struct UsbDev dev = dev_;
215    auto ret = g_usbInterface->OpenDevice(dev);
216    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
217    ASSERT_EQ(0, ret);
218    dev.busNum = BUS_NUM_INVALID;
219    dev.devAddr = DEV_ADDR_INVALID;
220    ret = g_usbInterface->CloseDevice(dev);
221    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
222    ASSERT_NE(ret, 0);
223    dev = dev_;
224    g_usbInterface->CloseDevice(dev);
225}
226
227/**
228 * @tc.number   : SUB_USB_HostManager_HDI_Func_1900
229 * @tc.name     : UsbdResetDevice001
230 * @tc.desc     : int32_t ResetDevice(const UsbDev &dev)
231 * @tc.desc     : Positive test: parameters correctly
232 * @tc.size     : MediumTest
233 * @tc.type     : Function
234 * @tc.level    : Level 3
235 */
236HWTEST_F(UsbdDeviceTest, UsbdResetDevice001, Function | MediumTest | Level1)
237{
238    struct UsbDev dev = dev_;
239    auto ret = g_usbInterface->OpenDevice(dev);
240    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
241    ASSERT_EQ(0, ret);
242    ret = g_usbInterface->ResetDevice(dev);
243    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d UsbdResetDevice001 result=%{public}d", __LINE__, ret);
244    ASSERT_EQ(0, ret);
245    ret = g_usbInterface->CloseDevice(dev);
246    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
247    ASSERT_EQ(0, ret);
248}
249
250/**
251 * @tc.number   : SUB_USB_HostManager_HDI_Compatibility_9000
252 * @tc.name     : UsbdResetDevice002
253 * @tc.desc     : int32_t ResetDevice(const UsbDev &dev)
254 * @tc.desc     : Negative test
255 * @tc.size     : MediumTest
256 * @tc.type     : Function
257 * @tc.level    : Level 3
258 */
259HWTEST_F(UsbdDeviceTest, UsbdResetDevice002, Function | MediumTest | Level1)
260{
261    struct UsbDev dev = dev_;
262    auto ret = g_usbInterface->OpenDevice(dev);
263    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
264    ASSERT_EQ(0, ret);
265    dev.busNum = BUS_NUM_INVALID;
266    ret = g_usbInterface->ResetDevice(dev);
267    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d UsbdResetDevice002 result=%{public}d", __LINE__, ret);
268    ASSERT_NE(0, ret);
269    ret = g_usbInterface->CloseDevice(dev);
270    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
271    ASSERT_NE(ret, 0);
272    dev = dev_;
273    g_usbInterface->CloseDevice(dev);
274}
275
276/**
277 * @tc.number   : SUB_USB_HostManager_HDI_Compatibility_9100
278 * @tc.name     : UsbdResetDevice003
279 * @tc.desc     : int32_t ResetDevice(const UsbDev &dev)
280 * @tc.desc     : Negative test
281 * @tc.size     : MediumTest
282 * @tc.type     : Function
283 * @tc.level    : Level 3
284 */
285HWTEST_F(UsbdDeviceTest, UsbdResetDevice003, Function | MediumTest | Level1)
286{
287    struct UsbDev dev = dev_;
288    auto ret = g_usbInterface->OpenDevice(dev);
289    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
290    ASSERT_EQ(0, ret);
291    dev.devAddr = DEV_ADDR_INVALID;
292    ret = g_usbInterface->ResetDevice(dev);
293    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d UsbdResetDevice003 result=%{public}d", __LINE__, ret);
294    ASSERT_NE(0, ret);
295    ret = g_usbInterface->CloseDevice(dev);
296    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
297    ASSERT_NE(ret, 0);
298    dev = dev_;
299    g_usbInterface->CloseDevice(dev);
300}
301
302/**
303 * @tc.number   : SUB_USB_HostManager_HDI_Compatibility_9200
304 * @tc.name     : UsbdResetDevice004
305 * @tc.desc     : int32_t ResetDevice(const UsbDev &dev)
306 * @tc.desc     : Negative test
307 * @tc.size     : MediumTest
308 * @tc.type     : Function
309 * @tc.level    : Level 3
310 */
311HWTEST_F(UsbdDeviceTest, UsbdResetDevice004, Function | MediumTest | Level1)
312{
313    struct UsbDev dev = dev_;
314    auto ret = g_usbInterface->OpenDevice(dev);
315    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d OpenDevice result=%{public}d", __LINE__, ret);
316    ASSERT_EQ(0, ret);
317    dev.busNum = BUS_NUM_INVALID;
318    dev.devAddr = DEV_ADDR_INVALID;
319    ret = g_usbInterface->ResetDevice(dev);
320    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d UsbdResetDevice004 result=%{public}d", __LINE__, ret);
321    ASSERT_NE(0, ret);
322    ret = g_usbInterface->CloseDevice(dev);
323    HDF_LOGI("UsbdDeviceTest:: Line:%{public}d Close result=%{public}d", __LINE__, ret);
324    ASSERT_NE(ret, 0);
325    dev = dev_;
326    g_usbInterface->CloseDevice(dev);
327}
328} // namespace