• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include <gmock/gmock.h>
17 #include <gtest/gtest.h>
18 
19 #include <dirent.h>
20 #include <fcntl.h>
21 #include <grp.h>
22 #include <pwd.h>
23 #include <stack>
24 #include <sys/types.h>
25 #include <unistd.h>
26 
27 #include "b_anony/b_anony.h"
28 #include "b_error/b_error.h"
29 #include "b_hiaudit/hi_audit.h"
30 #include "b_resources/b_constants.h"
31 #include "directory_ex.h"
32 #include "filemgmt_libhilog.h"
33 #include "library_func_mock.h"
34 #include "securec.h"
35 #include "tar_file.h"
36 
37 #include "library_func_define.h"
38 #include "tar_file.cpp"
39 #include "library_func_undef.h"
40 
41 namespace OHOS::FileManagement::Backup {
42 using namespace std;
43 using namespace testing;
44 using namespace OHOS::AppFileService;
45 
46 class TarFileSubTest : public testing::Test {
47 public:
48     static void SetUpTestCase(void);
49     static void TearDownTestCase();
SetUp()50     void SetUp() override {};
TearDown()51     void TearDown() override {};
52     static inline shared_ptr<LibraryFuncMock> funcMock = nullptr;
53 };
54 
SetUpTestCase()55 void TarFileSubTest::SetUpTestCase()
56 {
57     GTEST_LOG_(INFO) << "SetUpTestCase enter";
58     funcMock = make_shared<LibraryFuncMock>();
59     LibraryFuncMock::libraryFunc_ = funcMock;
60 }
61 
TearDownTestCase()62 void TarFileSubTest::TearDownTestCase()
63 {
64     GTEST_LOG_(INFO) << "TearDownTestCase enter";
65     LibraryFuncMock::libraryFunc_ = nullptr;
66     funcMock = nullptr;
67 }
68 
69 /**
70  * @tc.number: SUB_Tar_File_SplitWriteAll_0100
71  * @tc.name: SUB_Tar_File_SplitWriteAll_0100
72  * @tc.desc: 测试 SplitWriteAll 接口
73  * @tc.size: MEDIUM
74  * @tc.type: FUNC
75  * @tc.level Level 1
76  * @tc.require: I6F3GV
77  */
78 HWTEST_F(TarFileSubTest, SUB_Tar_File_SplitWriteAll_0100, testing::ext::TestSize.Level1)
79 {
80     GTEST_LOG_(INFO) << "TarFileSubTest-begin SUB_Tar_File_SplitWriteAll_0100";
81     try {
82         int err = 0;
83         vector<uint8_t> ioBuffer {0, 0, 0, 0, 0};
84         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(ioBuffer.size()));
85         auto ret = TarFile::GetInstance().SplitWriteAll(ioBuffer, 5, err);
86         EXPECT_EQ(ret, ioBuffer.size());
87 
88         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(0)).WillOnce(Return(ioBuffer.size()));
89         ret = TarFile::GetInstance().SplitWriteAll(ioBuffer, 5, err);
90         EXPECT_EQ(ret, ioBuffer.size());
91 
92         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(0)).WillOnce(Return(0));
93         ret = TarFile::GetInstance().SplitWriteAll(ioBuffer, 5, err);
94         EXPECT_EQ(ret, 0);
95 
96         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(4));
97         ret = TarFile::GetInstance().SplitWriteAll(ioBuffer, 4, err);
98         EXPECT_EQ(ret, 4);
99     } catch (...) {
100         EXPECT_TRUE(false);
101         GTEST_LOG_(INFO) << "TarFileSubTest-an exception occurred by TarFile.";
102     }
103     GTEST_LOG_(INFO) << "TarFileSubTest-end SUB_Tar_File_SplitWriteAll_0100";
104 }
105 
106 /**
107  * @tc.number: SUB_Tar_File_CreateSplitTarFile_0100
108  * @tc.name: SUB_Tar_File_CreateSplitTarFile_0100
109  * @tc.desc: 测试 CreateSplitTarFile 接口
110  * @tc.size: MEDIUM
111  * @tc.type: FUNC
112  * @tc.level Level 1
113  * @tc.require: I6F3GV
114  */
115 HWTEST_F(TarFileSubTest, SUB_Tar_File_CreateSplitTarFile_0100, testing::ext::TestSize.Level1)
116 {
117     GTEST_LOG_(INFO) << "TarFileSubTest-begin SUB_Tar_File_CreateSplitTarFile_0100";
118     try {
119         TarFile::GetInstance().currentTarFile_ = nullptr;
120         EXPECT_CALL(*funcMock, fopen(_, _)).WillOnce(Return(nullptr));
121         EXPECT_THROW(TarFile::GetInstance().CreateSplitTarFile(), BError);
122 
123         int n = 0;
124         TarFile::GetInstance().currentTarFile_ = reinterpret_cast<FILE*>(&n);
125         EXPECT_CALL(*funcMock, fclose(_)).WillOnce(Return(0));
126         EXPECT_CALL(*funcMock, fopen(_, _)).WillOnce(Return(reinterpret_cast<FILE*>(&n)));
127         EXPECT_TRUE(TarFile::GetInstance().CreateSplitTarFile());
128         TarFile::GetInstance().currentTarFile_ = nullptr;
129     } catch (...) {
130         EXPECT_TRUE(false);
131         GTEST_LOG_(INFO) << "TarFileSubTest-an exception occurred by TarFile.";
132     }
133     GTEST_LOG_(INFO) << "TarFileSubTest-end SUB_Tar_File_CreateSplitTarFile_0100";
134 }
135 
136 /**
137  * @tc.number: SUB_Tar_File_FillSplitTailBlocks_0100
138  * @tc.name: SUB_Tar_File_FillSplitTailBlocks_0100
139  * @tc.desc: 测试 FillSplitTailBlocks 接口
140  * @tc.size: MEDIUM
141  * @tc.type: FUNC
142  * @tc.level Level 1
143  * @tc.require: I6F3GV
144  */
145 HWTEST_F(TarFileSubTest, SUB_Tar_File_FillSplitTailBlocks_0100, testing::ext::TestSize.Level1)
146 {
147     GTEST_LOG_(INFO) << "TarFileSubTest-begin SUB_Tar_File_FillSplitTailBlocks_0100";
148     try {
149         TarFile::GetInstance().currentTarFile_ = nullptr;
150         EXPECT_THROW(TarFile::GetInstance().FillSplitTailBlocks(), BError);
151 
152         int n = 0;
153         const int END_BLOCK_SIZE = 1024;
154         TarFile::GetInstance().currentTarFile_ = reinterpret_cast<FILE*>(&n);
155         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(END_BLOCK_SIZE));
156         EXPECT_CALL(*funcMock, ferror(_)).WillOnce(Return(0));
157         EXPECT_CALL(*funcMock, fflush(_)).WillOnce(Return(0));
158         EXPECT_CALL(*funcMock, stat(_, _)).WillOnce(Return(-1));
159         EXPECT_THROW(TarFile::GetInstance().FillSplitTailBlocks(), BError);
160 
161         TarFile::GetInstance().tarFileCount_ = 1;
162         TarFile::GetInstance().fileCount_ = 0;
163         TarFile::GetInstance().currentTarFile_ = reinterpret_cast<FILE*>(&n);
164         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(END_BLOCK_SIZE));
165         EXPECT_CALL(*funcMock, ferror(_)).WillOnce(Return(0));
166         EXPECT_CALL(*funcMock, fflush(_)).WillOnce(Return(0));
167         EXPECT_CALL(*funcMock, stat(_, _)).WillOnce(Return(0));
168         EXPECT_CALL(*funcMock, fclose(_)).WillOnce(Return(0));
169         EXPECT_CALL(*funcMock, remove(_)).WillOnce(Return(0));
170         EXPECT_TRUE(TarFile::GetInstance().FillSplitTailBlocks());
171 
172         TarFile::GetInstance().fileCount_ = 1;
173         TarFile::GetInstance().isReset_ = true;
174         TarFile::GetInstance().currentTarFile_ = reinterpret_cast<FILE*>(&n);
175         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(END_BLOCK_SIZE));
176         EXPECT_CALL(*funcMock, ferror(_)).WillOnce(Return(0));
177         EXPECT_CALL(*funcMock, fflush(_)).WillOnce(Return(0));
178         EXPECT_CALL(*funcMock, stat(_, _)).WillOnce(Return(0));
179         EXPECT_CALL(*funcMock, fclose(_)).WillOnce(Return(0));
180         EXPECT_TRUE(TarFile::GetInstance().FillSplitTailBlocks());
181     } catch (...) {
182         EXPECT_TRUE(false);
183         GTEST_LOG_(INFO) << "TarFileSubTest-an exception occurred by TarFile.";
184     }
185     GTEST_LOG_(INFO) << "TarFileSubTest-end SUB_Tar_File_FillSplitTailBlocks_0100";
186 }
187 
188 /**
189  * @tc.number: SUB_Tar_File_FillSplitTailBlocks_0200
190  * @tc.name: SUB_Tar_File_FillSplitTailBlocks_0200
191  * @tc.desc: 测试 FillSplitTailBlocks 接口
192  * @tc.size: MEDIUM
193  * @tc.type: FUNC
194  * @tc.level Level 1
195  * @tc.require: I6F3GV
196  */
197 HWTEST_F(TarFileSubTest, SUB_Tar_File_FillSplitTailBlocks_0200, testing::ext::TestSize.Level1)
198 {
199     GTEST_LOG_(INFO) << "TarFileSubTest-begin SUB_Tar_File_FillSplitTailBlocks_0200";
200     try {
201         TarFile::GetInstance().currentTarFile_ = nullptr;
202         EXPECT_THROW(TarFile::GetInstance().FillSplitTailBlocks(), BError);
203 
204         int n = 0;
205         const int END_BLOCK_SIZE = 1024;
206         TarFile::GetInstance().fileCount_ = 0;
207         TarFile::GetInstance().tarFileCount_ = 0;
208         TarFile::GetInstance().isReset_ = false;
209         TarFile::GetInstance().currentTarFile_ = reinterpret_cast<FILE*>(&n);
210         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(END_BLOCK_SIZE));
211         EXPECT_CALL(*funcMock, ferror(_)).WillOnce(Return(0));
212         EXPECT_CALL(*funcMock, fflush(_)).WillOnce(Return(0));
213         EXPECT_CALL(*funcMock, stat(_, _)).WillOnce(Return(0));
214         EXPECT_CALL(*funcMock, fclose(_)).WillOnce(Return(0));
215         EXPECT_TRUE(TarFile::GetInstance().FillSplitTailBlocks());
216 
217         struct stat sta { .st_size = 1 };
218         TarFile::GetInstance().currentTarFile_ = reinterpret_cast<FILE*>(&n);
219         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(END_BLOCK_SIZE));
220         EXPECT_CALL(*funcMock, ferror(_)).WillOnce(Return(0));
221         EXPECT_CALL(*funcMock, fflush(_)).WillOnce(Return(0));
222         EXPECT_CALL(*funcMock, stat(_, _)).WillOnce(DoAll(SetArgPointee<1>(sta), Return(0)));
223         EXPECT_CALL(*funcMock, fclose(_)).WillOnce(Return(0));
224         EXPECT_TRUE(TarFile::GetInstance().FillSplitTailBlocks());
225     } catch (...) {
226         EXPECT_TRUE(false);
227         GTEST_LOG_(INFO) << "TarFileSubTest-an exception occurred by TarFile.";
228     }
229     GTEST_LOG_(INFO) << "TarFileSubTest-end SUB_Tar_File_FillSplitTailBlocks_0200";
230 }
231 
232 /**
233  * @tc.number: SUB_Tar_File_WriteFileContent_0100
234  * @tc.name: SUB_Tar_File_WriteFileContent_0100
235  * @tc.desc: 测试 WriteFileContent 接口
236  * @tc.size: MEDIUM
237  * @tc.type: FUNC
238  * @tc.level Level 1
239  * @tc.require: I6F3GV
240  */
241 HWTEST_F(TarFileSubTest, SUB_Tar_File_WriteFileContent_0100, testing::ext::TestSize.Level1)
242 {
243     GTEST_LOG_(INFO) << "TarFileSubTest-begin SUB_Tar_File_WriteFileContent_0100";
244     try {
245         string fileName = "fileName";
246         off_t size = 0;
247         int err = 0;
248         EXPECT_CALL(*funcMock, open(_, _)).WillOnce(Return(-1));
249         EXPECT_FALSE(TarFile::GetInstance().WriteFileContent(fileName, size, err));
250 
251         TarFile::GetInstance().ioBuffer_.resize(BLOCK_SIZE);
252         EXPECT_CALL(*funcMock, open(_, _)).WillOnce(Return(0));
253         EXPECT_CALL(*funcMock, read(_, _, _)).WillOnce(Return(BLOCK_SIZE));
254         EXPECT_CALL(*funcMock, close(_)).WillOnce(Return(0));
255         EXPECT_FALSE(TarFile::GetInstance().WriteFileContent(fileName, 1, err));
256 
257         TarFile::GetInstance().ioBuffer_.resize(BLOCK_SIZE);
258         EXPECT_CALL(*funcMock, open(_, _)).WillOnce(Return(0));
259         EXPECT_CALL(*funcMock, read(_, _, _)).WillOnce(Return(BLOCK_SIZE));
260         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(BLOCK_SIZE + 1));
261         EXPECT_CALL(*funcMock, close(_)).WillOnce(Return(0));
262         EXPECT_FALSE(TarFile::GetInstance().WriteFileContent(fileName, BLOCK_SIZE, err));
263 
264         TarFile::GetInstance().ioBuffer_.resize(BLOCK_SIZE);
265         EXPECT_CALL(*funcMock, open(_, _)).WillOnce(Return(0));
266         EXPECT_CALL(*funcMock, read(_, _, _)).WillOnce(Return(BLOCK_SIZE));
267         EXPECT_CALL(*funcMock, fwrite(_, _, _, _)).WillOnce(Return(BLOCK_SIZE));
268         EXPECT_CALL(*funcMock, close(_)).WillOnce(Return(0));
269         EXPECT_TRUE(TarFile::GetInstance().WriteFileContent(fileName, BLOCK_SIZE, err));
270     } catch (...) {
271         EXPECT_TRUE(false);
272         GTEST_LOG_(INFO) << "TarFileSubTest-an exception occurred by TarFile.";
273     }
274     GTEST_LOG_(INFO) << "TarFileSubTest-end SUB_Tar_File_WriteFileContent_0100";
275 }
276 } // namespace OHOS::FileManagement::Backup