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
16#define TDD_ENABLE 1
17
18#include "fuzzer/FuzzedDataProvider.h"
19#include "napi/native_api.h"
20#include "scan_callback.h"
21#include "scancallbackstub_fuzzer.h"
22
23namespace OHOS::Scan {
24constexpr uint8_t MAX_STRING_LENGTH = 255;
25constexpr int MAX_SET_NUMBER = 100;
26constexpr size_t FOO_MAX_LEN = 1024;
27constexpr size_t U32_AT_SIZE = 4;
28
29void OnRemoteRequestFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
30{
31    uint32_t code = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
32    MessageParcel parcelData;
33    parcelData.WriteInterfaceToken(u"OHOS.Scan.IScanCallback");
34    MessageParcel reply;
35    ScanCallback callBack(nullptr, nullptr);
36    MessageOption option;
37    callBack.OnRemoteRequest(code, parcelData, reply, option);
38}
39
40void HandleDeviceInfoTcpEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
41{
42    MessageParcel parcelData;
43    uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
44    parcelData.WriteUint32(state);
45    ScanCallback callBack(nullptr, nullptr);
46    MessageParcel reply;
47    callBack.HandleDeviceInfoTcpEvent(parcelData, reply);
48}
49
50void HandleDeviceInfoEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
51{
52    MessageParcel parcelData;
53    uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
54    parcelData.WriteUint32(state);
55    ScanCallback callBack(nullptr, nullptr);
56    MessageParcel reply;
57    callBack.HandleDeviceInfoEvent(parcelData, reply);
58}
59
60void HandleDeviceInfoSyncEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
61{
62    MessageParcel parcelData;
63    uint32_t state = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
64    parcelData.WriteUint32(state);
65    ScanCallback callBack(nullptr, nullptr);
66    MessageParcel reply;
67    callBack.HandleDeviceInfoSyncEvent(parcelData, reply);
68}
69
70void HandleGetFrameResEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
71{
72    MessageParcel parcelData;
73    bool isGetSucc = dataProvider->ConsumeBool();
74    parcelData.WriteBool(isGetSucc);
75    int32_t sizeRead = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
76    parcelData.WriteInt32(sizeRead);
77    ScanCallback callBack(nullptr, nullptr);
78    MessageParcel reply;
79    callBack.HandleGetFrameResEvent(parcelData, reply);
80}
81
82void HandleScanInitEventFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
83{
84    MessageParcel parcelData;
85    int32_t scanVersion = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
86    parcelData.WriteInt32(scanVersion);
87    ScanCallback callBack(nullptr, nullptr);
88    MessageParcel reply;
89    callBack.HandleScanInitEvent(parcelData, reply);
90}
91
92void HandleSendSearchMessageFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
93{
94    MessageParcel parcelData;
95    std::string message = parcelData.ReadString();
96    parcelData.WriteString(message);
97    message = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
98    parcelData.WriteString(message);
99    ScanCallback callBack(nullptr, nullptr);
100    MessageParcel reply;
101    callBack.HandleSendSearchMessage(parcelData, reply);
102}
103
104void HandleSendDeviceListFuzzTest(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
105{
106    MessageParcel parcelData;
107    int32_t infosSize = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
108    parcelData.WriteInt32(infosSize);
109    std::vector<ScanDeviceInfo> infos(infosSize);
110    for (size_t i = 0; i < infos.size(); i++) {
111        infos[i].Marshalling(parcelData);
112    }
113    ScanCallback callBack(nullptr, nullptr);
114    MessageParcel reply;
115    callBack.HandleSendDeviceList(parcelData, reply);
116}
117
118}
119
120/* Fuzzer entry point */
121extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
122{
123    if (data == nullptr) {
124        return 0;
125    }
126
127    if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
128        return 0;
129    }
130    FuzzedDataProvider dataProvider(data, size);
131    OHOS::Scan::OnRemoteRequestFuzzTest(data, size, &dataProvider);
132    OHOS::Scan::HandleDeviceInfoTcpEventFuzzTest(data, size, &dataProvider);
133    OHOS::Scan::HandleDeviceInfoEventFuzzTest(data, size, &dataProvider);
134    OHOS::Scan::HandleDeviceInfoSyncEventFuzzTest(data, size, &dataProvider);
135    OHOS::Scan::HandleGetFrameResEventFuzzTest(data, size, &dataProvider);
136    OHOS::Scan::HandleScanInitEventFuzzTest(data, size, &dataProvider);
137    OHOS::Scan::HandleSendSearchMessageFuzzTest(data, size, &dataProvider);
138    OHOS::Scan::HandleSendDeviceListFuzzTest(data, size, &dataProvider);
139    return 0;
140}
141
142