1 /*
2  * Copyright (c) 2021 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 #ifdef IPPOVERUSB_ENABLE
16 #include <gtest/gtest.h>
17 #define private public
18 #include "print_usb_manager.h"
19 #undef private
20 #include "print_ipp_over_usb_constant.h"
21 #include "print_log.h"
22 
23 using namespace testing::ext;
24 
25 namespace OHOS {
26 namespace Print {
27 static const std::string IPP_PRINTER =
28     R"({"busNum":2,"clazz":0,"configs":[{"attributes":192,"id":1,"interfaces":[{"alternateSetting":0,"clazz":7,)"\
29     R"("endpoints":[{"address":1,"attributes":2,"direction":0,"interfaceId":0,"interval":0,"maxPacketSize":512,)"\
30     R"("number":1,"type":2},{"address":129,"attributes":2,"direction":128,"interfaceId":0,"interval":0,)"\
31     R"("maxPacketSize":512,"number":1,"type":2}],"id":0,"name":"","protocol":2,"subClass":1},{"alternateSetting":0,)"\
32     R"("clazz":255,"endpoints":[{"address":2,"attributes":2,"direction":0,"interfaceId":1,"interval":0,)"\
33     R"("maxPacketSize":512,"number":2,"type":2},{"address":130,"attributes":2,"direction":128,"interfaceId":1,)"\
34     R"("interval":0,"maxPacketSize":512,"number":2,"type":2}],"id":1,"name":"","protocol":255,"subClass":255},)"\
35     R"({"alternateSetting":0,"clazz":7,"endpoints":[{"address":3,"attributes":2,"direction":0,"interfaceId":2,)"\
36     R"("interval":0,"maxPacketSize":512,"number":3,"type":2},{"address":131,"attributes":2,"direction":128,)"\
37     R"("interfaceId":2,"interval":0,"maxPacketSize":512,"number":3,"type":2}],"id":2,"name":"","protocol":4,)"\
38     R"("subClass":1},{"alternateSetting":0,"clazz":7,"endpoints":[{"address":4,"attributes":2,"direction":0,)"\
39     R"("interfaceId":3,"interval":0,"maxPacketSize":512,"number":4,"type":2},{"address":132,"attributes":2,)"\
40     R"("direction":128,"interfaceId":3,"interval":0,"maxPacketSize":512,"number":4,"type":2}],"id":3,"name":"",)"\
41     R"("protocol":4,"subClass":1},{"alternateSetting":0,"clazz":7,"endpoints":[{"address":5,"attributes":2,)"\
42     R"("direction":0,"interfaceId":4,"interval":0,"maxPacketSize":512,"number":5,"type":2},{"address":133,)"\
43     R"("attributes":2,"direction":128,"interfaceId":4,"interval":0,"maxPacketSize":512,"number":5,"type":2}],)"\
44     R"("id":4,"name":"","protocol":4,"subClass":1},{"alternateSetting":0,"clazz":7,"endpoints":[{"address":6,)"\
45     R"("attributes":2,"direction":0,"interfaceId":5,"interval":0,"maxPacketSize":512,"number":6,"type":2},)"\
46     R"({"address":134,"attributes":2,"direction":128,"interfaceId":5,"interval":0,"maxPacketSize":512,)"\
47     R"("number":6,"type":2}],"id":5,"name":" ","protocol":4,"subClass":1}],"isRemoteWakeup":false,)"\
48     R"("isSelfPowered":true,"maxPower":1,"name":" "}],"devAddress":5,"manufacturerName":" ","name":"2-5",)"\
49     R"("productId":4293,"productName":" ","protocol":0,"serial":"","subClass":0,"vendorId":4817,"version":"0404"})";
50 
51 static const std::string NON_IPP_PRINTER =
52     R"({"busNum":2,"clazz":0,"configs":[{"attributes":192,"id":1,"interfaces":[{"alternateSetting":0,"clazz":255,)"\
53     R"("endpoints":null,"id":0,"name":" ","protocol":255,"subClass":255}],"isRemoteWakeup":false,)"\
54     R"("isSelfPowered":true,"maxPower":0,"name":" "}],"devAddress":4,"manufacturerName":"Microchip Tech\u0000\u0000)"\
55     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
56     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
57     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
58     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
59     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
60     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
61     R"(\u0000\u0000\u0000","name":"2-4","productId":10048,"productName":"Hub Controller\u0000\u0000\u0000\u0000)"\
62     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
63     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
64     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
65     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
66     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
67     R"(\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000)"\
68     R"(\u0000", "protocol":0, "serial":"", "subClass":0, "vendorId":1060, "version":"0002"})";
69 
70 class PrintUsbManagerTest : public testing::Test {
71 public:
72     static void SetUpTestCase(void);
73     static void TearDownTestCase(void);
74     void SetUp();
75     void TearDown();
76 };
77 
SetUpTestCase(void)78 void PrintUsbManagerTest::SetUpTestCase(void)
79 {}
80 
TearDownTestCase(void)81 void PrintUsbManagerTest::TearDownTestCase(void)
82 {}
83 
SetUp(void)84 void PrintUsbManagerTest::SetUp(void)
85 {
86     static int32_t testNo = 0;
87     PRINT_HILOGI("PrintUsbManagerTest_%{public}d", ++testNo);
88 }
89 
TearDown(void)90 void PrintUsbManagerTest::TearDown(void)
91 {}
92 
93 /**
94  * @tc.name: PrintUsbManagerTest_001
95  * @tc.desc: Verify the Init function.
96  * @tc.type: FUNC
97  * @tc.require:
98  */
99 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_001, TestSize.Level1)
100 {
101     OHOS::Print::PrintUsbManager printUsbManager;
102     printUsbManager.isInit = false;
103     printUsbManager.isUsbEnable = false;
104     printUsbManager.Init();
105     EXPECT_EQ(true, printUsbManager.isInit);
106     printUsbManager.Init();
107     EXPECT_EQ(true, printUsbManager.isInit);
108 }
109 
110 /**
111  * @tc.name: PrintUsbManagerTest_002
112  * @tc.desc: Verify the isExistIppOverUsbPrinter function.
113  * @tc.type: FUNC
114  * @tc.require:
115  */
116 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_002, TestSize.Level1)
117 {
118     OHOS::Print::PrintUsbManager printUsbManager;
119     std::string printerName = "HUAWEI PixLab V1-0105";
120     OHOS::USB::UsbDevice usbDevice;
121     printUsbManager.printDeviceMap[printerName] = usbDevice;
122     bool ret = printUsbManager.isExistIppOverUsbPrinter(printerName);
123     EXPECT_EQ(true, ret);
124     printerName = "";
125     ret = printUsbManager.isExistIppOverUsbPrinter(printerName);
126     EXPECT_EQ(false, ret);
127 }
128 
129 /**
130  * @tc.name: PrintUsbManagerTest_003
131  * @tc.desc: Verify the isPrintDevice function.
132  * @tc.type: FUNC
133  * @tc.require:
134  */
135 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_003, TestSize.Level1)
136 {
137     OHOS::Print::PrintUsbManager printUsbManager;
138     printUsbManager.isUsbEnable = false;
139     OHOS::USB::UsbDevice usbDevice;
140     std::string printerName;
141     bool ret = printUsbManager.isPrintDevice(usbDevice, printerName);
142     EXPECT_EQ(false, ret);
143     printerName = "";
144     ret = printUsbManager.isPrintDevice(usbDevice, printerName);
145     EXPECT_EQ(false, ret);
146 }
147 
148 /**
149  * @tc.name: PrintUsbManagerTest_004
150  * @tc.desc: Verify the RefreshUsbPrinterDevice function.
151  * @tc.type: FUNC
152  * @tc.require:
153  */
154 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_004, TestSize.Level1)
155 {
156     OHOS::Print::PrintUsbManager printUsbManager;
157     printUsbManager.isUsbEnable = false;
158     vector<USB::UsbDevice> devlist;
159     int32_t ret = ERR_OK;
160     printUsbManager.RefreshUsbPrinterDevice();
161     if (printUsbManager.isUsbEnable) {
162         ret = USB::UsbSrvClient::GetInstance().GetDevices(devlist);
163     }
164     for (auto& dev : devlist) {
165         auto iter = printUsbManager.printDeviceMap.find(dev.GetName());
166         EXPECT_TRUE(iter != printUsbManager.printDeviceMap.end());
167     }
168     OHOS::USB::UsbDevice usbDevice;
169     printUsbManager.GetProductName(usbDevice);
170     printUsbManager.RefreshUsbPrinterDevice();
171 }
172 
173 /**
174  * @tc.name: PrintUsbManagerTest_005
175  * @tc.desc: Verify the GetProductName function.
176  * @tc.type: FUNC
177  * @tc.require:
178  */
179 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_005, TestSize.Level1)
180 {
181     OHOS::Print::PrintUsbManager printUsbManager;
182     printUsbManager.isUsbEnable = false;
183     OHOS::USB::UsbDevice usbDevice;
184     std::string printerName = printUsbManager.GetProductName(usbDevice);
185     EXPECT_EQ("-", printerName);
186     printUsbManager.isUsbEnable = true;
187     printerName = printUsbManager.GetProductName(usbDevice);
188 }
189 
190 /**
191  * @tc.name: PrintUsbManagerTest_006
192  * @tc.desc: Verify the QueryPrinterInfoFromStringDescriptor function.
193  * @tc.type: FUNC
194  * @tc.require:
195  */
196 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_006, TestSize.Level1)
197 {
198     OHOS::Print::PrintUsbManager printUsbManager;
199     printUsbManager.isUsbEnable = false;
200     OHOS::USB::USBDevicePipe usbDevicePipe;
201     uint16_t indexInStringDescriptor = USB_VALUE_DESCRIPTOR_INDEX_PRODUCT_NAME;
202     std::string printerInfo =
203         printUsbManager.QueryPrinterInfoFromStringDescriptor(usbDevicePipe, indexInStringDescriptor);
204     EXPECT_EQ("", printerInfo);
205     printUsbManager.isUsbEnable = true;
206     printerInfo =
207         printUsbManager.QueryPrinterInfoFromStringDescriptor(usbDevicePipe, indexInStringDescriptor);
208 }
209 
210 /**
211  * @tc.name: PrintUsbManagerTest_007
212  * @tc.desc: Verify the ConnectUsbPinter function.
213  * @tc.type: FUNC
214  * @tc.require:
215  */
216 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_007, TestSize.Level1)
217 {
218     OHOS::Print::PrintUsbManager printUsbManager;
219     printUsbManager.isUsbEnable = false;
220     std::string printerName = "HUAWEI PixLab V1-0105";
221     OHOS::USB::USBDevicePipe usbDevicePipe;
222     printUsbManager.printPipeMap[printerName] = usbDevicePipe;
223     OHOS::USB::UsbDevice usbDevice;
224     printUsbManager.printDeviceMap[printerName] = usbDevice;
225     bool ret = printUsbManager.ConnectUsbPinter(printerName);
226     EXPECT_EQ(ret, true);
227     printUsbManager.DisConnectUsbPinter(printerName);
228 }
229 
230 /**
231  * @tc.name: PrintUsbManagerTest_09
232  * @tc.desc: Verify the BulkTransferWrite function.
233  * @tc.type: FUNC
234  * @tc.require:
235  */
236 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_09, TestSize.Level1)
237 {
238     OHOS::Print::PrintUsbManager printUsbManager;
239     printUsbManager.isUsbEnable = false;
240     std::string printerName = "HUAWEI PixLab V1-0105";
241     std::vector<uint8_t> vectorRequestBuffer;
242     int32_t ret =
243         printUsbManager.BulkTransferWrite(printerName, Operation::Get_Printer_Attributes, vectorRequestBuffer);
244     EXPECT_GT(0, ret);
245     ret = printUsbManager.BulkTransferWrite(printerName, Operation::Send_Document, vectorRequestBuffer);
246     EXPECT_GT(0, ret);
247     ret = printUsbManager.BulkTransferWrite(printerName, Operation::Common, vectorRequestBuffer);
248     EXPECT_GT(0, ret);
249 }
250 
251 /**
252  * @tc.name: PrintUsbManagerTest_010
253  * @tc.desc: Verify the BulkTransferRead function.
254  * @tc.type: FUNC
255  * @tc.require:
256  */
257 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_010, TestSize.Level1)
258 {
259     OHOS::Print::PrintUsbManager printUsbManager;
260     printUsbManager.isUsbEnable = false;
261     std::string printerName = "HUAWEI PixLab V1-0105";
262     std::vector<uint8_t> vectorRequestBuffer;
263     int32_t ret = printUsbManager.BulkTransferRead(printerName, Operation::Get_Printer_Attributes, vectorRequestBuffer);
264     EXPECT_GT(0, ret);
265     ret = printUsbManager.BulkTransferRead(printerName, Operation::Send_Document, vectorRequestBuffer);
266     EXPECT_GT(0, ret);
267     ret = printUsbManager.BulkTransferRead(printerName, Operation::Common, vectorRequestBuffer);
268     EXPECT_GT(0, ret);
269 }
270 
271 /**
272  * @tc.name: PrintUsbManagerTest_011
273  * @tc.desc: Verify the DealUsbDevStatusChange function.
274  * @tc.type: FUNC
275  * @tc.require:
276  */
277 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_011, TestSize.Level1)
278 {
279     OHOS::Print::PrintUsbManager printUsbManager;
280     printUsbManager.isUsbEnable = false;
281     bool isAttach = true;
282     std::string devStr = IPP_PRINTER;
283     std::string devStrNull = "";
284     printUsbManager.DealUsbDevStatusChange(devStr, isAttach);
285     isAttach = false;
286     printUsbManager.DealUsbDevStatusChange(devStr, isAttach);
287     printUsbManager.DealUsbDevStatusChange(devStrNull, isAttach);
288     isAttach = true;
289     devStr = NON_IPP_PRINTER;
290     printUsbManager.DealUsbDevStatusChange(NON_IPP_PRINTER, isAttach);
291 }
292 
293 /**
294  * @tc.name: PrintUsbManagerTest_012
295  * @tc.desc: Verify the GetPrinterName function.
296  * @tc.type: FUNC
297  * @tc.require:
298  */
299 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_012, TestSize.Level1)
300 {
301     OHOS::Print::PrintUsbManager printUsbManager;
302     printUsbManager.isUsbEnable = false;
303     std::string name = "HUAWEI PixLab V1-0105";
304     std::string printerName = printUsbManager.GetPrinterName(name);
305     EXPECT_EQ("", printerName);
306     OHOS::USB::UsbDevice usbDevice;
307     printUsbManager.printDeviceMap[printerName] = usbDevice;
308     printUsbManager.GetPrinterName(usbDevice.GetName());
309 }
310 
311 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_013, TestSize.Level1)
312 {
313     OHOS::Print::PrintUsbManager printUsbManager;
314     printUsbManager.isUsbEnable = false;
315     std::string name = "HUAWEI PixLab V1-0105";
316     OHOS::USB::USBDevicePipe usbDevicePipe;
317     OHOS::USB::UsbDevice usbDevice;
318     bool ret = printUsbManager.AllocateInterface(name, usbDevice, usbDevicePipe);
319     EXPECT_EQ(false, ret);
320     std::vector<std::pair<int32_t, int32_t>> printerIndex;
321     printUsbManager.printerIndexMap[name] = printerIndex;
322     printUsbManager.isUsbEnable = true;
323     ret = printUsbManager.AllocateInterface(name, usbDevice, usbDevicePipe);
324     EXPECT_EQ(false, ret);
325 }
326 
327 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_014, TestSize.Level1)
328 {
329     OHOS::Print::PrintUsbManager printUsbManager;
330     printUsbManager.isUsbEnable = false;
331     std::string name = "HUAWEI PixLab V1-0105";
332     OHOS::USB::UsbDevice usbDevice;
333     printUsbManager.printDeviceMap[name] = usbDevice;
334     printUsbManager.DisConnectUsbPinter(name);
335     EXPECT_EQ(printUsbManager.printPipeMap.find(name), printUsbManager.printPipeMap.end());
336     EXPECT_EQ(printUsbManager.printTranIndexMap.find(name), printUsbManager.printTranIndexMap.end());
337 }
338 
339 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_015, TestSize.Level1)
340 {
341     OHOS::Print::PrintUsbManager printUsbManager;
342     printUsbManager.isUsbEnable = false;
343     std::string name = "HUAWEI PixLab V1-0105";
344     OHOS::USB::USBDevicePipe usbDevicePipe;
345     printUsbManager.printPipeMap[name] = usbDevicePipe;
346     printUsbManager.DisConnectUsbPinter(name);
347     EXPECT_NE(printUsbManager.printPipeMap.find(name), printUsbManager.printPipeMap.end());
348     EXPECT_EQ(printUsbManager.printTranIndexMap.find(name), printUsbManager.printTranIndexMap.end());
349 }
350 
351 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_016, TestSize.Level1)
352 {
353     OHOS::Print::PrintUsbManager printUsbManager;
354     printUsbManager.isUsbEnable = false;
355     std::string name = "";
356     printUsbManager.DisConnectUsbPinter(name);
357     EXPECT_EQ(printUsbManager.printPipeMap.find(name), printUsbManager.printPipeMap.end());
358     EXPECT_EQ(printUsbManager.printTranIndexMap.find(name), printUsbManager.printTranIndexMap.end());
359 }
360 
361 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_017, TestSize.Level1)
362 {
363     OHOS::Print::PrintUsbManager printUsbManager;
364     printUsbManager.isUsbEnable = false;
365     std::string printerName = "";
366     OHOS::USB::UsbDevice usbDevice;
367     printUsbManager.printDeviceMap[printerName] = usbDevice;
368     bool ret = printUsbManager.ConnectUsbPinter(printerName);
369     EXPECT_EQ(ret, false);
370 }
371 
372 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_018, TestSize.Level1)
373 {
374     OHOS::Print::PrintUsbManager printUsbManager;
375     printUsbManager.isUsbEnable = false;
376     std::string printerName = "";
377     bool ret = printUsbManager.ConnectUsbPinter(printerName);
378     EXPECT_EQ(ret, false);
379 }
380 
381 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_019, TestSize.Level1)
382 {
383     OHOS::Print::PrintUsbManager printUsbManager;
384     printUsbManager.isUsbEnable = false;
385     std::string printerName = "HUAWEI PixLab V1-0105";
386     bool ret = printUsbManager.ConnectUsbPinter(printerName);
387     EXPECT_EQ(ret, false);
388 }
389 
390 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_020, TestSize.Level1)
391 {
392     OHOS::Print::PrintUsbManager printUsbManager;
393     printUsbManager.isUsbEnable = false;
394     OHOS::USB::UsbDevice usbDevice;
395     std::string printerName = "HUAWEI PixLab V1-0105";
396     EXPECT_EQ(printUsbManager.isPrintDevice(usbDevice, printerName), false);
397 }
398 
399 HWTEST_F(PrintUsbManagerTest, PrintUsbManagerTest_021, TestSize.Level1)
400 {
401     OHOS::Print::PrintUsbManager printUsbManager;
402     printUsbManager.isUsbEnable = false;
403     std::string name = "";
404     OHOS::USB::USBDevicePipe usbDevicePipe;
405     OHOS::USB::UsbDevice usbDevice;
406     bool ret = printUsbManager.AllocateInterface(name, usbDevice, usbDevicePipe);
407     EXPECT_EQ(false, ret);
408 }
409 }  // namespace Print
410 }  // namespace OHOS
411 #endif // IPPOVERUSB_ENABLE