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 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 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
141 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->Init(true, DistributedKv::DataType::TYPE_DYNAMICAL));
142 }
143
144 /**
145 * @tc.name: db_adapter_test_001
146 * @tc.desc: Verify the PutDataBatch function.
147 * @tc.type: FUNC
148 * @tc.require: AR000GHSJE
149 */
150 HWTEST_F(DbAdapterTest, db_adapter_test_001, TestSize.Level0)
151 {
152 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
153 vector<shared_ptr<CapabilityInfo>> resInfos { CAP_INFO_0, CAP_INFO_1, CAP_INFO_2, CAP_INFO_3, CAP_INFO_4,
154 CAP_INFO_5, CAP_INFO_6, CAP_INFO_7, CAP_INFO_8, CAP_INFO_9 };
155
156 std::vector<std::string> keys;
157 std::vector<std::string> values;
158 std::string key;
159 for (auto &resInfo : resInfos) {
160 key = resInfo->GetKey();
161 keys.push_back(key);
162 values.push_back(resInfo->ToJsonString());
163 }
164 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->PutDataBatch(keys, values));
165 for (auto &resInfo : resInfos) {
166 g_dbAdapterPtr->RemoveDataByKey(resInfo->GetKey());
167 }
168 }
169
170 /**
171 * @tc.name: db_adapter_test_002
172 * @tc.desc: Verify the PutDataBatch function.
173 * @tc.type: FUNC
174 * @tc.require: AR000GHSCV
175 */
176 HWTEST_F(DbAdapterTest, db_adapter_test_002, TestSize.Level0)
177 {
178 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
179 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
180 std::vector<std::string> values { TEST_DH_ATTR_0 };
181
182 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->PutDataBatch(keys, values));
183 g_dbAdapterPtr->RemoveDataByKey(keys[0]);
184 }
185
186 /**
187 * @tc.name: db_adapter_test_003
188 * @tc.desc: Verify the PutDataBatch function.
189 * @tc.type: FUNC
190 * @tc.require: AR000GHSCV
191 */
192 HWTEST_F(DbAdapterTest, db_adapter_test_003, TestSize.Level0)
193 {
194 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
195 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
196 std::vector<std::string> valuesEmpty;
197
198 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keys, valuesEmpty));
199 }
200
201 /**
202 * @tc.name: db_adapter_test_004
203 * @tc.desc: Verify the PutDataBatch function.
204 * @tc.type: FUNC
205 * @tc.require: AR000GHSCV
206 */
207 HWTEST_F(DbAdapterTest, db_adapter_test_004, TestSize.Level0)
208 {
209 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
210 std::vector<std::string> keysEmpty;
211 std::vector<std::string> values { TEST_DH_ATTR_0 };
212
213 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keysEmpty, values));
214 }
215
216 /**
217 * @tc.name: db_adapter_test_005
218 * @tc.desc: Verify the PutDataBatch function.
219 * @tc.type: FUNC
220 * @tc.require: AR000GHSCV
221 */
222 HWTEST_F(DbAdapterTest, db_adapter_test_005, TestSize.Level0)
223 {
224 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
225 std::vector<std::string> keysEmpty;
226 std::vector<std::string> valuesEmpty;
227
228 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keysEmpty, valuesEmpty));
229 }
230
231 /**
232 * @tc.name: db_adapter_test_006
233 * @tc.desc: Verify the PutDataBatch function.
234 * @tc.type: FUNC
235 * @tc.require: AR000GHSCV
236 */
237 HWTEST_F(DbAdapterTest, db_adapter_test_006, TestSize.Level0)
238 {
239 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
240 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
241 std::vector<std::string> values { TEST_DH_ATTR_0, TEST_DH_ATTR_1 };
242
243 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutDataBatch(keys, values));
244 }
245
246 /**
247 * @tc.name: db_adapter_test_007
248 * @tc.desc: Verify the PutDataBatch function.
249 * @tc.type: FUNC
250 * @tc.require: AR000GHSCV
251 */
252 HWTEST_F(DbAdapterTest, db_adapter_test_007, TestSize.Level0)
253 {
254 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
255 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
256 std::vector<std::string> keys { std::string(TEST_DEV_ID_2 + TEST_DH_ID_0) };
257 std::vector<std::string> values { TEST_DH_ATTR_0 };
258
259 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->PutDataBatch(keys, values));
260 }
261
262 /**
263 * @tc.name: db_adapter_test_008
264 * @tc.desc: Verify the ReInit function.
265 * @tc.type: FUNC
266 * @tc.require: AR000GHSCV
267 */
268 HWTEST_F(DbAdapterTest, db_adapter_test_008, TestSize.Level0)
269 {
270 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
271 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
272 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->ReInit(true));
273 }
274
275 /**
276 * @tc.name: db_adapter_test_009
277 * @tc.desc: Verify the RemoveDeviceData function.
278 * @tc.type: FUNC
279 * @tc.require: AR000GHSCV
280 */
281 HWTEST_F(DbAdapterTest, db_adapter_test_009, TestSize.Level0)
282 {
283 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
284 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
285 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->RemoveDeviceData(TEST_DEV_ID_0));
286 }
287
288 /**
289 * @tc.name: db_adapter_test_010
290 * @tc.desc: Verify the RemoveDataByKey function.
291 * @tc.type: FUNC
292 * @tc.require: AR000GHSCV
293 */
294 HWTEST_F(DbAdapterTest, db_adapter_test_010, TestSize.Level0)
295 {
296 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
297 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
298 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->RemoveDataByKey("key"));
299 }
300
301 /**
302 * @tc.name: db_adapter_test_012
303 * @tc.desc: Verify the UnRegisterChangeListener function.
304 * @tc.type: FUNC
305 * @tc.require: AR000GHSCV
306 */
307 HWTEST_F(DbAdapterTest, db_adapter_test_012, TestSize.Level0)
308 {
309 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
310 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
311 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->UnRegisterChangeListener());
312 }
313
314 /**
315 * @tc.name: db_adapter_test_013
316 * @tc.desc: Verify the PutData function.
317 * @tc.type: FUNC
318 * @tc.require: AR000GHSCV
319 */
320 HWTEST_F(DbAdapterTest, db_adapter_test_013, TestSize.Level0)
321 {
322 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
323 std::string key = std::string(TEST_DEV_ID_1 + TEST_DH_ID_1);
324 std::string value = TEST_DH_ATTR_0;
325 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
326 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->PutData(key, value));
327 }
328
329 /**
330 * @tc.name: db_adapter_test_014
331 * @tc.desc: Verify the RegisterChangeListener function.
332 * @tc.type: FUNC
333 * @tc.require: AR000GHSCV
334 */
335 HWTEST_F(DbAdapterTest, db_adapter_test_014, TestSize.Level0)
336 {
337 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
338 std::string networkId = DEV_NETWORK_ID_1;
339 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
340 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->RegisterChangeListener());
341 }
342
343 /**
344 * @tc.name: db_adapter_test_015
345 * @tc.desc: Verify the UnRegisterChangeListener function.
346 * @tc.type: FUNC
347 * @tc.require: AR000GHSCV
348 */
349 HWTEST_F(DbAdapterTest, db_adapter_test_015, TestSize.Level0)
350 {
351 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
352 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
353 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->UnRegisterChangeListener());
354 }
355
356 /**
357 * @tc.name: ReInit_001
358 * @tc.desc: Verify the ReInit_001 function.
359 * @tc.type: FUNC
360 * @tc.require: AR000GHSCV
361 */
362 HWTEST_F(DbAdapterTest, ReInit_001, TestSize.Level0)
363 {
364 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
365 g_dbAdapterPtr->GetKvStorePtr(true, DistributedKv::DataType::TYPE_DYNAMICAL);
366 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->ReInit(true));
367 }
368
369 /**
370 * @tc.name: RemoveDeviceData_001
371 * @tc.desc: Verify the RemoveDeviceData function.
372 * @tc.type: FUNC
373 * @tc.require: AR000GHSJM
374 */
375 HWTEST_F(DbAdapterTest, RemoveDeviceData_001, TestSize.Level0)
376 {
377 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
378 g_dbAdapterPtr->GetKvStorePtr(true, DistributedKv::DataType::TYPE_DYNAMICAL);
379 EXPECT_EQ(DH_FWK_SUCCESS, g_dbAdapterPtr->RemoveDeviceData(TEST_DEV_ID_0));
380 }
381
382 /**
383 * @tc.name: PutData_01
384 * @tc.desc: Verify the PutData function.
385 * @tc.type: FUNC
386 * @tc.require: AR000GHSCV
387 */
388 HWTEST_F(DbAdapterTest, PutData_01, TestSize.Level0)
389 {
390 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
391 std::string key;
392 std::string value;
393 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
394 }
395
396 /**
397 * @tc.name: PutData_02
398 * @tc.desc: Verify the PutData function.
399 * @tc.type: FUNC
400 * @tc.require: AR000GHSCV
401 */
402 HWTEST_F(DbAdapterTest, PutData_02, TestSize.Level0)
403 {
404 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
405 uint32_t MAX_MESSAGE_LEN = 40 * 1024 * 1024 +1 ;
406 std::string key = "key";
407 key.resize(MAX_MESSAGE_LEN);
408 std::string value;
409 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
410 }
411
412 /**
413 * @tc.name: PutData_03
414 * @tc.desc: Verify the PutData function.
415 * @tc.type: FUNC
416 * @tc.require: AR000GHSCV
417 */
418 HWTEST_F(DbAdapterTest, PutData_03, TestSize.Level0)
419 {
420 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
421 std::string key = "key";
422 std::string value;
423 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
424 }
425
426 /**
427 * @tc.name: PutData_04
428 * @tc.desc: Verify the PutData function.
429 * @tc.type: FUNC
430 * @tc.require: AR000GHSCV
431 */
432 HWTEST_F(DbAdapterTest, PutData_04, TestSize.Level0)
433 {
434 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
435 uint32_t MAX_MESSAGE_LEN = 40 * 1024 * 1024 + 1;
436 std::string key = "key";
437 std::string value;
438 value.resize(MAX_MESSAGE_LEN);
439 EXPECT_EQ(ERR_DH_FWK_PARA_INVALID, g_dbAdapterPtr->PutData(key, value));
440 }
441
442 /**
443 * @tc.name: PutData_05
444 * @tc.desc: Verify the PutData function.
445 * @tc.type: FUNC
446 * @tc.require: AR000GHSCV
447 */
448 HWTEST_F(DbAdapterTest, PutData_05, TestSize.Level0)
449 {
450 ASSERT_TRUE(g_dbAdapterPtr != nullptr);
451 std::string key = "key";
452 std::string value = "value";
453 g_dbAdapterPtr->kvStoragePtr_ = nullptr;
454 EXPECT_EQ(ERR_DH_FWK_RESOURCE_KV_STORAGE_POINTER_NULL, g_dbAdapterPtr->PutData(key, value));
455 }
456 } // namespace DistributedHardware
457 } // namespace OHOS
458