1 /*
2 * Copyright (c) 2022-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 "db_adapter_test.h"
17
18 #include <cerrno>
19 #include <sys/stat.h>
20 #include <sys/types.h>
21 #include <vector>
22
23 #include "capability_info.h"
24 #include "capability_info_manager.h"
25 #include "constants.h"
26 #include "db_adapter.h"
27 #include "dh_context.h"
28 #include "distributed_hardware_errno.h"
29 #include "distributed_hardware_log.h"
30 #include "mock_db_change_listener.h"
31 #include "version_info_manager.h"
32
33 using namespace testing::ext;
34 using namespace std;
35
36 namespace OHOS {
37 namespace DistributedHardware {
38 #undef DH_LOG_TAG
39 #define DH_LOG_TAG "DbAdapterTest"
40
41 namespace {
42 const string DATABASE_DIR = "/data/service/el1/public/database/dtbhardware_manager_service/";
43 const std::string DEV_NETWORK_ID_1 = "nt36a637105409e904d4da83790a4a9";
44 const string TEST_DEV_ID_0 = "bb536a637105409e904d4da83791aa11";
45 const string TEST_DEV_ID_1 = "bb536a637105409e904d4da83791bb22";
46 const string TEST_DEV_ID_2 = "bb536a637105409e904d4da83791bb33";
47 const string TEST_DEV_NAME = "Dev1";
48 const string TEST_DH_ID_0 = "Camera_00";
49 const string TEST_DH_ID_1 = "Mic_01";
50 const string TEST_DH_ID_2 = "Gps_02";
51 const string TEST_DH_ID_3 = "Display_03";
52 const string TEST_DH_ID_4 = "Input_04";
53 const string TEST_DH_ATTR_0 = "db_test_attr0";
54 const string TEST_DH_ATTR_1 = "db_test_attr1";
55 const string TEST_DH_SUBTYPE_0 = "camera";
56 const string TEST_DH_SUBTYPE_1 = "mic";
57 const string TEST_DH_SUBTYPE_2 = "gps";
58 const string TEST_DH_SUBTYPE_3 = "screen";
59 const string TEST_DH_SUBTYPE_4 = "input";
60 constexpr uint16_t TEST_DEV_TYPE = 0x11;
61
62 const shared_ptr<CapabilityInfo> CAP_INFO_0 =
63 make_shared<CapabilityInfo>(TEST_DH_ID_0, TEST_DEV_ID_0, DEV_NAME, TEST_DEV_TYPE, DHType::CAMERA, TEST_DH_ATTR_0,
64 TEST_DH_SUBTYPE_0);
65 const shared_ptr<CapabilityInfo> CAP_INFO_1 =
66 make_shared<CapabilityInfo>(TEST_DH_ID_1, TEST_DEV_ID_0, DEV_NAME, TEST_DEV_TYPE, DHType::AUDIO, TEST_DH_ATTR_0,
67 TEST_DH_SUBTYPE_1);
68 const shared_ptr<CapabilityInfo> CAP_INFO_2 =
69 make_shared<CapabilityInfo>(TEST_DH_ID_2, TEST_DEV_ID_0, DEV_NAME, TEST_DEV_TYPE, DHType::GPS, TEST_DH_ATTR_0,
70 TEST_DH_SUBTYPE_2);
71 const shared_ptr<CapabilityInfo> CAP_INFO_3 =
72 make_shared<CapabilityInfo>(TEST_DH_ID_3, TEST_DEV_ID_0, DEV_NAME, TEST_DEV_TYPE, DHType::HFP, TEST_DH_ATTR_0,
73 TEST_DH_SUBTYPE_3);
74 const shared_ptr<CapabilityInfo> CAP_INFO_4 =
75 make_shared<CapabilityInfo>(TEST_DH_ID_4, TEST_DEV_ID_0, DEV_NAME, TEST_DEV_TYPE, DHType::INPUT, TEST_DH_ATTR_0,
76 TEST_DH_SUBTYPE_4);
77
78 const shared_ptr<CapabilityInfo> CAP_INFO_5 =
79 make_shared<CapabilityInfo>(TEST_DH_ID_0, TEST_DEV_ID_1, DEV_NAME, TEST_DEV_TYPE, DHType::CAMERA, TEST_DH_ATTR_1,
80 TEST_DH_SUBTYPE_0);
81 const shared_ptr<CapabilityInfo> CAP_INFO_6 =
82 make_shared<CapabilityInfo>(TEST_DH_ID_1, TEST_DEV_ID_1, DEV_NAME, TEST_DEV_TYPE, DHType::AUDIO, TEST_DH_ATTR_1,
83 TEST_DH_SUBTYPE_1);
84 const shared_ptr<CapabilityInfo> CAP_INFO_7 =
85 make_shared<CapabilityInfo>(TEST_DH_ID_2, TEST_DEV_ID_1, DEV_NAME, TEST_DEV_TYPE, DHType::GPS, TEST_DH_ATTR_1,
86 TEST_DH_SUBTYPE_2);
87 const shared_ptr<CapabilityInfo> CAP_INFO_8 =
88 make_shared<CapabilityInfo>(TEST_DH_ID_3, TEST_DEV_ID_1, DEV_NAME, TEST_DEV_TYPE, DHType::HFP, TEST_DH_ATTR_1,
89 TEST_DH_SUBTYPE_3);
90 const shared_ptr<CapabilityInfo> CAP_INFO_9 =
91 make_shared<CapabilityInfo>(TEST_DH_ID_4, TEST_DEV_ID_1, DEV_NAME, TEST_DEV_TYPE, DHType::INPUT, TEST_DH_ATTR_1,
92 TEST_DH_SUBTYPE_4);
93
94 std::shared_ptr<DBAdapter> g_dbAdapterPtr;
95 }
96
SetUpTestCase(void)97 void DbAdapterTest::SetUpTestCase(void)
98 {
99 auto ret = mkdir(DATABASE_DIR.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
100 if (ret != 0) {
101 DHLOGE("mkdir failed, path: %{public}s, errno : %{public}d", DATABASE_DIR.c_str(), errno);
102 }
103 std::shared_ptr<DistributedKv::KvStoreObserver> changeListener = std::make_shared<MockDBChangeListener>();
104 g_dbAdapterPtr = std::make_shared<DBAdapter>(APP_ID, GLOBAL_CAPABILITY_ID, changeListener);
105 if (g_dbAdapterPtr != nullptr) {
106 g_dbAdapterPtr->Init(true, DistributedKv::DataType::TYPE_DYNAMICAL);
107 }
108 }
109
TearDownTestCase(void)110 void DbAdapterTest::TearDownTestCase(void)
111 {
112 if (g_dbAdapterPtr != nullptr) {
113 g_dbAdapterPtr->UnInit();
114 }
115
116 g_dbAdapterPtr = nullptr;
117
118 auto ret = remove(DATABASE_DIR.c_str());
119 if (ret != 0) {
120 DHLOGE("remove dir failed, path: %{public}s, errno : %{public}d", DATABASE_DIR.c_str(), errno);
121 }
122 }
123
SetUp()124 void DbAdapterTest::SetUp()
125 {
126 }
127
TearDown()128 void DbAdapterTest::TearDown()
129 {
130 }
131
132 /**
133 * @tc.name: db_adapter_test_000
134 * @tc.desc: Verify the Init function.
135 * @tc.type: FUNC
136 * @tc.require: AR000GHSJE
137 */
138 HWTEST_F(DbAdapterTest, db_adapter_test_000, TestSize.Level0)
139 {
140 if (g_dbAdapterPtr == nullptr) {
141 return;
142 }
143 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->Init(true, DistributedKv::DataType::TYPE_DYNAMICAL));
144 }
145
146 /**
147 * @tc.name: db_adapter_test_001
148 * @tc.desc: Verify the PutDataBatch function.
149 * @tc.type: FUNC
150 * @tc.require: AR000GHSJE
151 */
152 HWTEST_F(DbAdapterTest, db_adapter_test_001, TestSize.Level0)
153 {
154 if (g_dbAdapterPtr == nullptr) {
155 return;
156 }
157 vector<shared_ptr<CapabilityInfo>> resInfos { CAP_INFO_0, CAP_INFO_1, CAP_INFO_2, CAP_INFO_3, CAP_INFO_4,
158 CAP_INFO_5, CAP_INFO_6, CAP_INFO_7, CAP_INFO_8, CAP_INFO_9 };
159
160 std::vector<std::string> keys;
161 std::vector<std::string> values;
162 std::string key;
163 for (auto &resInfo : resInfos) {
164 key = resInfo->GetKey();
165 keys.push_back(key);
166 values.push_back(resInfo->ToJsonString());
167 }
168 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->PutDataBatch(keys, values));
169 for (auto &resInfo : resInfos) {
170 g_dbAdapterPtr->RemoveDataByKey(resInfo->GetKey());
171 }
172 }
173
174 /**
175 * @tc.name: db_adapter_test_002
176 * @tc.desc: Verify the PutDataBatch function.
177 * @tc.type: FUNC
178 * @tc.require: AR000GHSCV
179 */
180 HWTEST_F(DbAdapterTest, db_adapter_test_002, TestSize.Level0)
181 {
182 if (g_dbAdapterPtr == nullptr) {
183 return;
184 }
185 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
186 std::vector<std::string> values { TEST_DH_ATTR_0 };
187
188 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->PutDataBatch(keys, values));
189 g_dbAdapterPtr->RemoveDataByKey(keys[0]);
190 }
191
192 /**
193 * @tc.name: db_adapter_test_003
194 * @tc.desc: Verify the PutDataBatch function.
195 * @tc.type: FUNC
196 * @tc.require: AR000GHSCV
197 */
198 HWTEST_F(DbAdapterTest, db_adapter_test_003, TestSize.Level0)
199 {
200 if (g_dbAdapterPtr == nullptr) {
201 return;
202 }
203 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
204 std::vector<std::string> valuesEmpty;
205
206 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keys, valuesEmpty));
207 }
208
209 /**
210 * @tc.name: db_adapter_test_004
211 * @tc.desc: Verify the PutDataBatch function.
212 * @tc.type: FUNC
213 * @tc.require: AR000GHSCV
214 */
215 HWTEST_F(DbAdapterTest, db_adapter_test_004, TestSize.Level0)
216 {
217 if (g_dbAdapterPtr == nullptr) {
218 return;
219 }
220 std::vector<std::string> keysEmpty;
221 std::vector<std::string> values { TEST_DH_ATTR_0 };
222
223 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keysEmpty, values));
224 }
225
226 /**
227 * @tc.name: db_adapter_test_005
228 * @tc.desc: Verify the PutDataBatch function.
229 * @tc.type: FUNC
230 * @tc.require: AR000GHSCV
231 */
232 HWTEST_F(DbAdapterTest, db_adapter_test_005, TestSize.Level0)
233 {
234 if (g_dbAdapterPtr == nullptr) {
235 return;
236 }
237 std::vector<std::string> keysEmpty;
238 std::vector<std::string> valuesEmpty;
239
240 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keysEmpty, valuesEmpty));
241 }
242
243 /**
244 * @tc.name: db_adapter_test_006
245 * @tc.desc: Verify the PutDataBatch function.
246 * @tc.type: FUNC
247 * @tc.require: AR000GHSCV
248 */
249 HWTEST_F(DbAdapterTest, db_adapter_test_006, TestSize.Level0)
250 {
251 if (g_dbAdapterPtr == nullptr) {
252 return;
253 }
254 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
255 std::vector<std::string> values { TEST_DH_ATTR_0, TEST_DH_ATTR_1 };
256
257 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keys, values));
258 }
259
260 /**
261 * @tc.name: db_adapter_test_007
262 * @tc.desc: Verify the PutDataBatch function.
263 * @tc.type: FUNC
264 * @tc.require: AR000GHSCV
265 */
266 HWTEST_F(DbAdapterTest, db_adapter_test_007, TestSize.Level0)
267 {
268 if (g_dbAdapterPtr == nullptr) {
269 return;
270 }
271 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
272 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
273 std::vector<std::string> values { TEST_DH_ATTR_0 };
274
275 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->PutDataBatch(keys, values));
276 }
277
278 /**
279 * @tc.name: db_adapter_test_008
280 * @tc.desc: Verify the ReInit function.
281 * @tc.type: FUNC
282 * @tc.require: AR000GHSCV
283 */
284 HWTEST_F(DbAdapterTest, db_adapter_test_008, TestSize.Level0)
285 {
286 if (g_dbAdapterPtr == nullptr) {
287 return;
288 }
289 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
290 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->ReInit(true));
291 }
292
293 /**
294 * @tc.name: db_adapter_test_009
295 * @tc.desc: Verify the RemoveDeviceData function.
296 * @tc.type: FUNC
297 * @tc.require: AR000GHSCV
298 */
299 HWTEST_F(DbAdapterTest, db_adapter_test_009, TestSize.Level0)
300 {
301 if (g_dbAdapterPtr == nullptr) {
302 return;
303 }
304 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
305 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->RemoveDeviceData(TEST_DEV_ID_0));
306 }
307
308 /**
309 * @tc.name: db_adapter_test_010
310 * @tc.desc: Verify the RemoveDataByKey function.
311 * @tc.type: FUNC
312 * @tc.require: AR000GHSCV
313 */
314 HWTEST_F(DbAdapterTest, db_adapter_test_010, TestSize.Level0)
315 {
316 if (g_dbAdapterPtr == nullptr) {
317 return;
318 }
319 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
320 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->RemoveDataByKey("key"));
321 }
322
323 /**
324 * @tc.name: db_adapter_test_012
325 * @tc.desc: Verify the UnRegisterChangeListener function.
326 * @tc.type: FUNC
327 * @tc.require: AR000GHSCV
328 */
329 HWTEST_F(DbAdapterTest, db_adapter_test_012, TestSize.Level0)
330 {
331 if (g_dbAdapterPtr == nullptr) {
332 return;
333 }
334 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
335 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->UnRegisterChangeListener());
336 }
337
338 /**
339 * @tc.name: db_adapter_test_013
340 * @tc.desc: Verify the PutData function.
341 * @tc.type: FUNC
342 * @tc.require: AR000GHSCV
343 */
344 HWTEST_F(DbAdapterTest, db_adapter_test_013, TestSize.Level0)
345 {
346 if (g_dbAdapterPtr == nullptr) {
347 return;
348 }
349 std::string key = std::string(TEST_DEV_ID_1 + TEST_DH_ID_1);
350 std::string value = TEST_DH_ATTR_0;
351 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
352 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->PutData(key, value));
353 }
354
355 /**
356 * @tc.name: db_adapter_test_014
357 * @tc.desc: Verify the RegisterChangeListener function.
358 * @tc.type: FUNC
359 * @tc.require: AR000GHSCV
360 */
361 HWTEST_F(DbAdapterTest, db_adapter_test_014, TestSize.Level0)
362 {
363 if (g_dbAdapterPtr == nullptr) {
364 return;
365 }
366 std::string networkId = DEV_NETWORK_ID_1;
367 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
368 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->RegisterChangeListener());
369 }
370
371 /**
372 * @tc.name: db_adapter_test_015
373 * @tc.desc: Verify the UnRegisterChangeListener function.
374 * @tc.type: FUNC
375 * @tc.require: AR000GHSCV
376 */
377 HWTEST_F(DbAdapterTest, db_adapter_test_015, TestSize.Level0)
378 {
379 if (g_dbAdapterPtr == nullptr) {
380 return;
381 }
382 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
383 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->UnRegisterChangeListener());
384 }
385
386 /**
387 * @tc.name: ReInit_001
388 * @tc.desc: Verify the ReInit_001 function.
389 * @tc.type: FUNC
390 * @tc.require: AR000GHSCV
391 */
392 HWTEST_F(DbAdapterTest, ReInit_001, TestSize.Level0)
393 {
394 if (g_dbAdapterPtr == nullptr) {
395 return;
396 }
397 g_dbAdapterPtr->GetKvStorePtr(true, DistributedKv::DataType::TYPE_DYNAMICAL);
398 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->ReInit(true));
399 }
400
401 /**
402 * @tc.name: RemoveDeviceData_001
403 * @tc.desc: Verify the RemoveDeviceData function.
404 * @tc.type: FUNC
405 * @tc.require: AR000GHSJM
406 */
407 HWTEST_F(DbAdapterTest, RemoveDeviceData_001, TestSize.Level0)
408 {
409 if (g_dbAdapterPtr == nullptr) {
410 return;
411 }
412 g_dbAdapterPtr->GetKvStorePtr(true, DistributedKv::DataType::TYPE_DYNAMICAL);
413 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_OPERATION_FAIL, g_dbAdapterPtr->RemoveDeviceData(TEST_DEV_ID_0));
414 }
415
416 /**
417 * @tc.name: PutData_01
418 * @tc.desc: Verify the PutData function.
419 * @tc.type: FUNC
420 * @tc.require: AR000GHSCV
421 */
422 HWTEST_F(DbAdapterTest, PutData_01, TestSize.Level0)
423 {
424 if (g_dbAdapterPtr == nullptr) {
425 return;
426 }
427 std::string key;
428 std::string value;
429 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
430 }
431
432 /**
433 * @tc.name: PutData_02
434 * @tc.desc: Verify the PutData function.
435 * @tc.type: FUNC
436 * @tc.require: AR000GHSCV
437 */
438 HWTEST_F(DbAdapterTest, PutData_02, TestSize.Level0)
439 {
440 if (g_dbAdapterPtr == nullptr) {
441 return;
442 }
443 uint32_t MAX_MESSAGE_LEN = 40 * 1024 * 1024 +1 ;
444 std::string key = "key";
445 key.resize(MAX_MESSAGE_LEN);
446 std::string value;
447 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
448 }
449
450 /**
451 * @tc.name: PutData_03
452 * @tc.desc: Verify the PutData function.
453 * @tc.type: FUNC
454 * @tc.require: AR000GHSCV
455 */
456 HWTEST_F(DbAdapterTest, PutData_03, TestSize.Level0)
457 {
458 if (g_dbAdapterPtr == nullptr) {
459 return;
460 }
461 std::string key = "key";
462 std::string value;
463 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
464 }
465
466 /**
467 * @tc.name: PutData_04
468 * @tc.desc: Verify the PutData function.
469 * @tc.type: FUNC
470 * @tc.require: AR000GHSCV
471 */
472 HWTEST_F(DbAdapterTest, PutData_04, TestSize.Level0)
473 {
474 if (g_dbAdapterPtr == nullptr) {
475 return;
476 }
477 uint32_t MAX_MESSAGE_LEN = 40 * 1024 * 1024 + 1;
478 std::string key = "key";
479 std::string value;
480 value.resize(MAX_MESSAGE_LEN);
481 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
482 }
483
484 /**
485 * @tc.name: PutData_05
486 * @tc.desc: Verify the PutData function.
487 * @tc.type: FUNC
488 * @tc.require: AR000GHSCV
489 */
490 HWTEST_F(DbAdapterTest, PutData_05, TestSize.Level0)
491 {
492 if (g_dbAdapterPtr == nullptr) {
493 return;
494 }
495 std::string key = "key";
496 std::string value = "value";
497 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
498 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->PutData(key, value));
499 }
500 } // namespace DistributedHardware
501 } // namespace OHOS
502