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