146debc2cSopenharmony_ci/*
246debc2cSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
346debc2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
446debc2cSopenharmony_ci * you may not use this file except in compliance with the License.
546debc2cSopenharmony_ci * You may obtain a copy of the License at
646debc2cSopenharmony_ci *
746debc2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
846debc2cSopenharmony_ci *
946debc2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1046debc2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1146debc2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1246debc2cSopenharmony_ci * See the License for the specific language governing permissions and
1346debc2cSopenharmony_ci * limitations under the License.
1446debc2cSopenharmony_ci */
1546debc2cSopenharmony_ci#include "fuzzer/FuzzedDataProvider.h"
1646debc2cSopenharmony_ci#include "scan_manager_client.h"
1746debc2cSopenharmony_ci#include "scan_callback.h"
1846debc2cSopenharmony_ci#include "scanner_info.h"
1946debc2cSopenharmony_ci#include "scanmanagerclient_fuzzer.h"
2046debc2cSopenharmony_ci
2146debc2cSopenharmony_cinamespace OHOS::Scan {
2246debc2cSopenharmony_ciconstexpr uint8_t MAX_STRING_LENGTH = 255;
2346debc2cSopenharmony_ciconstexpr int MAX_SET_NUMBER = 100;
2446debc2cSopenharmony_ciconstexpr size_t FOO_MAX_LEN = 1024;
2546debc2cSopenharmony_ciconstexpr size_t U32_AT_SIZE = 4;
2646debc2cSopenharmony_ci
2746debc2cSopenharmony_civoid TestGetScannerList(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
2846debc2cSopenharmony_ci{
2946debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
3046debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
3146debc2cSopenharmony_ci        return;
3246debc2cSopenharmony_ci    }
3346debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
3446debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
3546debc2cSopenharmony_ci    scanManagerPtr->GetScannerList();
3646debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
3746debc2cSopenharmony_ci}
3846debc2cSopenharmony_ci
3946debc2cSopenharmony_civoid TestStopDiscover(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
4046debc2cSopenharmony_ci{
4146debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
4246debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
4346debc2cSopenharmony_ci        return;
4446debc2cSopenharmony_ci    }
4546debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
4646debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
4746debc2cSopenharmony_ci    scanManagerPtr->StopDiscover();
4846debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
4946debc2cSopenharmony_ci}
5046debc2cSopenharmony_ci
5146debc2cSopenharmony_civoid TestGetScanOptionDesc(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
5246debc2cSopenharmony_ci{
5346debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
5446debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
5546debc2cSopenharmony_ci        return;
5646debc2cSopenharmony_ci    }
5746debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
5846debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
5946debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
6046debc2cSopenharmony_ci    int32_t optionIndex = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
6146debc2cSopenharmony_ci    ScanOptionDescriptor desc;
6246debc2cSopenharmony_ci    scanManagerPtr->OpenScanner(scannerId);
6346debc2cSopenharmony_ci    scanManagerPtr->GetScanOptionDesc(scannerId, optionIndex, desc);
6446debc2cSopenharmony_ci    scanManagerPtr->CloseScanner(scannerId);
6546debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
6646debc2cSopenharmony_ci}
6746debc2cSopenharmony_ci
6846debc2cSopenharmony_civoid TestOpScanOptionValue(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6946debc2cSopenharmony_ci{
7046debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
7146debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
7246debc2cSopenharmony_ci        return;
7346debc2cSopenharmony_ci    }
7446debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
7546debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
7646debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
7746debc2cSopenharmony_ci    int32_t optionIndex = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
7846debc2cSopenharmony_ci    auto op = static_cast<ScanOptionOpType>(dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER));
7946debc2cSopenharmony_ci    int32_t info = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
8046debc2cSopenharmony_ci    ScanOptionValue value;
8146debc2cSopenharmony_ci    scanManagerPtr->OpenScanner(scannerId);
8246debc2cSopenharmony_ci    scanManagerPtr->OpScanOptionValue(scannerId, optionIndex, op, value, info);
8346debc2cSopenharmony_ci    scanManagerPtr->CloseScanner(scannerId);
8446debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
8546debc2cSopenharmony_ci}
8646debc2cSopenharmony_ci
8746debc2cSopenharmony_civoid TestGetScanParameters(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
8846debc2cSopenharmony_ci{
8946debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
9046debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
9146debc2cSopenharmony_ci        return;
9246debc2cSopenharmony_ci    }
9346debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
9446debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
9546debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
9646debc2cSopenharmony_ci    ScanParameters para;
9746debc2cSopenharmony_ci    scanManagerPtr->OpenScanner(scannerId);
9846debc2cSopenharmony_ci    scanManagerPtr->GetScanParameters(scannerId, para);
9946debc2cSopenharmony_ci    scanManagerPtr->CloseScanner(scannerId);
10046debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
10146debc2cSopenharmony_ci}
10246debc2cSopenharmony_ci
10346debc2cSopenharmony_civoid TestStartScan(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
10446debc2cSopenharmony_ci{
10546debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
10646debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
10746debc2cSopenharmony_ci        return;
10846debc2cSopenharmony_ci    }
10946debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
11046debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
11146debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
11246debc2cSopenharmony_ci    bool batchMode = dataProvider->ConsumeBool();
11346debc2cSopenharmony_ci    scanManagerPtr->OpenScanner(scannerId);
11446debc2cSopenharmony_ci    scanManagerPtr->StartScan(scannerId, batchMode);
11546debc2cSopenharmony_ci    scanManagerPtr->CancelScan(scannerId);
11646debc2cSopenharmony_ci    scanManagerPtr->CloseScanner(scannerId);
11746debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
11846debc2cSopenharmony_ci}
11946debc2cSopenharmony_ci
12046debc2cSopenharmony_civoid TestGetSingleFrameFD(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
12146debc2cSopenharmony_ci{
12246debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
12346debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
12446debc2cSopenharmony_ci        return;
12546debc2cSopenharmony_ci    }
12646debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
12746debc2cSopenharmony_ci    scanManagerPtr->InitScan(scanVersion);
12846debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
12946debc2cSopenharmony_ci    uint32_t dataSize = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
13046debc2cSopenharmony_ci    uint32_t fd = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
13146debc2cSopenharmony_ci    scanManagerPtr->GetSingleFrameFD(scannerId, dataSize, fd);
13246debc2cSopenharmony_ci    scanManagerPtr->ExitScan();
13346debc2cSopenharmony_ci}
13446debc2cSopenharmony_ci
13546debc2cSopenharmony_civoid TestSetScanIOMode(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
13646debc2cSopenharmony_ci{
13746debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
13846debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
13946debc2cSopenharmony_ci        return;
14046debc2cSopenharmony_ci    }
14146debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
14246debc2cSopenharmony_ci    bool batchMode = dataProvider->ConsumeBool();
14346debc2cSopenharmony_ci    scanManagerPtr->OpenScanner(scannerId);
14446debc2cSopenharmony_ci    scanManagerPtr->SetScanIOMode(scannerId, batchMode);
14546debc2cSopenharmony_ci    scanManagerPtr->CloseScanner(scannerId);
14646debc2cSopenharmony_ci}
14746debc2cSopenharmony_ci
14846debc2cSopenharmony_civoid TestGetScanSelectFd(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
14946debc2cSopenharmony_ci{
15046debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
15146debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
15246debc2cSopenharmony_ci        return;
15346debc2cSopenharmony_ci    }
15446debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
15546debc2cSopenharmony_ci    int32_t fd = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
15646debc2cSopenharmony_ci    scanManagerPtr->OpenScanner(scannerId);
15746debc2cSopenharmony_ci    scanManagerPtr->GetScanSelectFd(scannerId, fd);
15846debc2cSopenharmony_ci    scanManagerPtr->CloseScanner(scannerId);
15946debc2cSopenharmony_ci}
16046debc2cSopenharmony_ci
16146debc2cSopenharmony_civoid TestOn(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
16246debc2cSopenharmony_ci{
16346debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
16446debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
16546debc2cSopenharmony_ci        return;
16646debc2cSopenharmony_ci    }
16746debc2cSopenharmony_ci    std::string taskId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
16846debc2cSopenharmony_ci    std::string type = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
16946debc2cSopenharmony_ci    std::function<void(std::vector<ScanDeviceInfo> &infos)> callbackFunction;
17046debc2cSopenharmony_ci    sptr<IScanCallback> listener = new (std::nothrow) ScanCallback(callbackFunction);
17146debc2cSopenharmony_ci    if (listener == nullptr) {
17246debc2cSopenharmony_ci        return;
17346debc2cSopenharmony_ci    }
17446debc2cSopenharmony_ci    scanManagerPtr->On(taskId, type, listener);
17546debc2cSopenharmony_ci}
17646debc2cSopenharmony_ci
17746debc2cSopenharmony_civoid TestOff(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
17846debc2cSopenharmony_ci{
17946debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
18046debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
18146debc2cSopenharmony_ci        return;
18246debc2cSopenharmony_ci    }
18346debc2cSopenharmony_ci    std::string taskId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
18446debc2cSopenharmony_ci    std::string type = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
18546debc2cSopenharmony_ci    scanManagerPtr->Off(taskId, type);
18646debc2cSopenharmony_ci}
18746debc2cSopenharmony_ci
18846debc2cSopenharmony_civoid TestGetScannerState(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
18946debc2cSopenharmony_ci{
19046debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
19146debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
19246debc2cSopenharmony_ci        return;
19346debc2cSopenharmony_ci    }
19446debc2cSopenharmony_ci    int32_t scannerState = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
19546debc2cSopenharmony_ci    scanManagerPtr->GetScannerState(scannerState);
19646debc2cSopenharmony_ci}
19746debc2cSopenharmony_ci
19846debc2cSopenharmony_civoid TestGetScanProgress(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
19946debc2cSopenharmony_ci{
20046debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
20146debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
20246debc2cSopenharmony_ci        return;
20346debc2cSopenharmony_ci    }
20446debc2cSopenharmony_ci    std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
20546debc2cSopenharmony_ci    ScanProgress prog;
20646debc2cSopenharmony_ci    scanManagerPtr->GetScanProgress(scannerId, prog);
20746debc2cSopenharmony_ci}
20846debc2cSopenharmony_ci
20946debc2cSopenharmony_civoid TestAddScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
21046debc2cSopenharmony_ci{
21146debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
21246debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
21346debc2cSopenharmony_ci        return;
21446debc2cSopenharmony_ci    }
21546debc2cSopenharmony_ci    std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
21646debc2cSopenharmony_ci    std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
21746debc2cSopenharmony_ci    scanManagerPtr->AddScanner(serialNumber, discoverMode);
21846debc2cSopenharmony_ci}
21946debc2cSopenharmony_ci
22046debc2cSopenharmony_civoid TestDeleteScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
22146debc2cSopenharmony_ci{
22246debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
22346debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
22446debc2cSopenharmony_ci        return;
22546debc2cSopenharmony_ci    }
22646debc2cSopenharmony_ci    std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
22746debc2cSopenharmony_ci    std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
22846debc2cSopenharmony_ci    scanManagerPtr->DeleteScanner(serialNumber, discoverMode);
22946debc2cSopenharmony_ci}
23046debc2cSopenharmony_ci
23146debc2cSopenharmony_civoid TestGetAddedScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
23246debc2cSopenharmony_ci{
23346debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
23446debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
23546debc2cSopenharmony_ci        return;
23646debc2cSopenharmony_ci    }
23746debc2cSopenharmony_ci    int32_t count = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
23846debc2cSopenharmony_ci    std::vector<ScanDeviceInfo> allAddedScanner(count);
23946debc2cSopenharmony_ci    scanManagerPtr->GetAddedScanner(allAddedScanner);
24046debc2cSopenharmony_ci}
24146debc2cSopenharmony_ci
24246debc2cSopenharmony_civoid TestUpdateScannerName(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
24346debc2cSopenharmony_ci{
24446debc2cSopenharmony_ci    auto scanManagerPtr = ScanManagerClient::GetInstance();
24546debc2cSopenharmony_ci    if (scanManagerPtr == nullptr) {
24646debc2cSopenharmony_ci        return;
24746debc2cSopenharmony_ci    }
24846debc2cSopenharmony_ci    std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
24946debc2cSopenharmony_ci    std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
25046debc2cSopenharmony_ci    std::string deviceName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
25146debc2cSopenharmony_ci    scanManagerPtr->UpdateScannerName(serialNumber, discoverMode, deviceName);
25246debc2cSopenharmony_ci}
25346debc2cSopenharmony_ci
25446debc2cSopenharmony_ci}
25546debc2cSopenharmony_ci
25646debc2cSopenharmony_ci/* Fuzzer entry point */
25746debc2cSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
25846debc2cSopenharmony_ci{
25946debc2cSopenharmony_ci    if (data == nullptr) {
26046debc2cSopenharmony_ci        return 0;
26146debc2cSopenharmony_ci    }
26246debc2cSopenharmony_ci
26346debc2cSopenharmony_ci    if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
26446debc2cSopenharmony_ci        return 0;
26546debc2cSopenharmony_ci    }
26646debc2cSopenharmony_ci    FuzzedDataProvider dataProvider(data, size);
26746debc2cSopenharmony_ci    OHOS::Scan::TestGetScannerList(data, size, &dataProvider);
26846debc2cSopenharmony_ci    OHOS::Scan::TestStopDiscover(data, size, &dataProvider);
26946debc2cSopenharmony_ci    OHOS::Scan::TestGetScanOptionDesc(data, size, &dataProvider);
27046debc2cSopenharmony_ci    OHOS::Scan::TestOpScanOptionValue(data, size, &dataProvider);
27146debc2cSopenharmony_ci    OHOS::Scan::TestGetScanParameters(data, size, &dataProvider);
27246debc2cSopenharmony_ci    OHOS::Scan::TestStartScan(data, size, &dataProvider);
27346debc2cSopenharmony_ci    OHOS::Scan::TestGetSingleFrameFD(data, size, &dataProvider);
27446debc2cSopenharmony_ci    OHOS::Scan::TestSetScanIOMode(data, size, &dataProvider);
27546debc2cSopenharmony_ci    OHOS::Scan::TestGetScanSelectFd(data, size, &dataProvider);
27646debc2cSopenharmony_ci    OHOS::Scan::TestOn(data, size, &dataProvider);
27746debc2cSopenharmony_ci    OHOS::Scan::TestOff(data, size, &dataProvider);
27846debc2cSopenharmony_ci    OHOS::Scan::TestGetScannerState(data, size, &dataProvider);
27946debc2cSopenharmony_ci    OHOS::Scan::TestGetScanProgress(data, size, &dataProvider);
28046debc2cSopenharmony_ci    OHOS::Scan::TestAddScanner(data, size, &dataProvider);
28146debc2cSopenharmony_ci    OHOS::Scan::TestDeleteScanner(data, size, &dataProvider);
28246debc2cSopenharmony_ci    OHOS::Scan::TestGetAddedScanner(data, size, &dataProvider);
28346debc2cSopenharmony_ci    OHOS::Scan::TestUpdateScannerName(data, size, &dataProvider);
28446debc2cSopenharmony_ci
28546debc2cSopenharmony_ci    return 0;
28646debc2cSopenharmony_ci}
28746debc2cSopenharmony_ci
288