• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include <string>
17 
18 #include "lnn_kv_adapter.h"
19 #include "lnn_kv_data_change_listener.h"
20 #include "softbus_error_code.h"
21 #include "gtest/gtest.h"
22 
23 using namespace std;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 
28 namespace {
29 const std::string APP_ID = "dsoftbus";
30 const std::string STORE_ID = "dsoftbus_kv_db_test";
31 shared_ptr<KVAdapter> kvStore = nullptr;
32 shared_ptr<DistributedKv::KvStoreObserver> kvStoreObserver = nullptr;
33 constexpr int32_t MAX_STRING_LEN = 4096;
34 constexpr int32_t MAX_MAP_SIZE = 10000;
35 const std::string DATABASE_DIR = "/data/service/el1/public/database/dsoftbus";
36 } // namespace
37 
38 class KVAdapterTest : public testing::Test {
39 protected:
40     static void SetUpTestCase(void);
41     static void TearDownTestCase(void);
42     void SetUp();
43     void TearDown();
44 };
45 
SetUpTestCase(void)46 void KVAdapterTest::SetUpTestCase(void)
47 {
48     kvStore = make_shared<KVAdapter>(APP_ID, STORE_ID);
49 }
50 
TearDownTestCase(void)51 void KVAdapterTest::TearDownTestCase(void) { }
52 
SetUp()53 void KVAdapterTest::SetUp()
54 {
55     kvStore->Init();
56 }
57 
TearDown()58 void KVAdapterTest::TearDown()
59 {
60     kvStore->DeInit();
61 }
62 
63 /**
64  * @tc.name: Init001
65  * @tc.desc: Init succeed.
66  * @tc.type: FUNC
67  * @tc.require:
68  */
69 HWTEST_F(KVAdapterTest, Init001, TestSize.Level1)
70 {
71     kvStore->DeInit();
72     EXPECT_EQ(SOFTBUS_OK, kvStore->Init());
73 }
74 
75 /**
76  * @tc.name: UnInit001
77  * @tc.desc: UnInit succeed.
78  * @tc.type: FUNC
79  * @tc.require:
80  */
81 HWTEST_F(KVAdapterTest, UnInit001, TestSize.Level1)
82 {
83     EXPECT_EQ(SOFTBUS_OK, kvStore->DeInit());
84 }
85 
86 /**
87  * @tc.name: Put001
88  * @tc.desc: Put succeed.
89  * @tc.type: FUNC
90  * @tc.require:
91  */
92 HWTEST_F(KVAdapterTest, Put001, TestSize.Level1)
93 {
94     EXPECT_EQ(SOFTBUS_OK, kvStore->Put("key1", "value1"));
95 }
96 
97 /**
98  * @tc.name: Put002
99  * @tc.desc: Put failed, Param is invalid.
100  * @tc.type: FUNC
101  * @tc.require:
102  */
103 HWTEST_F(KVAdapterTest, Put002, TestSize.Level1)
104 {
105     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->Put("", "value1"));
106     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->Put("key1", ""));
107 }
108 
109 /**
110  * @tc.name: Put003
111  * @tc.desc: Put failed, kvDBPtr is null.
112  * @tc.type: FUNC
113  * @tc.require:
114  */
115 HWTEST_F(KVAdapterTest, Put003, TestSize.Level1)
116 {
117     kvStore->DeInit();
118     EXPECT_EQ(SOFTBUS_KV_DB_PTR_NULL, kvStore->Put("key1", "value1"));
119 }
120 
121 /**
122  * @tc.name: Put004
123  * @tc.desc: Put first if.
124  * @tc.type: FUNC
125  * @tc.require:
126  */
127 HWTEST_F(KVAdapterTest, Put004, TestSize.Level1)
128 {
129     string key = "key";
130     string value = "value";
131     EXPECT_EQ(SOFTBUS_OK, kvStore->Put(key, value));
132 
133     for (int32_t i = 0; i < MAX_STRING_LEN + 5; i++) {
134         value += 'a';
135     }
136     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->Put(key, value));
137 
138     value = "";
139     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->Put(key, value));
140 
141     for (int32_t i = 0; i < MAX_STRING_LEN + 5; i++) {
142         key += 'a';
143     }
144     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->Put(key, value));
145 
146     key = "";
147     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->Put(key, value));
148 }
149 
150 /**
151  * @tc.name: PutBatch001
152  * @tc.desc: PutBatch succeed.
153  * @tc.type: FUNC
154  * @tc.require:
155  */
156 HWTEST_F(KVAdapterTest, PutBatch001, TestSize.Level1)
157 {
158     map<string, string> values;
159     values.insert(pair<string, string>("key2", "value2"));
160     values.insert(pair<string, string>("key3", "value3"));
161     EXPECT_EQ(SOFTBUS_OK, kvStore->PutBatch(values));
162 }
163 
164 /**
165  * @tc.name: PutBatch002
166  * @tc.desc: PutBatch failed, Param is invalid.
167  * @tc.type: FUNC
168  * @tc.require:
169  */
170 HWTEST_F(KVAdapterTest, PutBatch002, TestSize.Level1)
171 {
172     map<string, string> values;
173     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->PutBatch(values));
174 
175     for (int32_t i = 0; i < MAX_MAP_SIZE + 5; i++) {
176         values[to_string(i)] = "value";
177     }
178     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->PutBatch(values));
179 }
180 
181 /**
182  * @tc.name: PutBatch003
183  * @tc.desc: PutBatch failed, kvDBPtr is null.
184  * @tc.type: FUNC
185  * @tc.require:
186  */
187 HWTEST_F(KVAdapterTest, PutBatch003, TestSize.Level1)
188 {
189     map<string, string> values;
190     values.insert(pair<string, string>("key1", "value1"));
191     values.insert(pair<string, string>("key2", "value2"));
192     kvStore->DeInit();
193     EXPECT_EQ(SOFTBUS_KV_DB_PTR_NULL, kvStore->PutBatch(values));
194 }
195 
196 /**
197  * @tc.name: Delete001
198  * @tc.desc: Delete succeed.
199  * @tc.type: FUNC
200  * @tc.require:
201  */
202 HWTEST_F(KVAdapterTest, Delete001, TestSize.Level1)
203 {
204     kvStore->Put("key4", "value4");
205     EXPECT_EQ(SOFTBUS_OK, kvStore->Delete("key4"));
206 }
207 
208 /**
209  * @tc.name: Delete002
210  * @tc.desc: Delete failed, kvDBPtr is null.
211  * @tc.type: FUNC
212  * @tc.require:
213  */
214 HWTEST_F(KVAdapterTest, Delete002, TestSize.Level1)
215 {
216     kvStore->Put("key5", "value5");
217     kvStore->DeInit();
218     EXPECT_EQ(SOFTBUS_KV_DB_PTR_NULL, kvStore->Delete("key5"));
219 }
220 
221 /**
222  * @tc.name: DeleteByPrefix001
223  * @tc.desc: DeleteByPrefix succeed.
224  * @tc.type: FUNC
225  * @tc.require:
226  */
227 HWTEST_F(KVAdapterTest, DeleteByPrefix001, TestSize.Level1)
228 {
229     kvStore->Put("key6", "value6");
230     kvStore->Put("key7", "value7");
231     EXPECT_EQ(SOFTBUS_OK, kvStore->DeleteByPrefix("key"));
232 }
233 
234 /**
235  * @tc.name: DeleteByPrefix002
236  * @tc.desc: DeleteByPrefix failed, kvDBPtr is null.
237  * @tc.type: FUNC
238  * @tc.require:
239  */
240 HWTEST_F(KVAdapterTest, DeleteByPrefix002, TestSize.Level1)
241 {
242     kvStore->Put("key8", "value8");
243     kvStore->Put("key9", "value9");
244     kvStore->DeInit();
245     EXPECT_EQ(SOFTBUS_KV_DB_PTR_NULL, kvStore->DeleteByPrefix("key"));
246 }
247 
248 /**
249  * @tc.name: DeleteByPrefix003
250  * @tc.desc: DeleteByPrefix failed, keyPrefix is empty.
251  * @tc.type: FUNC
252  * @tc.require:
253  */
254 HWTEST_F(KVAdapterTest, DeleteByPrefix003, TestSize.Level1)
255 {
256     std::string keyPrefix = "";
257     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->DeleteByPrefix(keyPrefix));
258 }
259 
260 /**
261  * @tc.name: DeleteByPrefix004
262  * @tc.desc: DeleteByPrefix failed, keyPrefix length exceeds MAX_STRING_LEN.
263  * @tc.type: FUNC
264  * @tc.require:
265  */
266 HWTEST_F(KVAdapterTest, DeleteByPrefix004, TestSize.Level1)
267 {
268     std::string keyPrefix(MAX_STRING_LEN + 1, 'a');
269     EXPECT_EQ(SOFTBUS_INVALID_PARAM, kvStore->DeleteByPrefix(keyPrefix));
270 }
271 
272 /**
273  * @tc.name: Get001
274  * @tc.desc: Get succeed.
275  * @tc.type: FUNC
276  * @tc.require:
277  */
278 HWTEST_F(KVAdapterTest, Get001, TestSize.Level1)
279 {
280     kvStore->Put("key10", "value10");
281     string value;
282     EXPECT_EQ(SOFTBUS_OK, kvStore->Get("key10", value));
283     EXPECT_EQ("value10", value);
284 }
285 
286 /**
287  * @tc.name: Get002
288  * @tc.desc: Get failed, kvDBPtr is null.
289  * @tc.type: FUNC
290  * @tc.require:
291  */
292 HWTEST_F(KVAdapterTest, Get002, TestSize.Level1)
293 {
294     kvStore->Put("key11", "value11");
295     kvStore->DeInit();
296     string value;
297     EXPECT_EQ(SOFTBUS_KV_DB_PTR_NULL, kvStore->Get("key11", value));
298 }
299 
300 /**
301  * @tc.name: SetCloudAbility001
302  * @tc.desc: SetCloudAbility succeed.
303  * @tc.type: FUNC
304  * @tc.require:
305  */
306 HWTEST_F(KVAdapterTest, SetCloudAbility001, TestSize.Level1)
307 {
308     EXPECT_EQ(SOFTBUS_OK, kvStore->SetCloudAbility(true));
309 }
310 
311 /**
312  * @tc.name: SetCloudAbility002
313  * @tc.desc: SetCloudAbility failed, kvDBPtr is null.
314  * @tc.type: FUNC
315  * @tc.require:
316  */
317 HWTEST_F(KVAdapterTest, SetCloudAbility002, TestSize.Level1)
318 {
319     kvStore->DeInit();
320     EXPECT_EQ(SOFTBUS_KV_DB_PTR_NULL, kvStore->SetCloudAbility(true));
321 }
322 
323 /**
324  * @tc.name: RegisterDataChangeListener001
325  * @tc.desc: RegisterDataChangeListener failed, cloud sync disabled.
326  * @tc.type: FUNC
327  * @tc.require:
328  */
329 HWTEST_F(KVAdapterTest, RegisterDataChangeListener001, TestSize.Level1)
330 {
331     kvStoreObserver = std::make_shared<DistributedKv::KvStoreObserver>();
332     EXPECT_NE(SOFTBUS_OK, kvStore->RegisterDataChangeListener(kvStoreObserver));
333 }
334 
335 /**
336  * @tc.name: DeRegisterDataChangeListener001
337  * @tc.desc: DeRegisterDataChangeListener failed, cloud sync disabled.
338  * @tc.type: FUNC
339  * @tc.require:
340  */
341 HWTEST_F(KVAdapterTest, DeRegisterDataChangeListener001, TestSize.Level1)
342 {
343     EXPECT_NE(SOFTBUS_OK, kvStore->DeRegisterDataChangeListener());
344 }
345 
346 /**
347  * @tc.name: CloudSync001
348  * @tc.desc: CloudSync failed, cloud sync disabled.
349  * @tc.type: FUNC
350  * @tc.require:
351  */
352 HWTEST_F(KVAdapterTest, CloudSync001, TestSize.Level1)
353 {
354     EXPECT_NE(SOFTBUS_OK, kvStore->CloudSync());
355 }
356 
357 /**
358  * @tc.name: CloudSyncCallback001
359  * @tc.desc: CloudSyncCallback succeed.
360  * @tc.type: FUNC
361  * @tc.require:
362  */
363 HWTEST_F(KVAdapterTest, CloudSyncCallback001, TestSize.Level1)
364 {
365     DistributedKv::ProgressDetail detail;
366     detail.code = DistributedKv::Status::SUCCESS;
367     detail.progress = DistributedKv::Progress::SYNC_FINISH;
368     kvStore->CloudSyncCallback(std::move(detail));
369 }
370 
371 /**
372  * @tc.name: CloudSyncCallback002
373  * @tc.desc: CloudSyncCallback failed, Status code is ERROR.
374  * @tc.type: FUNC
375  * @tc.require:
376  */
377 HWTEST_F(KVAdapterTest, CloudSyncCallback002, TestSize.Level1)
378 {
379     DistributedKv::ProgressDetail detail;
380     detail.code = DistributedKv::Status::ERROR;
381     detail.progress = DistributedKv::Progress::SYNC_FINISH;
382     kvStore->CloudSyncCallback(std::move(detail));
383 }
384 } // namespace OHOS
385