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 #include "cloudsyncmanager_fuzzer.h"
16
17 #include <cstddef>
18 #include <cstdint>
19 #include <memory>
20
21 #include "cloud_fuzzer_helper.h"
22 #include "cloud_sync_manager.h"
23 #include "cloud_sync_manager_impl.h"
24 #include "cloud_sync_service_proxy.h"
25 #include "i_cloud_download_callback.h"
26 #include "i_cloud_sync_callback.h"
27
28 namespace OHOS {
29 constexpr size_t U32_AT_SIZE = 4;
30 constexpr size_t BOOL_AT_SIZE = 1;
31
32 using namespace OHOS::FileManagement::CloudSync;
33 using namespace std;
34 class ICloudSyncCallbackTest : public IRemoteStub<ICloudSyncCallback> {
35 public:
OnSyncStateChanged(SyncType type,SyncPromptState state)36 void OnSyncStateChanged(SyncType type, SyncPromptState state) override {}
OnSyncStateChanged(CloudSyncState state,ErrorType error)37 void OnSyncStateChanged(CloudSyncState state, ErrorType error) override {}
38 };
39
40 class ICloudDownloadCallbackTest : public IRemoteStub<ICloudDownloadCallback> {
41 public:
OnDownloadProcess(const DownloadProgressObj & progress)42 void OnDownloadProcess(const DownloadProgressObj &progress) override {}
43 };
44
RegisterCallbackFuzzTest(FuzzData & fuzzData,size_t size)45 void RegisterCallbackFuzzTest(FuzzData &fuzzData, size_t size)
46 {
47 fuzzData.ResetData(size);
48 std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
49 auto cloudSyncCallback = make_shared<ICloudSyncCallbackTest>();
50 CloudSyncManager::GetInstance().RegisterCallback(cloudSyncCallback, bundleName);
51 }
52
UnRegisterCallbackFuzzTest(FuzzData & fuzzData,size_t size)53 void UnRegisterCallbackFuzzTest(FuzzData &fuzzData, size_t size)
54 {
55 fuzzData.ResetData(size);
56 std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
57 CloudSyncManager::GetInstance().UnRegisterCallback(bundleName);
58 }
59
StartSyncFuzzTest(FuzzData & fuzzData,size_t size)60 void StartSyncFuzzTest(FuzzData &fuzzData, size_t size)
61 {
62 fuzzData.ResetData(size);
63 std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
64 CloudSyncManager::GetInstance().StartSync(bundleName);
65 }
66
GetSyncTimeFuzzTest(FuzzData & fuzzData,size_t size)67 void GetSyncTimeFuzzTest(FuzzData &fuzzData, size_t size)
68 {
69 fuzzData.ResetData(size);
70 int64_t syncTime{0};
71 std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
72 CloudSyncManager::GetInstance().GetSyncTime(syncTime, bundleName);
73 }
74
StartSyncCallbackFuzzTest(FuzzData & fuzzData,size_t size)75 void StartSyncCallbackFuzzTest(FuzzData &fuzzData, size_t size)
76 {
77 fuzzData.ResetData(size);
78 bool forceFlag = fuzzData.GetData<bool>();
79 auto cloudSyncCallback = make_shared<ICloudSyncCallbackTest>();
80 CloudSyncManager::GetInstance().StartSync(forceFlag, cloudSyncCallback);
81 }
82
TriggerSyncFuzzTest(FuzzData & fuzzData,size_t size)83 void TriggerSyncFuzzTest(FuzzData &fuzzData, size_t size)
84 {
85 fuzzData.ResetData(size);
86 int32_t userId = 100;
87 std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
88 CloudSyncManager::GetInstance().TriggerSync(bundleName, userId);
89
90 fuzzData.ResetData(size);
91 userId = fuzzData.GetData<int32_t>();
92 bundleName = fuzzData.GetStringFromData(static_cast<int>(size - U32_AT_SIZE));
93 CloudSyncManager::GetInstance().TriggerSync(bundleName, userId);
94 }
95
StopSyncFuzzTest(FuzzData & fuzzData,size_t size)96 void StopSyncFuzzTest(FuzzData &fuzzData, size_t size)
97 {
98 fuzzData.ResetData(size);
99 std::string bundleName = fuzzData.GetStringFromData(static_cast<int>(size));
100 CloudSyncManager::GetInstance().StopSync(bundleName);
101 }
102
ChangeAppSwitchFuzzTest(FuzzData & fuzzData,size_t size)103 void ChangeAppSwitchFuzzTest(FuzzData &fuzzData, size_t size)
104 {
105 fuzzData.ResetData(size);
106 bool status = fuzzData.GetData<bool>();
107 int len = static_cast<int>((size - BOOL_AT_SIZE) >> 1);
108 std::string accoutId = fuzzData.GetStringFromData(len);
109 string bundleName = fuzzData.GetStringFromData(static_cast<int>(len));
110 CloudSyncManager::GetInstance().ChangeAppSwitch(accoutId, bundleName, status);
111 }
112
NotifyDataChangeFuzzTest(FuzzData & fuzzData,size_t size)113 void NotifyDataChangeFuzzTest(FuzzData &fuzzData, size_t size)
114 {
115 fuzzData.ResetData(size);
116 int len = static_cast<int>(size >> 1);
117 std::string accoutId = fuzzData.GetStringFromData(len);
118 std::string bundleName = fuzzData.GetStringFromData(len);
119 CloudSyncManager::GetInstance().NotifyDataChange(accoutId, bundleName);
120 }
121
StartDownloadFileFuzzTest(FuzzData & fuzzData,size_t size)122 void StartDownloadFileFuzzTest(FuzzData &fuzzData, size_t size)
123 {
124 fuzzData.ResetData(size);
125 string uri = fuzzData.GetStringFromData(static_cast<int>(size));
126 CloudSyncManager::GetInstance().StartDownloadFile(uri);
127 }
128
StartFileCacheFuzzTest(FuzzData & fuzzData,size_t size)129 void StartFileCacheFuzzTest(FuzzData &fuzzData, size_t size)
130 {
131 fuzzData.ResetData(size);
132 string uri = fuzzData.GetStringFromData(static_cast<int>(size));
133 CloudSyncManager::GetInstance().StartFileCache(uri);
134 }
135
StopDownloadFileFuzzTest(FuzzData & fuzzData,size_t size)136 void StopDownloadFileFuzzTest(FuzzData &fuzzData, size_t size)
137 {
138 fuzzData.ResetData(size);
139 bool needClean = fuzzData.GetData<bool>();
140 string uri = fuzzData.GetStringFromData(static_cast<int>(size - BOOL_AT_SIZE));
141 CloudSyncManager::GetInstance().StopDownloadFile(uri, needClean);
142 }
143
RegisterDownloadFileCallbackFuzzTest(FuzzData & fuzzData,size_t size)144 void RegisterDownloadFileCallbackFuzzTest(FuzzData &fuzzData, size_t size)
145 {
146 auto downloadCallback = make_shared<ICloudDownloadCallbackTest>();
147 CloudSyncManager::GetInstance().RegisterDownloadFileCallback(downloadCallback);
148 CloudSyncManager::GetInstance().UnregisterDownloadFileCallback();
149 }
150
EnableCloudFuzzTest(FuzzData & fuzzData,size_t size)151 void EnableCloudFuzzTest(FuzzData &fuzzData, size_t size)
152 {
153 fuzzData.ResetData(size);
154 int len = static_cast<int>(size >> 1);
155 std::string accoutId = fuzzData.GetStringFromData(len);
156 string itemStr = fuzzData.GetStringFromData(len - static_cast<int>(BOOL_AT_SIZE));
157 bool itemBool = fuzzData.GetData<bool>();
158 SwitchDataObj switchDataObj;
159 switchDataObj.switchData.insert({itemStr, itemBool});
160 CloudSyncManager::GetInstance().EnableCloud(accoutId, switchDataObj);
161 auto proxy = CloudSyncServiceProxy::GetInstance();
162 CloudSyncManagerImpl::GetInstance().SetDeathRecipient(proxy->AsObject());
163 }
164
DisableCloudFuzzTest(FuzzData & fuzzData,size_t size)165 void DisableCloudFuzzTest(FuzzData &fuzzData, size_t size)
166 {
167 fuzzData.ResetData(size);
168 std::string accoutId = fuzzData.GetStringFromData(static_cast<int>(size));
169 CloudSyncManager::GetInstance().DisableCloud(accoutId);
170 }
171
CleanFuzzTest(FuzzData & fuzzData,size_t size)172 void CleanFuzzTest(FuzzData &fuzzData, size_t size)
173 {
174 fuzzData.ResetData(size);
175 int len = static_cast<int>(size >> 1);
176 std::string accoutId = fuzzData.GetStringFromData(len);
177 int32_t itemInt = fuzzData.GetData<int32_t>();
178 auto remainSize = fuzzData.GetRemainSize();
179 string itemStr = fuzzData.GetStringFromData(static_cast<int>(remainSize));
180 CleanOptions cleanOptions;
181 cleanOptions.appActionsData.insert({itemStr, itemInt});
182 CloudSyncManager::GetInstance().Clean(accoutId, cleanOptions);
183 }
184
CleanCacheFuzzTest(FuzzData & fuzzData,size_t size)185 void CleanCacheFuzzTest(FuzzData &fuzzData, size_t size)
186 {
187 fuzzData.ResetData(size);
188 string uri = fuzzData.GetStringFromData(static_cast<int>(size));
189 CloudSyncManager::GetInstance().CleanCache(uri);
190 }
191 } // namespace OHOS
192
193 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)194 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
195 {
196 /* Run your code on data */
197 if (data == nullptr || size <= (OHOS::U32_AT_SIZE << 1)) {
198 return 0;
199 }
200
201 OHOS::FuzzData fuzzData(data, size);
202 OHOS::RegisterCallbackFuzzTest(fuzzData, size);
203 OHOS::UnRegisterCallbackFuzzTest(fuzzData, size);
204 OHOS::StartSyncFuzzTest(fuzzData, size);
205 OHOS::GetSyncTimeFuzzTest(fuzzData, size);
206 OHOS::StartSyncCallbackFuzzTest(fuzzData, size);
207 OHOS::TriggerSyncFuzzTest(fuzzData, size);
208 OHOS::StopSyncFuzzTest(fuzzData, size);
209 OHOS::ChangeAppSwitchFuzzTest(fuzzData, size);
210 OHOS::NotifyDataChangeFuzzTest(fuzzData, size);
211 OHOS::StartDownloadFileFuzzTest(fuzzData, size);
212 OHOS::StartFileCacheFuzzTest(fuzzData, size);
213 OHOS::StopDownloadFileFuzzTest(fuzzData, size);
214 OHOS::RegisterDownloadFileCallbackFuzzTest(fuzzData, size);
215 OHOS::EnableCloudFuzzTest(fuzzData, size);
216 OHOS::DisableCloudFuzzTest(fuzzData, size);
217 OHOS::CleanFuzzTest(fuzzData, size);
218 OHOS::CleanCacheFuzzTest(fuzzData, size);
219 return 0;
220 }
221