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