1 /*
2  * Copyright (c) 2022-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 <map>
17 #include <set>
18 #include <string>
19 #include <utility>
20 
21 #include <fcntl.h>
22 #include <sys/stat.h>
23 
24 #include <file_ex.h>
25 #include <gtest/gtest.h>
26 #include <json/value.h>
27 
28 #include "b_json/b_json_cached_entity.h"
29 #include "b_json/b_json_entity_ext_manage.h"
30 #include "test_manager.h"
31 
32 #include "src/b_json/b_json_entity_ext_manage.cpp"
33 
34 namespace OHOS::FileManagement::Backup {
35 using namespace std;
36 using namespace testing::ext;
37 const int32_t INDEX_FIRST = 0;
38 const int32_t INDEX_SECOND = 1;
39 const int32_t INDEX_THIRD = 2;
40 class BJsonEntityExtManageTest : public testing::Test {
41 public:
SetUpTestCase(void)42     static void SetUpTestCase(void) {};
TearDownTestCase()43     static void TearDownTestCase() {};
SetUp()44     void SetUp() {};
TearDown()45     void TearDown() {};
46 };
47 
IsEqual(const struct stat & lf,const struct stat & rh)48 bool IsEqual(const struct stat &lf, const struct stat &rh)
49 {
50     if (lf.st_size != rh.st_size) {
51         return false;
52     }
53     if (lf.st_atim.tv_sec != rh.st_atim.tv_sec) {
54         return false;
55     }
56     if (lf.st_atim.tv_nsec != rh.st_atim.tv_nsec) {
57         return false;
58     }
59     if (lf.st_mtim.tv_sec != rh.st_mtim.tv_sec) {
60         return false;
61     }
62     if (lf.st_mtim.tv_nsec != rh.st_mtim.tv_nsec) {
63         return false;
64     }
65     return true;
66 }
67 
IsEqual(const map<string,tuple<string,struct stat,bool>> & lf,const map<string,tuple<string,struct stat,bool>> & rh)68 bool IsEqual(const map<string, tuple<string, struct stat, bool>> &lf,
69              const map<string, tuple<string, struct stat, bool>> &rh)
70 {
71     if (lf.size() != rh.size()) {
72         return false;
73     }
74 
75     auto itemLF = lf.begin();
76     auto itemRH = rh.begin();
77     for (; itemLF != lf.end(); ++itemLF, ++itemRH) {
78         if (itemLF->first != itemRH->first) {
79             return false;
80         }
81         if (std::get<INDEX_FIRST>(itemLF->second) != std::get<INDEX_FIRST>(itemRH->second)) {
82             return false;
83         }
84         if (!IsEqual(std::get<INDEX_SECOND>(itemLF->second), std::get<INDEX_SECOND>(itemRH->second))) {
85             return false;
86         }
87         if (std::get<INDEX_THIRD>(itemLF->second) != std::get<INDEX_THIRD>(itemRH->second)) {
88             return false;
89         }
90     }
91 
92     return true;
93 }
94 
IsEqual(const std::vector<ExtManageInfo> & lf,const map<string,tuple<string,struct stat,bool>> & rh)95 bool IsEqual(const std::vector<ExtManageInfo> &lf, const map<string, tuple<string, struct stat, bool>> &rh)
96 {
97     if (lf.size() != rh.size()) {
98         return false;
99     }
100     for (auto &item : lf) {
101         if (rh.find(item.hashName) != rh.end()) {
102             auto [fileName, sta, isBeforeTar] = rh.at(item.hashName);
103             if (item.fileName != fileName || !IsEqual(item.sta, sta)) {
104                 return false;
105             }
106         }
107     }
108     return true;
109 }
110 
GetFileStat(const string & pathTestFile)111 struct stat GetFileStat(const string &pathTestFile)
112 {
113     struct stat sta = {};
114     if (stat(pathTestFile.data(), &sta) == -1) {
115         GTEST_LOG_(INFO) << pathTestFile << " invoked stat failure, errno :" << errno;
116         throw BError(errno);
117     }
118     return sta;
119 }
120 
121 /**
122  * @tc.number: SUB_backup_b_json_entity_ext_manage_0100
123  * @tc.name: b_json_entity_ext_manage_0100
124  * @tc.desc: 通过向接口SetExtManage传入不包含任何信息的空map参数,测试对索引文件的操作是否正确。
125  *           0:通过向索引文件写入0条数据模拟对索引文件的(空)内容的测试覆盖
126  *           1:调用接口SetExtManage,向索引文件写入数据
127  *           2:调用接口GetExtManage,从索引文件读出文件名数据
128  *           3:调用接口GetExtManageInfo,从索引文件读出文件详细数据(含文件名和对应文件的stat数据)
129  *           4:判断读出的文件名集合/文件详细数据记录个数是否为0
130  * @tc.size: MEDIUM
131  * @tc.type: FUNC
132  * @tc.level Level 0
133  * @tc.require: I6F3GV
134  */
135 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0100, testing::ext::TestSize.Level0)
136 {
137     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0100";
138     try {
139         // 预置文件数据
140         // 索引文件pathManageFile
141         TestManager tm("b_json_entity_ext_manage_0100");
142         string root = tm.GetRootDirCurTest();
143         string pathManageFile = root + "manage.json";
144         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
145         auto cache = cachedEntity.Structuralize();
146 
147         // 写入空数据
148         map<string, tuple<string, struct stat, bool>> info;
149         cache.SetExtManage(info);
150 
151         // 读取索引文件信息并做结果判断
152         auto fileNames = cache.GetExtManage();
153         EXPECT_EQ(fileNames.size(), 0ul);
154         auto fileInfo = cache.GetExtManageInfo();
155         EXPECT_EQ(fileInfo.size(), 0ul);
156     } catch (...) {
157         EXPECT_TRUE(false);
158         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
159     }
160     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0100";
161 }
162 
163 /**
164  * @tc.number: SUB_backup_b_json_entity_ext_manage_0200
165  * @tc.name: b_json_entity_ext_manage_0200
166  * @tc.desc: 通过向接口SetExtManage传入包含一条信息的map参数,测试对索引文件的操作是否正确。
167  *           0:通过向索引文件写入1条有效数据模拟对索引文件的(有)内容的测试覆盖
168  *           1:调用接口SetExtManage,向索引文件写入数据
169  *           2:调用接口GetExtManage,从索引文件读出文件名数据
170  *           3:调用接口GetExtManageInfo,从索引文件读出文件详细数据(含文件名和对应文件的stat数据)
171  *           4:判断读出的文件名集合/文件详细数据记录个数是否和写入时相等
172  *           5:判断读出的文件名集合/文件详细数据记录内容是否和写入时相等
173  * @tc.size: MEDIUM
174  * @tc.type: FUNC
175  * @tc.level Level 0
176  * @tc.require: I6F3GV
177  */
178 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0200, testing::ext::TestSize.Level0)
179 {
180     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0200";
181     try {
182         TestManager tm("b_json_entity_ext_manage_0200");
183 
184         // 预置文件数据
185         // 索引文件pathManageFile, 测试文件路径pathTestFile, 测试文件名testFileHexName
186         string root = tm.GetRootDirCurTest();
187         string pathManageFile = root + "manage.json";
188         string pathTestFile = root + "test.txt";
189         string testFileHexName = "1234567890abcdef";
190         SaveStringToFile(pathTestFile, "hello world");
191         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
192         auto cache = cachedEntity.Structuralize();
193 
194         // 生成一条有用数据并写入索引文件
195         map<string, tuple<string, struct stat, bool>> info;
196         struct stat sta = {};
197         info.emplace(testFileHexName, make_tuple(pathTestFile, sta = GetFileStat(pathTestFile), true));
198         cache.SetExtManage(info);
199 
200         // 读取索引文件内容并做结果判断
201         auto fileNames = cache.GetExtManage();
202         ASSERT_EQ(fileNames.size(), 1ul);
203         EXPECT_EQ(*fileNames.begin(), testFileHexName);
204         auto fileInfo = cache.GetExtManageInfo();
205         ASSERT_EQ(fileInfo.size(), 1ul);
206         EXPECT_EQ(fileInfo[0].hashName, testFileHexName);
207         EXPECT_EQ(fileInfo[0].fileName, pathTestFile);
208         EXPECT_TRUE(IsEqual(fileInfo[0].sta, sta));
209     } catch (...) {
210         EXPECT_TRUE(false);
211         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
212     }
213     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0200";
214 }
215 
216 /**
217  * @tc.number: SUB_backup_b_json_entity_ext_manage_0300
218  * @tc.name: b_json_entity_ext_manage_0300
219  * @tc.desc: 通过向接口SetExtManage传入包含三条信息的map参数,测试对索引文件的操作是否正确。
220  *           0:通过向索引文件写入3条有效数据模拟对索引文件的(无穷)内容的测试覆盖
221  *           1:调用接口SetExtManage,向索引文件写入数据
222  *           2:调用接口GetExtManage,从索引文件读出文件名数据
223  *           3:调用接口GetExtManageInfo,从索引文件读出文件详细数据(含文件名和对应文件的stat数据)
224  *           4:判断读出的文件名集合/文件详细数据记录个数是否和写入时相等
225  *           5:判断读出的文件名集合/文件详细数据记录内容是否和写入时相等
226  * @tc.size: MEDIUM
227  * @tc.type: FUNC
228  * @tc.level Level 0
229  * @tc.require: I6F3GV
230  */
231 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0300, testing::ext::TestSize.Level0)
232 {
233     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0300";
234     try {
235         TestManager tm("b_json_entity_ext_manage_0300");
236 
237         // 预置文件数据
238         // 索引文件pathManageFile1/2/3, 测试文件路径pathTestFile1/2/3, 测试文件名testFile1/2/3HexName
239         string root = tm.GetRootDirCurTest();
240         string pathManageFile = root + "manage.json";
241         string pathTestFile1 = root + "test1.txt";
242         string pathTestFile2 = root + "test2.txt";
243         string pathTestFile3 = root + "test3.txt";
244         string testFile1HexName = "1234567890abcde1";
245         string testFile2HexName = "1234567890abcde2";
246         string testFile3HexName = "1234567890abcde3";
247         SaveStringToFile(pathTestFile1, "h");
248         SaveStringToFile(pathTestFile2, "hello");
249         SaveStringToFile(pathTestFile3, "hello world");
250         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
251         auto newCache = cachedEntity.Structuralize();
252 
253         // 生成三条有用数据并写入索引文件
254         map<string, tuple<string, struct stat, bool>> info;
255         info.emplace(testFile1HexName, make_tuple(pathTestFile1, GetFileStat(pathTestFile1), true));
256         info.emplace(testFile2HexName, make_tuple(pathTestFile2, GetFileStat(pathTestFile2), true));
257         info.emplace(testFile3HexName, make_tuple(pathTestFile3, GetFileStat(pathTestFile3), true));
258         newCache.SetExtManage(info);
259 
260         // 预置结果集,用以在读取索引文件后做结果判断
261         set<string> resultFileName {testFile1HexName, testFile2HexName, testFile3HexName};
262 
263         // 读取索引文件内容并做结果判断
264         auto fileNames = newCache.GetExtManage();
265         EXPECT_EQ(fileNames.size(), info.size());
266         EXPECT_EQ(fileNames, resultFileName);
267         auto fileInfo = newCache.GetExtManageInfo();
268         EXPECT_EQ(fileInfo.size(), info.size());
269         EXPECT_TRUE(IsEqual(fileInfo, info));
270     } catch (...) {
271         EXPECT_TRUE(false);
272         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
273     }
274     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0300";
275 }
276 
277 /**
278  * @tc.number: SUB_backup_b_json_entity_ext_manage_0400
279  * @tc.name: b_json_entity_ext_manage_0400
280  * @tc.desc: 通过向接口SetExtManage传入包含三条信息的map参数,测试对索引文件的操作是否正确。
281  *           0:通过向索引文件写入3条有效数据模拟覆盖对索引文件的(无穷)内容的测试覆盖
282  *           0:通过向索引文件的记录一写入0条、记录二写入1条、记录三写入2条有效硬链接数据模拟对索引文件含
283  *              有硬链接(空、有、无穷)个的测试覆盖
284  *           1:调用接口SetExtManage,向索引文件写入数据
285  *           2:调用接口GetExtManage,从索引文件读出文件名数据
286  *           3:调用接口GetExtManageInfo,从索引文件读出文件详细数据(含文件名和对应文件的stat数据)
287  *           4:判断读出的文件名集合/文件详细数据记录个数是否和写入时相等
288  *           5:判断读出的文件名集合/文件详细数据记录内容是否和写入时相等
289  * @tc.size: MEDIUM
290  * @tc.type: FUNC
291  * @tc.level Level 0
292  * @tc.require: I6F3GV
293  */
294 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0400, testing::ext::TestSize.Level0)
295 {
296     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0400";
297     try {
298         TestManager tm("b_json_entity_ext_manage_0400");
299 
300         // 预置文件数据
301         // 索引文件pathManageFile1/2/3, 测试文件路径pathTestFile1/2/3, 测试文件名testFile1/2/3HexName
302         string root = tm.GetRootDirCurTest();
303         string pathManageFile = root + "manage.json";
304         string pathTestFile1 = root + "test4.txt";
305         string pathTestFile2 = root + "test5.txt";
306         string pathTestFile3 = root + "test6.txt";
307         string testFile1HexName = "1234567890abcde4";
308         string testFile2HexName = "1234567890abcde5";
309         string testFile3HexName = "1234567890abcde6";
310         SaveStringToFile(pathTestFile1, "h");
311         SaveStringToFile(pathTestFile2, "hello");
312         SaveStringToFile(pathTestFile3, "hello world");
313         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
314         auto cache = cachedEntity.Structuralize();
315 
316         // 生成三条有用数据并写入索引文件
317         map<string, tuple<string, struct stat, bool>> info;
318         info.emplace(testFile1HexName, make_tuple(pathTestFile1, GetFileStat(pathTestFile1), true));
319         info.emplace(testFile2HexName, make_tuple(pathTestFile2, GetFileStat(pathTestFile2), true));
320         info.emplace(testFile3HexName, make_tuple(pathTestFile3, GetFileStat(pathTestFile3), true));
321         cache.SetExtManage(info);
322 
323         // 预置结果集,用以在读取索引文件后做结果判断
324         set<string> resultFileName {testFile1HexName, testFile2HexName, testFile3HexName};
325 
326         // 读取索引文件内容并做结果判断
327         auto fileNames = cache.GetExtManage();
328         EXPECT_EQ(fileNames.size(), info.size());
329         EXPECT_EQ(fileNames, resultFileName);
330         auto fileInfo = cache.GetExtManageInfo();
331         EXPECT_EQ(fileInfo.size(), info.size());
332         EXPECT_TRUE(IsEqual(fileInfo, info));
333     } catch (...) {
334         EXPECT_TRUE(false);
335         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
336     }
337     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0400";
338 }
339 
340 /**
341  * @tc.number: SUB_backup_b_json_entity_ext_manage_0500
342  * @tc.name: b_json_entity_ext_manage_0500
343  * @tc.desc: 通过向接口SetExtManage传入包含三条信息的map参数,测试对索引文件的操作是否正确。
344  *           0:通过向索引文件写入3条有效数据模拟覆盖对索引文件的(无穷)内容的测试覆盖
345  *           0:通过向索引文件的记录一写入0条、记录二写入1条、记录三写入2条有效硬链接数据模拟对索引文件含
346  *              有硬链接(空、有、无穷)个的测试覆盖
347  *           0:通过传入和源文件相同stat信息向索引文件中对应记录添加硬链接
348  *           1:调用接口SetExtManage,向索引文件写入数据
349  *           2:调用接口GetExtManage,从索引文件读出文件名数据
350  *           3:调用接口GetExtManageInfo,从索引文件读出文件详细数据(含文件名和对应文件的stat数据)
351  *           4:判断读出的文件名集合/文件详细数据记录个数是否和写入时相等
352  *           5:判断读出的文件名集合/文件详细数据记录内容是否和写入时相等
353  * @tc.size: MEDIUM
354  * @tc.type: FUNC
355  * @tc.level Level 0
356  * @tc.require: I6F3GV
357  */
358 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0500, testing::ext::TestSize.Level0)
359 {
360     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0500";
361     try {
362         // 预置文件数据
363         // 索引文件pathManageFile1/2/3, 测试文件路径pathTestFile1/2/3, 测试文件名testFile1/2/3HexName
364         TestManager tm("b_json_entity_ext_manage_0500");
365         string root = tm.GetRootDirCurTest();
366         string pathManageFile = root + "manage.json";
367         string pathTestFile1 = root + "test7.txt";
368         string pathTestFile2 = root + "test8.txt";
369         string pathTestFile3 = root + "test9.txt";
370         string testFile1HexName = "1234567890abcde7";
371         string testFile2HexName = "1234567890abcde8";
372         string testFile3HexName = "1234567890abcde9";
373         SaveStringToFile(pathTestFile1, "h");
374         SaveStringToFile(pathTestFile2, "hello");
375         SaveStringToFile(pathTestFile3, "hello world");
376         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
377         auto cache = cachedEntity.Structuralize();
378 
379         // 生成三条有用数据并写入索引文件
380         map<string, tuple<string, struct stat, bool>> info;
381         struct stat sta = {};
382         info.emplace(testFile1HexName, make_tuple(pathTestFile1, GetFileStat(pathTestFile1), true));
383         info.emplace(testFile2HexName, make_tuple(pathTestFile2, sta = GetFileStat(pathTestFile2), true));
384         info.emplace(testFile3HexName, make_tuple(pathTestFile3, sta = GetFileStat(pathTestFile3), true));
385         cache.SetExtManage(info);
386 
387         // 预置结果集,用以在读取索引文件后做结果判断
388         set<string> resultFileName {testFile1HexName, testFile2HexName, testFile3HexName};
389 
390         // 读取索引文件内容并做结果判断
391         auto fileNames = cache.GetExtManage();
392         EXPECT_EQ(fileNames.size(), 3ul);
393         EXPECT_EQ(fileNames, resultFileName);
394         auto fileInfo = cache.GetExtManageInfo();
395         EXPECT_EQ(fileInfo.size(), info.size());
396         EXPECT_TRUE(IsEqual(fileInfo, info));
397     } catch (...) {
398         EXPECT_TRUE(false);
399         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
400     }
401     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0500";
402 }
403 
404 /**
405  * @tc.number: SUB_backup_b_json_entity_ext_manage_0700
406  * @tc.name: b_json_entity_ext_manage_0700
407  * @tc.desc: 测试GetExtManageInfo在Json数据不为数组时能否成功返回空map
408  * @tc.size: MEDIUM
409  * @tc.type: FUNC
410  * @tc.level Level 0
411  * @tc.require: I6F3GV
412  */
413 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0700, testing::ext::TestSize.Level0)
414 {
415     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0700";
416     try {
417         string_view sv = R"({"key":1})";
418         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(sv);
419         auto cache = cachedEntity.Structuralize();
420         auto mp = cache.GetExtManageInfo();
421         EXPECT_TRUE(mp.empty());
422     } catch (...) {
423         EXPECT_TRUE(false);
424         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
425     }
426     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0700";
427 }
428 
429 /**
430  * @tc.number: SUB_backup_b_json_entity_ext_manage_0800
431  * @tc.name: b_json_entity_ext_manage_0800
432  * @tc.desc: 测试GetExtManageInfo在Json数据为数组且仅有一个键不为information的对象时能否成功返回空map
433  * @tc.size: MEDIUM
434  * @tc.type: FUNC
435  * @tc.level Level 0
436  * @tc.require: I6F3GV
437  */
438 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0800, testing::ext::TestSize.Level0)
439 {
440     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0800";
441     try {
442         string_view sv = R"([{"key":1}])";
443         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(sv);
444         auto cache = cachedEntity.Structuralize();
445         auto mp = cache.GetExtManageInfo();
446         EXPECT_TRUE(mp.empty());
447     } catch (...) {
448         EXPECT_TRUE(false);
449         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
450     }
451     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0800";
452 }
453 
454 /**
455  * @tc.number: SUB_backup_b_json_entity_ext_manage_0801
456  * @tc.name: b_json_entity_ext_manage_0801
457  * @tc.desc: 测试GetExtManageInfo在Json数据为数组且有一个键为information的对象时能否成功返回空map
458  * @tc.size: MEDIUM
459  * @tc.type: FUNC
460  * @tc.level Level 0
461  * @tc.require: I6F3GV
462  */
463 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0801, testing::ext::TestSize.Level0)
464 {
465     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0801";
466     try {
467         string_view sv = R"([{"path":1}])";
468         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(sv);
469         auto cache = cachedEntity.Structuralize();
470         auto mp = cache.GetExtManageInfo();
471         EXPECT_TRUE(mp.empty());
472     } catch (...) {
473         EXPECT_TRUE(false);
474         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
475     }
476     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0801";
477 }
478 
479 /**
480  * @tc.number: SUB_backup_b_json_entity_ext_manage_0802
481  * @tc.name: b_json_entity_ext_manage_0802
482  * @tc.desc: 测试GetExtManageInfo在Json数据为数组且有两个键为information的对象时能否成功返回空map
483  * @tc.size: MEDIUM
484  * @tc.type: FUNC
485  * @tc.level Level 0
486  * @tc.require: I6F3GV
487  */
488 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0802, testing::ext::TestSize.Level0)
489 {
490     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0802";
491     try {
492         string_view sv = R"([{"path":1}, {"fileName":1}])";
493         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(sv);
494         auto cache = cachedEntity.Structuralize();
495         auto mp = cache.GetExtManageInfo();
496         EXPECT_TRUE(mp.empty());
497     } catch (...) {
498         EXPECT_TRUE(false);
499         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
500     }
501     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0802";
502 }
503 
504 /**
505  * @tc.number: SUB_backup_b_json_entity_ext_manage_0803
506  * @tc.name: b_json_entity_ext_manage_0803
507  * @tc.desc: 测试GetExtManageInfo在Json数据为数组且键为空时能否成功返回空map
508  * @tc.size: MEDIUM
509  * @tc.type: FUNC
510  * @tc.level Level 0
511  * @tc.require: I6F3GV
512  */
513 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0803, testing::ext::TestSize.Level0)
514 {
515     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0803";
516     try {
517         string_view sv = R"([{"":1}])";
518         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(sv);
519         auto cache = cachedEntity.Structuralize();
520         auto mp = cache.GetExtManageInfo();
521         EXPECT_TRUE(mp.empty());
522     } catch (...) {
523         EXPECT_TRUE(false);
524         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
525     }
526     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0803";
527 }
528 
529 /**
530  * @tc.number: SUB_backup_b_json_entity_ext_manage_0804
531  * @tc.name: b_json_entity_ext_manage_0804
532  * @tc.desc: 测试GetExtManageInfo
533  * @tc.size: MEDIUM
534  * @tc.type: FUNC
535  * @tc.level Level 0
536  * @tc.require: I6F3GV
537  */
538 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0804, testing::ext::TestSize.Level0)
539 {
540     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0804";
541     try {
542         string_view sv = R"([{"isBigFile":false}, {"fileName":"test"}])";
543         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(sv);
544         auto cache = cachedEntity.Structuralize();
545         auto mp = cache.GetExtManageInfo();
546         EXPECT_TRUE(mp.empty());
547     } catch (...) {
548         EXPECT_TRUE(false);
549         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
550     }
551     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0804";
552 }
553 
554 /**
555  * @tc.number: SUB_backup_b_json_entity_ext_manage_0900
556  * @tc.name: b_json_entity_ext_manage_0900
557  * @tc.desc: 测试CheckBigFile中st_size的两种情况
558  * @tc.size: MEDIUM
559  * @tc.type: FUNC
560  * @tc.level Level 1
561  * @tc.require: issuesI9JXNH
562  */
563 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0900, testing::ext::TestSize.Level1)
564 {
565     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0900";
566     try {
567         struct stat sta;
568         sta.st_size = 0;
569         bool ret = CheckBigFile(sta);
570         EXPECT_FALSE(ret);
571 
572         sta.st_size = BConstants::BIG_FILE_BOUNDARY + 1;
573         ret = CheckBigFile(sta);
574         EXPECT_TRUE(ret);
575     } catch (...) {
576         EXPECT_TRUE(false);
577         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
578     }
579     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0900";
580 }
581 
Canonicalize(const string_view & path)582 string BExcepUltils::Canonicalize(const string_view &path)
583 {
584     return string(path);
585 }
586 
587 /**
588  * @tc.number: SUB_backup_b_json_entity_ext_manage_0901
589  * @tc.name: b_json_entity_ext_manage_0901
590  * @tc.desc: 测试CheckOwnPackTar各种异常分支
591  * @tc.size: MEDIUM
592  * @tc.type: FUNC
593  * @tc.level Level 1
594  * @tc.require: issuesI9JXNH
595  */
596 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0901, testing::ext::TestSize.Level1)
597 {
598     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0901";
599     try {
600         string fileName = string(BConstants::PATH_BUNDLE_BACKUP_HOME)
601             .append(BConstants::SA_BUNDLE_BACKUP_BACKUP).append("/tar");
602         auto ret = CheckOwnPackTar(fileName);
603         EXPECT_FALSE(ret);
604 
605         fileName = string(BConstants::PATH_BUNDLE_BACKUP_HOME)
606             .append(BConstants::SA_BUNDLE_BACKUP_BACKUP).append("/test.tar");
607         ret = CheckOwnPackTar(fileName);
608         EXPECT_FALSE(ret);
609     } catch (...) {
610         EXPECT_TRUE(false);
611         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
612     }
613     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0901";
614 }
615 
616 /**
617  * @tc.number: SUB_backup_b_json_entity_ext_manage_0902
618  * @tc.name: b_json_entity_ext_manage_0902
619  * @tc.desc: 测试SetExtManageForClone的各种情况
620  * @tc.size: MEDIUM
621  * @tc.type: FUNC
622  * @tc.level Level 1
623  * @tc.require: issuesI9JXNH
624  */
625 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0902, testing::ext::TestSize.Level1)
626 {
627     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0902";
628     try {
629         TestManager tm("b_json_entity_ext_manage_0902");
630         // 预置文件数据
631         // 索引文件pathManageFile, 测试文件路径pathTestFile, 测试文件名testFileHexName
632         string root = tm.GetRootDirCurTest();
633         string pathManageFile = root + "manage.json";
634         string pathTestFile = root + "test.txt";
635         string testFileHexName = "1234567890abcdef";
636         SaveStringToFile(pathTestFile, "hello world");
637         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
638         auto cache = cachedEntity.Structuralize();
639 
640         // 生成一条有用数据并写入索引文件
641         map<string, tuple<string, struct stat, bool, bool>> info;
642         struct stat sta = {};
643         info.emplace(testFileHexName, make_tuple(pathTestFile, sta = GetFileStat(pathTestFile), false, true));
644         cache.SetExtManageForClone(info);
645 
646         // 读取索引文件内容并做结果判断
647         auto fileNames = cache.GetExtManage();
648         ASSERT_EQ(fileNames.size(), 1ul);
649         EXPECT_EQ(*fileNames.begin(), testFileHexName);
650         auto fileInfo = cache.GetExtManageInfo();
651         ASSERT_EQ(fileInfo.size(), 1ul);
652         EXPECT_EQ(fileInfo[0].hashName, testFileHexName);
653         EXPECT_EQ(fileInfo[0].fileName, pathTestFile);
654         EXPECT_TRUE(fileInfo[0].isUserTar);
655         EXPECT_FALSE(fileInfo[0].isBigFile);
656         EXPECT_TRUE(IsEqual(fileInfo[0].sta, sta));
657     } catch (...) {
658         EXPECT_TRUE(false);
659         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
660     }
661     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0902";
662 }
663 
664 /**
665  * @tc.number: SUB_backup_b_json_entity_ext_manage_0903
666  * @tc.name: b_json_entity_ext_manage_0903
667  * @tc.desc: 测试CheckOwnPackTar各种异常分支
668  * @tc.size: MEDIUM
669  * @tc.type: FUNC
670  * @tc.level Level 1
671  * @tc.require: issuesI9JXNH
672  */
673 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0903, testing::ext::TestSize.Level1)
674 {
675     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0903";
676     try {
677         TestManager tm("b_json_entity_ext_manage_0903");
678         // 预置文件数据
679         // 索引文件pathManageFile, 测试文件路径pathTestFile, 测试文件名testFileHexName
680         string root = tm.GetRootDirCurTest();
681         string pathManageFile = root + "manage.json";
682         BJsonCachedEntity<BJsonEntityExtManage> cachedEntity(UniqueFd(open(pathManageFile.data(), O_RDONLY, 0)));
683         auto cache = cachedEntity.Structuralize();
684         Json::Value value;
685         value["isUserTar"] = true;
686         value["information"]["test"] = "test";
687 
688         cache.obj_.clear();
689         cache.obj_.append(value);
690         // 读取索引文件内容并做结果判断
691         auto fileNames = cache.GetExtManage();
692         EXPECT_EQ(fileNames.size(), 1ul);
693         EXPECT_EQ(*fileNames.begin(), "");
694         auto infos = cache.GetExtManageInfo();
695         EXPECT_EQ(infos.size(), 0);
696     } catch (...) {
697         EXPECT_TRUE(false);
698         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
699     }
700     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0903";
701 }
702 
703 /**
704  * @tc.number: SUB_backup_b_json_entity_ext_manage_0904
705  * @tc.name: b_json_entity_ext_manage_0904
706  * @tc.desc: 测试CheckOwnPackTar各种异常分支
707  * @tc.size: MEDIUM
708  * @tc.type: FUNC
709  * @tc.level Level 1
710  * @tc.require: issuesI9JXNH
711  */
712 HWTEST_F(BJsonEntityExtManageTest, b_json_entity_ext_manage_0904, testing::ext::TestSize.Level1)
713 {
714     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-begin b_json_entity_ext_manage_0904";
715     try {
716         string fileName = "/home/user/test.tar";
717         auto ret = CheckOwnPackTar(fileName);
718         EXPECT_FALSE(ret);
719 
720         fileName = string(BConstants::PATH_BUNDLE_BACKUP_HOME)
721             .append(BConstants::SA_BUNDLE_BACKUP_BACKUP).append("/part1.tar");
722         ret = CheckOwnPackTar(fileName);
723         EXPECT_TRUE(ret);
724     } catch (...) {
725         EXPECT_TRUE(false);
726         GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-an exception occurred.";
727     }
728     GTEST_LOG_(INFO) << "BJsonEntityExtManageTest-end b_json_entity_ext_manage_0904";
729 }
730 } // namespace OHOS::FileManagement::Backup