1/*
2 * Copyright (c) 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#define private public
16#define protected public
17#include "printcupsclient_fuzzer.h"
18#include "fuzzer/FuzzedDataProvider.h"
19#include "print_constant.h"
20#include "printer_capability.h"
21#include "print_log.h"
22#include "print_cups_client.h"
23
24namespace OHOS {
25namespace Print {
26constexpr uint8_t MAX_STRING_LENGTH = 255;
27constexpr int MAX_SET_NUMBER = 100;
28constexpr size_t FOO_MAX_LEN = 1024;
29constexpr size_t U32_AT_SIZE = 4;
30
31void TestQueryPPDInformation(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
32{
33    PrintCupsClient::GetInstance()->InitCupsResources();
34    std::string makeModelStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
35    std::string ppd = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
36    std::vector<std::string> ppds;
37    ppds.push_back(ppd);
38    PrintCupsClient::GetInstance()->QueryPPDInformation(makeModelStr.c_str(), ppds);
39    PrintCupsClient::GetInstance()->StopCupsdService();
40}
41
42void TestAddPrinterToCups(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
43{
44    PrintCupsClient::GetInstance()->InitCupsResources();
45    std::string printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
46    std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
47    std::string printerMake = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
48    PrintCupsClient::GetInstance()->AddPrinterToCups(printerUri, printerName, printerMake);
49    PrintCupsClient::GetInstance()->JobCompleteCallback();
50}
51
52void TestQueryPrinterCapabilityByUri(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
53{
54    PrintCupsClient::GetInstance()->InitCupsResources();
55    std::string printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
56    std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
57    PrinterCapability printerCaps;
58    PrintCupsClient::GetInstance()->QueryPrinterCapabilityByUri(printerUri, printerName, printerCaps);
59}
60
61void TestDeleteCupsPrinter(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
62{
63    PrintCupsClient::GetInstance()->InitCupsResources();
64    std::string printerNameStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
65    PrintCupsClient::GetInstance()->DeleteCupsPrinter(printerNameStr.c_str());
66}
67
68void TestAddCupsPrintJob(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
69{
70    PrintCupsClient::GetInstance()->InitCupsResources();
71    PrintJob jobInfo;
72    std::string option = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
73    jobInfo.SetOption(option);
74    PrintCupsClient::GetInstance()->AddCupsPrintJob(jobInfo);
75}
76
77void TestCancelCupsJob(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
78{
79    PrintCupsClient::GetInstance()->InitCupsResources();
80    std::string serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
81    PrintCupsClient::GetInstance()->CancelCupsJob(serviceJobId);
82}
83
84void TestQueryAddedPrinterList(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
85{
86    PrintCupsClient::GetInstance()->InitCupsResources();
87    std::string printerNameStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
88    std::vector<std::string> printerName;
89    printerName.push_back(printerNameStr);
90    PrintCupsClient::GetInstance()->QueryAddedPrinterList(printerName);
91}
92
93void TestGetPPDFile(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
94{
95    PrintCupsClient::GetInstance()->InitCupsResources();
96    std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
97    PrintCupsClient::GetInstance()->GetPPDFile(printerName);
98}
99
100void TestSetDefaultPrinter(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
101{
102    PrintCupsClient::GetInstance()->InitCupsResources();
103    std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
104    PrintCupsClient::GetInstance()->SetDefaultPrinter(printerName);
105}
106
107void TestQueryPrinterAttrList(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
108{
109    PrintCupsClient::GetInstance()->InitCupsResources();
110    std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
111    std::string key = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
112    std::vector<std::string> keyList;
113    keyList.push_back(key);
114    std::string value = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
115    std::vector<std::string> valueList;
116    valueList.push_back(value);
117    PrintCupsClient::GetInstance()->QueryPrinterAttrList(printerName, keyList, valueList);
118}
119
120void TestQueryPrinterInfoByPrinterId(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
121{
122    PrintCupsClient::GetInstance()->InitCupsResources();
123    std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
124    PrinterInfo info;
125    PrintCupsClient::GetInstance()->QueryPrinterInfoByPrinterId(printerId, info);
126}
127
128void TestCheckPrinterMakeModel(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
129{
130    PrintCupsClient::GetInstance()->InitCupsResources();
131    JobParameters jobParams;
132    jobParams.printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
133    PrintCupsClient::GetInstance()->CheckPrinterMakeModel(&jobParams);
134}
135
136void TestDeletePrinterFromCups(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
137{
138    PrintCupsClient::GetInstance()->InitCupsResources();
139    std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
140    PrintCupsClient::GetInstance()->DeleteCupsPrinter(printerName.c_str());
141}
142
143void TestCheckPrinterOnline(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
144{
145    JobMonitorParam monitorParam;
146    monitorParam.printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
147    monitorParam.printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
148    PrintCupsClient::GetInstance()->CheckPrinterOnline(&monitorParam);
149}
150
151void TestGetIpAddress(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
152{
153    unsigned int number = dataProvider->ConsumeIntegralInRange<unsigned int>(0, MAX_SET_NUMBER);
154    PrintCupsClient::GetInstance()->GetIpAddress(number);
155}
156
157void TestIsIpConflict(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
158{
159    std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
160    std::string nic = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
161    PrintCupsClient::GetInstance()->IsIpConflict(printerId, nic);
162}
163
164void TestConvertInchTo100MM(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
165{
166    int num = dataProvider->ConsumeIntegralInRange<int>(0, MAX_SET_NUMBER);
167    PrintCupsClient::GetInstance()->ConvertInchTo100MM(num);
168}
169
170void TestGetColorString(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
171{
172    uint32_t colorCode = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
173    PrintCupsClient::GetInstance()->GetColorString(colorCode);
174}
175
176void TestGetDulpexString(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
177{
178    uint32_t duplexCode = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
179    PrintCupsClient::GetInstance()->GetDulpexString(duplexCode);
180}
181
182void TestGetMedieSize(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
183{
184    PrintJob printJob;
185    printJob.SetJobId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
186    printJob.SetPrinterId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
187    PrintCupsClient::GetInstance()->GetMedieSize(printJob);
188}
189
190void TestDumpJobParameters(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
191{
192    JobParameters jobParams;
193    jobParams.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
194    PrintCupsClient::GetInstance()->DumpJobParameters(&jobParams);
195}
196
197void TestBuildJobParameters(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
198{
199    PrintJob printJob;
200    printJob.SetJobId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
201    printJob.SetPrinterId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
202    printJob.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
203    PrintCupsClient::GetInstance()->BuildJobParameters(printJob);
204}
205
206void TestQueryJobState(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
207{
208    http_t *http;
209    JobMonitorParam param;
210    param.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
211    JobStatus jobStatus;
212    PrintCupsClient::GetInstance()->QueryJobState(http, &param, &jobStatus);
213}
214
215void TestGetBlockedSubstate(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
216{
217    JobStatus jobStatus;
218    std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
219    printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
220    PrintCupsClient::GetInstance()->GetBlockedSubstate(&jobStatus);
221}
222
223void TestReportBlockedReason(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
224{
225    JobMonitorParam param;
226    param.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
227    JobStatus jobStatus;
228    std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
229    printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
230    PrintCupsClient::GetInstance()->ReportBlockedReason(&param, &jobStatus);
231}
232
233void TestJobStatusCallback(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
234{
235    JobMonitorParam param;
236    param.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
237    JobStatus jobStatus;
238    std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
239    printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
240    bool isOffline = dataProvider->ConsumeBool();
241    PrintCupsClient::GetInstance()->JobStatusCallback(&param, &jobStatus, isOffline);
242}
243
244void TestUpdateJobStatus(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
245{
246    JobStatus prevousJobStatus;
247    std::string prevousPrinterReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
248    prevousPrinterReason.copy(prevousJobStatus.printer_state_reasons, prevousPrinterReason.length() + 1);
249    JobStatus jobStatus;
250    std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
251    printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
252    PrintCupsClient::GetInstance()->UpdateJobStatus(&prevousJobStatus, &jobStatus);
253}
254
255}  // namespace Print
256}  // namespace OHOS
257
258/* Fuzzer entry point */
259extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
260{
261    /* Run your code on data */
262    if (data == nullptr) {
263        return 0;
264    }
265
266    if (size < OHOS::Print::U32_AT_SIZE || size > OHOS::Print::FOO_MAX_LEN) {
267    }
268
269    FuzzedDataProvider dataProvider(data, size);
270    OHOS::Print::TestQueryPPDInformation(data, size, &dataProvider);
271    OHOS::Print::TestAddPrinterToCups(data, size, &dataProvider);
272    OHOS::Print::TestQueryPrinterCapabilityByUri(data, size, &dataProvider);
273    OHOS::Print::TestDeleteCupsPrinter(data, size, &dataProvider);
274    OHOS::Print::TestAddCupsPrintJob(data, size, &dataProvider);
275    OHOS::Print::TestCancelCupsJob(data, size, &dataProvider);
276    OHOS::Print::TestQueryAddedPrinterList(data, size, &dataProvider);
277    OHOS::Print::TestGetPPDFile(data, size, &dataProvider);
278    OHOS::Print::TestSetDefaultPrinter(data, size, &dataProvider);
279    OHOS::Print::TestQueryPrinterAttrList(data, size, &dataProvider);
280    OHOS::Print::TestQueryPrinterInfoByPrinterId(data, size, &dataProvider);
281    OHOS::Print::TestCheckPrinterMakeModel(data, size, &dataProvider);
282    OHOS::Print::TestDeletePrinterFromCups(data, size, &dataProvider);
283    OHOS::Print::TestCheckPrinterOnline(data, size, &dataProvider);
284    OHOS::Print::TestGetIpAddress(data, size, &dataProvider);
285    OHOS::Print::TestIsIpConflict(data, size, &dataProvider);
286    OHOS::Print::TestConvertInchTo100MM(data, size, &dataProvider);
287    OHOS::Print::TestGetColorString(data, size, &dataProvider);
288    OHOS::Print::TestGetDulpexString(data, size, &dataProvider);
289    OHOS::Print::TestGetMedieSize(data, size, &dataProvider);
290    OHOS::Print::TestDumpJobParameters(data, size, &dataProvider);
291    OHOS::Print::TestBuildJobParameters(data, size, &dataProvider);
292    OHOS::Print::TestQueryJobState(data, size, &dataProvider);
293    OHOS::Print::TestGetBlockedSubstate(data, size, &dataProvider);
294    OHOS::Print::TestReportBlockedReason(data, size, &dataProvider);
295    OHOS::Print::TestJobStatusCallback(data, size, &dataProvider);
296    OHOS::Print::TestUpdateJobStatus(data, size, &dataProvider);
297
298    return 0;
299}
300