• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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