1060ff233Sopenharmony_ci/*
2060ff233Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3060ff233Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4060ff233Sopenharmony_ci * you may not use this file except in compliance with the License.
5060ff233Sopenharmony_ci * You may obtain a copy of the License at
6060ff233Sopenharmony_ci *
7060ff233Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8060ff233Sopenharmony_ci *
9060ff233Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10060ff233Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11060ff233Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12060ff233Sopenharmony_ci * See the License for the specific language governing permissions and
13060ff233Sopenharmony_ci * limitations under the License.
14060ff233Sopenharmony_ci */
15060ff233Sopenharmony_ci
16060ff233Sopenharmony_ci#ifndef FUZZ_DATA_GENERATOR_H
17060ff233Sopenharmony_ci#define FUZZ_DATA_GENERATOR_H
18060ff233Sopenharmony_ci
19060ff233Sopenharmony_ci#include <cstdint>
20060ff233Sopenharmony_ci#include <string>
21060ff233Sopenharmony_ci#include <vector>
22060ff233Sopenharmony_ci
23060ff233Sopenharmony_ci#include "parcel.h"
24060ff233Sopenharmony_ci
25060ff233Sopenharmony_ciclass DataGenerator {
26060ff233Sopenharmony_cipublic:
27060ff233Sopenharmony_ci    static void Write(const uint8_t *data, size_t size)
28060ff233Sopenharmony_ci    {
29060ff233Sopenharmony_ci        DataGenerator::parcel_.WriteBuffer(data, size);
30060ff233Sopenharmony_ci        DataGenerator::parcel_.RewindRead(0);
31060ff233Sopenharmony_ci    }
32060ff233Sopenharmony_ci
33060ff233Sopenharmony_ci    static void Clear()
34060ff233Sopenharmony_ci    {
35060ff233Sopenharmony_ci        DataGenerator::parcel_.FlushBuffer();
36060ff233Sopenharmony_ci    }
37060ff233Sopenharmony_ci
38060ff233Sopenharmony_ci    static OHOS::Parcel &GetInstance()
39060ff233Sopenharmony_ci    {
40060ff233Sopenharmony_ci        return DataGenerator::parcel_;
41060ff233Sopenharmony_ci    }
42060ff233Sopenharmony_ci
43060ff233Sopenharmony_ciprivate:
44060ff233Sopenharmony_ci    static inline OHOS::Parcel parcel_;
45060ff233Sopenharmony_ci};
46060ff233Sopenharmony_ci
47060ff233Sopenharmony_citemplate <typename T>
48060ff233Sopenharmony_ciinline bool GenerateFromList(T &value, const std::vector<T> &candidateValues)
49060ff233Sopenharmony_ci{
50060ff233Sopenharmony_ci    if (candidateValues.empty()) {
51060ff233Sopenharmony_ci        return false;
52060ff233Sopenharmony_ci    }
53060ff233Sopenharmony_ci    uint8_t rawData = 0;
54060ff233Sopenharmony_ci    if (!DataGenerator::GetInstance().ReadUint8(rawData)) {
55060ff233Sopenharmony_ci        return false;
56060ff233Sopenharmony_ci    }
57060ff233Sopenharmony_ci    value = candidateValues[rawData % candidateValues.size()];
58060ff233Sopenharmony_ci    return true;
59060ff233Sopenharmony_ci}
60060ff233Sopenharmony_ci
61060ff233Sopenharmony_ciinline bool GenerateBool(bool &value)
62060ff233Sopenharmony_ci{
63060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadBool(value);
64060ff233Sopenharmony_ci}
65060ff233Sopenharmony_ci
66060ff233Sopenharmony_ciinline bool GenerateInt8(int8_t &value)
67060ff233Sopenharmony_ci{
68060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadInt8(value);
69060ff233Sopenharmony_ci}
70060ff233Sopenharmony_ci
71060ff233Sopenharmony_ciinline bool GenerateInt16(int16_t &value)
72060ff233Sopenharmony_ci{
73060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadInt16(value);
74060ff233Sopenharmony_ci}
75060ff233Sopenharmony_ci
76060ff233Sopenharmony_ciinline bool GenerateInt32(int32_t &value)
77060ff233Sopenharmony_ci{
78060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadInt32(value);
79060ff233Sopenharmony_ci}
80060ff233Sopenharmony_ci
81060ff233Sopenharmony_ciinline bool GenerateInt64(int64_t &value)
82060ff233Sopenharmony_ci{
83060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadInt64(value);
84060ff233Sopenharmony_ci}
85060ff233Sopenharmony_ci
86060ff233Sopenharmony_ciinline bool GenerateUint8(uint8_t &value)
87060ff233Sopenharmony_ci{
88060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadUint8(value);
89060ff233Sopenharmony_ci}
90060ff233Sopenharmony_ci
91060ff233Sopenharmony_ciinline bool GenerateUint16(uint16_t &value)
92060ff233Sopenharmony_ci{
93060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadUint16(value);
94060ff233Sopenharmony_ci}
95060ff233Sopenharmony_ci
96060ff233Sopenharmony_ciinline bool GenerateUint32(uint32_t &value)
97060ff233Sopenharmony_ci{
98060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadUint32(value);
99060ff233Sopenharmony_ci}
100060ff233Sopenharmony_ci
101060ff233Sopenharmony_ciinline bool GenerateUint64(uint64_t &value)
102060ff233Sopenharmony_ci{
103060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadUint64(value);
104060ff233Sopenharmony_ci}
105060ff233Sopenharmony_ci
106060ff233Sopenharmony_ciinline bool GenerateFloat(float &value)
107060ff233Sopenharmony_ci{
108060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadFloat(value);
109060ff233Sopenharmony_ci}
110060ff233Sopenharmony_ci
111060ff233Sopenharmony_ciinline bool GenerateDouble(double &value)
112060ff233Sopenharmony_ci{
113060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadDouble(value);
114060ff233Sopenharmony_ci}
115060ff233Sopenharmony_ci
116060ff233Sopenharmony_ciinline bool GenerateString(std::string &value)
117060ff233Sopenharmony_ci{
118060ff233Sopenharmony_ci    return DataGenerator::GetInstance().ReadString(value);
119060ff233Sopenharmony_ci}
120060ff233Sopenharmony_ci
121060ff233Sopenharmony_ciinline bool GeneratePayload(std::vector<uint8_t> &payload, const std::vector<uint8_t> &prefix = {})
122060ff233Sopenharmony_ci{
123060ff233Sopenharmony_ci    uint8_t len = 0;
124060ff233Sopenharmony_ci    if (!DataGenerator::GetInstance().ReadUint8(len)) {
125060ff233Sopenharmony_ci        return false;
126060ff233Sopenharmony_ci    }
127060ff233Sopenharmony_ci    size_t readableSize = DataGenerator::GetInstance().GetReadableBytes();
128060ff233Sopenharmony_ci    len = (readableSize == 0) ? 0 : (len % readableSize);
129060ff233Sopenharmony_ci    payload.push_back(len + prefix.size());
130060ff233Sopenharmony_ci    payload.insert(payload.end(), prefix.begin(), prefix.end());
131060ff233Sopenharmony_ci    for (uint8_t i = 0; i < len; ++i) {
132060ff233Sopenharmony_ci        payload.push_back(DataGenerator::GetInstance().ReadUint8());
133060ff233Sopenharmony_ci    }
134060ff233Sopenharmony_ci    return true;
135060ff233Sopenharmony_ci}
136060ff233Sopenharmony_ci
137060ff233Sopenharmony_ci#endif // FUZZ_DATA_GENERATOR_H
138