1 /*
2 * Copyright (c) 2022 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 #include "preferences_fuzzer.h"
17 #include <fuzzer/FuzzedDataProvider.h>
18 #include <iostream>
19
20 #include "preferences.h"
21 #include "preferences_errno.h"
22 #include "preferences_helper.h"
23
24 using namespace OHOS::NativePreferences;
25
26 namespace OHOS {
27 constexpr size_t NUM_MIN = 1;
28 constexpr size_t NUM_MAX = 32 * 1024 * 1024;
29 class PreferencesFuzzTest {
30 public:
31 static void SetUpTestCase(void);
32 static void TearDownTestCase(void);
33 void SetUp();
34 void TearDown();
35
36 static std::shared_ptr<Preferences> Preferences_;
37
38 static const std::string LONG_KEY;
39 };
40
41 std::shared_ptr<Preferences> PreferencesFuzzTest::Preferences_ = nullptr;
42
43 const std::string PreferencesFuzzTest::LONG_KEY = std::string(Preferences::MAX_KEY_LENGTH, std::toupper('a'));
44
SetUpTestCase(void)45 void PreferencesFuzzTest::SetUpTestCase(void)
46 {
47 int errCode = E_OK;
48 Preferences_ = PreferencesHelper::GetPreferences("/data/test/test", errCode);
49 }
50
TearDownTestCase(void)51 void PreferencesFuzzTest::TearDownTestCase(void)
52 {
53 Preferences_->Clear();
54 PreferencesHelper::RemovePreferencesFromCache("/data/test/test");
55 Preferences_ = nullptr;
56 }
57
SetUp(void)58 void PreferencesFuzzTest::SetUp(void)
59 {
60 }
61
TearDown(void)62 void PreferencesFuzzTest::TearDown(void)
63 {
64 }
65
PutVectorFuzz(FuzzedDataProvider & provider)66 void PutVectorFuzz(FuzzedDataProvider &provider)
67 {
68 std::string key = provider.ConsumeRandomLengthString();
69 size_t bytesSize = provider.ConsumeIntegralInRange<size_t>(NUM_MIN, NUM_MAX);
70 std::vector<uint8_t> value = provider.ConsumeBytes<uint8_t>(bytesSize);
71 PreferencesFuzzTest::Preferences_->Put(key, value);
72 return;
73 }
74
GetVectorFuzz(FuzzedDataProvider & provider)75 void GetVectorFuzz(FuzzedDataProvider &provider)
76 {
77 std::string key = provider.ConsumeRandomLengthString();
78 size_t bytesSize = provider.ConsumeIntegralInRange<size_t>(NUM_MIN, NUM_MAX);
79 std::vector<uint8_t> value = provider.ConsumeBytes<uint8_t>(bytesSize);
80 PreferencesFuzzTest::Preferences_->Put(key, value);
81 PreferencesFuzzTest::Preferences_->Get(key, 0);
82 return;
83 }
84
HasFuzz(FuzzedDataProvider & provider)85 void HasFuzz(FuzzedDataProvider &provider)
86 {
87 std::string key = provider.ConsumeRandomLengthString();
88 auto value = provider.ConsumeIntegral<int32_t>();
89 PreferencesFuzzTest::Preferences_->PutInt(key, value);
90 PreferencesFuzzTest::Preferences_->HasKey(key);
91 return;
92 }
93
GetValueFuzz(FuzzedDataProvider & provider)94 void GetValueFuzz(FuzzedDataProvider &provider)
95 {
96 std::string key = provider.ConsumeRandomLengthString();
97 auto value = provider.ConsumeIntegral<int32_t>();
98 PreferencesFuzzTest::Preferences_->PutInt(key, value);
99 PreferencesFuzzTest::Preferences_->GetValue(key, 0);
100 return;
101 }
102
GetAllFuzz(FuzzedDataProvider & provider)103 void GetAllFuzz(FuzzedDataProvider &provider)
104 {
105 std::string key = provider.ConsumeRandomLengthString();
106 auto value = provider.ConsumeIntegral<int32_t>();
107 PreferencesFuzzTest::Preferences_->PutInt(key, value);
108 PreferencesFuzzTest::Preferences_->GetAll();
109 return;
110 }
111
GetAllDataFuzz(FuzzedDataProvider & provider)112 void GetAllDataFuzz(FuzzedDataProvider &provider)
113 {
114 std::string key = provider.ConsumeRandomLengthString();
115 auto value = provider.ConsumeIntegral<int32_t>();
116 PreferencesFuzzTest::Preferences_->PutInt(key, value);
117 PreferencesFuzzTest::Preferences_->GetAllData();
118 return;
119 }
120
GetAllDatasFuzz(FuzzedDataProvider & provider)121 void GetAllDatasFuzz(FuzzedDataProvider &provider)
122 {
123 std::string key = provider.ConsumeRandomLengthString();
124 auto value = provider.ConsumeIntegral<int32_t>();
125 PreferencesFuzzTest::Preferences_->PutInt(key, value);
126 PreferencesFuzzTest::Preferences_->GetAllDatas();
127 return;
128 }
129
PutIntFuzz(FuzzedDataProvider & provider)130 void PutIntFuzz(FuzzedDataProvider &provider)
131 {
132 std::string key = provider.ConsumeRandomLengthString();
133 auto value = provider.ConsumeIntegral<int32_t>();
134 PreferencesFuzzTest::Preferences_->PutInt(key, value);
135 return;
136 }
137
GetIntFuzz(FuzzedDataProvider & provider)138 void GetIntFuzz(FuzzedDataProvider &provider)
139 {
140 std::string key = provider.ConsumeRandomLengthString();
141 auto value = provider.ConsumeIntegral<int32_t>();
142 PreferencesFuzzTest::Preferences_->PutInt(key, value);
143 PreferencesFuzzTest::Preferences_->GetInt(key);
144 return;
145 }
146
PutStringFuzz(FuzzedDataProvider & provider)147 void PutStringFuzz(FuzzedDataProvider &provider)
148 {
149 std::string key = provider.ConsumeRandomLengthString();
150 std::string value = provider.ConsumeRandomLengthString();
151 PreferencesFuzzTest::Preferences_->PutString(key, value);
152 return;
153 }
154
GetStringFuzz(FuzzedDataProvider & provider)155 void GetStringFuzz(FuzzedDataProvider &provider)
156 {
157 std::string key = provider.ConsumeRandomLengthString();
158 std::string value = provider.ConsumeRandomLengthString();
159 PreferencesFuzzTest::Preferences_->PutString(key, value);
160 PreferencesFuzzTest::Preferences_->GetString(key);
161 return;
162 }
163
PutBoolFuzz(FuzzedDataProvider & provider)164 void PutBoolFuzz(FuzzedDataProvider &provider)
165 {
166 std::string key = provider.ConsumeRandomLengthString();
167 auto value = provider.ConsumeBool();
168 PreferencesFuzzTest::Preferences_->PutBool(key, value);
169 return;
170 }
171
GetBoolFuzz(FuzzedDataProvider & provider)172 void GetBoolFuzz(FuzzedDataProvider &provider)
173 {
174 std::string key = provider.ConsumeRandomLengthString();
175 auto value = provider.ConsumeBool();
176 PreferencesFuzzTest::Preferences_->PutBool(key, value);
177 PreferencesFuzzTest::Preferences_->GetBool(key);
178 return;
179 }
180
PutFloatFuzz(FuzzedDataProvider & provider)181 void PutFloatFuzz(FuzzedDataProvider &provider)
182 {
183 std::string key = provider.ConsumeRandomLengthString();
184 auto value = provider.ConsumeFloatingPoint<float>();
185 PreferencesFuzzTest::Preferences_->PutFloat(key, value);
186 return;
187 }
188
GetFloatFuzz(FuzzedDataProvider & provider)189 void GetFloatFuzz(FuzzedDataProvider &provider)
190 {
191 std::string key = provider.ConsumeRandomLengthString();
192 auto value = provider.ConsumeFloatingPoint<float>();
193 PreferencesFuzzTest::Preferences_->PutFloat(key, value);
194 PreferencesFuzzTest::Preferences_->GetFloat(key);
195 return;
196 }
197
PutDoubleFuzz(FuzzedDataProvider & provider)198 void PutDoubleFuzz(FuzzedDataProvider &provider)
199 {
200 std::string key = provider.ConsumeRandomLengthString();
201 auto value = provider.ConsumeFloatingPoint<double>();
202 PreferencesFuzzTest::Preferences_->PutDouble(key, value);
203 return;
204 }
205
GetDoubleFuzz(FuzzedDataProvider & provider)206 void GetDoubleFuzz(FuzzedDataProvider &provider)
207 {
208 std::string key = provider.ConsumeRandomLengthString();
209 auto value = provider.ConsumeFloatingPoint<double>();
210 PreferencesFuzzTest::Preferences_->PutDouble(key, value);
211 PreferencesFuzzTest::Preferences_->GetDouble(key);
212 return;
213 }
214
PutLongFuzz(FuzzedDataProvider & provider)215 void PutLongFuzz(FuzzedDataProvider &provider)
216 {
217 std::string key = provider.ConsumeRandomLengthString();
218 auto value = provider.ConsumeFloatingPoint<double>();
219 PreferencesFuzzTest::Preferences_->PutLong(key, value);
220 return;
221 }
222
GetLongFuzz(FuzzedDataProvider & provider)223 void GetLongFuzz(FuzzedDataProvider &provider)
224 {
225 std::string key = provider.ConsumeRandomLengthString();
226 auto value = provider.ConsumeFloatingPoint<double>();
227 PreferencesFuzzTest::Preferences_->PutLong(key, value);
228 PreferencesFuzzTest::Preferences_->GetLong(key);
229 return;
230 }
231
DeleteFuzz(FuzzedDataProvider & provider)232 void DeleteFuzz(FuzzedDataProvider &provider)
233 {
234 std::string key = provider.ConsumeRandomLengthString();
235 auto value = provider.ConsumeFloatingPoint<double>();
236 PreferencesFuzzTest::Preferences_->PutLong(key, value);
237 PreferencesFuzzTest::Preferences_->Delete(key);
238 return;
239 }
240
ClearFuzz(FuzzedDataProvider & provider)241 void ClearFuzz(FuzzedDataProvider &provider)
242 {
243 std::string key = provider.ConsumeRandomLengthString();
244 auto value = provider.ConsumeFloatingPoint<double>();
245 PreferencesFuzzTest::Preferences_->PutLong(key, value);
246 PreferencesFuzzTest::Preferences_->Clear();
247 return;
248 }
249
FlushFuzz(FuzzedDataProvider & provider)250 void FlushFuzz(FuzzedDataProvider &provider)
251 {
252 std::string key = provider.ConsumeRandomLengthString();
253 auto value = provider.ConsumeFloatingPoint<double>();
254 PreferencesFuzzTest::Preferences_->PutLong(key, value);
255 PreferencesFuzzTest::Preferences_->Flush();
256 PreferencesFuzzTest::Preferences_->GetLong(key);
257 PreferencesHelper::DeletePreferences("/data/test/test");
258 return;
259 }
260
FlushSyncFuzz(FuzzedDataProvider & provider)261 void FlushSyncFuzz(FuzzedDataProvider &provider)
262 {
263 std::string key = provider.ConsumeRandomLengthString();
264 auto value = provider.ConsumeFloatingPoint<double>();
265 PreferencesFuzzTest::Preferences_->PutLong(key, value);
266 PreferencesFuzzTest::Preferences_->FlushSync();
267 PreferencesFuzzTest::Preferences_->GetLong(key);
268 PreferencesHelper::DeletePreferences("/data/test/test");
269 return;
270 }
271 } // namespace OHOS
272
273 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)274 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
275 {
276 /* Run your code on data */
277 FuzzedDataProvider provider(data, size);
278 OHOS::PreferencesFuzzTest::SetUpTestCase();
279 OHOS::PutVectorFuzz(provider);
280 OHOS::GetVectorFuzz(provider);
281 OHOS::HasFuzz(provider);
282 OHOS::GetValueFuzz(provider);
283 OHOS::GetAllFuzz(provider);
284 OHOS::GetAllDataFuzz(provider);
285 OHOS::GetAllDatasFuzz(provider);
286 OHOS::PutIntFuzz(provider);
287 OHOS::GetIntFuzz(provider);
288 OHOS::PutStringFuzz(provider);
289 OHOS::GetStringFuzz(provider);
290 OHOS::PutBoolFuzz(provider);
291 OHOS::GetBoolFuzz(provider);
292 OHOS::PutFloatFuzz(provider);
293 OHOS::GetFloatFuzz(provider);
294 OHOS::PutDoubleFuzz(provider);
295 OHOS::PutLongFuzz(provider);
296 OHOS::GetDoubleFuzz(provider);
297 OHOS::GetLongFuzz(provider);
298 OHOS::DeleteFuzz(provider);
299 OHOS::ClearFuzz(provider);
300 OHOS::FlushFuzz(provider);
301 OHOS::FlushSyncFuzz(provider);
302 OHOS::PreferencesFuzzTest::TearDownTestCase();
303 return 0;
304 }