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