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 "logger.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 class PreferencesFileTest : public testing::Test {
31 public:
32 static void SetUpTestCase(void);
33 static void TearDownTestCase(void);
34 void SetUp();
35 void TearDown();
36 };
37
SetUpTestCase(void)38 void PreferencesFileTest::SetUpTestCase(void)
39 {
40 }
41
TearDownTestCase(void)42 void PreferencesFileTest::TearDownTestCase(void)
43 {
44 }
45
SetUp(void)46 void PreferencesFileTest::SetUp(void)
47 {
48 }
49
TearDown(void)50 void PreferencesFileTest::TearDown(void)
51 {
52 }
53
54 /**
55 * @tc.name: NativePreferencesFileTest_001
56 * @tc.desc: normal testcase of backup file
57 * @tc.type: FUNC
58 * @tc.require: AR000CU2BN
59 * @tc.author: liulinna
60 */
61 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_001, TestSize.Level1)
62 {
63 std::string file = "/data/test/test";
64 std::string backupFile = "/data/test/test.bak";
65
66 std::remove(file.c_str());
67 std::remove(backupFile.c_str());
68
69 std::vector<Element> settings;
70 Element elem;
71 elem.key_ = "intKey";
72 elem.tag_ = std::string("int");
73 elem.value_ = std::to_string(10);
74 settings.push_back(elem);
75 PreferencesXmlUtils::WriteSettingXml(backupFile, settings);
76
77 int errCode = E_OK;
78 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
79 EXPECT_EQ(errCode, E_OK);
80 int ret = pref->GetInt("intKey", 0);
81 EXPECT_EQ(ret, 10);
82
83 struct stat st = { 0 };
84 ret = stat(file.c_str(), &st);
85 EXPECT_EQ(ret, 0);
86 ret = (st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO));
87 EXPECT_EQ(ret, 0);
88
89 pref = nullptr;
90 ret = PreferencesHelper::DeletePreferences(file);
91 EXPECT_EQ(ret, E_OK);
92 }
93
94 /**
95 * @tc.name: NativePreferencesFileTest_002
96 * @tc.desc: normal testcase of file permission
97 * @tc.type: FUNC
98 * @tc.require: AR000CU2BN
99 * @tc.author: liulinna
100 */
101 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_002, TestSize.Level1)
102 {
103 std::string file = "/data/test/test";
104 std::remove(file.c_str());
105
106 int errCode = E_OK;
107 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
108 EXPECT_EQ(errCode, E_OK);
109
110 pref->PutInt("key1", 2);
111 pref->PutString("key2", "test");
112 int ret = pref->FlushSync();
113 EXPECT_EQ(ret, E_OK);
114
115 struct stat st = { 0 };
116 int result = stat(file.c_str(), &st);
117 EXPECT_EQ(result, 0);
118 result = st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO);
119 EXPECT_EQ(result, 0);
120
121 pref = nullptr;
122 result = PreferencesHelper::DeletePreferences(file);
123 EXPECT_EQ(result, E_OK);
124 }
125
126 /**
127 * @tc.name: NativePreferencesFileTest_003
128 * @tc.desc: test two same file path
129 * @tc.type: FUNC
130 * @tc.require: AR000CU2BN
131 * @tc.author: liulinna
132 */
133 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_003, TestSize.Level1)
134 {
135 std::string absolutePath = "/data/test1";
136 std::string relativePath = "/data/test/../test1";
137 std::remove(absolutePath.c_str());
138
139 int errCode = E_OK;
140 std::shared_ptr<Preferences> pref1 = PreferencesHelper::GetPreferences(absolutePath, errCode);
141 EXPECT_EQ(errCode, E_OK);
142
143 errCode = E_OK;
144 std::shared_ptr<Preferences> pref2 = PreferencesHelper::GetPreferences(relativePath, errCode);
145 EXPECT_EQ(errCode, E_OK);
146
147 EXPECT_EQ(pref1, pref2);
148
149 pref1 = nullptr;
150 pref2 = nullptr;
151 int result = PreferencesHelper::DeletePreferences(absolutePath);
152 EXPECT_EQ(result, E_OK);
153 }
154
155 /**
156 * @tc.name: NativePreferencesFileTest_004
157 * @tc.desc: test FlushSync one times and five times
158 * @tc.type: FUNC
159 * @tc.require: AR000CU2BN
160 * @tc.author: liulinna
161 */
162 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_004, TestSize.Level1)
163 {
164 std::string file = "/data/test/test";
165 int ret = PreferencesHelper::DeletePreferences(file);
166 EXPECT_EQ(ret, E_OK);
167
168 int errCode = E_OK;
169 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
170 EXPECT_EQ(errCode, E_OK);
171
172 pref->PutInt("intKey", 1);
173 pref->PutString("stringKey", "string1");
174 ret = pref->FlushSync();
175 EXPECT_EQ(ret, E_OK);
176
177 EXPECT_EQ(1, pref->GetInt("intKey", 0));
178 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
179
180 pref = nullptr;
181 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
182 EXPECT_EQ(ret, E_OK);
183
184 errCode = E_OK;
185 pref = PreferencesHelper::GetPreferences(file, errCode);
186 EXPECT_EQ(errCode, E_OK);
187
188 EXPECT_EQ(1, pref->GetInt("intKey", 0));
189 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
190
191 pref->PutInt("intKey", 2);
192 pref->PutString("stringKey", "string2");
193 ret = pref->FlushSync();
194 EXPECT_EQ(ret, E_OK);
195 pref->PutInt("intKey", 3);
196 pref->PutString("stringKey", "string3");
197 ret = pref->FlushSync();
198 EXPECT_EQ(ret, E_OK);
199
200 pref->PutInt("intKey", 4);
201 pref->PutString("stringKey", "string4");
202 ret = pref->FlushSync();
203 EXPECT_EQ(ret, E_OK);
204
205 pref = PreferencesHelper::GetPreferences(file, errCode);
206 pref->PutInt("intKey", 5);
207 pref->PutString("stringKey", "string5");
208 ret = pref->FlushSync();
209 EXPECT_EQ(ret, E_OK);
210
211 EXPECT_EQ(5, pref->GetInt("intKey", 0));
212 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
213
214 pref = nullptr;
215 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
216 EXPECT_EQ(ret, E_OK);
217
218 errCode = E_OK;
219 pref = PreferencesHelper::GetPreferences(file, errCode);
220 EXPECT_EQ(errCode, E_OK);
221
222 EXPECT_EQ(5, pref->GetInt("intKey", 0));
223 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
224
225 pref = nullptr;
226 ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
227 EXPECT_EQ(ret, E_OK);
228 }
229
230 /**
231 * @tc.name: NativePreferencesFileTest_005
232 * @tc.desc: test Flush one times and five times
233 * @tc.type: FUNC
234 * @tc.require: AR000CU2BN
235 * @tc.author: liulinna
236 */
237 HWTEST_F(PreferencesFileTest, NativePreferencesFileTest_005, TestSize.Level3)
238 {
239 std::string file = "/data/test/test";
240 int ret = PreferencesHelper::DeletePreferences(file);
241 EXPECT_EQ(ret, E_OK);
242
243 int errCode = E_OK;
244 std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
245 EXPECT_EQ(errCode, E_OK);
246
247 pref->PutInt("intKey", 1);
248 pref->PutString("stringKey", "string1");
249 pref->Flush();
250
251 EXPECT_EQ(1, pref->GetInt("intKey", 0));
252 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
253
254 std::this_thread::sleep_for(std::chrono::milliseconds(20));
255
256 pref = nullptr;
257 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
258 EXPECT_EQ(ret, E_OK);
259
260 errCode = E_OK;
261 pref = PreferencesHelper::GetPreferences(file, errCode);
262 EXPECT_EQ(errCode, E_OK);
263
264 EXPECT_EQ(1, pref->GetInt("intKey", 0));
265 EXPECT_EQ("string1", pref->GetString("stringKey", ""));
266
267 pref->PutInt("intKey", 2);
268 pref->PutString("stringKey", "string2");
269 pref->Flush();
270 pref->PutInt("intKey", 3);
271 pref->PutString("stringKey", "string3");
272 pref->Flush();
273
274 pref->PutInt("intKey", 4);
275 pref->PutString("stringKey", "string4");
276 pref->Flush();
277
278 pref->PutInt("intKey", 5);
279 pref->PutString("stringKey", "string5");
280 pref->Flush();
281
282 EXPECT_EQ(5, pref->GetInt("intKey", 0));
283 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
284
285 std::this_thread::sleep_for(std::chrono::milliseconds(20));
286
287 pref = nullptr;
288 ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
289 EXPECT_EQ(ret, E_OK);
290
291 errCode = E_OK;
292 pref = PreferencesHelper::GetPreferences(file, errCode);
293 EXPECT_EQ(errCode, E_OK);
294
295 EXPECT_EQ(5, pref->GetInt("intKey", 0));
296 EXPECT_EQ("string5", pref->GetString("stringKey", ""));
297
298 pref = nullptr;
299 ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
300 EXPECT_EQ(ret, E_OK);
301 }
302