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