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