1 /*
2  * Copyright (c) 2022-2023 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 <iostream>
17 #include <map>
18 #include <sstream>
19 
20 #include <gtest/gtest.h>
21 
22 #include "b_resources/b_constants.h"
23 #include "tools_op.h"
24 #include "tools_op_backup.h"
25 #include "utils_mock_global_variable.h"
26 
27 namespace OHOS::FileManagement::Backup {
28 using namespace std;
29 class ToolsOpBackupTest : public testing::Test {
30 public:
SetUpTestCase(void)31     static void SetUpTestCase(void) {};
TearDownTestCase()32     static void TearDownTestCase() {};
SetUp()33     void SetUp() {};
TearDown()34     void TearDown() {};
35 };
36 
PerformBackupOperation(map<string,vector<string>> & mapArgToVal)37 static void PerformBackupOperation(map<string, vector<string>> &mapArgToVal)
38 {
39     GTEST_LOG_(INFO) << "ToolsOpBackupTest-backup";
40     vector<string_view> curOp;
41     curOp.emplace_back("backup");
42     auto tryOpSucceed = [&curOp](const ToolsOp &op) { return op.TryMatch(curOp); };
43     auto &&opeartions = ToolsOp::GetAllOperations();
44     auto matchedOp = find_if(opeartions.begin(), opeartions.end(), tryOpSucceed);
45     if (matchedOp != opeartions.end()) {
46         auto ret = matchedOp->Execute(mapArgToVal);
47         EXPECT_EQ(ret, 0);
48     }
49 }
50 
PrepareBackupArguments()51 static map<string, vector<string>> PrepareBackupArguments()
52 {
53     map<string, vector<string>> mapArgToVal;
54     vector<string> path = {"/data/backup/tmp"};
55     mapArgToVal.insert(make_pair("pathCapFile", path));
56     vector<string> bundles = {"com.example.app2backup", "com.example.app3backup", "com.example.app4backup"};
57     mapArgToVal.insert(make_pair("bundles", bundles));
58     vector<string> local = {"false"};
59     mapArgToVal.insert(make_pair("isLocal", local));
60 
61     return mapArgToVal;
62 }
63 
64 /**
65  * @tc.number: SUB_backup_tools_op_backup_0100
66  * @tc.name: SUB_backup_tools_op_backup_0100
67  * @tc.desc: 测试backup流程
68  * @tc.size: MEDIUM
69  * @tc.type: FUNC
70  * @tc.level Level 1
71  * @tc.require: I6F3GV
72  */
73 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0100, testing::ext::TestSize.Level1)
74 {
75     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0100";
76     try {
77         SetMockGetInstance(true);
78         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
79         map<string, vector<string>> mapArgToVal;
80         string localCap = string(BConstants::GetSaBundleBackupToolDir(BConstants::DEFAULT_USER_ID).data()) + "/tmp";
81         vector<string> path = {localCap.data()};
82         mapArgToVal.insert(make_pair("pathCapFile", path));
83         vector<string> bundles = {"com.example.app2backup"};
84         mapArgToVal.insert(make_pair("bundles", bundles));
85         vector<string> local = {"true"};
86         mapArgToVal.insert(make_pair("isLocal", local));
87 
88         // 尝试匹配当前命令,成功后执行
89         PerformBackupOperation(mapArgToVal);
90     } catch (...) {
91         EXPECT_TRUE(false);
92         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
93     }
94     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0100";
95 }
96 
97 /**
98  * @tc.number: SUB_backup_tools_op_backup_0200
99  * @tc.name: SUB_backup_tools_op_backup_0200
100  * @tc.desc: 测试Exec分支
101  * @tc.size: MEDIUM
102  * @tc.type: FUNC
103  * @tc.level Level 1
104  * @tc.require: I6F3GV
105  */
106 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0200, testing::ext::TestSize.Level1)
107 {
108     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0200";
109     try {
110         GTEST_LOG_(INFO) << "ToolsOpBackupTest-The pathCapFile field is not contained.";
111         map<string, vector<string>> mapArgToVal;
112         vector<string> bundles = {"com.example.app2backup"};
113         vector<string> path = {"/data/backup/tmp"};
114         vector<string> local = {"true"};
115         mapArgToVal.insert(make_pair("bundles", bundles));
116         mapArgToVal.insert(make_pair("isLocal", local));
117 
118         vector<string_view> curOp;
119         curOp.emplace_back("backup");
__anonb7f0dea10202(const ToolsOp &op) 120         auto tryOpSucceed = [&curOp](const ToolsOp &op) { return op.TryMatch(curOp); };
121         auto &&opeartions = ToolsOp::GetAllOperations();
122         auto matchedOp = find_if(opeartions.begin(), opeartions.end(), tryOpSucceed);
123         int ret = 0;
124         if (matchedOp != opeartions.end()) {
125             ret = matchedOp->Execute(mapArgToVal);
126             EXPECT_NE(ret, 0);
127         }
128 
129         GTEST_LOG_(INFO) << "ToolsOpBackupTest-The bundles field is noGt contained.";
130         mapArgToVal.clear();
131         mapArgToVal.insert(make_pair("pathCapFile", path));
132         mapArgToVal.insert(make_pair("isLocal", local));
133         if (matchedOp != opeartions.end()) {
134             ret = matchedOp->Execute(mapArgToVal);
135             EXPECT_NE(ret, 0);
136         }
137 
138         GTEST_LOG_(INFO) << "ToolsOpBackupTest-The isLocal field is noGt contained.";
139         mapArgToVal.clear();
140         mapArgToVal.insert(make_pair("pathCapFile", path));
141         mapArgToVal.insert(make_pair("bundles", bundles));
142         if (matchedOp != opeartions.end()) {
143             ret = matchedOp->Execute(mapArgToVal);
144             EXPECT_NE(ret, 0);
145         }
146 
147         mapArgToVal.clear();
148         if (matchedOp != opeartions.end()) {
149             ret = matchedOp->Execute(mapArgToVal);
150             EXPECT_NE(ret, 0);
151         }
152     } catch (...) {
153         EXPECT_TRUE(false);
154         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
155     }
156     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0200";
157 }
158 
159 /**
160  * @tc.number: SUB_backup_tools_op_backup_0300
161  * @tc.name: SUB_backup_tools_op_backup_0300
162  * @tc.desc: 测试Exec分支
163  * @tc.size: MEDIUM
164  * @tc.type: FUNC
165  * @tc.level Level 1
166  * @tc.require: I6F3GV
167  */
168 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0300, testing::ext::TestSize.Level1)
169 {
170     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0300";
171     try {
172         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
173         map<string, vector<string>> mapArgToVal = PrepareBackupArguments();
174 
175         // 尝试匹配当前命令,成功后执行
176         PerformBackupOperation(mapArgToVal);
177     } catch (...) {
178         EXPECT_TRUE(false);
179         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
180     }
181     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0300";
182 }
183 
184 /**
185  * @tc.number: SUB_backup_tools_op_backup_0400
186  * @tc.name: SUB_backup_tools_op_backup_0400
187  * @tc.desc: 测试InitPathCapFile分支
188  * @tc.size: MEDIUM
189  * @tc.type: FUNC
190  * @tc.level Level 1
191  * @tc.require: I6F3GV
192  */
193 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0400, testing::ext::TestSize.Level1)
194 {
195     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0400";
196     try {
197         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
198         BackUpRegister();
199         map<string, vector<string>> mapArgToVal;
200         vector<string> path = {"/data/backup/tmp"};
201         mapArgToVal.insert(make_pair("pathCapFile", path));
202         vector<string> bundles = {"com.example.app2backup", "com.example.app3backup", "com.example.app4backup"};
203         mapArgToVal.insert(make_pair("bundles", bundles));
204         vector<string> local = {"false"};
205         mapArgToVal.insert(make_pair("isLocal", local));
206 
207         // 尝试匹配当前命令,成功后执行
208         PerformBackupOperation(mapArgToVal);
209     } catch (...) {
210         EXPECT_TRUE(false);
211         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
212     }
213     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0400";
214 }
215 
216 /**
217  * @tc.number: SUB_backup_tools_op_backup_0500
218  * @tc.name: SUB_backup_tools_op_backup_0500
219  * @tc.desc: 测试OnAllBundlesFinished分支
220  * @tc.size: MEDIUM
221  * @tc.type: FUNC
222  * @tc.level Level 1
223  * @tc.require: I6F3GV
224  */
225 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0500, testing::ext::TestSize.Level1)
226 {
227     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0500";
228     try {
229         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
230         BackUpRegister();
231         map<string, vector<string>> mapArgToVal = PrepareBackupArguments();
232 
233         // 尝试匹配当前命令,成功后执行
234         PerformBackupOperation(mapArgToVal);
235     } catch (...) {
236         EXPECT_TRUE(false);
237         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
238     }
239     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0500";
240 }
241 
242 /**
243  * @tc.number: SUB_backup_tools_op_backup_0600
244  * @tc.name: SUB_backup_tools_op_backup_0600
245  * @tc.desc: 测试InitPathCapFile分支
246  * @tc.size: MEDIUM
247  * @tc.type: FUNC
248  * @tc.level Level 1
249  * @tc.require: I6F3GV
250  */
251 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0600, testing::ext::TestSize.Level1)
252 {
253     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0600";
254     try {
255         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
256         BackUpRegister();
257         rmdir((BConstants::BACKUP_TOOL_LINK_DIR).data());
258         mkdir((BConstants::BACKUP_TOOL_LINK_DIR).data(), S_IRWXO);
259         map<string, vector<string>> mapArgToVal = PrepareBackupArguments();
260 
261         // 尝试匹配当前命令,成功后执行
262         PerformBackupOperation(mapArgToVal);
263         rmdir((BConstants::BACKUP_TOOL_LINK_DIR).data());
264     } catch (...) {
265         EXPECT_TRUE(false);
266         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
267     }
268     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0600";
269 }
270 
271 /**
272  * @tc.number: SUB_backup_tools_op_backup_0700
273  * @tc.name: SUB_backup_tools_op_backup_0700
274  * @tc.desc: 测试InitPathCapFile分支
275  * @tc.size: MEDIUM
276  * @tc.type: FUNC
277  * @tc.level Level 1
278  * @tc.require: I6F3GV
279  */
280 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0700, testing::ext::TestSize.Level1)
281 {
282     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0700";
283     try {
284         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
285         BackUpRegister();
286         map<string, vector<string>> mapArgToVal = PrepareBackupArguments();
287 
288         // 尝试匹配当前命令,成功后执行
289         PerformBackupOperation(mapArgToVal);
290     } catch (...) {
291         EXPECT_TRUE(false);
292         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
293     }
294     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0700";
295 }
296 
297 /**
298  * @tc.number: SUB_backup_tools_op_backup_0900
299  * @tc.name: SUB_backup_tools_op_backup_0900
300  * @tc.desc: 测试BackupToolDirSoftlinkToBackupDir分支
301  * @tc.size: MEDIUM
302  * @tc.type: FUNC
303  * @tc.level Level 1
304  * @tc.require: I6F3GV
305  */
306 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_0900, testing::ext::TestSize.Level1)
307 {
308     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_0900";
309     try {
310         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
311         BackUpRegister();
312         rmdir(BConstants::BACKUP_TOOL_LINK_DIR.data());
313         map<string, vector<string>> mapArgToVal = PrepareBackupArguments();
314 
315         // 尝试匹配当前命令,成功后执行
316         PerformBackupOperation(mapArgToVal);
317     } catch (...) {
318         EXPECT_TRUE(false);
319         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
320     }
321     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_0900";
322 }
323 
324 /**
325  * @tc.number: SUB_backup_tools_op_backup_1000
326  * @tc.name: SUB_backup_tools_op_backup_1000
327  * @tc.desc: 测试InitPathCapFile分支
328  * @tc.size: MEDIUM
329  * @tc.type: FUNC
330  * @tc.level Level 1
331  * @tc.require: I6F3GV
332  */
333 HWTEST_F(ToolsOpBackupTest, SUB_backup_tools_op_backup_1000, testing::ext::TestSize.Level1)
334 {
335     GTEST_LOG_(INFO) << "ToolsOpBackupTest-begin SUB_backup_tools_op_backup_1000";
336     try {
337         GTEST_LOG_(INFO) << "ToolsOpBackupTest-info";
338         BackUpRegister();
339         string cmdusermod = string("usermod -u 1000") + BConstants::BACKUP_TOOL_RECEIVE_DIR.data();
340         system(cmdusermod.c_str());
341         map<string, vector<string>> mapArgToVal = PrepareBackupArguments();
342 
343         // 尝试匹配当前命令,成功后执行
344         PerformBackupOperation(mapArgToVal);
345         rmdir((BConstants::BACKUP_TOOL_RECEIVE_DIR).data());
346     } catch (...) {
347         EXPECT_TRUE(false);
348         GTEST_LOG_(INFO) << "ToolsOpBackupTest-an exception occurred by construction.";
349     }
350     GTEST_LOG_(INFO) << "ToolsOpBackupTest-end SUB_backup_tools_op_backup_1000";
351 }
352 } // namespace OHOS::FileManagement::Backup