1 /*
2 * Copyright (c) 2024 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 #include <cctype>
16 #include <condition_variable>
17 #include <cstdint>
18 #include <fcntl.h>
19 #include <filesystem>
20 #include <functional>
21 #include <gtest/gtest.h>
22 #include <iostream>
23 #include <list>
24 #include <map>
25 #include <memory>
26 #include <mutex>
27 #include <string>
28 #include <sys/mman.h>
29 #include <thread>
30 #include <vector>
31
32 #include "log_print.h"
33 #include "preferences_test_utils.h"
34 #include "oh_preferences_impl.h"
35 #include "oh_preferences.h"
36 #include "oh_preferences_err_code.h"
37 #include "oh_preferences_value.h"
38 #include "oh_preferences_option.h"
39 #include "preferences_helper.h"
40
41 using namespace testing::ext;
42
43 using namespace OHOS::PreferencesNdk;
44 using namespace OHOS::NativePreferences;
45 namespace {
46 class PreferencesNdkValueTest : public testing::Test {
47 public:
48 static void SetUpTestCase(void);
49 static void TearDownTestCase(void);
50 void SetUp();
51 void TearDown();
52 };
53
SetUpTestCase(void)54 void PreferencesNdkValueTest::SetUpTestCase(void)
55 {
56 NdkTestUtils::CreateDirectoryRecursively("/data/test/");
57 }
TearDownTestCase(void)58 void PreferencesNdkValueTest::TearDownTestCase(void) {}
59
SetUp(void)60 void PreferencesNdkValueTest::SetUp(void)
61 {
62 NdkTestUtils::CreateDirectoryRecursively("/data/test/");
63 }
64
TearDown(void)65 void PreferencesNdkValueTest::TearDown(void) {}
66
67 enum class PrefDataType { UNASSIGNED, INT, STRING, BOOL };
68
GetCommonOption()69 static OH_PreferencesOption *GetCommonOption()
70 {
71 OH_PreferencesOption *option = OH_PreferencesOption_Create();
72 EXPECT_EQ(OH_PreferencesOption_SetFileName(option, "valueTestDbb"), PREFERENCES_OK);
73 EXPECT_EQ(OH_PreferencesOption_SetBundleName(option, "com.uttest"), PREFERENCES_OK);
74 EXPECT_EQ(OH_PreferencesOption_SetDataGroupId(option, "123"), PREFERENCES_OK);
75 return option;
76 }
77
PreferencesFlush(OH_Preferences * store)78 int PreferencesFlush(OH_Preferences *store)
79 {
80 if (store == nullptr) {
81 printf("preferences flush failed, store is null\n");
82 return PREFERENCES_ERROR_BASE;
83 }
84 OH_PreferencesImpl *pref = static_cast<OH_PreferencesImpl *>(store);
85 std::shared_ptr<OHOS::NativePreferences::Preferences> nativePreferences = pref->GetNativePreferences();
86 return nativePreferences->FlushSync();
87 }
88
89 /**
90 * @tc.name: NDKPreferencesTest_001
91 * @tc.desc: test pref is nullptr
92 * @tc.type: FUNC
93 * @tc.require: NA
94 * @tc.author: Lirui
95 */
96 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTest_001, TestSize.Level1)
97 {
98 int errCode = PREFERENCES_OK;
99 std::string intKey = "ndktest_int_key";
100 int value = 0;
101 int res = 0;
102 errCode = OH_Preferences_SetInt(nullptr, intKey.c_str(), 123);
103 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
104
105 errCode = OH_Preferences_GetInt(nullptr, intKey.c_str(), &value);
106 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
107
108 OH_PreferencesOption *option = GetCommonOption();
109 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
110 (void)OH_PreferencesOption_Destroy(option);
111 ASSERT_EQ(errCode, PREFERENCES_OK);
112
113 errCode = OH_Preferences_SetInt(pref, "", value);
114 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
115 errCode = OH_Preferences_GetInt(pref, "", &res);
116 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
117
118 errCode = OH_Preferences_SetInt(pref, nullptr, value);
119 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
120 errCode = OH_Preferences_GetInt(pref, nullptr, &res);
121 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
122 EXPECT_EQ(res, value);
123
124 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
125 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
126 OHOS::NativePreferences::E_OK);
127 }
128
129 /**
130 * @tc.name: NDKPreferencesTest_002
131 * @tc.desc: test pref is nullptr
132 * @tc.type: FUNC
133 * @tc.require: NA
134 * @tc.author: Lirui
135 */
136 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTest_002, TestSize.Level1)
137 {
138 int errCode = PREFERENCES_OK;
139 std::string stringKey = "ndktest_int_key";
140 uint32_t len = 0;
141 char *res = nullptr;
142 char *resValue = nullptr;
143 errCode = OH_Preferences_SetString(nullptr, stringKey.c_str(), "test");
144 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
145
146 errCode = OH_Preferences_GetString(nullptr, stringKey.c_str(), &res, &len);
147 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
148
149 OH_PreferencesOption *option = GetCommonOption();
150 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
151
152 ASSERT_EQ(errCode, PREFERENCES_OK);
153
154 errCode = OH_Preferences_SetString(pref, "", "test");
155 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
156 errCode = OH_Preferences_GetString(pref, "", &res, &len);
157 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
158
159 errCode = OH_Preferences_SetString(pref, nullptr, "test");
160 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
161 errCode = OH_Preferences_GetString(pref, nullptr, &res, &len);
162 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
163
164 errCode = OH_Preferences_SetString(pref, stringKey.c_str(), "123 test");
165 ASSERT_EQ(errCode, PREFERENCES_OK);
166 errCode = OH_Preferences_GetString(pref, stringKey.c_str(), &resValue, &len);
167 ASSERT_EQ(errCode, PREFERENCES_OK);
168 EXPECT_EQ(strcmp(resValue, "123 test"), 0);
169 EXPECT_EQ(PreferencesFlush(pref), PREFERENCES_OK);
170 OH_Preferences_FreeString(resValue);
171
172 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
173 pref = OH_Preferences_Open(option, &errCode);
174 errCode = OH_Preferences_GetString(pref, stringKey.c_str(), &resValue, &len);
175 ASSERT_EQ(errCode, PREFERENCES_OK);
176 EXPECT_EQ(strcmp(resValue, "123 test"), 0);
177 (void)OH_PreferencesOption_Destroy(option);
178 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
179 OHOS::NativePreferences::E_OK);
180 }
181
182 /**
183 * @tc.name: NDKPreferencesTest_003
184 * @tc.desc: test pref is nullptr
185 * @tc.type: FUNC
186 * @tc.require: NA
187 * @tc.author: Lirui
188 */
189 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTest_003, TestSize.Level1)
190 {
191 int errCode = PREFERENCES_OK;
192 std::string boolKey = "ndktest_int_key";
193 bool boolValue = false;
194 errCode = OH_Preferences_SetBool(nullptr, boolKey.c_str(), true);
195 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
196
197 errCode = OH_Preferences_GetBool(nullptr, boolKey.c_str(), &boolValue);
198 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
199
200 OH_PreferencesOption *option = GetCommonOption();
201 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
202 (void)OH_PreferencesOption_Destroy(option);
203 ASSERT_EQ(errCode, PREFERENCES_OK);
204
205 errCode = OH_Preferences_SetBool(pref, "", false);
206 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
207 errCode = OH_Preferences_GetBool(pref, "", &boolValue);
208 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
209
210 errCode = OH_Preferences_SetBool(pref, nullptr, false);
211 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
212 errCode = OH_Preferences_GetBool(pref, nullptr, &boolValue);
213 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
214
215 errCode = OH_Preferences_SetBool(pref, " ", true);
216 EXPECT_EQ(errCode, PREFERENCES_OK);
217 errCode = OH_Preferences_GetBool(pref, " ", &boolValue);
218 EXPECT_EQ(errCode, PREFERENCES_OK);
219 ASSERT_EQ(boolValue, true);
220
221 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
222 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
223 OHOS::NativePreferences::E_OK);
224 }
225
226 /**
227 * @tc.name: NDKPreferencesTest_004
228 * @tc.desc: test pref is nullptr
229 * @tc.type: FUNC
230 * @tc.require: NA
231 * @tc.author: Lirui
232 */
233 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTest_004, TestSize.Level1)
234 {
235 int errCode = PREFERENCES_OK;
236 std::string boolKey = "ndktest_int_key";
237 errCode = OH_Preferences_Delete(nullptr, boolKey.c_str());
238 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
239
240 OH_PreferencesOption *option = GetCommonOption();
241 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
242 ASSERT_EQ(errCode, PREFERENCES_OK);
243
244 errCode = OH_Preferences_Delete(pref, "");
245 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
246 errCode = OH_Preferences_Delete(pref, nullptr);
247 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
248
249 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
250
251 errCode = OH_Preferences_SetBool(pref, boolKey.c_str(), false);
252 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
253 bool res;
254 errCode = OH_Preferences_GetBool(pref, boolKey.c_str(), &res);
255 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
256 EXPECT_EQ(res, false);
257 (void)OH_PreferencesOption_Destroy(option);
258
259 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
260 OHOS::NativePreferences::E_OK);
261 }
262
263 /**
264 * @tc.name: NDKPreferencesTest_005
265 * @tc.desc: test key and value
266 * @tc.type: FUNC
267 * @tc.require: NA
268 * @tc.author: Lirui
269 */
270 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTest_005, TestSize.Level1)
271 {
272 int errCode = PREFERENCES_OK;
273 std::string boolKey = "ndktest_int_key";
274 errCode = OH_Preferences_Delete(nullptr, boolKey.c_str());
275 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
276
277 OH_PreferencesOption *option = GetCommonOption();
278 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
279 ASSERT_EQ(errCode, PREFERENCES_OK);
280 (void)OH_PreferencesOption_Destroy(option);
281
282 std::string stringKey(1024, 'a');
283 errCode = OH_Preferences_SetString(pref, stringKey.c_str(), "test");
284 EXPECT_EQ(errCode, PREFERENCES_OK);
285 errCode = OH_Preferences_SetString(pref, stringKey.append("a").c_str(), "test");
286 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
287 std::string stringValue(16 * 1024 * 1024, 'a');
288 errCode = OH_Preferences_SetString(pref, "test", stringValue.c_str());
289 EXPECT_EQ(errCode, PREFERENCES_OK);
290 errCode = OH_Preferences_SetString(pref, "test", stringValue.append("a").c_str());
291 EXPECT_EQ(errCode, PREFERENCES_ERROR_INVALID_PARAM);
292
293 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
294 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
295 OHOS::NativePreferences::E_OK);
296 }
297
298 /**
299 * @tc.name: NDKPreferencesTestEmptyValueTest001
300 * @tc.desc: test key and value
301 * @tc.type: FUNC
302 * @tc.require: NA
303 * @tc.author: Lirui
304 */
305 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTestEmptyValueTest001, TestSize.Level1)
306 {
307 int errCode = PREFERENCES_OK;
308 OH_PreferencesOption *option = GetCommonOption();
309 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
310 ASSERT_EQ(errCode, PREFERENCES_OK);
311 (void)OH_PreferencesOption_Destroy(option);
312
313 uint32_t len = 0;
314 char *valueGet = nullptr;
315 EXPECT_EQ(OH_Preferences_SetString(pref, "abc", ""), PREFERENCES_OK);
316 errCode = OH_Preferences_GetString(pref, "abc", &valueGet, &len);
317 ASSERT_EQ(errCode, PREFERENCES_OK);
318 EXPECT_EQ(strcmp(valueGet, ""), 0);
319 EXPECT_EQ(len, 1);
320 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
321 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
322 OHOS::NativePreferences::E_OK);
323 }
324
325 /**
326 * @tc.name: NDKPreferencesTestEmptyValueTest001
327 * @tc.desc: test key and value
328 * @tc.type: FUNC
329 * @tc.require: NA
330 * @tc.author: bluhuang
331 */
332 HWTEST_F(PreferencesNdkValueTest, NDKPreferencesTestTypeTest001, TestSize.Level1)
333 {
334 int errCode = PREFERENCES_OK;
335 OH_PreferencesOption *option = GetCommonOption();
336 OH_Preferences *pref = OH_Preferences_Open(option, &errCode);
337 ASSERT_EQ(errCode, PREFERENCES_OK);
338 (void)OH_PreferencesOption_Destroy(option);
339
340 std::string key = "testKey";
341 uint32_t len = 0;
342 char *strValue = nullptr;
343 bool boolValue = false;
344 int intValue = -1;
345 EXPECT_EQ(OH_Preferences_SetInt(pref, key.c_str(), 123), PREFERENCES_OK);
346 EXPECT_EQ(OH_Preferences_GetString(pref, key.c_str(), &strValue, &len), PREFERENCES_ERROR_KEY_NOT_FOUND);
347 EXPECT_EQ(OH_Preferences_GetBool(pref, key.c_str(), &boolValue), PREFERENCES_ERROR_KEY_NOT_FOUND);
348 EXPECT_EQ(OH_Preferences_GetInt(pref, key.c_str(), &intValue), PREFERENCES_OK);
349
350 EXPECT_EQ(OH_Preferences_SetBool(pref, key.c_str(), true), PREFERENCES_OK);
351 EXPECT_EQ(OH_Preferences_GetInt(pref, key.c_str(), &intValue), PREFERENCES_ERROR_KEY_NOT_FOUND);
352 EXPECT_EQ(OH_Preferences_GetString(pref, key.c_str(), &strValue, &len), PREFERENCES_ERROR_KEY_NOT_FOUND);
353 EXPECT_EQ(OH_Preferences_GetBool(pref, key.c_str(), &boolValue), PREFERENCES_OK);
354
355 EXPECT_EQ(OH_Preferences_SetString(pref, key.c_str(), ""), PREFERENCES_OK);
356 EXPECT_EQ(OH_Preferences_GetBool(pref, key.c_str(), &boolValue), PREFERENCES_ERROR_KEY_NOT_FOUND);
357 EXPECT_EQ(OH_Preferences_GetInt(pref, key.c_str(), &intValue), PREFERENCES_ERROR_KEY_NOT_FOUND);
358 EXPECT_EQ(OH_Preferences_GetString(pref, key.c_str(), &strValue, &len), PREFERENCES_OK);
359
360 EXPECT_EQ(OH_Preferences_Close(pref), PREFERENCES_OK);
361 EXPECT_EQ(OHOS::NativePreferences::PreferencesHelper::DeletePreferences("/data/test/valueTestDb"),
362 OHOS::NativePreferences::E_OK);
363 }
364 }
365