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, ¶m, &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(¶m, &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(¶m, &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