1fc223305Sopenharmony_ci/*
2fc223305Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3fc223305Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fc223305Sopenharmony_ci * you may not use this file except in compliance with the License.
5fc223305Sopenharmony_ci * You may obtain a copy of the License at
6fc223305Sopenharmony_ci *
7fc223305Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fc223305Sopenharmony_ci *
9fc223305Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fc223305Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fc223305Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fc223305Sopenharmony_ci * See the License for the specific language governing permissions and
13fc223305Sopenharmony_ci * limitations under the License.
14fc223305Sopenharmony_ci */
15fc223305Sopenharmony_ci
16fc223305Sopenharmony_ci#include <gtest/gtest.h>
17fc223305Sopenharmony_ci
18fc223305Sopenharmony_ci#include <string>
19fc223305Sopenharmony_ci#include <thread>
20fc223305Sopenharmony_ci
21fc223305Sopenharmony_ci#include "log_print.h"
22fc223305Sopenharmony_ci#include "preferences.h"
23fc223305Sopenharmony_ci#include "preferences_errno.h"
24fc223305Sopenharmony_ci#include "preferences_helper.h"
25fc223305Sopenharmony_ci#include "preferences_xml_utils.h"
26fc223305Sopenharmony_ci
27fc223305Sopenharmony_ciusing namespace testing::ext;
28fc223305Sopenharmony_ciusing namespace OHOS::NativePreferences;
29fc223305Sopenharmony_ci
30fc223305Sopenharmony_cinamespace {
31fc223305Sopenharmony_ciclass PreferencesFileTest : public testing::Test {
32fc223305Sopenharmony_cipublic:
33fc223305Sopenharmony_ci    static void SetUpTestCase(void);
34fc223305Sopenharmony_ci    static void TearDownTestCase(void);
35fc223305Sopenharmony_ci    void SetUp();
36fc223305Sopenharmony_ci    void TearDown();
37fc223305Sopenharmony_ci};
38fc223305Sopenharmony_ci
39fc223305Sopenharmony_civoid PreferencesFileTest::SetUpTestCase(void)
40fc223305Sopenharmony_ci{
41fc223305Sopenharmony_ci}
42fc223305Sopenharmony_ci
43fc223305Sopenharmony_civoid PreferencesFileTest::TearDownTestCase(void)
44fc223305Sopenharmony_ci{
45fc223305Sopenharmony_ci}
46fc223305Sopenharmony_ci
47fc223305Sopenharmony_civoid PreferencesFileTest::SetUp(void)
48fc223305Sopenharmony_ci{
49fc223305Sopenharmony_ci}
50fc223305Sopenharmony_ci
51fc223305Sopenharmony_civoid PreferencesFileTest::TearDown(void)
52fc223305Sopenharmony_ci{
53fc223305Sopenharmony_ci}
54fc223305Sopenharmony_ci
55fc223305Sopenharmony_ciint PreferencesPutValue(std::shared_ptr<Preferences> pref, const std::string &intKey, int intValue,
56fc223305Sopenharmony_ci    const std::string &strKey, const std::string &strValue)
57fc223305Sopenharmony_ci{
58fc223305Sopenharmony_ci    pref->PutInt(intKey, intValue);
59fc223305Sopenharmony_ci    pref->PutString(strKey, strValue);
60fc223305Sopenharmony_ci    int ret = pref->FlushSync();
61fc223305Sopenharmony_ci    return ret;
62fc223305Sopenharmony_ci}
63fc223305Sopenharmony_ci
64fc223305Sopenharmony_ci/**
65fc223305Sopenharmony_ci * @tc.name: NativePreferencesFileTest_001
66fc223305Sopenharmony_ci * @tc.desc: normal testcase of backup file
67fc223305Sopenharmony_ci * @tc.type: FUNC
68fc223305Sopenharmony_ci * @tc.require: AR000CU2BN
69fc223305Sopenharmony_ci * @tc.author: liulinna
70fc223305Sopenharmony_ci */
71fc223305Sopenharmony_ciHWTEST_F(PreferencesFileTest, NativePreferencesFileTest_001, TestSize.Level1)
72fc223305Sopenharmony_ci{
73fc223305Sopenharmony_ci    std::string file = "/data/test/test";
74fc223305Sopenharmony_ci    std::string backupFile = "/data/test/test.bak";
75fc223305Sopenharmony_ci
76fc223305Sopenharmony_ci    std::remove(file.c_str());
77fc223305Sopenharmony_ci    std::remove(backupFile.c_str());
78fc223305Sopenharmony_ci
79fc223305Sopenharmony_ci    std::vector<Element> settings;
80fc223305Sopenharmony_ci    Element elem;
81fc223305Sopenharmony_ci    elem.key_ = "intKey";
82fc223305Sopenharmony_ci    elem.tag_ = std::string("int");
83fc223305Sopenharmony_ci    elem.value_ = std::to_string(10);
84fc223305Sopenharmony_ci    settings.push_back(elem);
85fc223305Sopenharmony_ci    PreferencesXmlUtils::WriteSettingXml(backupFile, "", "", settings);
86fc223305Sopenharmony_ci
87fc223305Sopenharmony_ci    int errCode = E_OK;
88fc223305Sopenharmony_ci    std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
89fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
90fc223305Sopenharmony_ci    int ret = pref->GetInt("intKey", 0);
91fc223305Sopenharmony_ci    EXPECT_EQ(ret, 10);
92fc223305Sopenharmony_ci
93fc223305Sopenharmony_ci    struct stat st = { 0 };
94fc223305Sopenharmony_ci    ret = stat(file.c_str(), &st);
95fc223305Sopenharmony_ci    EXPECT_EQ(ret, 0);
96fc223305Sopenharmony_ci    ret = (st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO));
97fc223305Sopenharmony_ci    EXPECT_EQ(ret, 0);
98fc223305Sopenharmony_ci
99fc223305Sopenharmony_ci    pref = nullptr;
100fc223305Sopenharmony_ci    ret = PreferencesHelper::DeletePreferences(file);
101fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
102fc223305Sopenharmony_ci}
103fc223305Sopenharmony_ci
104fc223305Sopenharmony_ci/**
105fc223305Sopenharmony_ci * @tc.name: NativePreferencesFileTest_002
106fc223305Sopenharmony_ci * @tc.desc: normal testcase of file permission
107fc223305Sopenharmony_ci * @tc.type: FUNC
108fc223305Sopenharmony_ci * @tc.require: AR000CU2BN
109fc223305Sopenharmony_ci * @tc.author: liulinna
110fc223305Sopenharmony_ci */
111fc223305Sopenharmony_ciHWTEST_F(PreferencesFileTest, NativePreferencesFileTest_002, TestSize.Level1)
112fc223305Sopenharmony_ci{
113fc223305Sopenharmony_ci    std::string file = "/data/test/test";
114fc223305Sopenharmony_ci    std::remove(file.c_str());
115fc223305Sopenharmony_ci
116fc223305Sopenharmony_ci    int errCode = E_OK;
117fc223305Sopenharmony_ci    std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
118fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
119fc223305Sopenharmony_ci
120fc223305Sopenharmony_ci    int ret = PreferencesPutValue(pref, "key1", 2, "key2", "test");
121fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
122fc223305Sopenharmony_ci
123fc223305Sopenharmony_ci    struct stat st = { 0 };
124fc223305Sopenharmony_ci    int result = stat(file.c_str(), &st);
125fc223305Sopenharmony_ci    EXPECT_EQ(result, 0);
126fc223305Sopenharmony_ci    result = st.st_mode & (S_IXUSR | S_IXGRP | S_IRWXO);
127fc223305Sopenharmony_ci    EXPECT_EQ(result, 0);
128fc223305Sopenharmony_ci
129fc223305Sopenharmony_ci    pref = nullptr;
130fc223305Sopenharmony_ci    result = PreferencesHelper::DeletePreferences(file);
131fc223305Sopenharmony_ci    EXPECT_EQ(result, E_OK);
132fc223305Sopenharmony_ci}
133fc223305Sopenharmony_ci
134fc223305Sopenharmony_ci/**
135fc223305Sopenharmony_ci * @tc.name: NativePreferencesFileTest_003
136fc223305Sopenharmony_ci * @tc.desc: test FlushSync one times and five times
137fc223305Sopenharmony_ci * @tc.type: FUNC
138fc223305Sopenharmony_ci * @tc.require: AR000CU2BN
139fc223305Sopenharmony_ci * @tc.author: liulinna
140fc223305Sopenharmony_ci */
141fc223305Sopenharmony_ciHWTEST_F(PreferencesFileTest, NativePreferencesFileTest_003, TestSize.Level1)
142fc223305Sopenharmony_ci{
143fc223305Sopenharmony_ci    std::string file = "/data/test/test";
144fc223305Sopenharmony_ci    int ret = PreferencesHelper::DeletePreferences(file);
145fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
146fc223305Sopenharmony_ci
147fc223305Sopenharmony_ci    int errCode = E_OK;
148fc223305Sopenharmony_ci    std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
149fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
150fc223305Sopenharmony_ci
151fc223305Sopenharmony_ci    ret = PreferencesPutValue(pref, "intKey", 1, "stringKey", "string1");
152fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
153fc223305Sopenharmony_ci
154fc223305Sopenharmony_ci    EXPECT_EQ(1, pref->GetInt("intKey", 0));
155fc223305Sopenharmony_ci    EXPECT_EQ("string1", pref->GetString("stringKey", ""));
156fc223305Sopenharmony_ci
157fc223305Sopenharmony_ci    pref = nullptr;
158fc223305Sopenharmony_ci    ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
159fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
160fc223305Sopenharmony_ci
161fc223305Sopenharmony_ci    errCode = E_OK;
162fc223305Sopenharmony_ci    pref = PreferencesHelper::GetPreferences(file, errCode);
163fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
164fc223305Sopenharmony_ci
165fc223305Sopenharmony_ci    EXPECT_EQ(1, pref->GetInt("intKey", 0));
166fc223305Sopenharmony_ci    EXPECT_EQ("string1", pref->GetString("stringKey", ""));
167fc223305Sopenharmony_ci
168fc223305Sopenharmony_ci    for (int i = 2; i <= 5; i++) {
169fc223305Sopenharmony_ci        ret = PreferencesPutValue(pref, "intKey", i, "stringKey", "string" + std::to_string(i));
170fc223305Sopenharmony_ci        EXPECT_EQ(ret, E_OK);
171fc223305Sopenharmony_ci    }
172fc223305Sopenharmony_ci
173fc223305Sopenharmony_ci    EXPECT_EQ(5, pref->GetInt("intKey", 0));
174fc223305Sopenharmony_ci    EXPECT_EQ("string5", pref->GetString("stringKey", ""));
175fc223305Sopenharmony_ci
176fc223305Sopenharmony_ci    pref = nullptr;
177fc223305Sopenharmony_ci    ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
178fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
179fc223305Sopenharmony_ci
180fc223305Sopenharmony_ci    errCode = E_OK;
181fc223305Sopenharmony_ci    pref = PreferencesHelper::GetPreferences(file, errCode);
182fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
183fc223305Sopenharmony_ci
184fc223305Sopenharmony_ci    EXPECT_EQ(5, pref->GetInt("intKey", 0));
185fc223305Sopenharmony_ci    EXPECT_EQ("string5", pref->GetString("stringKey", ""));
186fc223305Sopenharmony_ci
187fc223305Sopenharmony_ci    pref = nullptr;
188fc223305Sopenharmony_ci    ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
189fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
190fc223305Sopenharmony_ci}
191fc223305Sopenharmony_ci
192fc223305Sopenharmony_ci/**
193fc223305Sopenharmony_ci * @tc.name: NativePreferencesFileTest_004
194fc223305Sopenharmony_ci * @tc.desc: test Flush one times and five times
195fc223305Sopenharmony_ci * @tc.type: FUNC
196fc223305Sopenharmony_ci * @tc.require: AR000CU2BN
197fc223305Sopenharmony_ci * @tc.author: liulinna
198fc223305Sopenharmony_ci */
199fc223305Sopenharmony_ciHWTEST_F(PreferencesFileTest, NativePreferencesFileTest_004, TestSize.Level3)
200fc223305Sopenharmony_ci{
201fc223305Sopenharmony_ci    std::string file = "/data/test/test";
202fc223305Sopenharmony_ci    int ret = PreferencesHelper::DeletePreferences(file);
203fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
204fc223305Sopenharmony_ci
205fc223305Sopenharmony_ci    int errCode = E_OK;
206fc223305Sopenharmony_ci    std::shared_ptr<Preferences> pref = PreferencesHelper::GetPreferences(file, errCode);
207fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
208fc223305Sopenharmony_ci
209fc223305Sopenharmony_ci    ret = PreferencesPutValue(pref, "intKey", 1, "stringKey", "string1");
210fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
211fc223305Sopenharmony_ci
212fc223305Sopenharmony_ci    EXPECT_EQ(1, pref->GetInt("intKey", 0));
213fc223305Sopenharmony_ci    EXPECT_EQ("string1", pref->GetString("stringKey", ""));
214fc223305Sopenharmony_ci
215fc223305Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(20));
216fc223305Sopenharmony_ci
217fc223305Sopenharmony_ci    pref = nullptr;
218fc223305Sopenharmony_ci    ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
219fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
220fc223305Sopenharmony_ci
221fc223305Sopenharmony_ci    errCode = E_OK;
222fc223305Sopenharmony_ci    pref = PreferencesHelper::GetPreferences(file, errCode);
223fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
224fc223305Sopenharmony_ci
225fc223305Sopenharmony_ci    EXPECT_EQ(1, pref->GetInt("intKey", 0));
226fc223305Sopenharmony_ci    EXPECT_EQ("string1", pref->GetString("stringKey", ""));
227fc223305Sopenharmony_ci
228fc223305Sopenharmony_ci    for (int i = 2; i <= 5; i++) {
229fc223305Sopenharmony_ci        ret = PreferencesPutValue(pref, "intKey", i, "stringKey", "string" + std::to_string(i));
230fc223305Sopenharmony_ci        EXPECT_EQ(ret, E_OK);
231fc223305Sopenharmony_ci    }
232fc223305Sopenharmony_ci
233fc223305Sopenharmony_ci    EXPECT_EQ(5, pref->GetInt("intKey", 0));
234fc223305Sopenharmony_ci    EXPECT_EQ("string5", pref->GetString("stringKey", ""));
235fc223305Sopenharmony_ci
236fc223305Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(20));
237fc223305Sopenharmony_ci
238fc223305Sopenharmony_ci    pref = nullptr;
239fc223305Sopenharmony_ci    ret = PreferencesHelper::RemovePreferencesFromCache("/data/test/test_helper");
240fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
241fc223305Sopenharmony_ci
242fc223305Sopenharmony_ci    errCode = E_OK;
243fc223305Sopenharmony_ci    pref = PreferencesHelper::GetPreferences(file, errCode);
244fc223305Sopenharmony_ci    EXPECT_EQ(errCode, E_OK);
245fc223305Sopenharmony_ci
246fc223305Sopenharmony_ci    EXPECT_EQ(5, pref->GetInt("intKey", 0));
247fc223305Sopenharmony_ci    EXPECT_EQ("string5", pref->GetString("stringKey", ""));
248fc223305Sopenharmony_ci
249fc223305Sopenharmony_ci    pref = nullptr;
250fc223305Sopenharmony_ci    ret = PreferencesHelper::DeletePreferences("/data/test/test_helper");
251fc223305Sopenharmony_ci    EXPECT_EQ(ret, E_OK);
252fc223305Sopenharmony_ci}
253fc223305Sopenharmony_ci}
254