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_helper.h"
25 #include "preferences_xml_utils.h"
26 
27 using namespace testing::ext;
28 using namespace OHOS::NativePreferences;
29 
30 namespace {
31 class PreferencesFileTest : public testing::Test {
32 public:
33     static void SetUpTestCase(void);
34     static void TearDownTestCase(void);
35     void SetUp();
36     void TearDown();
37 };
38 
SetUpTestCase(void)39 void PreferencesFileTest::SetUpTestCase(void)
40 {
41 }
42 
TearDownTestCase(void)43 void PreferencesFileTest::TearDownTestCase(void)
44 {
45 }
46 
SetUp(void)47 void PreferencesFileTest::SetUp(void)
48 {
49 }
50 
TearDown(void)51 void PreferencesFileTest::TearDown(void)
52 {
53 }
54 
PreferencesPutValue(std::shared_ptr<Preferences> pref,const std::string & intKey,int intValue,const std::string & strKey,const std::string & strValue)55 int PreferencesPutValue(std::shared_ptr<Preferences> pref, const std::string &intKey, int intValue,
56     const std::string &strKey, const std::string &strValue)
57 {
58     pref->PutInt(intKey, intValue);
59     pref->PutString(strKey, strValue);
60     int ret = pref->FlushSync();
61     return ret;
62 }
63 
64 /**
65  * @tc.name: NativePreferencesFileTest_001
66  * @tc.desc: normal testcase of backup file
67  * @tc.type: FUNC
68  * @tc.require: AR000CU2BN
69  * @tc.author: liulinna
70  */
71 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_001, TestSize.Level1)
72 {
73     std::string file = "/data/test/test";
74     std::string backupFile = "/data/test/test.bak";
75 
76     std::remove(file.c_str());
77     std::remove(backupFile.c_str());
78 
79     std::vector<Element> settings;
80     Element elem;
81     elem.key_ = "intKey";
82     elem.tag_ = std::string("int");
83     elem.value_ = std::to_string(10);
84     settings.push_back(elem);
85     PreferencesXmlUtils::WriteSettingXml(backupFile, "", "", settings);
86 
87     int errCode = E_OK;
88     std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
89     EXPECT_EQ(errCode, E_OK);
90     int ret = pref->GetInt("intKey", 0);
91     EXPECT_EQ(ret, 10);
92 
93     struct stat st = { 0 };
94     ret = stat(file.c_str(), &st);
95     EXPECT_EQ(ret, 0);
96     ret = (st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO));
97     EXPECT_EQ(ret, 0);
98 
99     pref = nullptr;
100     ret = PreferencesHelper::DeletePreferences(file);
101     EXPECT_EQ(ret, E_OK);
102 }
103 
104 /**
105  * @tc.name: NativePreferencesFileTest_002
106  * @tc.desc: normal testcase of file permission
107  * @tc.type: FUNC
108  * @tc.require: AR000CU2BN
109  * @tc.author: liulinna
110  */
111 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_002, TestSize.Level1)
112 {
113     std::string file = "/data/test/test";
114     std::remove(file.c_str());
115 
116     int errCode = E_OK;
117     std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
118     EXPECT_EQ(errCode, E_OK);
119 
120     int ret = PreferencesPutValue(pref, "key1", 2, "key2", "test");
121     EXPECT_EQ(ret, E_OK);
122 
123     struct stat st = { 0 };
124     int result = stat(file.c_str(), &st);
125     EXPECT_EQ(result, 0);
126     result = st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO);
127     EXPECT_EQ(result, 0);
128 
129     pref = nullptr;
130     result = PreferencesHelper::DeletePreferences(file);
131     EXPECT_EQ(result, E_OK);
132 }
133 
134 /**
135  * @tc.name: NativePreferencesFileTest_003
136  * @tc.desc: test FlushSync one times and five times
137  * @tc.type: FUNC
138  * @tc.require: AR000CU2BN
139  * @tc.author: liulinna
140  */
141 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_003, TestSize.Level1)
142 {
143     std::string file = "/data/test/test";
144     int ret = PreferencesHelper::DeletePreferences(file);
145     EXPECT_EQ(ret, E_OK);
146 
147     int errCode = E_OK;
148     std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
149     EXPECT_EQ(errCode, E_OK);
150 
151     ret = PreferencesPutValue(pref, "intKey", 1, "stringKey", "string1");
152     EXPECT_EQ(ret, E_OK);
153 
154     EXPECT_EQ(1, pref->GetInt("intKey", 0));
155     EXPECT_EQ("string1", pref->GetString("stringKey", ""));
156 
157     pref = nullptr;
158     ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
159     EXPECT_EQ(ret, E_OK);
160 
161     errCode = E_OK;
162     pref = PreferencesHelper::GetPreferences(file, errCode);
163     EXPECT_EQ(errCode, E_OK);
164 
165     EXPECT_EQ(1, pref->GetInt("intKey", 0));
166     EXPECT_EQ("string1", pref->GetString("stringKey", ""));
167 
168     for (int i = 2; i <= 5; i++) {
169         ret = PreferencesPutValue(pref, "intKey", i, "stringKey", "string" + std::to_string(i));
170         EXPECT_EQ(ret, E_OK);
171     }
172 
173     EXPECT_EQ(5, pref->GetInt("intKey", 0));
174     EXPECT_EQ("string5", pref->GetString("stringKey", ""));
175 
176     pref = nullptr;
177     ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
178     EXPECT_EQ(ret, E_OK);
179 
180     errCode = E_OK;
181     pref = PreferencesHelper::GetPreferences(file, errCode);
182     EXPECT_EQ(errCode, E_OK);
183 
184     EXPECT_EQ(5, pref->GetInt("intKey", 0));
185     EXPECT_EQ("string5", pref->GetString("stringKey", ""));
186 
187     pref = nullptr;
188     ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
189     EXPECT_EQ(ret, E_OK);
190 }
191 
192 /**
193  * @tc.name: NativePreferencesFileTest_004
194  * @tc.desc: test Flush one times and five times
195  * @tc.type: FUNC
196  * @tc.require: AR000CU2BN
197  * @tc.author: liulinna
198  */
199 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_004, TestSize.Level3)
200 {
201     std::string file = "/data/test/test";
202     int ret = PreferencesHelper::DeletePreferences(file);
203     EXPECT_EQ(ret, E_OK);
204 
205     int errCode = E_OK;
206     std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
207     EXPECT_EQ(errCode, E_OK);
208 
209     ret = PreferencesPutValue(pref, "intKey", 1, "stringKey", "string1");
210     EXPECT_EQ(ret, E_OK);
211 
212     EXPECT_EQ(1, pref->GetInt("intKey", 0));
213     EXPECT_EQ("string1", pref->GetString("stringKey", ""));
214 
215     std::this_thread::sleep_for(std::chrono::milliseconds(20));
216 
217     pref = nullptr;
218     ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
219     EXPECT_EQ(ret, E_OK);
220 
221     errCode = E_OK;
222     pref = PreferencesHelper::GetPreferences(file, errCode);
223     EXPECT_EQ(errCode, E_OK);
224 
225     EXPECT_EQ(1, pref->GetInt("intKey", 0));
226     EXPECT_EQ("string1", pref->GetString("stringKey", ""));
227 
228     for (int i = 2; i <= 5; i++) {
229         ret = PreferencesPutValue(pref, "intKey", i, "stringKey", "string" + std::to_string(i));
230         EXPECT_EQ(ret, E_OK);
231     }
232 
233     EXPECT_EQ(5, pref->GetInt("intKey", 0));
234     EXPECT_EQ("string5", pref->GetString("stringKey", ""));
235 
236     std::this_thread::sleep_for(std::chrono::milliseconds(20));
237 
238     pref = nullptr;
239     ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
240     EXPECT_EQ(ret, E_OK);
241 
242     errCode = E_OK;
243     pref = PreferencesHelper::GetPreferences(file, errCode);
244     EXPECT_EQ(errCode, E_OK);
245 
246     EXPECT_EQ(5, pref->GetInt("intKey", 0));
247     EXPECT_EQ("string5", pref->GetString("stringKey", ""));
248 
249     pref = nullptr;
250     ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
251     EXPECT_EQ(ret, E_OK);
252 }
253 }
254