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