1 /*
2  * Copyright (c) 2023-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 
16 #include <iostream>
17 #include <map>
18 #include <sstream>
19 #include <string>
20 #include <sys/stat.h>
21 #include <unistd.h>
22 
23 #include <gtest/gtest.h>
24 
25 #include "b_resources/b_constants.h"
26 #include "tools_op.h"
27 
28 #include "b_error/b_error.h"
29 #include "b_error/b_excep_utils.h"
30 #include "b_file_info.h"
31 #include "tools_op_restore_async.cpp"
32 
33 namespace OHOS::FileManagement::Backup {
34 using namespace std;
35 
36 namespace {
37 const string FILE_NAME = "1.tar";
38 const string BUNDLE_NAME = "com.example.app2backup/";
39 const string MANAGE_JSON = "manage.json";
40 } // namespace
41 
42 class ToolsOpRestoreAsyncTest : public testing::Test {
43 public:
SetUpTestCase(void)44     static void SetUpTestCase(void) {};
TearDownTestCase()45     static void TearDownTestCase() {};
SetUp()46     void SetUp() {};
TearDown()47     void TearDown() {};
48 };
49 
50 /**
51  * @tc.number: SUB_backup_tools_op_restore_async_0100
52  * @tc.name: SUB_backup_tools_op_restore_async_0100
53  * @tc.desc: 测试
54  * @tc.size: MEDIUM
55  * @tc.type: FUNC
56  * @tc.level Level 1
57  * @tc.require: I7L7A6
58  */
59 HWTEST_F(ToolsOpRestoreAsyncTest, SUB_backup_tools_op_restore_async_0100, testing::ext::TestSize.Level1)
60 {
61     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin SUB_backup_tools_op_restore_async_0100";
62     try {
63         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-info";
64         map<string, vector<string>> mapArgToVal;
65         string localCap = string(BConstants::SA_BUNDLE_BACKUP_TMP_DIR.data()) + "/tmp";
66         vector<string> path = { localCap.data() };
67         mapArgToVal.insert(make_pair("pathCapFile", path));
68         vector<string> bundles = { "com.example.app2backup" };
69         mapArgToVal.insert(make_pair("bundles", bundles));
70         vector<string> restoreType = { "true" };
71         mapArgToVal.insert(make_pair("restoreType", restoreType));
72         vector<string> userId = { "100" };
73         mapArgToVal.insert(make_pair("userId", userId));
74 
75         // 创建测试路径以及测试环境
76         string cmdMkdir = string("mkdir -p ") + BConstants::BACKUP_TOOL_RECEIVE_DIR.data() + BUNDLE_NAME;
77         system(cmdMkdir.c_str());
78         string cmdTool = string("mkdir -p ") + BConstants::SA_BUNDLE_BACKUP_TMP_DIR.data();
79         system(cmdTool.c_str());
80         string touchTar = string("touch ") + BConstants::BACKUP_TOOL_RECEIVE_DIR.data() + BUNDLE_NAME + FILE_NAME;
81         system(touchTar.c_str());
82         string touchManage = string("touch ") + BConstants::BACKUP_TOOL_RECEIVE_DIR.data() + BUNDLE_NAME + MANAGE_JSON;
83         system(touchManage.c_str());
84         string touchTmp = string("touch ") + localCap;
85         system(touchTmp.c_str());
86 
87         // 尝试匹配当前命令,成功后执行
88         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-restoreAsync";
89         vector<string_view> curOp;
90         curOp.emplace_back("restoreAsync");
__anonbb973b0c0202(const ToolsOp &op) 91         auto tryOpSucceed = [&curOp](const ToolsOp &op) { return op.TryMatch(curOp); };
92         auto &&opeartions = ToolsOp::GetAllOperations();
93         auto matchedOp = find_if(opeartions.begin(), opeartions.end(), tryOpSucceed);
94         if (matchedOp != opeartions.end()) {
95             auto ret = matchedOp->Execute(mapArgToVal);
96             EXPECT_EQ(ret, 0);
97         }
98         mapArgToVal.clear();
99     } catch (...) {
100         EXPECT_TRUE(false);
101         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
102     }
103     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end SUB_backup_tools_op_restore_async_0100";
104 }
105 
106 /**
107  * @tc.number: SUB_backup_tools_op_restore_async_0101
108  * @tc.name: SUB_backup_tools_op_restore_async_0101
109  * @tc.desc: 测试
110  * @tc.size: MEDIUM
111  * @tc.type: FUNC
112  * @tc.level Level 1
113  * @tc.require: I7L7A6
114  */
115 HWTEST_F(ToolsOpRestoreAsyncTest, SUB_backup_tools_op_restore_async_0101, testing::ext::TestSize.Level1)
116 {
117     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin SUB_backup_tools_op_restore_async_0100";
118     try {
119         string localCap = string(BConstants::SA_BUNDLE_BACKUP_TMP_DIR.data()) + "/tmp";
120         vector<string> path = { localCap.data() };
121         vector<string> bundles = { "com.example.app2backup" };
122         vector<string> userId = { "100" };
123         vector<string> restoreTypeF = { "false" };
124         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-info";
125         map<string, vector<string>> mapArgToVal;
126         mapArgToVal.insert(make_pair("pathCapFile", path));
127         mapArgToVal.insert(make_pair("bundles", bundles));
128         mapArgToVal.insert(make_pair("restoreType", restoreTypeF));
129         mapArgToVal.insert(make_pair("userId", userId));
130         vector<string_view> curOp;
131         curOp.emplace_back("restoreAsync");
132         auto &&opeartions = ToolsOp::GetAllOperations();
__anonbb973b0c0302(const ToolsOp &op) 133         auto tryOpSucceed = [&curOp](const ToolsOp &op) { return op.TryMatch(curOp); };
134         auto matchedOp = find_if(opeartions.begin(), opeartions.end(), tryOpSucceed);
135         if (matchedOp != opeartions.end()) {
136             auto ret = matchedOp->Execute(mapArgToVal);
137             EXPECT_EQ(ret, 0);
138         }
139         mapArgToVal.clear();
140     } catch (...) {
141         EXPECT_TRUE(false);
142         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
143     }
144     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end SUB_backup_tools_op_restore_async_0100";
145 }
146 
147 /**
148  * @tc.number: SUB_backup_tools_op_restore_async_0200
149  * @tc.name: SUB_backup_tools_op_restore_async_0200
150  * @tc.desc: 测试
151  * @tc.size: MEDIUM
152  * @tc.type: FUNC
153  * @tc.level Level 1
154  * @tc.require: I7L7A6
155  */
156 HWTEST_F(ToolsOpRestoreAsyncTest, SUB_backup_tools_op_restore_async_0200, testing::ext::TestSize.Level1)
157 {
158     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin SUB_backup_tools_op_restore_async_0200";
159     try {
160         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-The pathCapFile field is not contained.";
161         map<string, vector<string>> mapArgToVal;
162         vector<string> bundles = {"com.example.app2backup"};
163         vector<string> path = {"/data/backup/tmp"};
164         mapArgToVal.insert(make_pair("bundles", bundles));
165         vector<string> restoreType = {"false"};
166         mapArgToVal.insert(make_pair("restoreType", restoreType));
167         vector<string> userId = {"100"};
168         mapArgToVal.insert(make_pair("userId", userId));
169 
170         vector<string_view> curOp;
171         curOp.emplace_back("restoreAsync");
__anonbb973b0c0402(const ToolsOp &op) 172         auto tryOpSucceed = [&curOp](const ToolsOp &op) { return op.TryMatch(curOp); };
173         auto &&opeartions = ToolsOp::GetAllOperations();
174         auto matchedOp = find_if(opeartions.begin(), opeartions.end(), tryOpSucceed);
175         int ret = 0;
176         if (matchedOp != opeartions.end()) {
177             ret = matchedOp->Execute(mapArgToVal);
178             EXPECT_NE(ret, 0);
179         }
180         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-The bundles field is not contained.";
181         mapArgToVal.clear();
182         if (matchedOp != opeartions.end()) {
183             mapArgToVal.insert(make_pair("pathCapFile", path));
184             ret = matchedOp->Execute(mapArgToVal);
185             EXPECT_NE(ret, 0);
186 
187             mapArgToVal.clear();
188             mapArgToVal.insert(make_pair("pathCapFile", path));
189             mapArgToVal.insert(make_pair("bundles", bundles));
190             ret = matchedOp->Execute(mapArgToVal);
191             EXPECT_NE(ret, 0);
192 
193             mapArgToVal.clear();
194             mapArgToVal.insert(make_pair("pathCapFile", path));
195             mapArgToVal.insert(make_pair("bundles", bundles));
196             mapArgToVal.insert(make_pair("restoreType", restoreType));
197             ret = matchedOp->Execute(mapArgToVal);
198             EXPECT_NE(ret, 0);
199 
200             mapArgToVal.clear();
201             ret = matchedOp->Execute(mapArgToVal);
202             EXPECT_NE(ret, 0);
203         }
204     } catch (...) {
205         EXPECT_TRUE(false);
206         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
207     }
208     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end SUB_backup_tools_op_restore_async_0200";
209 }
210 
211 /**
212  * @tc.number: SUB_backup_tools_op_restore_async_0300
213  * @tc.name: tools_op_restore_async_0300
214  * @tc.desc: 测试文件名包含BConstants::EXT_BACKUP_MANAGE,且tmpPath存在
215  * @tc.size: MEDIUM
216  * @tc.type: FUNC
217  * @tc.level Level 1
218  * @tc.require: I9JNFM
219  */
220 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0300, testing::ext::TestSize.Level1)
221 {
222     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0300";
223     try {
224         auto ctx = make_shared<SessionAsync>();
225         BFileInfo fileInfo;
226         fileInfo.owner = "test";
227         fileInfo.fileName = "manage.json";
228         fileInfo.sn = 1;
229         UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666));
230         OnFileReady(ctx, fileInfo, move(fd), 0);
231     } catch (BError &e) {
232         EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode());
233         EXPECT_TRUE(true);
234     } catch (...) {
235         EXPECT_TRUE(false);
236         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
237     }
238     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0300";
239 }
240 
241 /**
242  * @tc.number: SUB_backup_tools_op_restore_async_0301
243  * @tc.name: tools_op_restore_async_0301
244  * @tc.desc: 测试文件名不包含BConstants::EXT_BACKUP_MANAGE,且tmpPath存在
245  * @tc.size: MEDIUM
246  * @tc.type: FUNC
247  * @tc.level Level 1
248  * @tc.require: I9JNFM
249  */
250 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0301, testing::ext::TestSize.Level1)
251 {
252     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0301";
253     try {
254         auto ctx = make_shared<SessionAsync>();
255         BFileInfo fileInfo;
256         fileInfo.owner = "test";
257         fileInfo.fileName = "test.json";
258         fileInfo.sn = 1;
259         UniqueFd fd(open("text.txt", O_RDWR | O_CREAT, 0666));
260         OnFileReady(ctx, fileInfo, move(fd), 0);
261     } catch (BError &e) {
262         EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode());
263         EXPECT_TRUE(true);
264     } catch (...) {
265         EXPECT_TRUE(false);
266         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
267     }
268     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0301";
269 }
270 
271 /**
272  * @tc.number: SUB_backup_tools_op_restore_async_0400
273  * @tc.name: tools_op_restore_async_0400
274  * @tc.desc: 测试当err=0时,不会调用UpdateBundleFinishedCount和TryNotify方法
275  * @tc.size: MEDIUM
276  * @tc.type: FUNC
277  * @tc.level Level 1
278  * @tc.require: I9JNFM
279  */
280 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0400, testing::ext::TestSize.Level1)
281 {
282     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0400";
283     try {
284         auto ctx = make_shared<SessionAsync>();
285         ErrCode err = 0;
286         BundleName name = "testBundle";
287         OnBundleStarted(ctx, err, name);
288         EXPECT_TRUE(true);
289     } catch (...) {
290         EXPECT_TRUE(false);
291         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
292     }
293     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0400";
294 }
295 
296 /**
297  * @tc.number: SUB_backup_tools_op_restore_async_0401
298  * @tc.name: tools_op_restore_async_0401
299  * @tc.desc: test func
300  * @tc.size: MEDIUM
301  * @tc.type: FUNC
302  * @tc.level Level 1
303  * @tc.require: I9JNFM
304  */
305 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0401, testing::ext::TestSize.Level1)
306 {
307     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0401";
308     try {
309         auto ctx = make_shared<SessionAsync>();
310         ctx->cnt_ = 1;
311         ErrCode err = -1;
312         BundleName name = "testBundle";
313         OnBundleStarted(ctx, err, name);
314         EXPECT_TRUE(true);
315     } catch (...) {
316         EXPECT_TRUE(false);
317         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
318     }
319     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0401";
320 }
321 
322 /**
323  * @tc.number: SUB_backup_tools_op_restore_async_0500
324  * @tc.name: tools_op_restore_async_0500
325  * @tc.desc: 测试OnBundleFinished方法
326  * @tc.size: MEDIUM
327  * @tc.type: FUNC
328  * @tc.level Level 1
329  * @tc.require: I9JNFM
330  */
331 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0500, testing::ext::TestSize.Level1)
332 {
333     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0500";
334     try {
335         auto ctx = make_shared<SessionAsync>();
336         ErrCode err = 0;
337         BundleName name = "testBundle";
338         OnBundleFinished(ctx, err, name);
339         EXPECT_TRUE(true);
340     } catch (...) {
341         EXPECT_TRUE(false);
342         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
343     }
344     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0500";
345 }
346 
347 /**
348  * @tc.number: SUB_backup_tools_op_restore_async_0501
349  * @tc.name: tools_op_restore_async_0501
350  * @tc.desc: 测试OnBundleFinished方法
351  * @tc.size: MEDIUM
352  * @tc.type: FUNC
353  * @tc.level Level 1
354  * @tc.require: I9JNFM
355  */
356 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0501, testing::ext::TestSize.Level1)
357 {
358     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0501";
359     try {
360         auto ctx = make_shared<SessionAsync>();
361         ctx->cnt_ = 1;
362         ErrCode err = -1;
363         BundleName name = "testBundle";
364         OnBundleFinished(ctx, err, name);
365         EXPECT_TRUE(true);
366     } catch (...) {
367         EXPECT_TRUE(false);
368         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
369     }
370     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0501";
371 }
372 
373 /**
374  * @tc.number: SUB_backup_tools_op_restore_async_0600
375  * @tc.name: tools_op_restore_async_0600
376  * @tc.desc: 测试OnAllBundlesFinished方法
377  * @tc.size: MEDIUM
378  * @tc.type: FUNC
379  * @tc.level Level 1
380  * @tc.require: I9JNFM
381  */
382 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0600, testing::ext::TestSize.Level1)
383 {
384     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0600";
385     try {
386         auto ctx = make_shared<SessionAsync>();
387         ErrCode err = 0;
388         OnAllBundlesFinished(ctx, err);
389         EXPECT_TRUE(true);
390     } catch (...) {
391         EXPECT_TRUE(false);
392         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
393     }
394     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0600";
395 }
396 
397 /**
398  * @tc.number: SUB_backup_tools_op_restore_async_0700
399  * @tc.name: tools_op_restore_async_0700
400  * @tc.desc: 测试OnResultReport方法
401  * @tc.size: MEDIUM
402  * @tc.type: FUNC
403  * @tc.level Level 1
404  * @tc.require: I9JNFM
405  */
406 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0700, testing::ext::TestSize.Level1)
407 {
408     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0700";
409     try {
410         auto ctx = make_shared<SessionAsync>();
411         std::string bundleName = "com.example.app2backup";
412         std::string resultInfo = "test result info";
413         OnResultReport(ctx, bundleName, resultInfo);
414         EXPECT_TRUE(true);
415     } catch (...) {
416         EXPECT_TRUE(false);
417         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
418     }
419     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0700";
420 }
421 
422 /**
423  * @tc.number: SUB_backup_tools_op_restore_async_0800
424  * @tc.name: tools_op_restore_async_0800
425  * @tc.desc: 测试OnBackupServiceDied方法
426  * @tc.size: MEDIUM
427  * @tc.type: FUNC
428  * @tc.level Level 1
429  * @tc.require: I9JNFM
430  */
431 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0800, testing::ext::TestSize.Level1)
432 {
433     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0800";
434     try {
435         auto ctx = make_shared<SessionAsync>();
436         OnBackupServiceDied(ctx);
437         EXPECT_TRUE(true);
438     } catch (...) {
439         EXPECT_TRUE(false);
440         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
441     }
442     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0800";
443 }
444 
445 /**
446  * @tc.number: SUB_backup_tools_op_restore_async_0900
447  * @tc.name: tools_op_restore_async_0900
448  * @tc.desc: 测试AdapteCloneOptimize方法路径存在
449  * @tc.size: MEDIUM
450  * @tc.type: FUNC
451  * @tc.level Level 1
452  * @tc.require: I9JNFM
453  */
454 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_0900, testing::ext::TestSize.Level1)
455 {
456     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_0900";
457     try {
458         string path = "/data/backup/receive";
459         AdapteCloneOptimize(path);
460         EXPECT_TRUE(true);
461     } catch (...) {
462         EXPECT_TRUE(false);
463         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
464     }
465     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_0900";
466 }
467 
468 /**
469  * @tc.number: SUB_backup_tools_op_restore_async_1000
470  * @tc.name: tools_op_restore_async_1000
471  * @tc.desc: 测试restore为空的情况
472  * @tc.size: MEDIUM
473  * @tc.type: FUNC
474  * @tc.level Level 1
475  * @tc.require: I9JNFM
476  */
477 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1000, testing::ext::TestSize.Level1)
478 {
479     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1000";
480     try {
481         vector<BundleName> bundleNames;
482         RestoreApp(nullptr, bundleNames);
483     } catch (BError &e) {
484         EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode());
485         EXPECT_TRUE(true);
486     } catch (...) {
487         EXPECT_TRUE(false);
488         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
489     }
490     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1000";
491 }
492 
493 /**
494  * @tc.number: SUB_backup_tools_op_restore_async_1001
495  * @tc.name: tools_op_restore_async_1001
496  * @tc.desc: 测试restore不为空bundlename包含'/'的情况
497  * @tc.size: MEDIUM
498  * @tc.type: FUNC
499  * @tc.level Level 1
500  * @tc.require: I9JNFM
501  */
502 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1001, testing::ext::TestSize.Level1)
503 {
504     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1001";
505     try {
506         vector<BundleName> bundleNames;
507         bundleNames.push_back("bundle/name");
508         shared_ptr<SessionAsync> restore = make_shared<SessionAsync>();
509         restore->session_ = {};
510         RestoreApp(restore, bundleNames);
511     } catch (BError &e) {
512         EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode());
513         EXPECT_TRUE(true);
514     } catch (...) {
515         EXPECT_TRUE(false);
516         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
517     }
518     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1001";
519 }
520 
521 /**
522  * @tc.number: SUB_backup_tools_op_restore_async_1002
523  * @tc.name: tools_op_restore_async_1002
524  * @tc.desc: 测试正常情况
525  * @tc.size: MEDIUM
526  * @tc.type: FUNC
527  * @tc.level Level 1
528  * @tc.require: I9JNFM
529  */
530 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1002, testing::ext::TestSize.Level1)
531 {
532     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1002";
533     try {
534         vector<BundleName> bundleNames;
535         bundleNames.push_back("bundlename");
536         shared_ptr<SessionAsync> restore = make_shared<SessionAsync>();
537         restore->session_ = {};
538         RestoreApp(restore, bundleNames);
539     } catch (BError &e) {
540         EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode());
541         EXPECT_TRUE(true);
542     } catch (...) {
543         EXPECT_TRUE(false);
544         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
545     }
546     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1002";
547 }
548 
549 /**
550  * @tc.number: SUB_backup_tools_op_restore_async_1100
551  * @tc.name: tools_op_restore_async_1100
552  * @tc.desc: 测试正type =false 的情况
553  * @tc.size: MEDIUM
554  * @tc.type: FUNC
555  * @tc.level Level 1
556  * @tc.require: I9JNFM
557  */
558 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1100, testing::ext::TestSize.Level1)
559 {
560     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1100";
561     try {
562         string pathCapFile = "/data/user/0/test/files/bundleInfo.json";
563         vector<string> bundleNames = {"bundlenames"};
564         string type = "false";
565         int32_t ret = ChangeBundleInfo(pathCapFile, bundleNames, type);
566         EXPECT_LT(ret, 0);
567     } catch (...) {
568         EXPECT_TRUE(false);
569         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
570     }
571     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1100";
572 }
573 
574 /**
575  * @tc.number: SUB_backup_tools_op_restore_async_1101
576  * @tc.name: tools_op_restore_async_1101
577  * @tc.desc: 测试正打开失败的情况
578  * @tc.size: MEDIUM
579  * @tc.type: FUNC
580  * @tc.level Level 1
581  * @tc.require: I9JNFM
582  */
583 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1101, testing::ext::TestSize.Level1)
584 {
585     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1101";
586     try {
587         string pathCapFile = " ";
588         vector<string> bundleNames = {"bundlenames"};
589         string type = "false";
590         int32_t ret = ChangeBundleInfo(pathCapFile, bundleNames, type);
591         EXPECT_LT(ret, 0);
592     } catch (...) {
593         EXPECT_TRUE(false);
594         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
595     }
596     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1101";
597 }
598 
599 /**
600  * @tc.number: SUB_backup_tools_op_restore_async_1102
601  * @tc.name: tools_op_restore_async_1102
602  * @tc.desc: 测试正打开失败的情况
603  * @tc.size: MEDIUM
604  * @tc.type: FUNC
605  * @tc.level Level 1
606  * @tc.require: I9JNFM
607  */
608 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1102, testing::ext::TestSize.Level1)
609 {
610     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1102";
611     try {
612         string pathCapFile = "/data/user/0/test/files/bundleInfo.json";
613         vector<string> bundleNames = {};
614         string type = "true";
615         int32_t ret = ChangeBundleInfo(pathCapFile, bundleNames, type);
616         EXPECT_LT(ret, 0);
617     } catch (...) {
618         EXPECT_TRUE(false);
619         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
620     }
621     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1102";
622 }
623 
624 /**
625  * @tc.number: SUB_backup_tools_op_restore_async_1200
626  * @tc.name: tools_op_restore_async_1200
627  * @tc.desc: 测试当BExcepUltils::VerifyPath方法抛出异常时
628  * @tc.size: MEDIUM
629  * @tc.type: FUNC
630  * @tc.level Level 1
631  * @tc.require: I9JNFM
632  */
633 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1200, testing::ext::TestSize.Level1)
634 {
635     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1200";
636     try {
637         string pathCapFile = "invalid/path";
638         vector<string> bundleNames = {"bundle1", "bundle2"};
639         string type = "true";
640         string userId = "123456";
641         shared_ptr<SessionAsync> restore = make_shared<SessionAsync>();
642         AppendBundles(restore, pathCapFile, bundleNames, type, userId);
643     } catch (BError &e) {
644         EXPECT_EQ(e.GetCode(), BError(BError::Codes::TOOL_INVAL_ARG).GetCode());
645     } catch (...) {
646         EXPECT_TRUE(false);
647         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
648     }
649     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1200";
650 }
651 
652 /**
653  * @tc.number: SUB_backup_tools_op_restore_async_1201
654  * @tc.name: tools_op_restore_async_1201
655  * @tc.desc: 测试当open方法返回错误时
656  * @tc.size: MEDIUM
657  * @tc.type: FUNC
658  * @tc.level Level 1
659  * @tc.require: I9JNFM
660  */
661 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1201, testing::ext::TestSize.Level1)
662 {
663     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1201";
664     try {
665         string pathCapFile = " ";
666         vector<string> bundleNames = {"bundle1", "bundle2"};
667         string type = "true";
668         string userId = "123456";
669         shared_ptr<SessionAsync> restore = make_shared<SessionAsync>();
670         EXPECT_EQ(-errno, AppendBundles(restore, pathCapFile, bundleNames, type, userId));
671     } catch (...) {
672         EXPECT_TRUE(false);
673         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
674     }
675     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1201";
676 }
677 
678 /**
679  * @tc.number: SUB_backup_tools_op_restore_async_1202
680  * @tc.name: tools_op_restore_async_1202
681  * @tc.desc: 测试当type = "true"
682  * @tc.size: MEDIUM
683  * @tc.type: FUNC
684  * @tc.level Level 1
685  * @tc.require: I9JNFM
686  */
687 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1202, testing::ext::TestSize.Level1)
688 {
689     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1202";
690     try {
691         string pathCapFile = "/invalid/path";
692         vector<string> bundleNames = {"bundle1", "bundle2"};
693         string type = "true";
694         string userId = "123456";
695         shared_ptr<SessionAsync> restore = make_shared<SessionAsync>();
696         int32_t ret = AppendBundles(restore, pathCapFile, bundleNames, type, userId);
697         EXPECT_LT(ret, 0);
698     } catch (...) {
699         EXPECT_TRUE(false);
700         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
701     }
702     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1202";
703 }
704 
705 /**
706  * @tc.number: SUB_backup_tools_op_restore_async_1204
707  * @tc.name: tools_op_restore_async_1204
708  * @tc.desc: 测试AppendBundles方法抛出异常
709  * @tc.size: MEDIUM
710  * @tc.type: FUNC
711  * @tc.level Level 1
712  * @tc.require: I9JNFM
713  */
714 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1204, testing::ext::TestSize.Level1)
715 {
716     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1204";
717     try {
718         string pathCapFile = "/invalid/path";
719         vector<string> bundleNames = {"bun/dle1"};
720         string type = "false";
721         string userId = "123456";
722         shared_ptr<SessionAsync> restore = make_shared<SessionAsync>();
723         int32_t ret = AppendBundles(restore, pathCapFile, bundleNames, type, userId);
724         EXPECT_LT(ret, 0);
725     } catch (...) {
726         EXPECT_TRUE(false);
727         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
728     }
729     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1204";
730 }
731 
732 /**
733  * @tc.number: SUB_backup_tools_op_restore_async_1300
734  * @tc.name: tools_op_restore_async_1300
735  * @tc.desc: 测试InitArg方法中ChangeBundleInfo返回false的情况
736  * @tc.size: MEDIUM
737  * @tc.type: FUNC
738  * @tc.level Level 1
739  * @tc.require: I9JNFM
740  */
741 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1300, testing::ext::TestSize.Level1)
742 {
743     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1300";
744     try {
745         string pathCapFile = " ";
746         vector<string> bundleNames = {"bundle1", "bundle2"};
747         string type = "type1";
748         string userId = "user1";
749         EXPECT_EQ(InitArg(pathCapFile, bundleNames, type, userId), -errno);
750     } catch (...) {
751         EXPECT_TRUE(false);
752         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
753     }
754     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1300";
755 }
756 
757 /**
758  * @tc.number: SUB_backup_tools_op_restore_async_1301
759  * @tc.name: tools_op_restore_async_1301
760  * @tc.desc: 测试InitArg正常
761  * @tc.size: MEDIUM
762  * @tc.type: FUNC
763  * @tc.level Level 1
764  * @tc.require: I9NOPD
765  */
766 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1301, testing::ext::TestSize.Level1)
767 {
768     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1301";
769     try {
770         string pathCapFile = "/data/test/tmp";
771         int fd = open(pathCapFile.data(), O_RDWR | O_CREAT, S_IRWXU);
772         EXPECT_GT(fd, 0);
773         close(fd);
774         vector<string> bundleNames = {"com.example.app2backup"};
775         string type = "true";
776         string userId = "100";
777         EXPECT_EQ(InitArg(pathCapFile, bundleNames, type, userId), 0);
778     } catch (...) {
779         EXPECT_TRUE(false);
780         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
781     }
782     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1301";
783 }
784 
785 /**
786  * @tc.number: SUB_backup_tools_op_restore_async_1400
787  * @tc.name: tools_op_restore_async_1400
788  * @tc.desc: 测试包含所有参数的情况
789  * @tc.size: MEDIUM
790  * @tc.type: FUNC
791  * @tc.level Level 1
792  * @tc.require: I9NOPD
793  */
794 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1400, testing::ext::TestSize.Level1)
795 {
796     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1400";
797     try {
798         map<string, vector<string>> mapArgToVal;
799         mapArgToVal["pathCapFile"] = {"/tmp/"};
800         mapArgToVal["bundles"] = {"com.example.app2backup"};
801         mapArgToVal["restoreType"] = {"true"};
802         mapArgToVal["userId"] = {"100"};
803         int ret = Exec(mapArgToVal);
804         EXPECT_LT(ret, 0);
805     } catch (...) {
806         EXPECT_TRUE(false);
807         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
808     }
809     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1400";
810 }
811 
812 /**
813  * @tc.number: SUB_backup_tools_op_restore_async_1401
814  * @tc.name: tools_op_restore_async_1401
815  * @tc.desc: 测试不包含所有参数的情况
816  * @tc.size: MEDIUM
817  * @tc.type: FUNC
818  * @tc.level Level 1
819  * @tc.require: I9NOPD
820  */
821 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1401, testing::ext::TestSize.Level1)
822 {
823     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1401";
824     try {
825         map<string, vector<string>> mapArgToVal;
826         int ret = Exec(mapArgToVal);
827         EXPECT_EQ(ret, -EPERM);
828     } catch (...) {
829         EXPECT_TRUE(false);
830         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
831     }
832     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1401";
833 }
834 
835 /**
836  * @tc.number: SUB_backup_tools_op_restore_async_1500
837  * @tc.name: tools_op_restore_async_1500
838  * @tc.desc: test func
839  * @tc.size: MEDIUM
840  * @tc.type: FUNC
841  * @tc.level Level 1
842  * @tc.require: I9NOPD
843  */
844 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1500, testing::ext::TestSize.Level1)
845 {
846     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1500";
847     try {
848         std::string path = "/data/backup/receive";
849         std::vector<ExtManageInfo> pkgInfo;
850         ExtManageInfo info;
851         info.hashName = "hashName";
852         info.fileName = "fileName";
853         info.isBigFile = false;
854         info.isUserTar = false;
855         pkgInfo.push_back(info);
856 
857         auto result = ReadyExtManage(path, pkgInfo);
858         EXPECT_EQ(result.size(), 1);
859     } catch (...) {
860         EXPECT_TRUE(false);
861         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
862     }
863     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1500";
864 }
865 
866 /**
867  * @tc.number: SUB_backup_tools_op_restore_async_1501
868  * @tc.name: tools_op_restore_async_1501
869  * @tc.desc: test func
870  * @tc.size: MEDIUM
871  * @tc.type: FUNC
872  * @tc.level Level 1
873  * @tc.require: I9NOPD
874  */
875 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1501, testing::ext::TestSize.Level1)
876 {
877     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1501";
878     try {
879         std::string path = "/data/backup/receive";
880         std::vector<ExtManageInfo> pkgInfo;
881         ExtManageInfo info;
882         info.hashName = "";
883         info.fileName = "";
884         info.isBigFile = false;
885         info.isUserTar = false;
886         pkgInfo.push_back(info);
887 
888         auto result = ReadyExtManage(path, pkgInfo);
889         EXPECT_EQ(result.size(), 0);
890     } catch (...) {
891         EXPECT_TRUE(false);
892         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
893     }
894     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1501";
895 }
896 
897 /**
898  * @tc.number: SUB_backup_tools_op_restore_async_1502
899  * @tc.name: tools_op_restore_async_1502
900  * @tc.desc: test func
901  * @tc.size: MEDIUM
902  * @tc.type: FUNC
903  * @tc.level Level 1
904  * @tc.require: I9NOPD
905  */
906 HWTEST_F(ToolsOpRestoreAsyncTest, tools_op_restore_async_1502, testing::ext::TestSize.Level1)
907 {
908     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-begin tools_op_restore_async_1502";
909     try {
910         std::string path = "/data/backup/receive";
911         std::vector<ExtManageInfo> pkgInfo;
912         ExtManageInfo info;
913         info.hashName = "hashName";
914         info.fileName = "fileName";
915         info.isBigFile = true;
916         info.isUserTar = true;
917         pkgInfo.push_back(info);
918 
919         auto result = ReadyExtManage(path, pkgInfo);
920         EXPECT_EQ(result.size(), 1);
921     } catch (...) {
922         EXPECT_TRUE(false);
923         GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-an exception occurred by construction.";
924     }
925     GTEST_LOG_(INFO) << "ToolsOpRestoreAsyncTest-end tools_op_restore_async_1502";
926 }
927 } // namespace OHOS::FileManagement::Backup