1 /*
2 * Copyright (c) 2022 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 "gtest/gtest.h"
17
18 #include "utils.h"
19
20 #define private public
21 #define protected public
22 #include "kernel_interface.h"
23 #undef private
24 #undef protected
25
26 namespace OHOS {
27 namespace Memory {
28 using namespace testing;
29 using namespace testing::ext;
30
31 class KernelInterfaceTest : public testing::Test {
32 public:
33 static void SetUpTestCase();
34 static void TearDownTestCase();
35 void SetUp();
36 void TearDown();
37 };
38
SetUpTestCase()39 void KernelInterfaceTest::SetUpTestCase()
40 {
41 }
42
TearDownTestCase()43 void KernelInterfaceTest::TearDownTestCase()
44 {
45 }
46
SetUp()47 void KernelInterfaceTest::SetUp()
48 {
49 }
50
TearDown()51 void KernelInterfaceTest::TearDown()
52 {
53 }
54
55 HWTEST_F(KernelInterfaceTest, EchoToPath_InvalidPath, TestSize.Level1)
56 {
57 bool ret = KernelInterface::GetInstance().EchoToPath("", "");
58 EXPECT_EQ(ret, false);
59 }
60
61 HWTEST_F(KernelInterfaceTest, PathDelimiterAddAndRmTest, TestSize.Level1)
62 {
63 std::string base = "/test/tmp";
64 // add delimiter test
65 std::string pathWithDeli = KernelInterface::GetInstance().AddDelimiter(base);
66 EXPECT_EQ(pathWithDeli.compare(base + "/"), 0);
67
68 std::string pathTmp = KernelInterface::GetInstance().AddDelimiter("");
69 EXPECT_EQ(pathTmp.length(), 0u);
70
71 // rm delimiter test
72 pathTmp = KernelInterface::GetInstance().RmDelimiter(pathWithDeli);
73 EXPECT_EQ(pathTmp.compare(base), 0);
74
75 pathTmp = KernelInterface::GetInstance().RmDelimiter("");
76 EXPECT_EQ(pathTmp.length(), 0u);
77
78 pathTmp = KernelInterface::GetInstance().RmDelimiter(base);
79 EXPECT_EQ(pathTmp.compare(base), 0);
80 }
81
82 HWTEST_F(KernelInterfaceTest, JoinPathTest, TestSize.Level1)
83 {
84 std::string first = "/test/tmp";
85 std::string second = "2";
86 std::string third = "3";
87 std::string empty = "";
88 // JoinPath with 2 param test
89 std::string path = KernelInterface::GetInstance().JoinPath(first, second);
90 EXPECT_EQ(path.compare(first + "/" + second), 0);
91 path = KernelInterface::GetInstance().JoinPath(empty, second);
92 EXPECT_EQ(path.compare(second), 0);
93 path = KernelInterface::GetInstance().JoinPath(first, empty);
94 EXPECT_EQ(path.compare(first + "/"), 0);
95 path = KernelInterface::GetInstance().JoinPath(empty, empty);
96 EXPECT_EQ(path.compare(empty), 0);
97
98 // JoinPath with 3 param test
99 path = KernelInterface::GetInstance().JoinPath(first, second, third);
100 EXPECT_EQ(path.compare(first + "/" + second + "/" + third), 0);
101 path = KernelInterface::GetInstance().JoinPath(empty, second, third);
102 EXPECT_EQ(path.compare(second + "/" + third), 0);
103 path = KernelInterface::GetInstance().JoinPath(first, empty, third);
104 EXPECT_EQ(path.compare(first + "/" + third), 0);
105 path = KernelInterface::GetInstance().JoinPath(first, second, empty);
106 EXPECT_EQ(path.compare(first + "/" + second + "/"), 0);
107
108 path = KernelInterface::GetInstance().JoinPath(empty, empty, third);
109 EXPECT_EQ(path.compare(third), 0);
110 path = KernelInterface::GetInstance().JoinPath(empty, second, empty);
111 EXPECT_EQ(path.compare(second + "/"), 0);
112 path = KernelInterface::GetInstance().JoinPath(first, empty, empty);
113 EXPECT_EQ(path.compare(first + "/"), 0);
114
115 path = KernelInterface::GetInstance().JoinPath(empty, empty, empty);
116 EXPECT_EQ(path.compare(empty), 0);
117 }
118
119 HWTEST_F(KernelInterfaceTest, FileCreateTest, TestSize.Level1)
120 {
121 const std::string BASE_PATH = "/data/local/tmp";
122 bool ret = KernelInterface::GetInstance().IsDirExists(BASE_PATH);
123 EXPECT_EQ(ret, true);
124
125 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testFile");
126 ret = KernelInterface::GetInstance().CreateFile(path);
127 EXPECT_EQ(ret, true);
128 ret = KernelInterface::GetInstance().IsFileExists(path);
129 EXPECT_EQ(ret, true);
130 KernelInterface::GetInstance().RemoveFile(path);
131 }
132
133 HWTEST_F(KernelInterfaceTest, FileRemoveTest, TestSize.Level1)
134 {
135 const std::string BASE_PATH = "/data/local/tmp";
136 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testFile");
137 KernelInterface::GetInstance().RemoveFile(path);
138 bool ret = KernelInterface::GetInstance().CreateFile(path);
139 ret = ret && KernelInterface::GetInstance().IsFileExists(path);
140 ret = ret && KernelInterface::GetInstance().RemoveFile(path);
141 EXPECT_EQ(ret, true);
142 ret = KernelInterface::GetInstance().IsFileExists(path);
143 EXPECT_EQ(ret, false);
144 }
145
146 HWTEST_F(KernelInterfaceTest, SingleLineFileReadWriteTest, TestSize.Level1)
147 {
148 const std::string BASE_PATH = "/data/local/tmp";
149 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testFile");
150 KernelInterface::GetInstance().RemoveFile(path);
151 bool ret = KernelInterface::GetInstance().CreateFile(path);
152 ret = ret && KernelInterface::GetInstance().IsFileExists(path);
153 EXPECT_EQ(ret, true);
154 std::string line1 = "line1";
155 std::string output;
156
157 ret = KernelInterface::GetInstance().WriteToFile(path, line1); // curr content: "line1"
158 ret = ret && KernelInterface::GetInstance().ReadFromFile(path, output);
159 EXPECT_EQ(ret, true);
160 EXPECT_EQ(output.compare(line1), 0);
161
162 ret = KernelInterface::GetInstance().WriteToFile(path, line1, false); // curr content: "line1line1"
163 ret = ret && KernelInterface::GetInstance().ReadFromFile(path, output);
164 EXPECT_EQ(ret, true);
165 EXPECT_EQ(output.compare(line1 + line1), 0);
166 KernelInterface::GetInstance().RemoveFile(path);
167 }
168
169 HWTEST_F(KernelInterfaceTest, SingleLineFileReadWriteLinesTest, TestSize.Level1)
170 {
171 const std::string BASE_PATH = "/data/local/tmp";
172 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testFile");
173 KernelInterface::GetInstance().RemoveFile(path);
174 bool ret = KernelInterface::GetInstance().CreateFile(path);
175 ret = ret && KernelInterface::GetInstance().IsFileExists(path);
176 EXPECT_EQ(ret, true);
177 std::string line1 = "line1";
178 std::vector<std::string> inputLines = {line1};
179 std::string output;
180 std::vector<std::string> outputLines;
181
182 ret = KernelInterface::GetInstance().WriteLinesToFile(path, inputLines); // curr content: "line1\n"
183 ret = ret && KernelInterface::GetInstance().ReadLinesFromFile(path, outputLines);
184 EXPECT_EQ(ret, true);
185 EXPECT_EQ(outputLines.size(), 2u);
186 EXPECT_EQ(outputLines[0].compare(line1), 0);
187 EXPECT_EQ(outputLines[1].length(), 0u);
188 KernelInterface::GetInstance().RemoveFile(path);
189 }
190
191 HWTEST_F(KernelInterfaceTest, MultLinesFileReadWriteTest, TestSize.Level1)
192 {
193 const std::string BASE_PATH = "/data/local/tmp";
194 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testFile");
195 KernelInterface::GetInstance().RemoveFile(path);
196 bool ret = KernelInterface::GetInstance().CreateFile(path);
197 ret = ret && KernelInterface::GetInstance().IsFileExists(path);
198 EXPECT_EQ(ret, true);
199 std::string line1 = "line1";
200 std::string line2 = "line2";
201 std::string line3 = "line3";
202 std::string lines = line1 + "\n" + line2 + "\n" + line3; // "line1\nline2\nline3"
203 std::string output;
204
205 ret = KernelInterface::GetInstance().WriteToFile(path, line1); // curr content: "line1"
206 ret = ret && KernelInterface::GetInstance().WriteToFile(path, "\n", false); // curr content: "line1\n"
207 ret = ret && KernelInterface::GetInstance().WriteToFile(path, line2, false); // curr content: "line1\nline2"
208 ret = ret && KernelInterface::GetInstance().ReadFromFile(path, output);
209 EXPECT_EQ(ret, true);
210 EXPECT_EQ(output.compare(line1 + "\n" + line2), 0);
211
212 ret = KernelInterface::GetInstance().WriteToFile(path, lines); // curr content: "line1\nline2\nline3"
213 ret = ret && KernelInterface::GetInstance().ReadFromFile(path, output);
214 EXPECT_EQ(ret, true);
215 EXPECT_EQ(output.compare(lines), 0);
216 KernelInterface::GetInstance().RemoveFile(path);
217 }
218
219 HWTEST_F(KernelInterfaceTest, MultLinesFileReadWriteLinesTest, TestSize.Level1)
220 {
221 const std::string BASE_PATH = "/data/local/tmp";
222 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testFile");
223 KernelInterface::GetInstance().RemoveFile(path);
224 bool ret = KernelInterface::GetInstance().CreateFile(path);
225 ret = ret && KernelInterface::GetInstance().IsFileExists(path);
226 EXPECT_EQ(ret, true);
227 std::string line1 = "line1";
228 std::string line2 = "line2";
229 std::string line3 = "line3";
230 std::vector<std::string> outputLines;
231 std::vector<std::string> inputLines = {line1, line2, line3};
232
233 ret = KernelInterface::GetInstance().WriteLinesToFile(path, inputLines); // curr content: "line1\nline2\nline3\n"
234 ret = ret && KernelInterface::GetInstance().ReadLinesFromFile(path, outputLines);
235 EXPECT_EQ(ret, true);
236 EXPECT_EQ(outputLines.size(), 4u);
237 EXPECT_EQ(outputLines[0].compare(line1), 0);
238 EXPECT_EQ(outputLines[1].compare(line2), 0);
239 EXPECT_EQ(outputLines[2].compare(line3), 0);
240 EXPECT_EQ(outputLines[3].length(), 0u);
241 KernelInterface::GetInstance().RemoveFile(path);
242 }
243
244 HWTEST_F(KernelInterfaceTest, NoSuchFileCreateTest, TestSize.Level1)
245 {
246 std::string basedir = "/NoSuchDir";
247 std::string path = "/NoSuchDir/file";
248 KernelInterface::GetInstance().RemoveDirRecursively(basedir);
249 bool ret = KernelInterface::GetInstance().CreateFile("");
250 ret = ret || KernelInterface::GetInstance().CreateFile(path);
251 ret = ret || KernelInterface::GetInstance().IsFileExists(path);
252 EXPECT_EQ(ret, false);
253 }
254
255 HWTEST_F(KernelInterfaceTest, NoSuchFileRemoveTest, TestSize.Level1)
256 {
257 std::string basedir = "/NoSuchDir";
258 std::string path1 = "/NoSuchDir/file";
259 std::string path2 = "/proc/NoSuchFile";
260 KernelInterface::GetInstance().RemoveDirRecursively(basedir);
261 KernelInterface::GetInstance().RemoveFile(path2);
262 bool ret = KernelInterface::GetInstance().RemoveFile(path1);
263 ret = ret && KernelInterface::GetInstance().RemoveFile(path2);
264 EXPECT_EQ(ret, true);
265 }
266
267 HWTEST_F(KernelInterfaceTest, NoSuchFileReadWriteTest, TestSize.Level1)
268 {
269 std::string path = "/NoSuchDir/NoSuchFile";
270 KernelInterface::GetInstance().RemoveFile(path);
271 std::string line1 = "line1";
272 std::string line2 = "line2";
273 std::string line3 = "line3";
274 std::string output;
275 std::vector<std::string> outputLines;
276 std::vector<std::string> inputLines = {line1, line2, line3};
277
278 bool ret = KernelInterface::GetInstance().WriteToFile(path, line1, false);
279 ret = ret || KernelInterface::GetInstance().WriteToFile(path, line1);
280 ret = ret || KernelInterface::GetInstance().WriteToFile("", line1);
281 ret = ret || KernelInterface::GetInstance().ReadFromFile(path, output);
282 ret = ret || KernelInterface::GetInstance().ReadFromFile("", output);
283 EXPECT_EQ(ret, false);
284
285 ret = KernelInterface::GetInstance().WriteLinesToFile(path, inputLines);
286 ret = ret || KernelInterface::GetInstance().ReadLinesFromFile(path, outputLines);
287 ret = ret || KernelInterface::GetInstance().WriteLinesToFile("", inputLines);
288 ret = ret || KernelInterface::GetInstance().ReadLinesFromFile("", outputLines);
289 EXPECT_EQ(ret, false);
290 }
291
292 HWTEST_F(KernelInterfaceTest, DirCreateTest, TestSize.Level1)
293 {
294 const std::string BASE_PATH = "/data/local/tmp";
295 bool ret = KernelInterface::GetInstance().IsDirExists(BASE_PATH);
296 std::string path = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testDir");
297 KernelInterface::GetInstance().RemoveDirRecursively(path);
298 ret = ret && KernelInterface::GetInstance().CreateDir(path);
299 ret = ret && KernelInterface::GetInstance().IsDirExists(path);
300 EXPECT_EQ(ret, true);
301 KernelInterface::GetInstance().RemoveDirRecursively(path);
302
303 path = KernelInterface::GetInstance().JoinPath(path, "midDir", "subDir");
304 ret = ret && KernelInterface::GetInstance().CreateDir(path);
305 ret = ret && KernelInterface::GetInstance().IsDirExists(path);
306 EXPECT_EQ(ret, true);
307 KernelInterface::GetInstance().RemoveDirRecursively(path);
308 }
309
310 HWTEST_F(KernelInterfaceTest, DirRemoveTest, TestSize.Level1)
311 {
312 const std::string BASE_PATH = "/data/local/tmp";
313 bool ret = KernelInterface::GetInstance().IsDirExists(BASE_PATH);
314 std::string basedir = KernelInterface::GetInstance().JoinPath(BASE_PATH, "testDir");
315 std::string subDir1 = KernelInterface::GetInstance().JoinPath(basedir, "subDir1");
316 std::string subDir2 = KernelInterface::GetInstance().JoinPath(basedir, "subDir2");
317 std::string file1 = KernelInterface::GetInstance().JoinPath(subDir1, "testFile1");
318 std::string file2 = KernelInterface::GetInstance().JoinPath(subDir2, "testFile2");
319 KernelInterface::GetInstance().CreateDir(subDir1); // ../testDir/subDir1/
320 KernelInterface::GetInstance().CreateFile(file1); // ../testDir/subDir1/testFile1
321
322 ret = KernelInterface::GetInstance().RemoveDirRecursively(subDir1);
323 ret = ret && KernelInterface::GetInstance().IsEmptyDir(basedir);
324 EXPECT_EQ(ret, true);
325 ret = KernelInterface::GetInstance().IsDirExists(subDir1);
326 EXPECT_EQ(ret, false);
327
328 KernelInterface::GetInstance().CreateDir(subDir1);
329 KernelInterface::GetInstance().CreateDir(subDir2); // ../testDir/subDir2/
330 KernelInterface::GetInstance().CreateFile(file1); // ../testDir/subDir1/testFile1
331 KernelInterface::GetInstance().CreateFile(file2); // ../testDir/subDir2/testFile2
332 ret = KernelInterface::GetInstance().RemoveDirRecursively(basedir);
333 EXPECT_EQ(ret, true);
334 ret = KernelInterface::GetInstance().IsDirExists(basedir);
335 EXPECT_EQ(ret, false);
336 }
337
338 HWTEST_F(KernelInterfaceTest, GetPidProcInfoTest, TestSize.Level1)
339 {
340 ProcInfo procInfo;
341 procInfo.pid = 1;
342 bool ret = KernelInterface::GetInstance().GetPidProcInfo(procInfo);
343 printf("pid=[%d], name=[%s], status=[%s], size=[%d KB]\n",
344 procInfo.pid, procInfo.name.c_str(), procInfo.status.c_str(), procInfo.size);
345 EXPECT_EQ(ret, true);
346 }
347
348 HWTEST_F(KernelInterfaceTest, GetCurrentBufferTest, TestSize.Level1)
349 {
350 int buffer = KernelInterface::GetInstance().GetCurrentBuffer();
351 printf("buffer=%d", buffer);
352 EXPECT_GT(buffer, 0);
353 }
354 }
355 }
356