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
1646debc2cSopenharmony_ci#define TDD_ENABLE 1
1746debc2cSopenharmony_ci
1846debc2cSopenharmony_ci#include "fuzzer/FuzzedDataProvider.h"
1946debc2cSopenharmony_ci#include "napi/native_api.h"
2046debc2cSopenharmony_ci#include "scan_callback.h"
2146debc2cSopenharmony_ci#include "scancallbackstub_fuzzer.h"
2246debc2cSopenharmony_ci
2346debc2cSopenharmony_cinamespace OHOS::Scan {
2446debc2cSopenharmony_ciconstexpr uint8_t MAX_STRING_LENGTH = 255;
2546debc2cSopenharmony_ciconstexpr int MAX_SET_NUMBER = 100;
2646debc2cSopenharmony_ciconstexpr size_t FOO_MAX_LEN = 1024;
2746debc2cSopenharmony_ciconstexpr size_t U32_AT_SIZE = 4;
2846debc2cSopenharmony_ci
2946debc2cSopenharmony_civoid OnRemoteRequestFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
3046debc2cSopenharmony_ci{
3146debc2cSopenharmony_ci    uint32_t code = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
3246debc2cSopenharmony_ci    MessageParcel parcelData;
3346debc2cSopenharmony_ci    parcelData.WriteInterfaceToken(u"OHOS.Scan.IScanCallback");
3446debc2cSopenharmony_ci    MessageParcel reply;
3546debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
3646debc2cSopenharmony_ci    MessageOption option;
3746debc2cSopenharmony_ci    callBack.OnRemoteRequest(code, parcelData, reply, option);
3846debc2cSopenharmony_ci}
3946debc2cSopenharmony_ci
4046debc2cSopenharmony_civoid HandleDeviceInfoTcpEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
4146debc2cSopenharmony_ci{
4246debc2cSopenharmony_ci    MessageParcel parcelData;
4346debc2cSopenharmony_ci    uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
4446debc2cSopenharmony_ci    parcelData.WriteUint32(state);
4546debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
4646debc2cSopenharmony_ci    MessageParcel reply;
4746debc2cSopenharmony_ci    callBack.HandleDeviceInfoTcpEvent(parcelData, reply);
4846debc2cSopenharmony_ci}
4946debc2cSopenharmony_ci
5046debc2cSopenharmony_civoid HandleDeviceInfoEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
5146debc2cSopenharmony_ci{
5246debc2cSopenharmony_ci    MessageParcel parcelData;
5346debc2cSopenharmony_ci    uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
5446debc2cSopenharmony_ci    parcelData.WriteUint32(state);
5546debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
5646debc2cSopenharmony_ci    MessageParcel reply;
5746debc2cSopenharmony_ci    callBack.HandleDeviceInfoEvent(parcelData, reply);
5846debc2cSopenharmony_ci}
5946debc2cSopenharmony_ci
6046debc2cSopenharmony_civoid HandleDeviceInfoSyncEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
6146debc2cSopenharmony_ci{
6246debc2cSopenharmony_ci    MessageParcel parcelData;
6346debc2cSopenharmony_ci    uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
6446debc2cSopenharmony_ci    parcelData.WriteUint32(state);
6546debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
6646debc2cSopenharmony_ci    MessageParcel reply;
6746debc2cSopenharmony_ci    callBack.HandleDeviceInfoSyncEvent(parcelData, reply);
6846debc2cSopenharmony_ci}
6946debc2cSopenharmony_ci
7046debc2cSopenharmony_civoid HandleGetFrameResEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
7146debc2cSopenharmony_ci{
7246debc2cSopenharmony_ci    MessageParcel parcelData;
7346debc2cSopenharmony_ci    bool isGetSucc = dataProvider->ConsumeBool();
7446debc2cSopenharmony_ci    parcelData.WriteBool(isGetSucc);
7546debc2cSopenharmony_ci    int32_t sizeRead = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
7646debc2cSopenharmony_ci    parcelData.WriteInt32(sizeRead);
7746debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
7846debc2cSopenharmony_ci    MessageParcel reply;
7946debc2cSopenharmony_ci    callBack.HandleGetFrameResEvent(parcelData, reply);
8046debc2cSopenharmony_ci}
8146debc2cSopenharmony_ci
8246debc2cSopenharmony_civoid HandleScanInitEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
8346debc2cSopenharmony_ci{
8446debc2cSopenharmony_ci    MessageParcel parcelData;
8546debc2cSopenharmony_ci    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
8646debc2cSopenharmony_ci    parcelData.WriteInt32(scanVersion);
8746debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
8846debc2cSopenharmony_ci    MessageParcel reply;
8946debc2cSopenharmony_ci    callBack.HandleScanInitEvent(parcelData, reply);
9046debc2cSopenharmony_ci}
9146debc2cSopenharmony_ci
9246debc2cSopenharmony_civoid HandleSendSearchMessageFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
9346debc2cSopenharmony_ci{
9446debc2cSopenharmony_ci    MessageParcel parcelData;
9546debc2cSopenharmony_ci    std::string message = parcelData.ReadString();
9646debc2cSopenharmony_ci    parcelData.WriteString(message);
9746debc2cSopenharmony_ci    message = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
9846debc2cSopenharmony_ci    parcelData.WriteString(message);
9946debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
10046debc2cSopenharmony_ci    MessageParcel reply;
10146debc2cSopenharmony_ci    callBack.HandleSendSearchMessage(parcelData, reply);
10246debc2cSopenharmony_ci}
10346debc2cSopenharmony_ci
10446debc2cSopenharmony_civoid HandleSendDeviceListFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
10546debc2cSopenharmony_ci{
10646debc2cSopenharmony_ci    MessageParcel parcelData;
10746debc2cSopenharmony_ci    int32_t infosSize = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
10846debc2cSopenharmony_ci    parcelData.WriteInt32(infosSize);
10946debc2cSopenharmony_ci    std::vector<ScanDeviceInfo> infos(infosSize);
11046debc2cSopenharmony_ci    for (size_t i = 0; i < infos.size(); i++) {
11146debc2cSopenharmony_ci        infos[i].Marshalling(parcelData);
11246debc2cSopenharmony_ci    }
11346debc2cSopenharmony_ci    ScanCallback callBack(nullptr, nullptr);
11446debc2cSopenharmony_ci    MessageParcel reply;
11546debc2cSopenharmony_ci    callBack.HandleSendDeviceList(parcelData, reply);
11646debc2cSopenharmony_ci}
11746debc2cSopenharmony_ci
11846debc2cSopenharmony_ci}
11946debc2cSopenharmony_ci
12046debc2cSopenharmony_ci/* Fuzzer entry point */
12146debc2cSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
12246debc2cSopenharmony_ci{
12346debc2cSopenharmony_ci    if (data == nullptr) {
12446debc2cSopenharmony_ci        return 0;
12546debc2cSopenharmony_ci    }
12646debc2cSopenharmony_ci
12746debc2cSopenharmony_ci    if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
12846debc2cSopenharmony_ci        return 0;
12946debc2cSopenharmony_ci    }
13046debc2cSopenharmony_ci    FuzzedDataProvider dataProvider(data, size);
13146debc2cSopenharmony_ci    OHOS::Scan::OnRemoteRequestFuzzTest(data, size, &dataProvider);
13246debc2cSopenharmony_ci    OHOS::Scan::HandleDeviceInfoTcpEventFuzzTest(data, size, &dataProvider);
13346debc2cSopenharmony_ci    OHOS::Scan::HandleDeviceInfoEventFuzzTest(data, size, &dataProvider);
13446debc2cSopenharmony_ci    OHOS::Scan::HandleDeviceInfoSyncEventFuzzTest(data, size, &dataProvider);
13546debc2cSopenharmony_ci    OHOS::Scan::HandleGetFrameResEventFuzzTest(data, size, &dataProvider);
13646debc2cSopenharmony_ci    OHOS::Scan::HandleScanInitEventFuzzTest(data, size, &dataProvider);
13746debc2cSopenharmony_ci    OHOS::Scan::HandleSendSearchMessageFuzzTest(data, size, &dataProvider);
13846debc2cSopenharmony_ci    OHOS::Scan::HandleSendDeviceListFuzzTest(data, size, &dataProvider);
13946debc2cSopenharmony_ci    return 0;
14046debc2cSopenharmony_ci}
14146debc2cSopenharmony_ci
142