1 /*
2 * Copyright (c) 2021 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 <string>
19 #include <thread>
20
21 #include "log_print.h"
22 #include "preferences.h"
23 #include "preferences_errno.h"
24 #include "preferences_file_operation.h"
25 #include "preferences_helper.h"
26 #include "preferences_xml_utils.h"
27
28 using namespace testing::ext;
29 using namespace OHOS::NativePreferences;
30
31 namespace {
32 class PreferencesFileTest : public testing::Test {
33 public:
34 static void SetUpTestCase(void);
35 static void TearDownTestCase(void);
36 void SetUp();
37 void TearDown();
38 };
39
SetUpTestCase(void)40 void PreferencesFileTest::SetUpTestCase(void)
41 {
42 }
43
TearDownTestCase(void)44 void PreferencesFileTest::TearDownTestCase(void)
45 {
46 }
47
SetUp(void)48 void PreferencesFileTest::SetUp(void)
49 {
50 }
51
TearDown(void)52 void PreferencesFileTest::TearDown(void)
53 {
54 }
55
PreferencesPutValue(std::shared_ptr<Preferences> pref,const std::string & intKey,int intValue,const std::string & strKey,const std::string & strValue)56 int PreferencesPutValue(std::shared_ptr<Preferences> pref, const std::string &intKey, int intValue,
57 const std::string &strKey, const std::string &strValue)
58 {
59 pref->PutInt(intKey, intValue);
60 pref->PutString(strKey, strValue);
61 int ret = pref->FlushSync();
62 return ret;
63 }
64
65 /**
66 * @tc.name: NativePreferencesFileTest_001
67 * @tc.desc: normal testcase of backup file
68 * @tc.type: FUNC
69 * @tc.require: AR000CU2BN
70 * @tc.author: liulinna
71 */
72 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_001, TestSize.Level1)
73 {
74 std::string file = "/data/test/test";
75 std::string backupFile = "/data/test/test.bak";
76
77 std::remove(file.c_str());
78 std::remove(backupFile.c_str());
79
80 std::vector<Element> settings;
81 Element elem;
82 elem.key_ = "intKey";
83 elem.tag_ = std::string("int");
84 elem.value_ = std::to_string(10);
85 settings.push_back(elem);
86 PreferencesXmlUtils::WriteSettingXml(backupFile, "", "", settings);
87
88 int errCode = E_OK;
89 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
90 EXPECT_EQ(errCode, E_OK);
91 int ret = pref->GetInt("intKey", 0);
92 EXPECT_EQ(ret, 10);
93
94 struct stat st = { 0 };
95 ret = stat(file.c_str(), &st);
96 EXPECT_EQ(ret, 0);
97 ret = (st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO));
98 EXPECT_EQ(ret, 0);
99
100 pref = nullptr;
101 ret = PreferencesHelper::DeletePreferences(file);
102 EXPECT_EQ(ret, E_OK);
103 }
104
105 /**
106 * @tc.name: NativePreferencesFileTest_002
107 * @tc.desc: normal testcase of file permission
108 * @tc.type: FUNC
109 * @tc.require: AR000CU2BN
110 * @tc.author: liulinna
111 */
112 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_002, TestSize.Level1)
113 {
114 std::string file = "/data/test/test";
115 std::remove(file.c_str());
116
117 int errCode = E_OK;
118 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
119 EXPECT_EQ(errCode, E_OK);
120
121 int ret = PreferencesPutValue(pref, "key1", 2, "key2", "test");
122 EXPECT_EQ(ret, E_OK);
123
124 struct stat st = { 0 };
125 int result = stat(file.c_str(), &st);
126 EXPECT_EQ(result, 0);
127 result = st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO);
128 EXPECT_EQ(result, 0);
129
130 pref = nullptr;
131 result = PreferencesHelper::DeletePreferences(file);
132 EXPECT_EQ(result, E_OK);
133 }
134
135 /**
136 * @tc.name: NativePreferencesFileTest_003
137 * @tc.desc: test FlushSync one times and five times
138 * @tc.type: FUNC
139 * @tc.require: AR000CU2BN
140 * @tc.author: liulinna
141 */
142 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_003, TestSize.Level1)
143 {
144 std::string file = "/data/test/test";
145 int ret = PreferencesHelper::DeletePreferences(file);
146 EXPECT_EQ(ret, E_OK);
147
148 int errCode = E_OK;
149 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
150 EXPECT_EQ(errCode, E_OK);
151
152 ret = PreferencesPutValue(pref, "intKey", 1, "stringKey", "string1");
153 EXPECT_EQ(ret, E_OK);
154
155 EXPECT_EQ(1, pref->GetInt("intKey", 0));
156 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
157
158 pref = nullptr;
159 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
160 EXPECT_EQ(ret, E_OK);
161
162 errCode = E_OK;
163 pref = PreferencesHelper::GetPreferences(file, errCode);
164 EXPECT_EQ(errCode, E_OK);
165
166 EXPECT_EQ(1, pref->GetInt("intKey", 0));
167 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
168
169 for (int i = 2; i <= 5; i++) {
170 ret = PreferencesPutValue(pref, "intKey", i, "stringKey", "string" + std::to_string(i));
171 EXPECT_EQ(ret, E_OK);
172 }
173
174 EXPECT_EQ(5, pref->GetInt("intKey", 0));
175 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
176
177 pref = nullptr;
178 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
179 EXPECT_EQ(ret, E_OK);
180
181 errCode = E_OK;
182 pref = PreferencesHelper::GetPreferences(file, errCode);
183 EXPECT_EQ(errCode, E_OK);
184
185 EXPECT_EQ(5, pref->GetInt("intKey", 0));
186 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
187
188 pref = nullptr;
189 ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
190 EXPECT_EQ(ret, E_OK);
191 }
192
193 /**
194 * @tc.name: NativePreferencesFileTest_004
195 * @tc.desc: test Flush one times and five times
196 * @tc.type: FUNC
197 * @tc.require: AR000CU2BN
198 * @tc.author: liulinna
199 */
200 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_004, TestSize.Level3)
201 {
202 std::string file = "/data/test/test";
203 int ret = PreferencesHelper::DeletePreferences(file);
204 EXPECT_EQ(ret, E_OK);
205
206 int errCode = E_OK;
207 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
208 EXPECT_EQ(errCode, E_OK);
209
210 ret = PreferencesPutValue(pref, "intKey", 1, "stringKey", "string1");
211 EXPECT_EQ(ret, E_OK);
212
213 EXPECT_EQ(1, pref->GetInt("intKey", 0));
214 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
215
216 std::this_thread::sleep_for(std::chrono::milliseconds(20));
217
218 pref = nullptr;
219 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
220 EXPECT_EQ(ret, E_OK);
221
222 errCode = E_OK;
223 pref = PreferencesHelper::GetPreferences(file, errCode);
224 EXPECT_EQ(errCode, E_OK);
225
226 EXPECT_EQ(1, pref->GetInt("intKey", 0));
227 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
228
229 for (int i = 2; i <= 5; i++) {
230 ret = PreferencesPutValue(pref, "intKey", i, "stringKey", "string" + std::to_string(i));
231 EXPECT_EQ(ret, E_OK);
232 }
233
234 EXPECT_EQ(5, pref->GetInt("intKey", 0));
235 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
236
237 std::this_thread::sleep_for(std::chrono::milliseconds(20));
238
239 pref = nullptr;
240 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
241 EXPECT_EQ(ret, E_OK);
242
243 errCode = E_OK;
244 pref = PreferencesHelper::GetPreferences(file, errCode);
245 EXPECT_EQ(errCode, E_OK);
246
247 EXPECT_EQ(5, pref->GetInt("intKey", 0));
248 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
249
250 pref = nullptr;
251 ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
252 EXPECT_EQ(ret, E_OK);
253 }
254
255 /**
256 * @tc.name: NativePreferencesFileTest_005
257 * @tc.desc: normal testcase of fallback logic
258 * @tc.type: FUNC
259 */
260 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_005, TestSize.Level1)
261 {
262 std::string path = "/data/test/file_test005";
263 std::string file = path + "/test";
264 int ret = PreferencesHelper::DeletePreferences(file);
265 EXPECT_EQ(ret, E_OK);
266
267 int errCode = E_OK;
268 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
269 EXPECT_EQ(errCode, E_OK);
270 ret = pref->GetInt("intKey", 0);
271 EXPECT_EQ(ret, 0);
272 ret = pref->GetInt("intKey1", 0);
273 EXPECT_EQ(ret, 0);
274 pref->PutInt("intKey", 2);
275
276 OHOS::NativePreferences::Mkdir(path);
277 std::vector<Element> settings;
278 Element elem;
279 elem.key_ = "intKey";
280 elem.tag_ = std::string("int");
281 elem.value_ = std::to_string(10);
282 Element elem1;
283 elem1.key_ = "intKey1";
284 elem1.tag_ = std::string("int");
285 elem1.value_ = std::to_string(10);
286 settings.push_back(elem);
287 settings.push_back(elem1);
288 PreferencesXmlUtils::WriteSettingXml(file, "", "", settings);
289
290 ret = pref->GetInt("intKey", 0);
291 EXPECT_EQ(ret, 2);
292 ret = pref->GetInt("intKey1", 0);
293 EXPECT_EQ(ret, 10);
294
295 pref = nullptr;
296 ret = PreferencesHelper::DeletePreferences(file);
297 EXPECT_EQ(ret, E_OK);
298 rmdir(path.c_str());
299 }
300
301 /**
302 * @tc.name: NativePreferencesFileTest_006
303 * @tc.desc: normal testcase of fallback logic
304 * @tc.type: FUNC
305 */
306 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_006, TestSize.Level1)
307 {
308 std::string path = "/data/test/file_test006";
309 std::string file = path + "/test";
310 int ret = PreferencesHelper::DeletePreferences(file);
311 EXPECT_EQ(ret, E_OK);
312
313 int errCode = E_OK;
314 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
315 EXPECT_EQ(errCode, E_OK);
316 EXPECT_EQ(false, pref->HasKey("intKey"));
317 EXPECT_EQ(false, pref->HasKey("intKey1"));
318 pref->PutInt("intKey", 2);
319
320 OHOS::NativePreferences::Mkdir(path);
321 std::vector<Element> settings;
322 Element elem;
323 elem.key_ = "intKey";
324 elem.tag_ = std::string("int");
325 elem.value_ = std::to_string(20);
326 Element elem1;
327 elem1.key_ = "intKey1";
328 elem1.tag_ = std::string("int");
329 elem1.value_ = std::to_string(20);
330 settings.push_back(elem);
331 settings.push_back(elem1);
332 PreferencesXmlUtils::WriteSettingXml(file, "", "", settings);
333
334 pref->FlushSync();
335
336 std::vector<Element> settingsRes = {};
337 bool res = PreferencesXmlUtils::ReadSettingXml(file, "", "", settingsRes);
338 EXPECT_EQ(res, true);
339 EXPECT_EQ(settingsRes.empty(), false);
340 EXPECT_EQ(elem.key_, settingsRes[0].key_);
341 EXPECT_EQ(elem.tag_, settingsRes[0].tag_);
342 EXPECT_EQ(std::to_string(2), settingsRes[0].value_);
343
344 EXPECT_EQ(elem1.key_, settingsRes[1].key_);
345 EXPECT_EQ(elem1.tag_, settingsRes[1].tag_);
346 EXPECT_EQ(elem1.value_, settingsRes[1].value_);
347
348 pref = nullptr;
349 ret = PreferencesHelper::DeletePreferences(file);
350 EXPECT_EQ(ret, E_OK);
351 rmdir(path.c_str());
352 }
353
354 /**
355 * @tc.name: NativePreferencesFileTest_007
356 * @tc.desc: normal testcase of fallback logic
357 * @tc.type: FUNC
358 */
359 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_007, TestSize.Level1)
360 {
361 std::string file = "/data/test/test";
362 int ret = PreferencesHelper::DeletePreferences(file);
363 EXPECT_EQ(ret, E_OK);
364
365 int errCode = E_OK;
366 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
367 EXPECT_EQ(errCode, E_OK);
368 pref->PutInt("intKey", 7);
369
370 std::vector<Element> settings;
371 Element elem;
372 elem.key_ = "intKey";
373 elem.tag_ = std::string("int");
374 elem.value_ = std::to_string(70);
375 Element elem1;
376 elem1.key_ = "intKey1";
377 elem1.tag_ = std::string("int");
378 elem1.value_ = std::to_string(70);
379 settings.push_back(elem);
380 settings.push_back(elem1);
381 PreferencesXmlUtils::WriteSettingXml(file, "", "", settings);
382
383 ret = pref->GetInt("intKey", 0);
384 EXPECT_EQ(ret, 7);
385 ret = pref->GetInt("intKey1", 0);
386 EXPECT_EQ(ret, 70);
387
388 pref = nullptr;
389 ret = PreferencesHelper::DeletePreferences(file);
390 EXPECT_EQ(ret, E_OK);
391 }
392
393 /**
394 * @tc.name: NativePreferencesFileTest_008
395 * @tc.desc: normal testcase of fallback logic
396 * @tc.type: FUNC
397 */
398 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_008, TestSize.Level1)
399 {
400 std::string file = "/data/test/test";
401 int ret = PreferencesHelper::DeletePreferences(file);
402 EXPECT_EQ(ret, E_OK);
403
404 int errCode = E_OK;
405 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
406 EXPECT_EQ(errCode, E_OK);
407 EXPECT_EQ(false, pref->HasKey("intKey"));
408 EXPECT_EQ(false, pref->HasKey("intKey1"));
409 pref->PutInt("intKey", 8);
410
411 std::vector<Element> settings;
412 Element elem;
413 elem.key_ = "intKey";
414 elem.tag_ = std::string("int");
415 elem.value_ = std::to_string(80);
416 Element elem1;
417 elem1.key_ = "intKey1";
418 elem1.tag_ = std::string("int");
419 elem1.value_ = std::to_string(80);
420 settings.push_back(elem);
421 settings.push_back(elem1);
422 PreferencesXmlUtils::WriteSettingXml(file, "", "", settings);
423
424 pref->FlushSync();
425
426 std::vector<Element> settingsRes = {};
427 bool res = PreferencesXmlUtils::ReadSettingXml(file, "", "", settingsRes);
428 EXPECT_EQ(res, true);
429 EXPECT_EQ(settingsRes.empty(), false);
430 EXPECT_EQ(elem.key_, settingsRes[0].key_);
431 EXPECT_EQ(elem.tag_, settingsRes[0].tag_);
432 EXPECT_EQ(std::to_string(8), settingsRes[0].value_);
433
434 EXPECT_EQ(elem1.key_, settingsRes[1].key_);
435 EXPECT_EQ(elem1.tag_, settingsRes[1].tag_);
436 EXPECT_EQ(elem1.value_, settingsRes[1].value_);
437
438 pref = nullptr;
439 ret = PreferencesHelper::DeletePreferences(file);
440 EXPECT_EQ(ret, E_OK);
441 }
442
443 /**
444 * @tc.name: NativePreferencesFileTest_009
445 * @tc.desc: normal testcase of fallback logic
446 * @tc.type: FUNC
447 */
448 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_009, TestSize.Level1)
449 {
450 std::string file = "/data/test/test";
451 int ret = PreferencesHelper::DeletePreferences(file);
452 EXPECT_EQ(ret, E_OK);
453
454 int errCode = E_OK;
455 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
456 EXPECT_EQ(errCode, E_OK);
457 pref->PutInt("intKey", 9);
458
459 pref->FlushSync();
460
461 std::vector<Element> settingsRes = {};
462 bool res = PreferencesXmlUtils::ReadSettingXml(file, "", "", settingsRes);
463 EXPECT_EQ(res, true);
464 EXPECT_EQ(settingsRes.empty(), false);
465 EXPECT_EQ("intKey", settingsRes[0].key_);
466 EXPECT_EQ(std::string("int"), settingsRes[0].tag_);
467 EXPECT_EQ(std::to_string(9), settingsRes[0].value_);
468
469 pref = nullptr;
470 ret = PreferencesHelper::DeletePreferences(file);
471 EXPECT_EQ(ret, E_OK);
472 }
473 }
474