1/*
2 * Copyright (c) 2023 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 <gtest/gtest.h>
17#include <iostream>
18#include "UsbSubscriberTest.h"
19#include "hdf_log.h"
20#include "usbd_type.h"
21#include "v1_0/iusbd_subscriber.h"
22#include "v1_0/iusb_interface.h"
23#include "v1_0/usb_types.h"
24
25using OHOS::HDI::Usb::V1_0::UsbDev;
26
27namespace {
28const uint8_t INDEX_0 = 0;
29const uint8_t INDEX_1 = 1;
30const uint8_t INDEX_INVALID = 255;
31const uint8_t BUS_NUM_INVALID = 255;
32const uint8_t DEV_ADDR_INVALID = 255;
33const uint8_t INTERFACEID_OK = 1;
34const uint8_t INTERFACEID_INVALID = 255;
35const int SLEEP_TIME = 3;
36class UsbdInterfaceTest : public testing::Test {
37public:
38    static void SetUpTestCase();
39    static void TearDownTestCase();
40
41    static UsbDev dev_;
42    static OHOS::sptr<OHOS::USB::UsbSubscriberTest> subscriber_;
43};
44UsbDev UsbdInterfaceTest::dev_ = {0, 0};
45OHOS::sptr<OHOS::USB::UsbSubscriberTest> UsbdInterfaceTest::subscriber_ = nullptr;
46
47using namespace testing::ext;
48using namespace OHOS;
49using namespace OHOS::USB;
50using namespace std;
51using namespace OHOS::HDI::Usb::V1_0;
52
53sptr<IUsbInterface> g_usbInterface = nullptr;
54
55int32_t SwitchErrCode(int32_t ret)
56{
57    return ret == HDF_ERR_NOT_SUPPORT ? HDF_SUCCESS : ret;
58}
59
60void UsbdInterfaceTest::SetUpTestCase(void)
61{
62    g_usbInterface = IUsbInterface::Get();
63    if (g_usbInterface == nullptr) {
64        HDF_LOGE("%{public}s:IUsbInterface::Get() failed.", __func__);
65        exit(0);
66    }
67    auto ret = g_usbInterface->SetPortRole(1, 1, 1);
68    sleep(SLEEP_TIME);
69    HDF_LOGI("UsbdInterfaceTest::[Device] %{public}d SetPortRole=%{public}d", __LINE__, ret);
70    ret = SwitchErrCode(ret);
71    ASSERT_EQ(0, ret);
72    if (ret != 0) {
73        exit(0);
74    }
75
76    subscriber_ = new UsbSubscriberTest();
77    if (g_usbInterface->BindUsbdSubscriber(subscriber_) != HDF_SUCCESS) {
78        HDF_LOGE("%{public}s: bind usbd subscriber_ failed", __func__);
79        exit(0);
80    }
81
82    int c;
83    while ((c = getchar()) != '\n' && c != EOF) {}
84    dev_ = {subscriber_->busNum_, subscriber_->devAddr_};
85
86    ret = g_usbInterface->OpenDevice(dev_);
87    ASSERT_EQ(0, ret);
88    HDF_LOGI("UsbdInterfaceTest:: %{public}d OpenDevice=%{public}d", __LINE__, ret);
89    ret = g_usbInterface->ClaimInterface(dev_, 1, 1);
90    ASSERT_EQ(0, ret);
91}
92
93void UsbdInterfaceTest::TearDownTestCase(void)
94{
95    g_usbInterface->UnbindUsbdSubscriber(subscriber_);
96    dev_ = {subscriber_->busNum_, subscriber_->devAddr_};
97    auto ret = g_usbInterface->CloseDevice(dev_);
98    HDF_LOGI("UsbdInterfaceTest:: %{public}d Close=%{public}d", __LINE__, ret);
99    EXPECT_EQ(0, ret);
100}
101
102/**
103 * @tc.name: UsbdSetInterface001
104 * @tc.desc: Test functions to SetInterface
105 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
106 * @tc.desc: Positive test: parameters correctly
107 * @tc.type: FUNC
108 */
109HWTEST_F(UsbdInterfaceTest, UsbdSetInterface001, TestSize.Level1)
110{
111    uint8_t interfaceId = INTERFACEID_OK;
112    uint8_t altIndex = INDEX_0;
113    struct UsbDev dev = dev_;
114    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
115    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface001 %{public}d ret=%{public}d", __LINE__, ret);
116    EXPECT_EQ(0, ret);
117}
118
119/**
120 * @tc.name: UsbdSetInterface002
121 * @tc.desc: Test functions to SetInterface
122 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
123 * @tc.desc: Negative test: parameters exception, busNum error
124 * @tc.type: FUNC
125 */
126HWTEST_F(UsbdInterfaceTest, UsbdSetInterface002, TestSize.Level1)
127{
128    uint8_t interfaceId = INTERFACEID_OK;
129    uint8_t altIndex = INDEX_0;
130    struct UsbDev dev = dev_;
131    ;
132    dev.busNum = BUS_NUM_INVALID;
133    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
134    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface002 %{public}d ret=%{public}d", __LINE__, ret);
135    EXPECT_NE(ret, 0);
136}
137
138/**
139 * @tc.name: UsbdSetInterface003
140 * @tc.desc: Test functions to SetInterface
141 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
142 * @tc.desc: Negative test: parameters exception, devAddr error
143 * @tc.type: FUNC
144 */
145HWTEST_F(UsbdInterfaceTest, UsbdSetInterface003, TestSize.Level1)
146{
147    uint8_t interfaceId = INTERFACEID_OK;
148    uint8_t altIndex = INDEX_INVALID;
149    struct UsbDev dev = dev_;
150    dev.devAddr = DEV_ADDR_INVALID;
151    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
152    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface003 %{public}d ret=%{public}d", __LINE__, ret);
153    EXPECT_NE(ret, 0);
154}
155
156/**
157 * @tc.name: UsbdSetInterface004
158 * @tc.desc: Test functions to SetInterface
159 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
160 * @tc.desc: Negative test: parameters exception, interfaceId error
161 * @tc.type: FUNC
162 */
163HWTEST_F(UsbdInterfaceTest, UsbdSetInterface004, TestSize.Level1)
164{
165    uint8_t interfaceId = INTERFACEID_INVALID;
166    uint8_t altIndex = INDEX_INVALID;
167    struct UsbDev dev = dev_;
168    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
169    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface004 %{public}d ret=%{public}d", __LINE__, ret);
170    EXPECT_NE(ret, 0);
171}
172
173/**
174 * @tc.name: UsbdSetInterface005
175 * @tc.desc: Test functions to SetInterface
176 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
177 * @tc.desc: Negative test: parameters exception, busNum && devAddr error
178 * @tc.type: FUNC
179 */
180HWTEST_F(UsbdInterfaceTest, UsbdSetInterface005, TestSize.Level1)
181{
182    uint8_t interfaceId = INTERFACEID_OK;
183    uint8_t altIndex = INDEX_0;
184    struct UsbDev dev = dev_;
185    dev.busNum = BUS_NUM_INVALID;
186    dev.devAddr = DEV_ADDR_INVALID;
187    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
188    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface005 %{public}d ret=%{public}d", __LINE__, ret);
189    EXPECT_NE(ret, 0);
190}
191
192/**
193 * @tc.name: UsbdSetInterface006
194 * @tc.desc: Test functions to SetInterface
195 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
196 * @tc.desc: Negative test: parameters exception, busNum && interfaceId error
197 * @tc.type: FUNC
198 */
199HWTEST_F(UsbdInterfaceTest, UsbdSetInterface006, TestSize.Level1)
200{
201    int32_t interfaceId = INTERFACEID_INVALID;
202    uint8_t altIndex = INDEX_1;
203    struct UsbDev dev = dev_;
204    dev.busNum = BUS_NUM_INVALID;
205    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
206    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface006 %{public}d ret=%{public}d", __LINE__, ret);
207    EXPECT_NE(ret, 0);
208}
209
210/**
211 * @tc.name: UsbdSetInterface007
212 * @tc.desc: Test functions to SetInterface
213 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
214 * @tc.desc: Negative test: parameters exception, devAddr && interfaceId error
215 * @tc.type: FUNC
216 */
217HWTEST_F(UsbdInterfaceTest, UsbdSetInterface007, TestSize.Level1)
218{
219    int32_t interfaceId = INTERFACEID_INVALID;
220    uint8_t altIndex = INDEX_INVALID;
221    struct UsbDev dev = dev_;
222    dev.devAddr = DEV_ADDR_INVALID;
223    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
224    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface007 %{public}d ret=%{public}d", __LINE__, ret);
225    EXPECT_NE(ret, 0);
226}
227
228/**
229 * @tc.name: UsbdSetInterface008
230 * @tc.desc: Test functions to SetInterface
231 * @tc.desc: int32_t SetInterface(const UsbDev &dev, uint8_t interfaceId, uint8_t altIndex);
232 * @tc.desc: Negative test: parameters exception, busNum && devAddr && interfaceId error
233 * @tc.type: FUNC
234 */
235HWTEST_F(UsbdInterfaceTest, UsbdSetInterface008, TestSize.Level1)
236{
237    uint8_t altIndex = INDEX_INVALID;
238    int32_t interfaceId = INTERFACEID_INVALID;
239    struct UsbDev dev = dev_;
240    dev.busNum = BUS_NUM_INVALID;
241    dev.devAddr = DEV_ADDR_INVALID;
242    auto ret = g_usbInterface->SetInterface(dev, interfaceId, altIndex);
243    HDF_LOGI("UsbdInterfaceTest::UsbdSetInterface008 %{public}d ret=%{public}d", __LINE__, ret);
244    EXPECT_NE(ret, 0);
245}
246} // namespace