1 /*
2 * Copyright (C) 2023 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 "mediadatashare_unit_test.h"
17
18 #include <gtest/gtest.h>
19 #include <unistd.h>
20
21 #include "abs_shared_result_set.h"
22 #include "accesstoken_kit.h"
23 #include "dataobs_mgr_changeinfo.h"
24 #include "datashare_log.h"
25 #include "datashare_valuebucket_convert.h"
26 #include "data_proxy_observer_stub.h"
27 #include "hap_token_info.h"
28 #include "iservice_registry.h"
29 #include "rdb_data_ability_utils.h"
30 #include "system_ability_definition.h"
31 #include "token_setproc.h"
32
33 namespace OHOS {
34 namespace DataShare {
35 using namespace testing::ext;
36 using namespace OHOS::Security::AccessToken;
37
38 template <typename T>
39 class ConditionLock {
40 public:
ConditionLock()41 explicit ConditionLock() {}
~ConditionLock()42 ~ConditionLock() {}
43 public:
Notify(const T & data)44 void Notify(const T &data)
45 {
46 std::lock_guard<std::mutex> lock(mutex_);
47 data_ = data;
48 isSet_ = true;
49 cv_.notify_one();
50 }
51
Wait()52 T Wait()
53 {
54 std::unique_lock<std::mutex> lock(mutex_);
55 cv_.wait_for(lock, std::chrono::seconds(INTERVAL), [this]() { return isSet_; });
56 T data = data_;
57 cv_.notify_one();
58 return data;
59 }
60
Clear()61 void Clear()
62 {
63 std::lock_guard<std::mutex> lock(mutex_);
64 isSet_ = false;
65 cv_.notify_one();
66 }
67
68 private:
69 bool isSet_ = false;
70 T data_;
71 std::mutex mutex_;
72 std::condition_variable cv_;
73 static constexpr int64_t INTERVAL = 2;
74 };
75
76 class DataShareObserverTest : public DataShare::DataShareObserver {
77 public:
DataShareObserverTest()78 DataShareObserverTest() {}
~DataShareObserverTest()79 ~DataShareObserverTest() {}
80
OnChange(const ChangeInfo & changeInfo)81 void OnChange(const ChangeInfo &changeInfo) override
82 {
83 changeInfo_ = changeInfo;
84 data.Notify(changeInfo);
85 }
86
Clear()87 void Clear()
88 {
89 changeInfo_.changeType_ = INVAILD;
90 changeInfo_.uris_.clear();
91 changeInfo_.data_ = nullptr;
92 changeInfo_.size_ = 0;
93 changeInfo_.valueBuckets_ = {};
94 data.Clear();
95 }
96
97 ChangeInfo changeInfo_;
98 ConditionLock<ChangeInfo> data;
99 };
100
101 constexpr int STORAGE_MANAGER_MANAGER_ID = 5003;
102 std::string DATA_SHARE_URI = "datashare:///com.acts.datasharetest";
103 std::string MEDIALIBRARY_DATA_URI = "datashare:///com.acts.datasharetest";
104 std::string MEDIALIBRARY_DATA_URI_ERROR = "test:///com.acts.datasharetest";
105 std::string FILE_DATA_URI = "file://com.acts.datasharetest";
106 std::string NORMALIZE_URI = "normalize+datashare:///com.acts.datasharetest";
107 std::string DENORMALIZE_URI = "denormalize+datashare:///com.acts.datasharetest";
108 std::shared_ptr<DataShare::DataShareHelper> g_dataShareHelper;
109
CreateDataShareHelper(int32_t systemAbilityId)110 std::shared_ptr<DataShare::DataShareHelper> CreateDataShareHelper(int32_t systemAbilityId)
111 {
112 LOG_INFO("CreateDataShareHelper start");
113 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
114 if (saManager == nullptr) {
115 LOG_ERROR("GetSystemAbilityManager get samgr failed.");
116 return nullptr;
117 }
118 auto remoteObj = saManager->GetSystemAbility(systemAbilityId);
119 if (remoteObj == nullptr) {
120 LOG_ERROR("GetSystemAbility service failed.");
121 return nullptr;
122 }
123 return DataShare::DataShareHelper::Creator(remoteObj, DATA_SHARE_URI);
124 }
125
UrisEqual(std::list<Uri> uri1,std::list<Uri> uri2)126 bool MediaDataShareUnitTest::UrisEqual(std::list<Uri> uri1, std::list<Uri> uri2)
127 {
128 if (uri1.size() != uri2.size()) {
129 return false;
130 }
131 auto cmp = [](const Uri &first, const Uri &second) {
132 return first.ToString() < second.ToString();
133 };
134 uri1.sort(cmp);
135 uri2.sort(cmp);
136 auto it1 = uri1.begin();
137 auto it2 = uri2.begin();
138 for (; it1 != uri1.end() && it2 != uri2.end(); it1++, it2++) {
139 if (!it1->Equals(*it2)) {
140 return false;
141 }
142 }
143 return true;
144 }
145
ValueBucketEqual(const VBuckets & v1,const VBuckets & v2)146 bool MediaDataShareUnitTest::ValueBucketEqual(const VBuckets& v1, const VBuckets& v2)
147 {
148 if (v1.size() != v2.size()) {
149 return false;
150 }
151 for (size_t i = 0; i < v1.size(); i++) {
152 const VBucket& vb1 = v1[i];
153 const VBucket& vb2 = v2[i];
154 if (vb1.size() != vb2.size()) {
155 return false;
156 }
157 for (const auto& pair1 : vb1) {
158 const auto& key = pair1.first;
159 const auto& value1 = pair1.second;
160 auto it2 = vb2.find(key);
161 if (it2 == vb2.end() || it2->second != value1) {
162 return false;
163 }
164 }
165 }
166 return true;
167 }
168
ChangeInfoEqual(const ChangeInfo & changeInfo,const ChangeInfo & expectChangeInfo)169 bool MediaDataShareUnitTest::ChangeInfoEqual(const ChangeInfo &changeInfo, const ChangeInfo &expectChangeInfo)
170 {
171 if (changeInfo.changeType_ != expectChangeInfo.changeType_) {
172 return false;
173 }
174
175 if (!UrisEqual(changeInfo.uris_, expectChangeInfo.uris_)) {
176 return false;
177 }
178
179 if (changeInfo.size_ != expectChangeInfo.size_) {
180 return false;
181 }
182
183 if (changeInfo.size_ != 0) {
184 if (changeInfo.data_ == nullptr && expectChangeInfo.data_ == nullptr) {
185 return false;
186 }
187 return memcmp(changeInfo.data_, expectChangeInfo.data_, expectChangeInfo.size_) == 0;
188 }
189
190 return ValueBucketEqual(changeInfo.valueBuckets_, expectChangeInfo.valueBuckets_);
191 }
192
193
SetUpTestCase(void)194 void MediaDataShareUnitTest::SetUpTestCase(void)
195 {
196 LOG_INFO("SetUpTestCase invoked");
197 g_dataShareHelper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
198 ASSERT_TRUE(g_dataShareHelper != nullptr);
199 int sleepTime = 1;
200 sleep(sleepTime);
201
202 Uri uri(MEDIALIBRARY_DATA_URI);
203 DataShare::DataShareValuesBucket valuesBucket;
204 double valueD1 = 20.07;
205 valuesBucket.Put("phoneNumber", valueD1);
206 valuesBucket.Put("name", "dataShareTest003");
207 int value1 = 1001;
208 valuesBucket.Put("age", value1);
209 int retVal = g_dataShareHelper->Insert(uri, valuesBucket);
210 EXPECT_EQ((retVal > 0), true);
211
212 valuesBucket.Clear();
213 double valueD2 = 20.08;
214 valuesBucket.Put("phoneNumber", valueD2);
215 valuesBucket.Put("name", "dataShareTest004");
216 int value2 = 1000;
217 valuesBucket.Put("age", value2);
218 retVal = g_dataShareHelper->Insert(uri, valuesBucket);
219 EXPECT_EQ((retVal > 0), true);
220
221 valuesBucket.Clear();
222 double valueD3 = 20.09;
223 valuesBucket.Put("phoneNumber", valueD3);
224 valuesBucket.Put("name", "dataShareTest005");
225 int value3 = 999;
226 valuesBucket.Put("age", value3);
227 retVal = g_dataShareHelper->Insert(uri, valuesBucket);
228 EXPECT_EQ((retVal > 0), true);
229 LOG_INFO("SetUpTestCase end");
230 }
231
TearDownTestCase(void)232 void MediaDataShareUnitTest::TearDownTestCase(void)
233 {
234 LOG_INFO("TearDownTestCase invoked");
235 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
236 ASSERT_TRUE(g_dataShareHelper != nullptr);
237 Uri deleteAssetUri(MEDIALIBRARY_DATA_URI);
238 DataShare::DataSharePredicates predicates;
239 predicates.GreaterThan("id", 0);
240 int retVal = helper->Delete(deleteAssetUri, predicates);
241 LOG_INFO("TearDownTestCase Delete retVal: %{public}d", retVal);
242 EXPECT_EQ((retVal >= 0), true);
243
244 bool result = helper->Release();
245 EXPECT_EQ(result, true);
246 LOG_INFO("TearDownTestCase end");
247 }
248
SetUp(void)249 void MediaDataShareUnitTest::SetUp(void) {}
TearDown(void)250 void MediaDataShareUnitTest::TearDown(void) {}
251
252 /**
253 * @tc.name: MediaDataShare_Predicates_Test_001
254 * @tc.desc: Verify query with Equals and Limit predicates returns correct result count
255 * @tc.type: FUNC
256 * @tc.require: None
257 * @tc.precon: None
258 * @tc.step:
259 1. Create predicates with Equals("name", "dataShareTest003") and Limit(1, 0)
260 2. Execute query with these predicates
261 3. Check the returned row count
262 * @tc.expected: Query returns exactly 1 row
263 */
264 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_001, TestSize.Level0)
265 {
266 LOG_INFO("MediaDataShare_Predicates_Test_001::Start");
267 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
268 Uri uri(MEDIALIBRARY_DATA_URI);
269 DataShare::DataSharePredicates predicates;
270 predicates.EqualTo("name", "dataShareTest003");
271 predicates.Limit(1, 0);
272 vector<string> columns;
273 auto resultSet = helper->Query(uri, predicates, columns);
274 int result = 0;
275 if (resultSet != nullptr) {
276 resultSet->GetRowCount(result);
277 }
278 EXPECT_EQ(result, 1);
279 LOG_INFO("MediaDataShare_Predicates_Test_001, End");
280 }
281
282 /**
283 * @tc.name: MediaDataShare_Predicates_Test_002
284 * @tc.desc: Verify query with NotEqualTo predicate returns correct result count
285 * @tc.type: FUNC
286 * @tc.require: None
287 * @tc.precon: None
288 * @tc.step:
289 1. Create predicates with NotEqualTo("name", "dataShareTest003")
290 2. Execute query with these predicates
291 3. Check the returned row count
292 * @tc.expected: Query returns exactly 2 rows
293 */
294 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_002, TestSize.Level0)
295 {
296 LOG_INFO("MediaDataShare_Predicates_Test_002::Start");
297 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
298 DataShare::DataSharePredicates predicates;
299 predicates.NotEqualTo("name", "dataShareTest003");
300 vector<string> columns;
301 Uri uri(MEDIALIBRARY_DATA_URI);
302 auto resultSet = helper->Query(uri, predicates, columns);
303 int result = 0;
304 if (resultSet != nullptr) {
305 resultSet->GetRowCount(result);
306 }
307 EXPECT_EQ(result, 2);
308 LOG_INFO("MediaDataShare_Predicates_Test_002, End");
309 }
310
311 /**
312 * @tc.name: MediaDataShare_Predicates_Test_003
313 * @tc.desc: Verify query with Contains predicate returns correct result count
314 * @tc.type: FUNC
315 * @tc.require: None
316 * @tc.precon: None
317 * @tc.step:
318 1. Create predicates with Contains("name", "dataShareTest")
319 2. Execute query with these predicates
320 3. Check the returned row count
321 * @tc.expected: Query returns exactly 3 rows
322 */
323 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_003, TestSize.Level0)
324 {
325 LOG_INFO("MediaDataShare_Predicates_Test_003::Start");
326 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
327 DataShare::DataSharePredicates predicates;
328 predicates.Contains("name", "dataShareTest");
329 vector<string> columns;
330 Uri uri(MEDIALIBRARY_DATA_URI);
331 auto resultSet = helper->Query(uri, predicates, columns);
332 int result = 0;
333 if (resultSet != nullptr) {
334 resultSet->GetRowCount(result);
335 }
336 EXPECT_EQ(result, 3);
337 LOG_INFO("MediaDataShare_Predicates_Test_003, End");
338 }
339
340 /**
341 * @tc.name: MediaDataShare_Predicates_Test_004
342 * @tc.desc: Verify query with BeginsWith predicate returns correct result count
343 * @tc.type: FUNC
344 * @tc.require: None
345 * @tc.precon: None
346 * @tc.step:
347 1. Create predicates with BeginsWith("name", "dataShare")
348 2. Execute query with these predicates
349 3. Check the returned row count
350 * @tc.expected: Query returns exactly 3 rows
351 */
352 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_004, TestSize.Level0)
353 {
354 LOG_INFO("MediaDataShare_Predicates_Test_004::Start");
355 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
356 DataShare::DataSharePredicates predicates;
357 predicates.BeginsWith("name", "dataShare");
358 vector<string> columns;
359 Uri uri(MEDIALIBRARY_DATA_URI);
360 auto resultSet = helper->Query(uri, predicates, columns);
361 int result = 0;
362 if (resultSet != nullptr) {
363 resultSet->GetRowCount(result);
364 }
365 EXPECT_EQ(result, 3);
366 LOG_INFO("MediaDataShare_Predicates_Test_004, End");
367 }
368
369 /**
370 * @tc.name: MediaDataShare_Predicates_Test_005
371 * @tc.desc: Verify query with EndsWith predicate returns correct result count
372 * @tc.type: FUNC
373 * @tc.require: None
374 * @tc.precon: None
375 * @tc.step:
376 1. Create predicates with EndsWith("name", "003")
377 2. Execute query with these predicates
378 3. Check the returned row count
379 * @tc.expected: Query returns exactly 1 row
380 */
381 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_005, TestSize.Level0)
382 {
383 LOG_INFO("MediaDataShare_Predicates_Test_005::Start");
384 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
385 DataShare::DataSharePredicates predicates;
386 predicates.EndsWith("name", "003");
387 vector<string> columns;
388 Uri uri(MEDIALIBRARY_DATA_URI);
389 auto resultSet = helper->Query(uri, predicates, columns);
390 int result = 0;
391 if (resultSet != nullptr) {
392 resultSet->GetRowCount(result);
393 }
394 EXPECT_EQ(result, 1);
395 LOG_INFO("MediaDataShare_Predicates_Test_005, End");
396 }
397
398 /**
399 * @tc.name: MediaDataShare_Predicates_Test_006
400 * @tc.desc: Verify query with IsNull predicate returns correct result count
401 * @tc.type: FUNC
402 * @tc.require: None
403 * @tc.precon: None
404 * @tc.step:
405 1. Create predicates with IsNull("name")
406 2. Execute query with these predicates
407 3. Check the returned row count
408 * @tc.expected: Query returns exactly 0 rows
409 */
410 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_006, TestSize.Level0)
411 {
412 LOG_INFO("MediaDataShare_Predicates_Test_006::Start");
413 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
414 DataShare::DataSharePredicates predicates;
415 predicates.IsNull("name");
416 vector<string> columns;
417 Uri uri(MEDIALIBRARY_DATA_URI);
418 auto resultSet = helper->Query(uri, predicates, columns);
419 int result = -1;
420 if (resultSet != nullptr) {
421 resultSet->GetRowCount(result);
422 }
423 EXPECT_EQ(result, 0);
424 LOG_INFO("MediaDataShare_Predicates_Test_006, End");
425 }
426
427 /**
428 * @tc.name: MediaDataShare_Predicates_Test_007
429 * @tc.desc: Verify query with IsNotNull predicate returns correct result count
430 * @tc.type: FUNC
431 * @tc.require: None
432 * @tc.precon: None
433 * @tc.step:
434 1. Create predicates with IsNotNull("name")
435 2. Execute query with these predicates
436 3. Check the returned row count
437 * @tc.expected: Query returns exactly 3 rows
438 */
439 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_007, TestSize.Level0)
440 {
441 LOG_INFO("MediaDataShare_Predicates_Test_007::Start");
442 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
443 DataShare::DataSharePredicates predicates;
444 predicates.IsNotNull("name");
445 vector<string> columns;
446 Uri uri(MEDIALIBRARY_DATA_URI);
447 auto resultSet = helper->Query(uri, predicates, columns);
448 int result = 0;
449 if (resultSet != nullptr) {
450 resultSet->GetRowCount(result);
451 }
452 EXPECT_EQ(result, 3);
453 LOG_INFO("MediaDataShare_Predicates_Test_007, End");
454 }
455
456 /**
457 * @tc.name: MediaDataShare_Predicates_Test_008
458 * @tc.desc: Verify query with Like predicate returns correct result count
459 * @tc.type: FUNC
460 * @tc.require: None
461 * @tc.precon: None
462 * @tc.step:
463 1. Create predicates with Like("name", "%Test003")
464 2. Execute query with these predicates
465 3. Check the returned row count
466 * @tc.expected: Query returns exactly 1 row
467 */
468 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_008, TestSize.Level0)
469 {
470 LOG_INFO("MediaDataShare_Predicates_Test_008::Start");
471 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
472 DataShare::DataSharePredicates predicates;
473 predicates.Like("name", "%Test003");
474 vector<string> columns;
475 Uri uri(MEDIALIBRARY_DATA_URI);
476 auto resultSet = helper->Query(uri, predicates, columns);
477 int result = 0;
478 if (resultSet != nullptr) {
479 resultSet->GetRowCount(result);
480 }
481 EXPECT_EQ(result, 1);
482 LOG_INFO("MediaDataShare_Predicates_Test_008, End");
483 }
484
485 /**
486 * @tc.name: MediaDataShare_Predicates_Test_009
487 * @tc.desc: Verify query with Glob predicate returns correct result count
488 * @tc.type: FUNC
489 * @tc.require: None
490 * @tc.precon: None
491 * @tc.step:
492 1. Create predicates with Glob("name", "dataShareTes?003")
493 2. Execute query with these predicates
494 3. Check the returned row count
495 * @tc.expected: Query returns exactly 1 row
496 */
497 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_009, TestSize.Level0)
498 {
499 LOG_INFO("MediaDataShare_Predicates_Test_009::Start");
500 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
501 DataShare::DataSharePredicates predicates;
502 predicates.Glob("name", "dataShareTes?003");
503 vector<string> columns;
504 Uri uri(MEDIALIBRARY_DATA_URI);
505 auto resultSet = helper->Query(uri, predicates, columns);
506 int result = 0;
507 if (resultSet != nullptr) {
508 resultSet->GetRowCount(result);
509 }
510 EXPECT_EQ(result, 1);
511 LOG_INFO("MediaDataShare_Predicates_Test_009, End");
512 }
513
514 /**
515 * @tc.name: MediaDataShare_Predicates_Test_010
516 * @tc.desc: Verify query with Between predicate returns correct result count
517 * @tc.type: FUNC
518 * @tc.require: None
519 * @tc.precon: None
520 * @tc.step:
521 1. Create predicates with Between("age", "0", "999")
522 2. Execute query with these predicates
523 3. Check the returned row count
524 * @tc.expected: Query returns exactly 1 row
525 */
526 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_010, TestSize.Level0)
527 {
528 LOG_INFO("MediaDataShare_Predicates_Test_010::Start");
529 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
530 DataShare::DataSharePredicates predicates;
531 predicates.Between("age", "0", "999");
532 vector<string> columns;
533 Uri uri(MEDIALIBRARY_DATA_URI);
534 auto resultSet = helper->Query(uri, predicates, columns);
535 int result = 0;
536 if (resultSet != nullptr) {
537 resultSet->GetRowCount(result);
538 }
539 EXPECT_EQ(result, 1);
540 LOG_INFO("MediaDataShare_Predicates_Test_010, End");
541 }
542
543 /**
544 * @tc.name: MediaDataShare_Predicates_Test_011
545 * @tc.desc: Verify query with NotBetween predicate returns correct result count
546 * @tc.type: FUNC
547 * @tc.require: None
548 * @tc.precon: None
549 * @tc.step:
550 1. Create predicates with NotBetween("age", "0", "999")
551 2. Execute query with these predicates
552 3. Check the returned row count
553 * @tc.expected: Query returns exactly 2 rows
554 */
555 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_011, TestSize.Level0)
556 {
557 LOG_INFO("MediaDataShare_Predicates_Test_011::Start");
558 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
559 DataShare::DataSharePredicates predicates;
560 predicates.NotBetween("age", "0", "999");
561 vector<string> columns;
562 Uri uri(MEDIALIBRARY_DATA_URI);
563 auto resultSet = helper->Query(uri, predicates, columns);
564 int result = 0;
565 if (resultSet != nullptr) {
566 resultSet->GetRowCount(result);
567 }
568 EXPECT_EQ(result, 2);
569 LOG_INFO("MediaDataShare_Predicates_Test_011, End");
570 }
571
572 /**
573 * @tc.name: MediaDataShare_Predicates_Test_012
574 * @tc.desc: Verify query with GreaterThan predicate returns correct result count
575 * @tc.type: FUNC
576 * @tc.require: None
577 * @tc.precon: None
578 * @tc.step:
579 1. Create predicates with GreaterThan("age", 999)
580 2. Execute query with these predicates
581 3. Check the returned row count
582 * @tc.expected: Query returns exactly 2 rows
583 */
584 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_012, TestSize.Level0)
585 {
586 LOG_INFO("MediaDataShare_Predicates_Test_012::Start");
587 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
588 DataShare::DataSharePredicates predicates;
589 predicates.GreaterThan("age", 999);
590 vector<string> columns;
591 Uri uri(MEDIALIBRARY_DATA_URI);
592 auto resultSet = helper->Query(uri, predicates, columns);
593 int result = 0;
594 if (resultSet != nullptr) {
595 resultSet->GetRowCount(result);
596 }
597 EXPECT_EQ(result, 2);
598 LOG_INFO("MediaDataShare_Predicates_Test_012, End");
599 }
600
601 /**
602 * @tc.name: MediaDataShare_Predicates_Test_013
603 * @tc.desc: Verify query with LessThan predicate returns correct result count
604 * @tc.type: FUNC
605 * @tc.require: None
606 * @tc.precon: None
607 * @tc.step:
608 1. Create predicates with LessThan("age", 1000)
609 2. Execute query with these predicates
610 3. Check the returned row count
611 * @tc.expected: Query returns exactly 1 row
612 */
613 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_013, TestSize.Level0)
614 {
615 LOG_INFO("MediaDataShare_Predicates_Test_013::Start");
616 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
617 DataShare::DataSharePredicates predicates;
618 predicates.LessThan("age", 1000);
619 vector<string> columns;
620 Uri uri(MEDIALIBRARY_DATA_URI);
621 auto resultSet = helper->Query(uri, predicates, columns);
622 int result = 0;
623 if (resultSet != nullptr) {
624 resultSet->GetRowCount(result);
625 }
626 EXPECT_EQ(result, 1);
627 LOG_INFO("MediaDataShare_Predicates_Test_013, End");
628 }
629
630 /**
631 * @tc.name: MediaDataShare_Predicates_Test_014
632 * @tc.desc: Verify query with GreaterThanOrEqualTo predicate returns correct result count
633 * @tc.type: FUNC
634 * @tc.require: None
635 * @tc.precon: None
636 * @tc.step:
637 1. Create predicates with GreaterThanOrEqualTo("age", 1000)
638 2. Execute query with these predicates
639 3. Check the returned row count
640 * @tc.expected: Query returns exactly 2 rows
641 */
642 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_014, TestSize.Level0)
643 {
644 LOG_INFO("MediaDataShare_Predicates_Test_014::Start");
645 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
646 DataShare::DataSharePredicates predicates;
647 predicates.GreaterThanOrEqualTo("age", 1000);
648 vector<string> columns;
649 Uri uri(MEDIALIBRARY_DATA_URI);
650 auto resultSet = helper->Query(uri, predicates, columns);
651 int result = 0;
652 if (resultSet != nullptr) {
653 resultSet->GetRowCount(result);
654 }
655 EXPECT_EQ(result, 2);
656 LOG_INFO("MediaDataShare_Predicates_Test_014, End");
657 }
658
659 /**
660 * @tc.name: MediaDataShare_Predicates_Test_015
661 * @tc.desc: Verify query with LessThanOrEqualTo predicate returns correct result count
662 * @tc.type: FUNC
663 * @tc.require: None
664 * @tc.precon: None
665 * @tc.step:
666 1. Create predicates with LessThanOrEqualTo("age", 1000)
667 2. Execute query with these predicates
668 3. Check the returned row count
669 * @tc.expected: Query returns exactly 2 rows
670 */
671 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_015, TestSize.Level0)
672 {
673 LOG_INFO("MediaDataShare_Predicates_Test_015::Start");
674 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
675 DataShare::DataSharePredicates predicates;
676 predicates.LessThanOrEqualTo("age", 1000);
677 vector<string> columns;
678 Uri uri(MEDIALIBRARY_DATA_URI);
679 auto resultSet = helper->Query(uri, predicates, columns);
680 int result = 0;
681 if (resultSet != nullptr) {
682 resultSet->GetRowCount(result);
683 }
684 EXPECT_EQ(result, 2);
685 LOG_INFO("MediaDataShare_Predicates_Test_015, End");
686 }
687
688 /**
689 * @tc.name: MediaDataShare_Predicates_Test_016
690 * @tc.desc: Verify query with combined predicates (AND/OR) returns correct result count
691 * @tc.type: FUNC
692 * @tc.require: None
693 * @tc.precon: None
694 * @tc.step:
695 1. Create complex predicates with nested conditions
696 2. Execute query with these predicates
697 3. Check the returned row count
698 * @tc.expected: Query returns exactly 1 row
699 */
700 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_016, TestSize.Level0)
701 {
702 LOG_INFO("MediaDataShare_Predicates_Test_016::Start");
703 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
704 DataShare::DataSharePredicates predicates;
705 predicates.EqualTo("phoneNumber", 20.08)
706 ->BeginWrap()
707 ->EqualTo("name", "dataShareTest004")
708 ->Or()
709 ->EqualTo("age", 1000)
710 ->EndWrap();
711 vector<string> columns;
712 Uri uri(MEDIALIBRARY_DATA_URI);
713 auto resultSet = helper->Query(uri, predicates, columns);
714 int result = 0;
715 if (resultSet != nullptr) {
716 resultSet->GetRowCount(result);
717 }
718 EXPECT_EQ(result, 1);
719 LOG_INFO("MediaDataShare_Predicates_Test_016, End");
720 }
721
722 /**
723 * @tc.name: MediaDataShare_Predicates_Test_017
724 * @tc.desc: Verify query with AND combined predicates returns correct result count
725 * @tc.type: FUNC
726 * @tc.require: None
727 * @tc.precon: None
728 * @tc.step:
729 1. Create predicates combining two EqualTo conditions with AND
730 2. Execute query with these predicates
731 3. Check the returned row count
732 * @tc.expected: Query returns exactly 1 row
733 */
734 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_017, TestSize.Level0)
735 {
736 LOG_INFO("MediaDataShare_Predicates_Test_017::Start");
737 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
738 DataShare::DataSharePredicates predicates;
739 predicates.EqualTo("phoneNumber", 20.08)->And()->EqualTo("name", "dataShareTest004");
740 vector<string> columns;
741 Uri uri(MEDIALIBRARY_DATA_URI);
742 auto resultSet = helper->Query(uri, predicates, columns);
743 int result = 0;
744 if (resultSet != nullptr) {
745 resultSet->GetRowCount(result);
746 }
747 EXPECT_EQ(result, 1);
748 LOG_INFO("MediaDataShare_Predicates_Test_017, End");
749 }
750
751 /**
752 * @tc.name: MediaDataShare_Predicates_Test_018
753 * @tc.desc: Verify query with ascending order predicate returns correctly ordered results
754 * @tc.type: FUNC
755 * @tc.require: None
756 * @tc.precon: None
757 * @tc.step:
758 1. Create predicates with OrderByAsc("age")
759 2. Execute query with these predicates
760 3. Check the name of the first row in results
761 * @tc.expected: First row contains name "dataShareTest005"
762 */
763 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_018, TestSize.Level0)
764 {
765 LOG_INFO("MediaDataShare_Predicates_Test_018::Start");
766 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
767 DataShare::DataSharePredicates predicates;
768 predicates.OrderByAsc("age");
769 vector<string> columns;
770 Uri uri(MEDIALIBRARY_DATA_URI);
771 auto resultSet = helper->Query(uri, predicates, columns);
772 int columnIndex = 0;
773 std::string stringResult = "";
774 if (resultSet != nullptr) {
775 resultSet->GoToFirstRow();
776 resultSet->GetColumnIndex("name", columnIndex);
777 resultSet->GetString(columnIndex, stringResult);
778 }
779 EXPECT_EQ(stringResult, "dataShareTest005");
780 LOG_INFO("MediaDataShare_Predicates_Test_018, End");
781 }
782
783 /**
784 * @tc.name: MediaDataShare_Predicates_Test_019
785 * @tc.desc: Verify query with descending order predicate returns correctly ordered results
786 * @tc.type: FUNC
787 * @tc.require: None
788 * @tc.precon: None
789 * @tc.step:
790 1. Create predicates with OrderByDesc("phoneNumber")
791 2. Execute query with these predicates
792 3. Check the name of the first row in results
793 * @tc.expected: First row contains name "dataShareTest005"
794 */
795 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_019, TestSize.Level0)
796 {
797 LOG_INFO("MediaDataShare_Predicates_Test_019::Start");
798 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
799 DataShare::DataSharePredicates predicates;
800 predicates.OrderByDesc("phoneNumber");
801 vector<string> columns;
802 Uri uri(MEDIALIBRARY_DATA_URI);
803 auto resultSet = helper->Query(uri, predicates, columns);
804 int columnIndex = 0;
805 std::string stringResult = "";
806 if (resultSet != nullptr) {
807 resultSet->GoToFirstRow();
808 resultSet->GetColumnIndex("name", columnIndex);
809 resultSet->GetString(columnIndex, stringResult);
810 }
811 EXPECT_EQ(stringResult, "dataShareTest005");
812 LOG_INFO("MediaDataShare_Predicates_Test_019, End");
813 }
814
815 /**
816 * @tc.name: MediaDataShare_Predicates_Test_020
817 * @tc.desc: Verify predicate setting mode can be set and retrieved correctly
818 * @tc.type: FUNC
819 * @tc.require: None
820 * @tc.precon: None
821 * @tc.step:
822 1. Create empty predicates
823 2. Set setting mode to PREDICATES_METHOD
824 3. Retrieve and check the setting mode
825 * @tc.expected: Retrieved setting mode matches PREDICATES_METHOD
826 */
827 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_020, TestSize.Level0)
828 {
829 LOG_INFO("MediaDataShare_Predicates_Test_020::Start");
830 DataShare::DataSharePredicates predicates;
831 predicates.SetSettingMode(DataShare::SettingMode::PREDICATES_METHOD);
832 int16_t setting = predicates.GetSettingMode();
833 EXPECT_EQ(setting, DataShare::SettingMode::PREDICATES_METHOD);
834 LOG_INFO("MediaDataShare_Predicates_Test_020, End");
835 }
836
837 /**
838 * @tc.name: MediaDataShare_Predicates_Test_021
839 * @tc.desc: Verify predicate operation list is correctly generated
840 * @tc.type: FUNC
841 * @tc.require: None
842 * @tc.precon: None
843 * @tc.step:
844 1. Create predicates with Equals("name", "dataShareTest003")
845 2. Retrieve the operation list
846 3. Verify operation type and parameters
847 * @tc.expected: Operation list contains correct type and parameters
848 */
849 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_021, TestSize.Level0)
850 {
851 LOG_INFO("MediaDataShare_Predicates_Test_021::Start");
852 DataShare::DataSharePredicates predicates;
853 predicates.EqualTo("name", "dataShareTest003");
854
855 std::vector<DataShare::OperationItem> operationItems = predicates.GetOperationList();
856 DataShare::OperationItem operationItem = operationItems[0];
857 EXPECT_EQ(operationItem.operation, DataShare::OperationType::EQUAL_TO);
858 DataShare::SingleValue sv1 = operationItem.singleParams[0];
859 string param1 = sv1;
860 DataShare::SingleValue sv2 = operationItem.singleParams[1];
861 string param2 = sv2;
862 EXPECT_EQ(param1, "name");
863 EXPECT_EQ(param2, "dataShareTest003");
864 LOG_INFO("MediaDataShare_Predicates_Test_021, End");
865 }
866
867 /**
868 * @tc.name: MediaDataShare_Predicates_Test_022
869 * @tc.desc: Verify where clause can be set and retrieved correctly
870 * @tc.type: FUNC
871 * @tc.require: None
872 * @tc.precon: None
873 * @tc.step:
874 1. Create empty predicates
875 2. Set where clause to "`data2` > ?"
876 3. Retrieve and verify the where clause
877 * @tc.expected: Retrieved where clause matches the set value
878 */
879 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_022, TestSize.Level0)
880 {
881 LOG_INFO("MediaDataShare_Predicates_Test_023::Start");
882 DataShare::DataSharePredicates predicates;
883 int res = predicates.SetWhereClause("`data2` > ?");
884 EXPECT_EQ(res, 0);
885 string clause = predicates.GetWhereClause();
886 EXPECT_EQ(clause, "`data2` > ?");
887 LOG_INFO("MediaDataShare_Predicates_Test_023, End");
888 }
889
890 /**
891 * @tc.name: MediaDataShare_Predicates_Test_023
892 * @tc.desc: Verify where arguments can be set and retrieved correctly
893 * @tc.type: FUNC
894 * @tc.require: None
895 * @tc.precon: None
896 * @tc.step:
897 1. Create empty predicates
898 2. Set where arguments with vector containing "-5"
899 3. Retrieve and verify the where arguments
900 * @tc.expected: Retrieved where arguments match the set values
901 */
902 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_023, TestSize.Level0)
903 {
904 LOG_INFO("MediaDataShare_Predicates_Test_024::Start");
905 DataShare::DataSharePredicates predicates;
906 int res = predicates.SetWhereArgs(std::vector<std::string>{ "-5" });
907 EXPECT_EQ(res, 0);
908 vector<string> args = predicates.GetWhereArgs();
909 EXPECT_EQ(args[0], "-5");
910 LOG_INFO("MediaDataShare_Predicates_Test_024, End");
911 }
912
913 /**
914 * @tc.name: MediaDataShare_Predicates_Test_024
915 * @tc.desc: Verify order clause can be set and retrieved correctly
916 * @tc.type: FUNC
917 * @tc.require: None
918 * @tc.precon: None
919 * @tc.step:
920 1. Create empty predicates
921 2. Set order clause to "data3"
922 3. Retrieve and verify the order clause
923 * @tc.expected: Retrieved order clause matches the set value
924 */
925 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Predicates_Test_024, TestSize.Level0)
926 {
927 LOG_INFO("MediaDataShare_Predicates_Test_025::Start");
928 DataShare::DataSharePredicates predicates;
929 int res = predicates.SetOrder("data3");
930 EXPECT_EQ(res, 0);
931 string order = predicates.GetOrder();
932 EXPECT_EQ(order, "data3");
933 LOG_INFO("MediaDataShare_Predicates_Test_025, End");
934 }
935
936 /**
937 * @tc.name: MediaDataShare_ValuesBucket_Test_001
938 * @tc.desc: Verify DataShareValuesBucket basic operations work correctly
939 * @tc.type: FUNC
940 * @tc.require: None
941 * @tc.precon: None
942 * @tc.step:
943 1. Create empty ValuesBucket and verify it's empty
944 2. Add a value and verify it's no longer empty
945 3. Retrieve and verify the value
946 4. Clear the bucket and verify it's empty again
947 * @tc.expected: All operations work as expected with correct values
948 */
949 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ValuesBucket_Test_001, TestSize.Level0)
950 {
951 LOG_INFO("MediaDataShare_ValuesBucket_Test_001::Start");
952 DataShare::DataShareValuesBucket valuesBucket;
953 EXPECT_EQ(valuesBucket.IsEmpty(), true);
954
955 valuesBucket.Put("name", "dataShare_Test_001");
956 EXPECT_EQ(valuesBucket.IsEmpty(), false);
957
958 bool isValid;
959 DataShare::DataShareValueObject object = valuesBucket.Get("name", isValid);
960 string value = object;
961 EXPECT_EQ(value, "dataShare_Test_001");
962
963 valuesBucket.Clear();
964 EXPECT_EQ(valuesBucket.IsEmpty(), true);
965 LOG_INFO("MediaDataShare_ValuesBucket_Test_001 End");
966 }
967
968 /**
969 * @tc.name: MediaDataShare_ValueObject_Test_001
970 * @tc.desc: Verify DataShareValueObject handles various data types correctly
971 * @tc.type: FUNC
972 * @tc.require: None
973 * @tc.precon: None
974 * @tc.step:
975 1. Create ValueObjects with different data types (int, int64, double, bool, vector)
976 2. Verify copy and move operations
977 3. Check that retrieved values match original values
978 * @tc.expected: All value types are stored and retrieved correctly
979 */
980 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ValueObject_Test_001, TestSize.Level0)
981 {
982 LOG_INFO("MediaDataShare_ValueObject_Test_001::Start");
983
984 int base = 100;
985 DataShare::DataShareValueObject object(base);
986 int value = object;
987 EXPECT_EQ(value, base);
988
989 int64_t base64 = 100;
990 DataShare::DataShareValueObject object64(base64);
991 int64_t value64 = object64;
992 EXPECT_EQ(value64, base64);
993
994 double baseD = 10.0;
995 DataShare::DataShareValueObject objectD(baseD);
996 double valueD = objectD;
997 EXPECT_EQ(valueD, baseD);
998
999 bool baseB = true;
1000 DataShare::DataShareValueObject objectB(baseB);
1001 bool valueB = objectB;
1002 EXPECT_EQ(valueB, baseB);
1003
1004 vector<uint8_t> baseV;
1005 DataShare::DataShareValueObject objectV(baseV);
1006 vector<uint8_t> valueV = objectV;
1007 EXPECT_EQ(valueV, baseV);
1008
1009 DataShare::DataShareValueObject objectCopy(object);
1010 int valueCopy = objectCopy;
1011 EXPECT_EQ(valueCopy, value);
1012
1013 DataShare::DataShareValueObject objectMove(std::move(object));
1014 int valueMove = objectMove;
1015 EXPECT_EQ(valueMove, value);
1016
1017 LOG_INFO("MediaDataShare_ValueObject_Test_001 End");
1018 }
1019
1020 /**
1021 * @tc.name: MediaDataShare_batchInsert_Test_001
1022 * @tc.desc: Verify batch insert operation correctly inserts multiple records
1023 * @tc.type: FUNC
1024 * @tc.require: None
1025 * @tc.precon: None
1026 * @tc.step:
1027 1. Create two ValuesBuckets with test data
1028 2. Perform batch insert with these buckets
1029 3. Verify the number of inserted records
1030 * @tc.expected: Batch insert returns 2 indicating successful insertion of both records
1031 */
1032 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_batchInsert_Test_001, TestSize.Level0)
1033 {
1034 LOG_INFO("MediaDataShare_batchInsert_Test_001::Start");
1035 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1036 ASSERT_TRUE(helper != nullptr);
1037 Uri uri(MEDIALIBRARY_DATA_URI);
1038 DataShare::DataShareValuesBucket valuesBucket1;
1039 valuesBucket1.Put("name", "dataShareTest006");
1040 valuesBucket1.Put("phoneNumber", 20.6);
1041 DataShare::DataShareValuesBucket valuesBucket2;
1042 valuesBucket2.Put("name", "dataShareTest007");
1043 valuesBucket2.Put("phoneNumber", 20.5);
1044 std::vector<DataShare::DataShareValuesBucket> values;
1045 values.push_back(valuesBucket1);
1046 values.push_back(valuesBucket2);
1047 int result = helper->BatchInsert(uri, values);
1048 EXPECT_EQ(result, 2);
1049 LOG_INFO("MediaDataShare_batchInsert_Test_001 End");
1050 }
1051
1052 /**
1053 * @tc.name: MediaDataShare_NormalizeUri_Test_001
1054 * @tc.desc: Verify URI normalization function works correctly
1055 * @tc.type: FUNC
1056 * @tc.require: None
1057 * @tc.precon: None
1058 * @tc.step:
1059 1. Call NormalizeUri with media library URI
1060 2. Compare result with expected normalized URI
1061 * @tc.expected: Normalized URI matches the expected value
1062 */
1063 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_NormalizeUri_Test_001, TestSize.Level0)
1064 {
1065 LOG_INFO("MediaDataShare_NormalizeUri_Test_001::Start");
1066 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1067 Uri uri(NORMALIZE_URI);
1068 Uri uri_media(MEDIALIBRARY_DATA_URI);
1069 auto normalUri = helper->NormalizeUri(uri_media);
1070 EXPECT_EQ(normalUri, uri);
1071 LOG_INFO("MediaDataShare_NormalizeUri_Test_001 End");
1072 }
1073
1074 /**
1075 * @tc.name: MediaDataShare_DenormalizeUri_Test_001
1076 * @tc.desc: Verify URI denormalization function works correctly
1077 * @tc.type: FUNC
1078 * @tc.require: None
1079 * @tc.precon: None
1080 * @tc.step:
1081 1. Call DenormalizeUri with media library URI
1082 2. Compare result with expected denormalized URI
1083 * @tc.expected: Denormalized URI matches the expected value
1084 */
1085 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_DenormalizeUri_Test_001, TestSize.Level0)
1086 {
1087 LOG_INFO("MediaDataShare_DenormalizeUri_Test_001::Start");
1088 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1089 Uri uri(DENORMALIZE_URI);
1090 Uri uri_media(MEDIALIBRARY_DATA_URI);
1091 auto denormalUri = helper->DenormalizeUri(uri_media);
1092 EXPECT_EQ(denormalUri, uri);
1093 LOG_INFO("MediaDataShare_DenormalizeUri_Test_001 End");
1094 }
1095
1096 /**
1097 * @tc.name: MediaDataShare_SingleValue_Test_001
1098 * @tc.desc: Verify SingleValue handles various data types correctly
1099 * @tc.type: FUNC
1100 * @tc.require: None
1101 * @tc.precon: None
1102 * @tc.step:
1103 1. Create SingleValue objects with different data types
1104 2. Verify copy and move operations
1105 3. Check that retrieved values match original values
1106 * @tc.expected: All value types are stored and retrieved correctly
1107 */
1108 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_SingleValue_Test_001, TestSize.Level0)
1109 {
1110 LOG_INFO("MediaDataShare_SingleValue_Test_001::Start");
1111 int base = 100;
1112 DataShare::SingleValue sv(base);
1113 int value = sv;
1114 EXPECT_EQ(value, base);
1115
1116 int64_t base64 = 100;
1117 DataShare::SingleValue sv64(base64);
1118 int64_t value64 = sv64;
1119 EXPECT_EQ(value64, base64);
1120
1121 double baseD = 10.0;
1122 DataShare::SingleValue svD(baseD);
1123 double valueD = svD;
1124 EXPECT_DOUBLE_EQ(valueD, baseD);
1125
1126 bool baseB = true;
1127 DataShare::SingleValue svB(baseB);
1128 bool valueB = svB;
1129 EXPECT_EQ(valueB, baseB);
1130
1131 string baseS = "dataShare_Test_001";
1132 DataShare::SingleValue svS(baseS);
1133 string valueS = svS;
1134 EXPECT_EQ(valueS, baseS);
1135
1136 DataShare::SingleValue svCopy(sv);
1137 int valueCopy = svCopy;
1138 EXPECT_EQ(valueCopy, value);
1139
1140 DataShare::SingleValue svMove(std::move(sv));
1141 int valueMove = svMove;
1142 EXPECT_EQ(valueMove, value);
1143 LOG_INFO("MediaDataShare_SingleValue_Test_001 End");
1144 }
1145
1146 /**
1147 * @tc.name: MediaDataShare_MutliValue_Test_001
1148 * @tc.desc: Verify MutliValue handles various collection types correctly
1149 * @tc.type: FUNC
1150 * @tc.require: None
1151 * @tc.precon: None
1152 * @tc.step:
1153 1. Create MutliValue objects with different collection types
1154 2. Verify copy and move operations
1155 3. Check that retrieved values match original values
1156 * @tc.expected: All collections are stored and retrieved correctly
1157 */
1158 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_MutliValue_Test_001, TestSize.Level0)
1159 {
1160 LOG_INFO("MediaDataShare_MutliValue_Test_001::Start");
1161 vector<int> base;
1162 base.push_back(100);
1163 DataShare::MutliValue mv(base);
1164 vector<int> value = mv;
1165 EXPECT_EQ(value[0], base[0]);
1166
1167 vector<int64_t> base64;
1168 base64.push_back(100);
1169 DataShare::MutliValue mv64(base64);
1170 vector<int64_t> value64 = mv64;
1171 EXPECT_EQ(value64[0], base64[0]);
1172
1173 vector<double> baseD;
1174 baseD.push_back(10.0);
1175 DataShare::MutliValue mvD(baseD);
1176 vector<double> valueD = mvD;
1177 EXPECT_DOUBLE_EQ(valueD[0], baseD[0]);
1178
1179 vector<string> baseS;
1180 baseS.push_back("dataShare_Test_001");
1181 DataShare::MutliValue mvS(baseS);
1182 vector<string> valueS = mvS;
1183 EXPECT_EQ(valueS[0], baseS[0]);
1184
1185 DataShare::MutliValue mvCopy(mv);
1186 vector<int> valueCopy = mvCopy;
1187 EXPECT_EQ(valueCopy[0], value[0]);
1188
1189 DataShare::MutliValue mvMove(std::move(mv));
1190 vector<int> valueMove = mvMove;
1191 EXPECT_EQ(valueMove[0], value[0]);
1192 LOG_INFO("MediaDataShare_MutliValue_Test_001 End");
1193 }
1194
1195 /**
1196 * @tc.name: MediaDataShare_ResultSet_Test_001
1197 * @tc.desc: Verify default ResultSet behavior with no data
1198 * @tc.type: FUNC
1199 * @tc.require: None
1200 * @tc.precon: None
1201 * @tc.step:
1202 1. Create empty ResultSet
1203 2. Attempt various operations (get columns, row count, move to row, get values)
1204 3. Verify operations return appropriate error codes
1205 * @tc.expected: All operations on empty ResultSet return errors
1206 */
1207 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ResultSet_Test_001, TestSize.Level0)
1208 {
1209 LOG_INFO("MediaDataShare_ResultSet_Test_005::Start");
1210 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1211 DataShare::DataSharePredicates predicates;
1212 predicates.Contains("name", "dataShareTest");
1213 DataShare::DataShareResultSet resultSet;
1214 std::vector<string> names;
1215 int err = resultSet.GetAllColumnNames(names);
1216 EXPECT_NE(err, 0);
1217 int count;
1218 err = resultSet.GetRowCount(count);
1219 EXPECT_NE(err, 0);
1220 err = resultSet.GoToRow(1);
1221 EXPECT_NE(err, 0);
1222 std::vector<uint8_t> blob;
1223 err = resultSet.GetBlob(0, blob);
1224 EXPECT_NE(err, 0);
1225 int64_t longValue;
1226 err = resultSet.GetLong(0, longValue);
1227 EXPECT_NE(err, 0);
1228 double doubleValue;
1229 err = resultSet.GetDouble(0, doubleValue);
1230 EXPECT_NE(err, 0);
1231
1232 bool isNull;
1233 err = resultSet.IsColumnNull(0, isNull);
1234 EXPECT_NE(err, 0);
1235 bool flag = resultSet.OnGo(0, 1);
1236 EXPECT_EQ(flag, false);
1237 LOG_INFO("MediaDataShare_ResultSet_Test_005, End");
1238 }
1239
1240 /**
1241 * @tc.name: MediaDataShare_ResultSet_Test_002
1242 * @tc.require: None
1243 * @tc.desc: Verify ResultSet column operations work correctly
1244 * @tc.type: FUNC
1245 * @tc.precon: None
1246 * @tc.step:
1247 1. Query data for "dataShareTest003"
1248 2. Verify column name retrieval
1249 3. Check blob retrieval from result set
1250 4. Verify all column names can be retrieved
1251 * @tc.expected: All column operations return valid results
1252 */
1253 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ResultSet_Test_002, TestSize.Level0)
1254 {
1255 LOG_INFO("MediaDataShare_ResultSet_Test_002::Start");
1256 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1257 ASSERT_TRUE(helper != nullptr);
1258 DataShare::DataSharePredicates predicates;
1259 predicates.EqualTo("name", "dataShareTest003");
1260 vector<string> columns;
1261 Uri uri(MEDIALIBRARY_DATA_URI);
1262 auto resultSet = helper->Query(uri, predicates, columns);
1263 int columnIndex = 0;
1264 vector<uint8_t> blob;
1265 vector<string> columnNames;
1266 if (resultSet != nullptr) {
1267 resultSet->GoToFirstRow();
1268 resultSet->GetColumnIndex("name", columnIndex);
1269 std::string columnName;
1270 int err = resultSet->GetColumnName(columnIndex, columnName);
1271 EXPECT_EQ(err, 0);
1272 EXPECT_EQ(columnName, "name");
1273 err = resultSet->GetBlob(columnIndex, blob);
1274 EXPECT_EQ(err, 0);
1275 EXPECT_NE(blob.size(), 0);
1276
1277 err = resultSet->GetAllColumnNames(columnNames);
1278 EXPECT_EQ(err, 0);
1279 EXPECT_NE(columnNames.size(), 0);
1280 }
1281 LOG_INFO("MediaDataShare_ResultSet_Test_002, End");
1282 }
1283
1284 /**
1285 * @tc.name: MediaDataShare_ResultSet_Test_003
1286 * @tc.desc: Verify ResultSet block operations work correctly
1287 * @tc.type: FUNC
1288 * @tc.require: None
1289 * @tc.precon: None
1290 * @tc.step:
1291 1. Query data for "dataShareTest003"
1292 2. Check if result set has a block
1293 3. Retrieve, set and fill block
1294 4. Verify block operations maintain correct reference
1295 * @tc.expected: All block operations work as expected
1296 */
1297 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ResultSet_Test_003, TestSize.Level0)
1298 {
1299 LOG_INFO("MediaDataShare_ResultSet_Test_003::Start");
1300 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1301 ASSERT_TRUE(helper != nullptr);
1302 DataShare::DataSharePredicates predicates;
1303 predicates.EqualTo("name", "dataShareTest003");
1304 vector<string> columns;
1305 Uri uri(MEDIALIBRARY_DATA_URI);
1306 auto resultSet = helper->Query(uri, predicates, columns);
1307 AppDataFwk::SharedBlock *block = nullptr;
1308 ASSERT_TRUE(resultSet != nullptr);
1309
1310 bool hasBlock = resultSet->HasBlock();
1311 EXPECT_EQ(hasBlock, true);
1312 EXPECT_NE(resultSet->GetBlock(), nullptr);
1313 block = (resultSet->GetBlock()).get();
1314 resultSet->SetBlock(block);
1315 EXPECT_EQ(block, (resultSet->GetBlock()).get());
1316 resultSet->FillBlock(0, block);
1317 EXPECT_EQ(block, (resultSet->GetBlock()).get());
1318 LOG_INFO("MediaDataShare_ResultSet_Test_003, End");
1319 }
1320
1321 /**
1322 * @tc.name: MediaDataShare_ResultSet_Test_004
1323 * @tc.desc: Verify ResultSet navigation works correctly
1324 * @tc.type: FUNC
1325 * @tc.require: None
1326 * @tc.precon: None
1327 * @tc.step:
1328 1. Query data with names containing "dataShareTest"
1329 2. Move to first row
1330 3. Attempt navigation with OnGo method
1331 * @tc.expected: Navigation operation returns true indicating success
1332 */
1333 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ResultSet_Test_004, TestSize.Level0)
1334 {
1335 LOG_INFO("MediaDataShare_ResultSet_Test_004::Start");
1336 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1337 ASSERT_TRUE(helper != nullptr);
1338 DataShare::DataSharePredicates predicates;
1339 predicates.Contains("name", "dataShareTest");
1340 vector<string> columns;
1341 Uri uri(MEDIALIBRARY_DATA_URI);
1342 auto resultSet = helper->Query(uri, predicates, columns);
1343 if (resultSet != nullptr) {
1344 resultSet->GoToFirstRow();
1345 bool ok = resultSet->OnGo(0, 1);
1346 EXPECT_EQ(ok, true);
1347 }
1348 LOG_INFO("MediaDataShare_ResultSet_Test_004, End");
1349 }
1350
1351 /**
1352 * @tc.name: MediaDataShare_ResultSet_Test_005
1353 * @tc.desc: Verify empty ResultSet operations return appropriate errors
1354 * @tc.type: FUNC
1355 * @tc.require: None
1356 * @tc.precon: None
1357 * @tc.step:
1358 1. Create empty ResultSet
1359 2. Attempt various operations without data
1360 3. Verify error codes and return values
1361 * @tc.expected: All operations on empty ResultSet return errors
1362 */
1363 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ResultSet_Test_005, TestSize.Level0)
1364 {
1365 LOG_INFO("MediaDataShare_ResultSet_Test_005::Start");
1366 DataShare::DataShareResultSet resultSet;
1367 std::vector<string> names;
1368 int err = resultSet.GetAllColumnNames(names);
1369 EXPECT_NE(err, 0);
1370 int count;
1371 err = resultSet.GetRowCount(count);
1372 EXPECT_NE(err, 0);
1373 err = resultSet.GoToRow(1);
1374 EXPECT_NE(err, 0);
1375 std::vector<uint8_t> blob;
1376 err = resultSet.GetBlob(0, blob);
1377 EXPECT_NE(err, 0);
1378 int64_t longValue;
1379 err = resultSet.GetLong(0, longValue);
1380 EXPECT_NE(err, 0);
1381 double doubleValue;
1382 err = resultSet.GetDouble(0, doubleValue);
1383 EXPECT_NE(err, 0);
1384
1385 bool isNull;
1386 err = resultSet.IsColumnNull(0, isNull);
1387 EXPECT_NE(err, 0);
1388 bool flag = resultSet.OnGo(0, 1);
1389 EXPECT_EQ(flag, false);
1390 LOG_INFO("MediaDataShare_ResultSet_Test_005, End");
1391 }
1392
1393 /**
1394 * @tc.name: MediaDataShare_ResultSet_Test_006
1395 * @tc.desc: Verify ResultSet data type and value retrieval
1396 * @tc.type: FUNC
1397 * @tc.require: None
1398 * @tc.precon: None
1399 * @tc.step:
1400 1. Insert test data with specific age value
1401 2. Query for the inserted data
1402 3. Verify data type and value match expectations
1403 4. Clean up test data
1404 * @tc.expected: Data type is INTEGER and retrieved value matches inserted value
1405 */
1406 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ResultSet_Test_006, TestSize.Level0)
1407 {
1408 LOG_INFO("MediaDataShare_ResultSet_Test_006::Start");
1409 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1410 ASSERT_TRUE(helper != nullptr);
1411 Uri uri(MEDIALIBRARY_DATA_URI);
1412 DataShare::DataShareValuesBucket valuesBucket;
1413 int value = 1112;
1414 valuesBucket.Put("age", value);
1415 int retVal = helper->Insert(uri, valuesBucket);
1416 EXPECT_EQ((retVal > 0), true);
1417
1418 DataShare::DataSharePredicates predicates;
1419 predicates.EqualTo("age", value);
1420 vector<string> columns;
1421 auto resultSet = helper->Query(uri, predicates, columns);
1422 int columnIndex = 0;
1423 int result = 0;
1424 ASSERT_TRUE(resultSet != nullptr);
1425 resultSet->GoToFirstRow();
1426 resultSet->GetColumnIndex("age", columnIndex);
1427 DataShare::DataType dt;
1428 resultSet->GetDataType(0, dt);
1429 EXPECT_EQ(dt, DataShare::DataType::TYPE_INTEGER);
1430 resultSet->GetInt(columnIndex, result);
1431 EXPECT_EQ(result, value);
1432
1433 DataShare::DataSharePredicates deletePredicates;
1434 deletePredicates.EqualTo("age", 1112);
1435 retVal = helper->Delete(uri, deletePredicates);
1436 EXPECT_EQ((retVal >= 0), true);
1437 LOG_INFO("MediaDataShare_ResultSet_Test_006, End");
1438 }
1439
1440 /**
1441 * @tc.name: Creator_IRemoteObjectNull_Test_001
1442 * @tc.desc: Verify Creator handles null remote object correctly
1443 * @tc.type: FUNC
1444 * @tc.require: None
1445 * @tc.precon: None
1446 * @tc.step:
1447 1. Attempt to create DataShareHelper with null IRemoteObject
1448 2. Check if returned helper is null
1449 * @tc.expected: Creator returns nullptr when remote object is null
1450 */
1451 HWTEST_F(MediaDataShareUnitTest, Creator_IRemoteObjectNull_Test_001, TestSize.Level0)
1452 {
1453 LOG_INFO("Creator_IRemoteObjectNull_Test_001::Start");
1454 sptr<IRemoteObject> remoteObjNull = nullptr;
1455 auto remoteNull = DataShare::DataShareHelper::Creator(remoteObjNull, MEDIALIBRARY_DATA_URI);
1456 EXPECT_EQ(remoteNull, nullptr);
1457 LOG_INFO("Creator_IRemoteObjectNull_Test_001 End");
1458 }
1459
1460 /**
1461 * @tc.name: Creator_UriError_Test_001
1462 * @tc.desc: Verify Creator handles invalid URI correctly
1463 * @tc.type: FUNC
1464 * @tc.require: None
1465 * @tc.precon: None
1466 * @tc.step:
1467 1. Get valid remote object from system ability manager
1468 2. Attempt to create DataShareHelper with invalid URI
1469 3. Check if returned helper is null
1470 * @tc.expected: Creator returns nullptr when URI is invalid
1471 */
1472 HWTEST_F(MediaDataShareUnitTest, Creator_UriError_Test_001, TestSize.Level0)
1473 {
1474 LOG_INFO("Creator_UriError_Test_001::Start");
1475 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1476 EXPECT_NE(saManager, nullptr);
1477 auto remoteObj = saManager->GetSystemAbility(STORAGE_MANAGER_MANAGER_ID);
1478 EXPECT_NE(remoteObj, nullptr);
1479 auto uriError = DataShare::DataShareHelper::Creator(remoteObj, MEDIALIBRARY_DATA_URI_ERROR);
1480 EXPECT_EQ(uriError, nullptr);
1481 LOG_INFO("Creator_UriError_Test_001 End");
1482 }
1483
1484 /**
1485 * @tc.name: Insert_ConnectionNull_Test_001
1486 * @tc.desc: Verify operations fail correctly when connection is released
1487 * @tc.type: FUNC
1488 * @tc.require: None
1489 * @tc.precon: None
1490 * @tc.step:
1491 1. Create DataShareHelper and immediately release it
1492 2. Attempt insert operation with released connection
1493 3. Attempt get type operation
1494 4. Verify error results
1495 * @tc.expected: Insert returns -1 and GetType returns empty string
1496 */
1497 HWTEST_F(MediaDataShareUnitTest, Insert_ConnectionNull_Test_001, TestSize.Level0)
1498 {
1499 LOG_INFO("Insert_ConnectionNull_Test_001::Start");
1500 auto helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
1501 ASSERT_TRUE(helper != nullptr);
1502 auto ret = helper->Release();
1503 EXPECT_TRUE(ret);
1504 Uri uri(MEDIALIBRARY_DATA_URI);
1505 DataShare::DataShareValuesBucket valuesBucket;
1506
1507 valuesBucket.Clear();
1508 double valueD4 = 20.10;
1509 valuesBucket.Put("phoneNumber", valueD4);
1510 valuesBucket.Put("name", "dataShareTest006");
1511 int value4 = 998;
1512 valuesBucket.Put("age", value4);
1513 auto resultInsert = helper->Insert(uri, valuesBucket);
1514 EXPECT_EQ(resultInsert, -1);
1515
1516 auto resultGetType = helper->GetType(uri);
1517 EXPECT_EQ(resultGetType.size(), 0);
1518 valuesBucket.Clear();
1519 LOG_INFO("Insert_ConnectionNull_Test_001 End");
1520 }
1521
1522 /**
1523 * @tc.name: MediaDataShare_CRUD_Test_001
1524 * @tc.desc: Verify basic CRUD operations (Create, Read, Update, Delete) work correctly
1525 * @tc.type: FUNC
1526 * @tc.require: None
1527 * @tc.precon: None
1528 * @tc.step:
1529 1. Insert a new record with name "Datashare_CRUD_Test001"
1530 2. Update the record to name "Datashare_CRUD_Test002" using predicates
1531 3. Query for the updated record to verify the change
1532 4. Delete the record using predicates
1533 * @tc.expected:
1534 1.Insert returns a positive ID indicating success
1535 2.Update returns non-negative value indicating success
1536 3.Query returns exactly 1 row for the updated record
1537 4.Delete returns non-negative value indicating success
1538 */
1539 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_CRUD_Test_001, TestSize.Level0)
1540 {
1541 LOG_INFO("MediaDataShare_CRUD_Test_001::Start");
1542 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1543 ASSERT_TRUE(helper != nullptr);
1544 Uri uri(MEDIALIBRARY_DATA_URI);
1545 DataShare::DataShareValuesBucket valuesBucket;
1546 valuesBucket.Put("name", "Datashare_CRUD_Test001");
1547 int retVal = helper->Insert(uri, valuesBucket);
1548 EXPECT_EQ((retVal > 0), true);
1549
1550 DataShare::DataSharePredicates predicates;
1551 predicates.EqualTo("name", "Datashare_CRUD_Test001");
1552
1553 valuesBucket.Clear();
1554 valuesBucket.Put("name", "Datashare_CRUD_Test002");
1555 retVal = helper->Update(uri, predicates, valuesBucket);
1556 EXPECT_EQ((retVal >= 0), true);
1557
1558 DataShare::DataSharePredicates queryPredicates;
1559 queryPredicates.EqualTo("name", "Datashare_CRUD_Test002");
1560 vector<string> columns;
1561 auto resultSet = helper->Query(uri, queryPredicates, columns);
1562 int result = 0;
1563 if (resultSet != nullptr) {
1564 resultSet->GetRowCount(result);
1565 }
1566 EXPECT_EQ(result, 1);
1567
1568 DataShare::DataSharePredicates deletePredicates;
1569 deletePredicates.EqualTo("name", "Datashare_CRUD_Test002'");
1570 retVal = helper->Delete(uri, deletePredicates);
1571 EXPECT_EQ((retVal >= 0), true);
1572 LOG_INFO("MediaDataShare_CRUD_Test_001, End");
1573 }
1574
1575 /**
1576 * @tc.name: MediaDataShare_CRUDEX_Test_001
1577 * @tc.desc: Verify extended CRUD operations with error code returns work correctly
1578 * @tc.type: FUNC
1579 * @tc.require: None
1580 * @tc.precon: None
1581 * @tc.step:
1582 1. Insert a new record using InsertEx and verify error code and return value
1583 2. Update the record using UpdateEx with predicates and verify results
1584 3. Query for the updated record to confirm changes
1585 4. Delete the record using DeleteEx and verify results
1586 * @tc.expected:
1587 1.InsertEx returns error code 0 and non-negative ID
1588 2.UpdateEx returns error code 0 and non-negative affected rows
1589 3.Query returns exactly 1 row for the updated record
1590 4.DeleteEx returns error code 0 and non-negative affected rows
1591 */
1592 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_CRUDEX_Test_001, TestSize.Level0)
1593 {
1594 LOG_INFO("MediaDataShare_CRUDEX_Test_001::Start");
1595 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1596 ASSERT_TRUE(helper != nullptr);
1597 Uri uri(MEDIALIBRARY_DATA_URI);
1598 DataShare::DataShareValuesBucket valuesBucket;
1599 valuesBucket.Put("name", "Datashare_CRUDEX_Test001");
1600 auto [errCode, retVal] = helper->InsertEx(uri, valuesBucket);
1601 EXPECT_EQ((errCode == 0), true);
1602 EXPECT_EQ((retVal >= 0), true);
1603 DataShare::DataSharePredicates predicates;
1604 predicates.EqualTo("name", "Datashare_CRUDEX_Test001");
1605
1606 valuesBucket.Clear();
1607 valuesBucket.Put("name", "Datashare_CRUDEX_Test002");
1608 auto [errCode1, retVal1] = helper->UpdateEx(uri, predicates, valuesBucket);
1609 EXPECT_EQ((errCode1 == 0), true);
1610 EXPECT_EQ((retVal1 >= 0), true);
1611 DataShare::DataSharePredicates queryPredicates;
1612 queryPredicates.EqualTo("name", "Datashare_CRUDEX_Test002");
1613 vector<string> columns;
1614 auto resultSet = helper->Query(uri, queryPredicates, columns);
1615 int result = 0;
1616 if (resultSet != nullptr) {
1617 resultSet->GetRowCount(result);
1618 }
1619 EXPECT_EQ(result, 1);
1620
1621 DataShare::DataSharePredicates deletePredicates;
1622 deletePredicates.EqualTo("name", "Datashare_CRUDEX_Test002'");
1623 auto [errCode2, retVal2] = helper->DeleteEx(uri, deletePredicates);
1624 EXPECT_EQ((errCode2 == 0), true);
1625 EXPECT_EQ((retVal2 >= 0), true);
1626 LOG_INFO("MediaDataShare_CRUDEX_Test_001, End");
1627 }
1628
1629 /**
1630 * @tc.name: MediaDataShare_ImplPredicates_Test_001
1631 * @tc.desc: Verify In predicate generates correct operation items
1632 * @tc.type: FUNC
1633 * @tc.require: None
1634 * @tc.precon: None
1635 * @tc.step:
1636 1. Create predicates with In("name", {1, 2, 3}) condition
1637 2. Retrieve the operation items from predicates
1638 3. Verify operation type, parameters, and values
1639 * @tc.expected:
1640 1.Exactly 1 operation item is generated
1641 2.Operation type is correct for In condition
1642 3.Parameters contain "name" and the correct integer values
1643 4.Variant indices match expected types (string and integer vector)
1644 */
1645 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ImplPredicates_Test_001, TestSize.Level0)
1646 {
1647 LOG_INFO("MediaDataShare_ImplPredicates_Test_001::Start");
1648 DataShare::DataSharePredicates predicates;
1649 vector<int> inColumn;
1650 inColumn.push_back(1);
1651 inColumn.push_back(2);
1652 inColumn.push_back(3);
1653 predicates.In("name", inColumn);
1654
1655 std::vector<DataShare::OperationItem> operationItems = predicates.GetOperationList();
1656 std::string str = std::get<string>(operationItems[0].singleParams[0]);
1657 std::vector<int> ret = std::get<std::vector<int>>(operationItems[0].multiParams[0]);
1658 EXPECT_EQ(operationItems.size(), 1);
1659 // index of variant, 3 is string
1660 EXPECT_EQ(operationItems[0].singleParams[0].index(), 3);
1661 EXPECT_EQ(str, "name");
1662 EXPECT_EQ(operationItems[0].multiParams[0].index(), 1);
1663 for (int i = 0; i < ret.size(); i++) {
1664 EXPECT_EQ(ret[i], i + 1);
1665 }
1666 operationItems.clear();
1667 LOG_INFO("MediaDataShare_ImplPredicates_Test_001, End");
1668 }
1669
1670 /**
1671 * @tc.name: MediaDataShare_NotImplPredicates_Test_001
1672 * @tc.desc: Verify multiple predicate combinations generate correct number of operation items
1673 * @tc.type: FUNC
1674 * @tc.require: None
1675 * @tc.precon: None
1676 * @tc.step:
1677 1. Create predicates with multiple conditions: In, NotIn, Unlike, GroupBy, Distinct, IndexedBy, KeyPrefix, InKeys
1678 2. Retrieve the operation items from predicates
1679 3. Verify the total number of operation items
1680 * @tc.expected: Exactly 8 operation items are generated matching the number of conditions
1681 */
1682 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_NotImplPredicates_Test_001, TestSize.Level0)
1683 {
1684 LOG_INFO("MediaDataShare_NotImplPredicates_Test_001::Start");
1685 DataShare::DataSharePredicates predicates;
1686 vector<string> inColumn;
1687 inColumn.push_back("dataShare_Test_001");
1688 inColumn.push_back("dataShare_Test_002");
1689 predicates.In("name", inColumn);
1690
1691 vector<string> notInColumn;
1692 notInColumn.push_back("dataShare_Test_003");
1693 notInColumn.push_back("dataShare_Test_004");
1694 predicates.NotIn("name", notInColumn);
1695 predicates.Unlike("name", "%Test003");
1696
1697 vector<string> preV;
1698 preV.push_back("name");
1699 predicates.GroupBy(preV);
1700 predicates.Distinct();
1701 predicates.IndexedBy("name");
1702 predicates.KeyPrefix("%Test");
1703 predicates.InKeys(preV);
1704
1705 std::vector<DataShare::OperationItem> operationItems = predicates.GetOperationList();
1706 EXPECT_EQ(operationItems.size(), 8);
1707 LOG_INFO("MediaDataShare_NotImplPredicates_Test_001, End");
1708 }
1709
1710 /**
1711 * @tc.name: MediaDataShare_Observer_001
1712 * @tc.desc: Verify normal registration and operation of non-silent data observer
1713 * @tc.type: FUNC
1714 * @tc.require: None
1715 * @tc.precon: None
1716 * @tc.step:
1717 1. Register a data observer for the media library URI
1718 2. Insert a new record and trigger notification
1719 3. Delete the record and trigger notification
1720 4. Unregister the observer
1721 * @tc.expected:
1722 1.Registration returns 0 indicating success
1723 2.Insert returns positive ID and notification is triggered
1724 3.Delete returns positive value and notification is triggered
1725 4.Unregistration returns 0 indicating success
1726 */
1727 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_Observer_001, TestSize.Level0)
1728 {
1729 LOG_INFO("MediaDataShare_Observer_001 start");
1730 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1731 ASSERT_TRUE(helper != nullptr);
1732 Uri uri(MEDIALIBRARY_DATA_URI);
1733 sptr<IDataAbilityObserverTest> dataObserver = new (std::nothrow) IDataAbilityObserverTest();
1734 int retVal = helper->RegisterObserver(uri, dataObserver);
1735 EXPECT_EQ(retVal, 0);
1736
1737 DataShare::DataShareValuesBucket valuesBucket;
1738 valuesBucket.Put("name", "Datashare_Observer_Test001");
1739 retVal = helper->Insert(uri, valuesBucket);
1740 EXPECT_GT(retVal, 0);
1741 helper->NotifyChange(uri);
1742
1743 DataShare::DataSharePredicates deletePredicates;
1744 deletePredicates.EqualTo("name", "Datashare_Observer_Test001");
1745 retVal = helper->Delete(uri, deletePredicates);
1746 EXPECT_GT(retVal, 0);
1747 helper->NotifyChange(uri);
1748 retVal = helper->UnregisterObserver(uri, dataObserver);
1749 EXPECT_EQ(retVal, 0);
1750 LOG_INFO("MediaDataShare_Observer_001 end");
1751 }
1752
1753 /**
1754 * @tc.name: MediaDataShare_ReregisterObserver_001
1755 * @tc.desc: Verify error handling when re-registering an existing observer
1756 * @tc.type: FUNC
1757 * @tc.require: None
1758 * @tc.precon: None
1759 * @tc.step:
1760 1. Register a data observer for the media library URI
1761 2. Attempt to register the same observer again
1762 3. Perform insert and delete operations with notifications
1763 4. Unregister the observer
1764 * @tc.expected:
1765 1.First registration returns 0 indicating success
1766 2.Second registration returns E_REGISTER_ERROR
1767 3.Insert and delete operations complete successfully
1768 4.Unregistration returns 0 indicating success
1769 */
1770 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ReregisterObserver_001, TestSize.Level0)
1771 {
1772 LOG_INFO("MediaDataShare_ReregisterObserver_001 start");
1773 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1774 EXPECT_NE(helper, nullptr);
1775 Uri uri(MEDIALIBRARY_DATA_URI);
1776 sptr<IDataAbilityObserverTest> dataObserver = new (std::nothrow) IDataAbilityObserverTest();
1777 int retVal = helper->RegisterObserver(uri, dataObserver);
1778 EXPECT_EQ(retVal, 0);
1779 retVal = helper->RegisterObserver(uri, dataObserver);
1780 EXPECT_EQ(retVal, E_REGISTER_ERROR);
1781
1782 DataShare::DataShareValuesBucket valuesBucket;
1783 valuesBucket.Put("name", "MediaDataShare_ReregisterObserver_001");
1784 retVal = helper->Insert(uri, valuesBucket);
1785 EXPECT_GT(retVal, 0);
1786 helper->NotifyChange(uri);
1787
1788 DataShare::DataSharePredicates deletePredicates;
1789 deletePredicates.EqualTo("name", "MediaDataShare_ReregisterObserver_001");
1790 retVal = helper->Delete(uri, deletePredicates);
1791 EXPECT_GT(retVal, 0);
1792 helper->NotifyChange(uri);
1793 retVal = helper->UnregisterObserver(uri, dataObserver);
1794 EXPECT_EQ(retVal, 0);
1795 LOG_INFO("MediaDataShare_ReregisterObserver_001 end");
1796 }
1797
1798 /**
1799 * @tc.name: MediaDataShare_ObserverExt_001
1800 * @tc.desc: Verify observer extension functionality for data change notifications
1801 * @tc.type: FUNC
1802 * @tc.require: issueIC8OCN
1803 * @tc.precon: DataShareHelper instance is properly initialized and MEDIALIBRARY_DATA_URI is accessible
1804 * @tc.step:
1805 1. Get DataShareHelper instance and verify it's not null
1806 2. Create test URI and DataShareObserverTest instance
1807 3. Register observer extension with the URI
1808 4. Insert test data and notify INSERT change
1809 5. Verify observer receives correct INSERT change information
1810 6. Insert data to descendant URI and notify INSERT change
1811 7. Verify observer receives correct descendant INSERT change information
1812 8. Delete test data and notify DELETE change with additional data
1813 9. Verify observer receives correct DELETE change information
1814 10. Unregister the observer
1815 * @tc.expect:
1816 1. DataShareHelper instance is successfully obtained
1817 2. Test data is inserted successfully (retVal > 0)
1818 3. Observer receives accurate INSERT change information for main URI
1819 4. Observer receives accurate INSERT change information for descendant URI
1820 5. Observer receives accurate DELETE change information including additional data
1821 6. All operations complete without errors
1822 */
1823 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ObserverExt_001, TestSize.Level0)
1824 {
1825 LOG_INFO("MediaDataShare_ObserverExt_001 start");
1826 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1827 ASSERT_TRUE(helper != nullptr);
1828 Uri uri(MEDIALIBRARY_DATA_URI);
1829 std::shared_ptr<DataShareObserverTest> dataObserver = std::make_shared<DataShareObserverTest>();
1830 helper->RegisterObserverExt(uri, dataObserver, true);
1831 DataShare::DataShareValuesBucket valuesBucket;
1832 valuesBucket.Put("name", "Datashare_Observer_Test001");
1833 int retVal = helper->Insert(uri, valuesBucket);
1834 EXPECT_EQ((retVal > 0), true);
1835 ChangeInfo uriChanges = { DataShareObserver::ChangeType::INSERT, { uri } };
1836 helper->NotifyChangeExt(uriChanges);
1837
1838 dataObserver->data.Wait();
1839 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
1840 dataObserver->Clear();
1841
1842 Uri descendantsUri(MEDIALIBRARY_DATA_URI + "/com.ohos.example");
1843 helper->Insert(descendantsUri, valuesBucket);
1844 EXPECT_EQ((retVal > 0), true);
1845 ChangeInfo descendantsChanges = { DataShareObserver::ChangeType::INSERT, { descendantsUri } };
1846 helper->NotifyChangeExt(descendantsChanges);
1847
1848 dataObserver->data.Wait();
1849 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, descendantsChanges));
1850 dataObserver->Clear();
1851
1852 DataShare::DataSharePredicates deletePredicates;
1853 deletePredicates.EqualTo("name", "Datashare_Observer_Test001");
1854 retVal = helper->Delete(uri, deletePredicates);
1855 EXPECT_EQ((retVal >= 0), true);
1856 char data[] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
1857 ChangeInfo delChanges = { DataShareObserver::ChangeType::DELETE, { uri }, data, sizeof(data) / sizeof(data[0]) };
1858 helper->NotifyChangeExt(delChanges);
1859
1860 dataObserver->data.Wait();
1861 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, delChanges));
1862 dataObserver->Clear();
1863
1864 helper->UnregisterObserverExt(uri, dataObserver);
1865 LOG_INFO("MediaDataShare_ObserverExt_001 end");
1866 }
1867
1868 /**
1869 * @tc.name: MediaDataShare_UnregisterObserverExt_001
1870 * @tc.desc: Verify unregister functionality of observer extension
1871 * @tc.type: FUNC
1872 * @tc.require: issueIC8OCN
1873 * @tc.precon: DataShareHelper instance is properly initialized and MEDIALIBRARY_DATA_URI is accessible
1874 * @tc.step:
1875 1. Get DataShareHelper instance and verify it's not null
1876 2. Create test URI and DataShareObserverTest instance
1877 3. Register observer extension with the URI
1878 4. Insert test data and notify INSERT change
1879 5. Verify observer receives correct change information
1880 6. Unregister the observer from the URI
1881 7. Notify another DELETE change
1882 8. Verify observer no longer receives change information
1883 * @tc.expect:
1884 1. DataShareHelper instance is successfully obtained
1885 2. Test data is inserted successfully (retVal > 0)
1886 3. Observer receives accurate change information before unregistration
1887 4. After unregistration, observer does NOT receive change notifications
1888 5. All operations complete without errors
1889 */
1890 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_UnregisterObserverExt_001, TestSize.Level0)
1891 {
1892 LOG_INFO("MediaDataShare_UnregisterObserverExt_001 start");
1893 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1894 ASSERT_TRUE(helper != nullptr);
1895 Uri uri(MEDIALIBRARY_DATA_URI);
1896 std::shared_ptr<DataShareObserverTest> dataObserver = std::make_shared<DataShareObserverTest>();
1897 helper->RegisterObserverExt(uri, dataObserver, true);
1898
1899 DataShare::DataShareValuesBucket valuesBucket;
1900 valuesBucket.Put("name", "Datashare_Observer_Test001");
1901 int retVal = helper->Insert(uri, valuesBucket);
1902 EXPECT_EQ((retVal > 0), true);
1903 ChangeInfo uriChanges = { DataShareObserver::ChangeType::INSERT, { uri } };
1904 helper->NotifyChangeExt(uriChanges);
1905
1906 dataObserver->data.Wait();
1907 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
1908 dataObserver->Clear();
1909
1910 helper->UnregisterObserverExt(uri, dataObserver);
1911 helper->NotifyChangeExt({ DataShareObserver::ChangeType::DELETE, { uri } });
1912
1913 dataObserver->data.Wait();
1914 EXPECT_FALSE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
1915 dataObserver->Clear();
1916 LOG_INFO("MediaDataShare_UnregisterObserverExt_001 end");
1917 }
1918
1919 /**
1920 * @tc.name: MediaDataShare_ToAbsSharedResultSet_Test_001
1921 * @tc.desc: Test conversion of DataShare query result to AbsSharedResultSet
1922 * @tc.type: FUNC
1923 * @tc.require: None
1924 * @tc.precon: None
1925 * @tc.step:
1926 1. Get the DataShare helper instance
1927 2. Create predicates to filter data by name "dataShareTest003"
1928 3. Query the media library URI with the predicates and empty columns
1929 4. Convert the query result to AbsSharedResultSet using RdbDataAbilityUtils
1930 5. Get the row count from the converted result set
1931 * @tc.expect:
1932 1.The converted AbsSharedResultSet is not null
1933 2.The row count of the result set is 1 (matches the expected test data)
1934 */
1935 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ToAbsSharedResultSet_Test_001, TestSize.Level0)
1936 {
1937 LOG_INFO("MediaDataShare_ToAbsSharedResultSet_Test_001::Start");
1938 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1939 DataShare::DataSharePredicates predicates;
1940 predicates.EqualTo("name", "dataShareTest003");
1941 vector<string> columns;
1942 Uri uri(MEDIALIBRARY_DATA_URI);
1943 auto resultSet = helper->Query(uri, predicates, columns);
1944 std::shared_ptr<NativeRdb::AbsSharedResultSet> absSharedResultSet =
1945 RdbDataAbilityAdapter::RdbDataAbilityUtils::ToAbsSharedResultSet(resultSet);
1946 int rowCount = 0;
1947 if (absSharedResultSet != nullptr) {
1948 absSharedResultSet->GetRowCount(rowCount);
1949 }
1950 EXPECT_EQ(rowCount, 1);
1951 LOG_INFO("MediaDataShare_ToAbsSharedResultSet_Test_001 End");
1952 }
1953
1954 /**
1955 * @tc.name: MediaDataShare_ExecuteBatch_Test_001
1956 * @tc.desc: Test batch execution of INSERT and DELETE operations via DataShare helper
1957 * @tc.type: FUNC
1958 * @tc.require: None
1959 * @tc.precon: None
1960 * @tc.step:
1961 1. Get the DataShare helper instance
1962 2. Create an INSERT operation statement with test data and predicates
1963 3. Create a DELETE operation statement with test data and predicates
1964 4. Add both statements to a batch list
1965 5. Execute the batch operation using helper->ExecuteBatch()
1966 * @tc.expect: Batch execution returns 0 (success status)
1967 */
1968 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ExecuteBatch_Test_001, TestSize.Level0)
1969 {
1970 LOG_INFO("MediaDataShare_ExecuteBatch_Test_001::Start");
1971 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
1972
1973 std::vector<DataShare::OperationStatement> statements;
1974 DataShare::OperationStatement statement1;
1975 statement1.operationType = Operation::INSERT;
1976 statement1.uri = "datashare:///uri1";
1977 DataShare::DataShareValuesBucket valuesBucket;
1978 valuesBucket.Put("DB_NUM", 150);
1979 valuesBucket.Put("DB_TITLE", "ExecuteBatch_Test002");
1980 statement1.valuesBucket = valuesBucket;
1981 DataShare::DataSharePredicates predicates;
1982 predicates.SetWhereClause("`DB_NUM` > 100");
1983 statement1.predicates = predicates;
1984 statements.emplace_back(statement1);
1985
1986 DataShare::OperationStatement statement2;
1987 statement2.operationType = Operation::DELETE;
1988 statement2.uri = "datashareproxy://com.uri2";
1989 DataShare::DataShareValuesBucket valuesBucket1;
1990 valuesBucket1.Put("DB_TITLE2", "ExecuteBatch_Test002");
1991 statement2.valuesBucket = valuesBucket1;
1992 DataShare::DataSharePredicates predicates1;
1993 predicates1.SetWhereClause("`DB_TITLE` = ExecuteBatch_Test002");
1994 statement2.predicates = predicates1;
1995 statements.emplace_back(statement2);
1996
1997 DataShare::ExecResultSet resultSet;
1998 auto ret = helper->ExecuteBatch(statements, resultSet);
1999 EXPECT_EQ(ret, 0);
2000 LOG_INFO("MediaDataShare_ExecuteBatch_Test_001 End");
2001 }
2002
2003 /**
2004 * @tc.name: MediaDataShare_InsertExt_Test_001
2005 * @tc.desc: Test extended insertion functionality (InsertExt) of DataShare helper
2006 * @tc.type: FUNC
2007 * @tc.require: None
2008 * @tc.precon: None
2009 * @tc.step:
2010 1. Get the DataShare helper instance and verify it is not null
2011 2. Create a URI for media library data
2012 3. Create a ValuesBucket with test data (name="Datashare_CRUD_Test001")
2013 4. Call InsertExt with the URI, ValuesBucket, and result string
2014 * @tc.expect: InsertExt returns 0 (success status)
2015 */
2016 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_InsertExt_Test_001, TestSize.Level0)
2017 {
2018 LOG_INFO("MediaDataShare_InsertExt_Test_001::Start");
2019 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2020 ASSERT_TRUE(helper != nullptr);
2021 Uri uri(MEDIALIBRARY_DATA_URI);
2022 DataShare::DataShareValuesBucket valuesBucket;
2023 valuesBucket.Put("name", "Datashare_CRUD_Test001");
2024 std::string str;
2025 int ret = helper->InsertExt(uri, valuesBucket, str);
2026 EXPECT_EQ(ret, 0);
2027 LOG_INFO("MediaDataShare_InsertExt_Test_001 End");
2028 }
2029
2030 /**
2031 * @tc.name: MediaDataShare_TransferUri_Test_001
2032 * @tc.desc: Test URI transfer functionality and DataShare helper creation for file data URI
2033 * @tc.type: FUNC
2034 * @tc.require: None
2035 * @tc.precon: None
2036 * @tc.step:
2037 1. Create a file data URI
2038 2. Get the SystemAbilityManager instance and verify it is not null
2039 3. Get the Storage Manager system ability remote object and verify it is not null
2040 4. Create a DataShare helper using the remote object and file data URI
2041 * @tc.expect:
2042 1.SystemAbilityManager instance is not null
2043 2.Storage Manager remote object is not null
2044 3.DataShare helper instance is successfully created (not null)
2045 */
2046 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_TransferUri_Test_001, TestSize.Level0)
2047 {
2048 LOG_INFO("MediaDataShare_TransferUri_Test_001::Start");
2049 Uri uri(FILE_DATA_URI);
2050
2051 auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
2052 EXPECT_NE(saManager, nullptr);
2053 if (saManager == nullptr) {
2054 LOG_ERROR("GetSystemAbilityManager get samgr failed.");
2055 }
2056 auto remoteObj = saManager->GetSystemAbility(STORAGE_MANAGER_MANAGER_ID);
2057 EXPECT_NE(remoteObj, nullptr);
2058 if (remoteObj == nullptr) {
2059 LOG_ERROR("GetSystemAbility service failed.");
2060 }
2061 std::shared_ptr<DataShare::DataShareHelper> helper = DataShare::DataShareHelper::Creator(remoteObj, FILE_DATA_URI);
2062 EXPECT_NE(helper, nullptr);
2063 LOG_INFO("MediaDataShare_TransferUri_Test_001 End");
2064 }
2065
2066 /**
2067 * @tc.name: ControllerTest_HelperInsertExtControllerNullTest_001
2068 * @tc.desc: Test InsertExt operation when DataShare controller is released (null)
2069 * @tc.type: FUNC
2070 * @tc.require: None
2071 * @tc.precon: None
2072 * @tc.step:
2073 1. Create a DataShare helper instance and verify it is not null
2074 2. Create a test URI and release the helper's controller
2075 3. Create a ValuesBucket with test data (phoneNumber=20.07, name="dataShareTest003", age=1001)
2076 4. Call InsertExt with the URI, ValuesBucket, and result string
2077 * @tc.expect: InsertExt returns a negative value (failure due to released controller)
2078 */
2079 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperInsertExtControllerNullTest_001, TestSize.Level0)
2080 {
2081 LOG_INFO("ControllerTest_HelperInsertExtControllerNullTest_001::Start");
2082 auto helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2083 ASSERT_TRUE(helper != nullptr);
2084 Uri uri(DATA_SHARE_URI);
2085 helper->Release();
2086 DataShare::DataShareValuesBucket valuesBucket;
2087 double valueD1 = 20.07;
2088 valuesBucket.Put("phoneNumber", valueD1);
2089 valuesBucket.Put("name", "dataShareTest003");
2090 int value1 = 1001;
2091 valuesBucket.Put("age", value1);
2092 std::string result;
2093 int retVal = helper->InsertExt(uri, valuesBucket, result);
2094 EXPECT_EQ((retVal < 0), true);
2095 LOG_INFO("ControllerTest_HelperInsertExtControllerNullTest_001::End");
2096 }
2097
2098 /**
2099 * @tc.name: ControllerTest_HelperUpdateControllerNullTest_001
2100 * @tc.desc: Test Update operation when DataShare controller is released (null)
2101 * @tc.type: FUNC
2102 * @tc.require: None
2103 * @tc.precon: None
2104 * @tc.step:
2105 1. Create a DataShare helper instance and verify it is not null
2106 2. Create a test URI and release the helper's controller
2107 3. Create predicates to filter data by name "Datashare_CRUD_Test001"
2108 4. Create a ValuesBucket to update name to "Datashare_CRUD_Test002"
2109 5. Call Update with the URI, predicates, and ValuesBucket
2110 * @tc.expect: Update returns a negative value (failure due to released controller)
2111 */
2112 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperUpdateControllerNullTest_001, TestSize.Level0)
2113 {
2114 LOG_INFO("ControllerTest_HelperUpdateControllerNullTest_001::Start");
2115 auto helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2116 ASSERT_TRUE(helper != nullptr);
2117 Uri uri(DATA_SHARE_URI);
2118 helper->Release();
2119 DataShare::DataSharePredicates predicates;
2120 predicates.EqualTo("name", "Datashare_CRUD_Test001");
2121 DataShare::DataShareValuesBucket valuesBucket;
2122 valuesBucket.Put("name", "Datashare_CRUD_Test002");
2123 int retVal = helper->Update(uri, predicates, valuesBucket);
2124 EXPECT_EQ((retVal < 0), true);
2125 LOG_INFO("ControllerTest_HelperUpdateControllerNullTest_001::End");
2126 }
2127
2128 /**
2129 * @tc.name: ControllerTest_HelperDeleteControllerNullTest_001
2130 * @tc.desc: Test Delete operation when DataShare controller is released (null)
2131 * @tc.type: FUNC
2132 * @tc.require: None
2133 * @tc.precon: None
2134 * @tc.step:
2135 1. Create a DataShare helper instance and verify it is not null
2136 2. Create a test URI and release the helper's controller
2137 3. Create predicates to filter data by age=1112
2138 4. Call Delete with the URI and predicates
2139 * @tc.expect: Delete returns a negative value (failure due to released controller)
2140 */
2141 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperDeleteControllerNullTest_001, TestSize.Level0)
2142 {
2143 LOG_INFO("ControllerTest_HelperDeleteControllerNullTest_001::Start");
2144 auto helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2145 ASSERT_TRUE(helper != nullptr);
2146 Uri uri(DATA_SHARE_URI);
2147 helper->Release();
2148 DataShare::DataSharePredicates deletePredicates;
2149 deletePredicates.EqualTo("age", 1112);
2150 int retVal = helper->Delete(uri, deletePredicates);
2151 EXPECT_EQ((retVal < 0), true);
2152 LOG_INFO("ControllerTest_HelperDeleteControllerNullTest_001::End");
2153 }
2154
2155 /**
2156 * @tc.name: ControllerTest_HelperQueryControllerNullTest_001
2157 * @tc.desc: Test Query operation when DataShare controller is released (null)
2158 * @tc.type: FUNC
2159 * @tc.require: None
2160 * @tc.precon: None
2161 * @tc.step:
2162 1. Create a DataShare helper instance and verify it is not null
2163 2. Create a test URI and release the helper's controller
2164 3. Create predicates to filter data by name "dataShareTest003" with limit 1
2165 4. Call Query with the URI, predicates, and empty columns
2166 * @tc.expect: Query returns a null result set (failure due to released controller)
2167 */
2168 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperQueryControllerNullTest_001, TestSize.Level0)
2169 {
2170 LOG_INFO("ControllerTest_HelperQueryControllerNullTest_001::Start");
2171 auto helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2172 ASSERT_TRUE(helper != nullptr);
2173 Uri uri(DATA_SHARE_URI);
2174 helper->Release();
2175 DataShare::DataSharePredicates predicates;
2176 predicates.EqualTo("name", "dataShareTest003");
2177 predicates.Limit(1, 0);
2178 vector<string> columns;
2179 auto resultSet = helper->Query(uri, predicates, columns);
2180 EXPECT_EQ(resultSet, nullptr);
2181 LOG_INFO("ControllerTest_HelperQueryControllerNullTest_001::End");
2182 }
2183
2184 /**
2185 * @tc.name: ControllerTest_HelperBatchInsertControllerNullTest_001
2186 * @tc.desc: Test BatchInsert operation when DataShare controller is released (null)
2187 * @tc.type: FUNC
2188 * @tc.require: None
2189 * @tc.precon: None
2190 * @tc.step:
2191 1. Create a DataShare helper instance and verify it is not null
2192 2. Create a test URI and release the helper's controller
2193 3. Create two ValuesBuckets with test data (name and phoneNumber)
2194 4. Add both buckets to a batch list
2195 5. Call BatchInsert with the URI and batch list
2196 * @tc.expect: BatchInsert returns a negative value (failure due to released controller)
2197 */
2198 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperBatchInsertControllerNullTest_001, TestSize.Level0)
2199 {
2200 LOG_INFO("ControllerTest_HelperBatchInsertControllerNullTest_001::Start");
2201 auto helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2202 ASSERT_TRUE(helper != nullptr);
2203 Uri uri(DATA_SHARE_URI);
2204 helper->Release();
2205 DataShare::DataShareValuesBucket valuesBucket1;
2206 valuesBucket1.Put("name", "dataShareTest006");
2207 valuesBucket1.Put("phoneNumber", 20.6);
2208 DataShare::DataShareValuesBucket valuesBucket2;
2209 valuesBucket2.Put("name", "dataShareTest007");
2210 valuesBucket2.Put("phoneNumber", 20.5);
2211 std::vector<DataShare::DataShareValuesBucket> values;
2212 values.push_back(valuesBucket1);
2213 values.push_back(valuesBucket2);
2214 int result = helper->BatchInsert(uri, values);
2215 EXPECT_EQ((result < 0), true);
2216 LOG_INFO("ControllerTest_HelperBatchInsertControllerNullTest_001::End");
2217 }
2218
2219 /**
2220 * @tc.name: ControllerTest_HelperExecuteBatchControllerNullTest_001
2221 * @tc.desc: Test ExecuteBatch operation when DataShare controller is released (null)
2222 * @tc.type: FUNC
2223 * @tc.require: None
2224 * @tc.precon: None
2225 * @tc.step:
2226 1. Create a DataShare helper instance and verify it is not null
2227 2. Create a test URI and release the helper's controller
2228 3. Create an INSERT operation statement with test data and predicates
2229 4. Create a DELETE operation statement with test data and predicates
2230 5. Add both statements to a batch list
2231 6. Call ExecuteBatch with the batch list and result set
2232 * @tc.expect: ExecuteBatch returns a negative value (failure due to released controller)
2233 */
2234 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperExecuteBatchControllerNullTest_001, TestSize.Level0)
2235 {
2236 LOG_INFO("ControllerTest_HelperExecuteBatchControllerNullTest_001::Start");
2237 auto helper= CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2238 ASSERT_TRUE(helper != nullptr);
2239 Uri uri(DATA_SHARE_URI);
2240 helper->Release();
2241 std::vector<DataShare::OperationStatement> statements;
2242 DataShare::OperationStatement statement1;
2243 statement1.operationType = Operation::INSERT;
2244 statement1.uri = "datashare:///uri1";
2245 DataShare::DataShareValuesBucket valuesBucket;
2246 valuesBucket.Put("DB_NUM", 150);
2247 valuesBucket.Put("DB_TITLE", "ExecuteBatch_Test002");
2248 statement1.valuesBucket = valuesBucket;
2249 DataShare::DataSharePredicates predicates;
2250 predicates.SetWhereClause("`DB_NUM` > 100");
2251 statement1.predicates = predicates;
2252 statements.emplace_back(statement1);
2253
2254 DataShare::OperationStatement statement2;
2255 statement2.operationType = Operation::DELETE;
2256 statement2.uri = "datashareproxy://com.uri2";
2257 DataShare::DataShareValuesBucket valuesBucket1;
2258 valuesBucket1.Put("DB_TITLE2", "ExecuteBatch_Test002");
2259 statement2.valuesBucket = valuesBucket1;
2260 DataShare::DataSharePredicates predicates1;
2261 predicates1.SetWhereClause("`DB_TITLE` = ExecuteBatch_Test002");
2262 statement2.predicates = predicates1;
2263 statements.emplace_back(statement2);
2264
2265 DataShare::ExecResultSet resultSet;
2266 auto ret = helper->ExecuteBatch(statements, resultSet);
2267 EXPECT_EQ((ret < 0), true);
2268 LOG_INFO("ControllerTest_HelperExecuteBatchControllerNullTest_001::End");
2269 }
2270
2271 /**
2272 * @tc.name: ControllerTest_HelperRegisterObserverControllerNullTest_001
2273 * @tc.desc: Test RegisterObserver, Insert, NotifyChange, Delete
2274 * @tc.type: FUNC
2275 * @tc.require: None
2276 * @tc.precon: None
2277 * @tc.step:
2278 1. Create a DataShare helper instance and verify it is not null
2279 2. Create a media library URI and release the helper's controller
2280 3. Create an IDataAbilityObserverTest instance
2281 4. Call RegisterObserver with the URI and observer, check the return value
2282 5. Insert test data into the URI and check the return value
2283 6. Notify a change for the URI
2284 7. Delete the test data using predicates and check the return value
2285 8. Notify a change again for the URI
2286 9. Call UnregisterObserver with the URI and observer, check the return value
2287 * @tc.expect:
2288 1.RegisterObserver returns E_HELPER_DIED
2289 2.Insert returns a negative value (failure)
2290 3.Delete returns a negative value (failure)
2291 4.UnregisterObserver returns E_HELPER_DIED
2292 */
2293 HWTEST_F(MediaDataShareUnitTest, ControllerTest_HelperRegisterObserverControllerNullTest_001, TestSize.Level0)
2294 {
2295 LOG_INFO("ControllerTest_HelperRegisterObserverControllerNullTest_001 start");
2296 auto helper= CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
2297 ASSERT_TRUE(helper != nullptr);
2298 Uri uri(MEDIALIBRARY_DATA_URI);
2299 helper->Release();
2300 sptr<IDataAbilityObserverTest> dataObserver = new (std::nothrow) IDataAbilityObserverTest();
2301 int retVal = helper->RegisterObserver(uri, dataObserver);
2302 EXPECT_EQ(retVal, E_HELPER_DIED);
2303
2304 DataShare::DataShareValuesBucket valuesBucket;
2305 valuesBucket.Put("name", "Datashare_Observer_Test001");
2306 retVal = helper->Insert(uri, valuesBucket);
2307 EXPECT_EQ((retVal < 0), true);
2308 helper->NotifyChange(uri);
2309
2310 DataShare::DataSharePredicates deletePredicates;
2311 deletePredicates.EqualTo("name", "Datashare_Observer_Test001");
2312 retVal = helper->Delete(uri, deletePredicates);
2313 EXPECT_EQ((retVal < 0), true);
2314 helper->NotifyChange(uri);
2315 retVal = helper->UnregisterObserver(uri, dataObserver);
2316 EXPECT_EQ(retVal, E_HELPER_DIED);
2317 LOG_INFO("ControllerTest_HelperRegisterObserverControllerNullTest_001 end");
2318 }
2319
2320 /**
2321 * @tc.name: MediaDataShare_ObserverExt_002
2322 * @tc.desc: Test DataShare observer extension for batch INSERT operation notification with extended data
2323 * @tc.type: FUNC
2324 * @tc.require: None
2325 * @tc.precon: None
2326 * @tc.step:
2327 1. Get the DataShare helper instance and verify it is not null
2328 2. Create a media library URI and a DataShareObserverTest instance
2329 3. Register the observer extension with the URI
2330 4. Create two ValuesBuckets with test data and batch insert them
2331 5. Convert the batch data to extended format for change info
2332 6. Notify an INSERT change with the extended data
2333 7. Wait for observer notification and verify the change info matches
2334 8. Unregister the observer extension
2335 * @tc.expect:
2336 1.Batch insertion returns a positive value (success)
2337 2.Observer correctly receives and matches INSERT change info with extended data
2338 */
2339 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ObserverExt_002, TestSize.Level0)
2340 {
2341 LOG_INFO("MediaDataShare_ObserverExt_002 start");
2342 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2343 ASSERT_TRUE(helper != nullptr);
2344 Uri uri(MEDIALIBRARY_DATA_URI);
2345 std::shared_ptr<DataShareObserverTest> dataObserver = std::make_shared<DataShareObserverTest>();
2346 helper->RegisterObserverExt(uri, dataObserver, false);
2347 DataShare::DataShareValuesBucket valuesBucket1;
2348 DataShare::DataShareValuesBucket valuesBucket2;
2349 valuesBucket1.Put("name", "Datashare_Observer_Test001");
2350 valuesBucket2.Put("name", "Datashare_Observer_Test002");
2351 std::vector<DataShareValuesBucket> VBuckets = {valuesBucket1, valuesBucket2};
2352 int retVal = helper->BatchInsert(uri, VBuckets);
2353 EXPECT_EQ((retVal > 0), true);
2354 DataShareObserver::ChangeInfo::VBuckets extends;
2355 extends = ValueProxy::Convert(std::move(VBuckets));
2356 ChangeInfo uriChanges = { DataShareObserver::ChangeType::INSERT, { uri }, nullptr, 0, extends};
2357 helper->NotifyChangeExt(uriChanges);
2358
2359 dataObserver->data.Wait();
2360 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
2361 dataObserver->Clear();
2362
2363 helper->UnregisterObserverExt(uri, dataObserver);
2364 LOG_INFO("MediaDataShare_ObserverExt_002 end");
2365 }
2366
2367 /**
2368 * @tc.name: MediaDataShare_ObserverExt_003
2369 * @tc.desc: Test DataShare observer extension for UPDATE operation notification with extended data
2370 * @tc.type: FUNC
2371 * @tc.require: None
2372 * @tc.precon: None
2373 * @tc.step:
2374 1. Get the DataShare helper instance and verify it is not null
2375 2. Create a media library URI and a DataShareObserverTest instance
2376 3. Register the observer extension with the URI
2377 4. Create a ValuesBucket with update data (name="Datashare_Observer_Test003")
2378 5. Update existing data filtered by predicates (name="Datashare_Observer_Test002")
2379 6. Convert the update data to extended format for change info
2380 7. Notify an UPDATE change with the extended data
2381 8. Wait for observer notification and verify the change info matches
2382 9. Unregister the observer extension
2383 * @tc.expect:
2384 1.Update operation returns a positive value (success)
2385 2.Observer correctly receives and matches UPDATE change info with extended data
2386 */
2387 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ObserverExt_003, TestSize.Level0)
2388 {
2389 LOG_INFO("MediaDataShare_ObserverExt_003 start");
2390 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2391 ASSERT_TRUE(helper != nullptr);
2392 Uri uri(MEDIALIBRARY_DATA_URI);
2393 std::shared_ptr<DataShareObserverTest> dataObserver = std::make_shared<DataShareObserverTest>();
2394 helper->RegisterObserverExt(uri, dataObserver, false);
2395 DataShare::DataShareValuesBucket valuesBucket;
2396 valuesBucket.Put("name", "Datashare_Observer_Test003");
2397 std::vector<DataShareValuesBucket> VBuckets = {valuesBucket};
2398 DataShare::DataSharePredicates predicates;
2399 predicates.EqualTo("name", "Datashare_Observer_Test002");
2400 int retVal = helper->Update(uri, predicates, valuesBucket);
2401 EXPECT_EQ((retVal > 0), true);
2402 DataShareObserver::ChangeInfo::VBuckets extends;
2403 extends = ValueProxy::Convert(std::move(VBuckets));
2404 ChangeInfo uriChanges = { DataShareObserver::ChangeType::UPDATE, { uri }, nullptr, 0, extends};
2405 helper->NotifyChangeExt(uriChanges);
2406
2407 dataObserver->data.Wait();
2408 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
2409 dataObserver->Clear();
2410
2411 helper->UnregisterObserverExt(uri, dataObserver);
2412 LOG_INFO("MediaDataShare_ObserverExt_003 end");
2413 }
2414
2415 /**
2416 * @tc.name: MediaDataShare_ObserverExt_004
2417 * @tc.desc: Test DataShare observer extension for DELETE operation notification with extended data
2418 * @tc.type: FUNC
2419 * @tc.require: None
2420 * @tc.precon: None
2421 * @tc.step:
2422 1. Get the DataShare helper instance and verify it is not null
2423 2. Create a media library URI and a DataShareObserverTest instance
2424 3. Register the observer extension with the URI
2425 4. Create predicates to filter data by name "Datashare_Observer_Test003"
2426 5. Delete the filtered data and verify success
2427 6. Convert the deleted data info to extended format for change info
2428 7. Notify a DELETE change with the extended data
2429 8. Wait for observer notification and verify the change info matches
2430 9. Unregister the observer extension
2431 * @tc.expect:
2432 1.Delete operation returns a positive value (success)
2433 2.Observer correctly receives and matches DELETE change info with extended data
2434 */
2435 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_ObserverExt_004, TestSize.Level0)
2436 {
2437 LOG_INFO("MediaDataShare_ObserverExt_004 start");
2438 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2439 ASSERT_TRUE(helper != nullptr);
2440 Uri uri(MEDIALIBRARY_DATA_URI);
2441 std::shared_ptr<DataShareObserverTest> dataObserver = std::make_shared<DataShareObserverTest>();
2442 helper->RegisterObserverExt(uri, dataObserver, false);
2443 DataShare::DataShareValuesBucket valuesBucket;
2444 valuesBucket.Put("name", "Datashare_Observer_Test003");
2445 std::vector<DataShareValuesBucket> VBuckets = {valuesBucket};
2446 DataShare::DataSharePredicates predicates;
2447 predicates.EqualTo("name", "Datashare_Observer_Test003");
2448 int retVal = helper->Delete(uri, predicates);
2449 EXPECT_EQ((retVal > 0), true);
2450 DataShareObserver::ChangeInfo::VBuckets extends;
2451 extends = ValueProxy::Convert(std::move(VBuckets));
2452 ChangeInfo uriChanges = { DataShareObserver::ChangeType::DELETE, { uri }, nullptr, 0, extends};
2453 helper->NotifyChangeExt(uriChanges);
2454
2455 dataObserver->data.Wait();
2456 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
2457 dataObserver->Clear();
2458
2459 helper->UnregisterObserverExt(uri, dataObserver);
2460 LOG_INFO("MediaDataShare_ObserverExt_004 end");
2461 }
2462
2463 /**
2464 * @tc.name: MediaDataShare_UnregisterObserverExt_002
2465 * @tc.desc: Test that unregistered DataShare observer no longer receives notifications with extended data
2466 * @tc.type: FUNC
2467 * @tc.require: None
2468 * @tc.precon: None
2469 * @tc.step:
2470 1. Get the DataShare helper instance and verify it is not null
2471 2. Create a media library URI and a DataShareObserverTest instance
2472 3. Register the observer extension with the URI
2473 4. Insert test data into the URI and verify success
2474 5. Convert the inserted data to extended format, notify an INSERT change, and verify observer receives it
2475 6. Unregister the observer extension
2476 7. Notify a DELETE change with the same extended data
2477 8. Wait for observer notification and verify the change info does not match
2478 * @tc.expect:
2479 1.Data insertion returns a positive value (success)
2480 2.Registered observer correctly receives INSERT change info with extended data
2481 3.Unregistered observer does not receive DELETE change info (change info mismatch)
2482 */
2483 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_UnregisterObserverExt_002, TestSize.Level0)
2484 {
2485 LOG_INFO("MediaDataShare_UnregisterObserverExt_002 start");
2486 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2487 ASSERT_TRUE(helper != nullptr);
2488 Uri uri(MEDIALIBRARY_DATA_URI);
2489 std::shared_ptr<DataShareObserverTest> dataObserver = std::make_shared<DataShareObserverTest>();
2490 helper->RegisterObserverExt(uri, dataObserver, true);
2491
2492 DataShare::DataShareValuesBucket valuesBucket;
2493 valuesBucket.Put("name", "Datashare_Observer_Test003");
2494 int retVal = helper->Insert(uri, valuesBucket);
2495 EXPECT_EQ((retVal > 0), true);
2496 std::vector<DataShareValuesBucket> Buckets = {valuesBucket};
2497 DataShareObserver::ChangeInfo::VBuckets extends;
2498 extends = ValueProxy::Convert(std::move(Buckets));
2499 ChangeInfo uriChanges = { DataShareObserver::ChangeType::INSERT, { uri }, nullptr, 0, extends};
2500 helper->NotifyChangeExt(uriChanges);
2501
2502 dataObserver->data.Wait();
2503 EXPECT_TRUE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
2504 dataObserver->Clear();
2505
2506 helper->UnregisterObserverExt(uri, dataObserver);
2507 helper->NotifyChangeExt({ DataShareObserver::ChangeType::DELETE, { uri }, nullptr, 0, extends });
2508
2509 dataObserver->data.Wait();
2510 EXPECT_FALSE(ChangeInfoEqual(dataObserver->changeInfo_, uriChanges));
2511 dataObserver->Clear();
2512 LOG_INFO("MediaDataShare_UnregisterObserverExt_002 end");
2513 }
2514
2515 /**
2516 * @tc.name: MediaDataShare_BatchUpdate_Test_001
2517 * @tc.desc: Test batch update functionality of DataShare helper with multiple operations and URIs
2518 * @tc.type: FUNC
2519 * @tc.require: None
2520 * @tc.precon: None
2521 * @tc.step:
2522 1. Get the DataShare helper instance and verify it is not null
2523 2. Create a media library URI and insert test data (name="batchUpdateTest")
2524 3. Create batch update operations:
2525 - For "uri1": Update existing test data to "batchUpdateTested"; Update non-existent data to "undefined1"
2526 - For "uri2": Update non-existent data to "undefined1"
2527 4. Execute batch update and get results
2528 5. Delete the test data to clean up
2529 * @tc.expect:
2530 1.Initial insertion returns a positive value (success)
2531 2.Batch update returns success, with results size 2
2532 3.Results for "uri1" contain [1, 0] (1 success, 1 no match)
2533 4.Results for "uri2" contain [0] (no match)
2534 5.Cleanup deletion returns a positive value (success)
2535 */
2536 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_BatchUpdate_Test_001, TestSize.Level0)
2537 {
2538 LOG_INFO("MediaDataShare_BatchUpdate_Test_001::Start");
2539 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2540 ASSERT_TRUE(helper != nullptr);
2541 Uri uri(MEDIALIBRARY_DATA_URI);
2542 DataShare::DataShareValuesBucket valuesBucket;
2543 valuesBucket.Put("name", "batchUpdateTest");
2544 int ret = helper->Insert(uri, valuesBucket);
2545 EXPECT_GT(ret, 0);
2546
2547 DataShare::UpdateOperations operations;
2548 std::vector<DataShare::UpdateOperation> updateOperations1;
2549 DataShare::UpdateOperation updateOperation1;
2550 updateOperation1.valuesBucket.Put("name", "batchUpdateTested");
2551 updateOperation1.predicates.EqualTo("name", "batchUpdateTest");
2552 updateOperations1.push_back(updateOperation1);
2553
2554 std::vector<DataShare::UpdateOperation> updateOperations2;
2555 DataShare::UpdateOperation updateOperation2;
2556 updateOperation2.valuesBucket.Put("name", "undefined1");
2557 updateOperation2.predicates.EqualTo("name", "undefined");
2558 updateOperations1.push_back(updateOperation2);
2559 updateOperations2.push_back(updateOperation2);
2560
2561 operations.emplace("uri1", updateOperations1);
2562 operations.emplace("uri2", updateOperations2);
2563 std::vector<BatchUpdateResult> results;
2564 ret = helper->BatchUpdate(operations, results);
2565 EXPECT_EQ(results.size(), 2);
2566 EXPECT_EQ(results[0].codes[0], 1);
2567 EXPECT_EQ(results[0].codes[1], 0);
2568 EXPECT_EQ(results[1].codes[0], 0);
2569 DataShare::DataSharePredicates predicates3;
2570 predicates3.EqualTo("name", "batchUpdateTested");
2571 ret = helper->Delete(uri, predicates3);
2572 EXPECT_GT(ret, 0);
2573 LOG_INFO("MediaDataShare_BatchUpdate_Test_001 End");
2574 }
2575
2576 /**
2577 * @tc.name: MediaDataShare_BatchUpdateThanLimit_Test_001
2578 * @tc.desc: Test batch update functionality when operation count exceeds the limit
2579 * @tc.type: FUNC
2580 * @tc.require: None
2581 * @tc.precon: None
2582 * @tc.step:
2583 1. Get the DataShare helper instance and verify it is not null
2584 2. Create a media library URI
2585 3. Create a batch update operation list with 4001 identical update operations (exceeding limit)
2586 4. Execute batch update and check the return value and results
2587 * @tc.expect:
2588 1.Batch update returns -1 (failure due to exceeding limit)
2589 2.Results list is empty
2590 */
2591 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_BatchUpdateThanLimit_Test_001, TestSize.Level0)
2592 {
2593 LOG_INFO("MediaDataShare_BatchUpdateThanLimit_Test_001::Start");
2594 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
2595 ASSERT_TRUE(helper != nullptr);
2596 Uri uri(MEDIALIBRARY_DATA_URI);
2597
2598 DataShare::UpdateOperations operations;
2599 std::vector<DataShare::UpdateOperation> updateOperations1;
2600 DataShare::UpdateOperation updateOperation1;
2601 updateOperation1.valuesBucket.Put("name", "batchUpdateTested");
2602 updateOperation1.predicates.EqualTo("name", "batchUpdateTest");
2603 for (int i = 0; i < 4001; i++) {
2604 updateOperations1.push_back(updateOperation1);
2605 }
2606 operations.emplace("uri1", updateOperations1);
2607 std::vector<BatchUpdateResult> results;
2608 int ret = helper->BatchUpdate(operations, results);
2609 EXPECT_EQ(ret, -1);
2610 EXPECT_EQ(results.size(), 0);
2611 LOG_INFO("MediaDataShare_BatchUpdateThanLimit_Test_001 End");
2612 }
2613
OnChangeCallback(const RdbChangeNode & changeNode)2614 void OnChangeCallback(const RdbChangeNode &changeNode)
2615 {
2616 // In test, put 2 uris into the data vec
2617 int vecLen = 2;
2618 EXPECT_EQ(changeNode.data_.size(), vecLen);
2619 for (int i = 0; i < vecLen; i++) {
2620 EXPECT_EQ(changeNode.data_[i], DATA_SHARE_URI);
2621 }
2622 }
2623
PrepareNodeContent(RdbChangeNode & node)2624 void PrepareNodeContent(RdbChangeNode &node)
2625 {
2626 OHOS::sptr<Ashmem> memory = Ashmem::CreateAshmem("PrepareNodeContent", DATA_SIZE_ASHMEM_TRANSFER_LIMIT);
2627 EXPECT_NE(memory, nullptr);
2628 bool mapRet = memory->MapReadAndWriteAshmem();
2629 ASSERT_TRUE(mapRet);
2630 // write 2 uris
2631 int vecLen = 2;
2632 int intByteLen = 4;
2633 int offset = 0;
2634 bool writeRet = memory->WriteToAshmem((void*)&vecLen, intByteLen, offset);
2635 ASSERT_TRUE(writeRet);
2636 offset += intByteLen;
2637 int len = DATA_SHARE_URI.length();
2638 const char *str = DATA_SHARE_URI.c_str();
2639 for (int i = 0; i < vecLen; i++) {
2640 writeRet = memory->WriteToAshmem((void*)&len, intByteLen, offset);
2641 ASSERT_TRUE(writeRet);
2642 offset += intByteLen;
2643 writeRet = memory->WriteToAshmem((void*)str, len, offset);
2644 ASSERT_TRUE(writeRet);
2645 offset += len;
2646 }
2647 node.memory_ = memory;
2648 node.size_ = offset;
2649 node.isSharedMemory_ = true;
2650 }
2651
2652 /**
2653 * @tc.name: ReadAshmem
2654 * @tc.desc: Test ReadAshmem function for normal read operations and error scenarios
2655 * @tc.type: FUNC
2656 * @tc.require: None
2657 * @tc.precon: None
2658 * @tc.step:
2659 1. Create an Ashmem instance and map it for read/write
2660 2. Write test data (string length and URI string) into Ashmem
2661 3. Use RdbObserverStub to read the length from Ashmem and verify it matches
2662 4. Read the URI string from Ashmem and verify it matches the original
2663 5. Test error path: attempt to read data exceeding Ashmem size
2664 * @tc.expect:
2665 1.Normal read of length returns E_OK and matches written length
2666 2.Normal read of string returns E_OK and matches original URI
2667 3.Error read (exceeding size) returns E_ERROR
2668 */
2669 HWTEST_F(MediaDataShareUnitTest, ReadAshmem, TestSize.Level1)
2670 {
2671 LOG_INFO("ReadAshmem starts");
2672 RdbChangeNode node;
2673
2674 OHOS::sptr<Ashmem> memory = Ashmem::CreateAshmem("ReadAshmem", DATA_SIZE_ASHMEM_TRANSFER_LIMIT);
2675 EXPECT_NE(memory, nullptr);
2676 bool mapRet = memory->MapReadAndWriteAshmem();
2677 ASSERT_TRUE(mapRet);
2678 int len = DATA_SHARE_URI.length();
2679 bool writeRet = memory->WriteToAshmem((void*)&len, 4, 0);
2680 ASSERT_TRUE(writeRet);
2681 const char *str = DATA_SHARE_URI.c_str();
2682 writeRet = memory->WriteToAshmem((void*)str, len, 4);
2683 ASSERT_TRUE(writeRet);
2684 node.memory_ = memory;
2685
2686 RdbObserverStub stub(OnChangeCallback);
2687 // Read an int
2688 const int *lenRead;
2689 int offset = 0;
2690 int readRet = stub.ReadAshmem(node, (const void**)&lenRead, 4, offset);
2691 EXPECT_EQ(readRet, E_OK);
2692 EXPECT_EQ(offset, 4);
2693 int lenFromAshmem = *lenRead;
2694 EXPECT_EQ(lenFromAshmem, len);
2695 // Read a string
2696 readRet = stub.ReadAshmem(node, (const void**)&str, lenFromAshmem, offset);
2697 EXPECT_EQ(readRet, E_OK);
2698 EXPECT_EQ(offset, 4 + len);
2699 std::string strRead(str, lenFromAshmem);
2700 EXPECT_EQ(strRead, DATA_SHARE_URI);
2701
2702 // Error path test
2703 readRet = stub.ReadAshmem(node, (const void**)&str, DATA_SIZE_ASHMEM_TRANSFER_LIMIT, offset);
2704 EXPECT_EQ(readRet, E_ERROR);
2705 LOG_INFO("ReadAshmem ends");
2706 }
2707
2708 /**
2709 * @tc.name: DeserializeDataFromAshmem001
2710 * @tc.desc: Test DeserializeDataFromAshmem function for successful data deserialization from Ashmem
2711 * @tc.type: FUNC
2712 * @tc.require: None
2713 * @tc.precon: None
2714 * @tc.step:
2715 1. Prepare an RdbChangeNode with Ashmem containing serialized data (2 URIs) using PrepareNodeContent
2716 2. Create an RdbObserverStub with OnChangeCallback
2717 3. Call DeserializeDataFromAshmem on the stub with the node
2718 4. Verify the deserialized data in the node
2719 * @tc.expect:
2720 1.Deserialization returns E_OK
2721 2.Node contains 2 URIs, both matching DATA_SHARE_URI
2722 */
2723 HWTEST_F(MediaDataShareUnitTest, DeserializeDataFromAshmem001, TestSize.Level1)
2724 {
2725 LOG_INFO("DeserializeDataFromAshmem001::Start");
2726 RdbChangeNode node;
2727 PrepareNodeContent(node);
2728
2729 RdbObserverStub stub(OnChangeCallback);
2730 int readRet = stub.DeserializeDataFromAshmem(node);
2731 EXPECT_EQ(readRet, E_OK);
2732 EXPECT_EQ(node.data_.size(), 2);
2733 for (int i = 0; i < 2; i++) {
2734 EXPECT_EQ(node.data_[i], DATA_SHARE_URI);
2735 }
2736 LOG_INFO("DeserializeDataFromAshmem001::End");
2737 }
2738
2739 /**
2740 * @tc.name: DeserializeDataFromAshmem002
2741 * @tc.desc: Test DeserializeDataFromAshmem function for error scenarios (invalid Ashmem data)
2742 * @tc.type: FUNC
2743 * @tc.require: None
2744 * @tc.precon: None
2745 * @tc.step:
2746 1. Test with null Ashmem: call deserialization on a node with no memory_
2747 2. Test with invalid string length: write Ashmem with excessive string length and call deserialization
2748 3. Test with insufficient size for vector length: create small Ashmem and call deserialization
2749 4. Test with insufficient size for string length: create Ashmem with partial data and call deserialization
2750 * @tc.expect: All error scenarios return E_ERROR
2751 */
2752 HWTEST_F(MediaDataShareUnitTest, DeserializeDataFromAshmem002, TestSize.Level1)
2753 {
2754 LOG_INFO("DeserializeDataFromAshmem002::Start");
2755 RdbChangeNode node;
2756 RdbObserverStub stub(OnChangeCallback);
2757 // memory_ is null.
2758 int ret = stub.DeserializeDataFromAshmem(node);
2759 EXPECT_EQ(ret, E_ERROR);
2760
2761 // Error in read from Ashmem with error string length.
2762 OHOS::sptr<Ashmem> memory = Ashmem::CreateAshmem("DeserializeDataFromAshmem002", DATA_SIZE_ASHMEM_TRANSFER_LIMIT);
2763 EXPECT_NE(memory, nullptr);
2764 bool mapRet = memory->MapReadAndWriteAshmem();
2765 ASSERT_TRUE(mapRet);
2766 int vecLen = 1;
2767 int offset = 0;
2768 bool writeRet = memory->WriteToAshmem((void*)&vecLen, 4, offset);
2769 ASSERT_TRUE(writeRet);
2770 offset += 4;
2771 int len = DATA_SHARE_URI.length();
2772 int errorLen = DATA_SIZE_ASHMEM_TRANSFER_LIMIT;
2773 const char *str = DATA_SHARE_URI.c_str();
2774 writeRet = memory->WriteToAshmem((void*)&errorLen, 4, offset);
2775 ASSERT_TRUE(writeRet);
2776 offset += 4;
2777 writeRet = memory->WriteToAshmem((void*)str, len, offset);
2778 ASSERT_TRUE(writeRet);
2779 node.memory_ = memory;
2780
2781 ret = stub.DeserializeDataFromAshmem(node);
2782 EXPECT_EQ(ret, E_ERROR);
2783
2784 // Error in read from Ashmem with vec size
2785 OHOS::sptr<Ashmem> memory2 = Ashmem::CreateAshmem("DeserializeDataFromAshmem002", 2);
2786 EXPECT_NE(memory2, nullptr);
2787 mapRet = memory2->MapReadAndWriteAshmem();
2788 ASSERT_TRUE(mapRet);
2789 node.memory_ = memory2;
2790 ret = stub.DeserializeDataFromAshmem(node);
2791 EXPECT_EQ(ret, E_ERROR);
2792
2793 // Error in read from Ashmem with str size
2794 OHOS::sptr<Ashmem> memory3 = Ashmem::CreateAshmem("DeserializeDataFromAshmem002", 5);
2795 EXPECT_NE(memory3, nullptr);
2796 mapRet = memory3->MapReadAndWriteAshmem();
2797 ASSERT_TRUE(mapRet);
2798 writeRet = memory3->WriteToAshmem((void*)&vecLen, 4, 0);
2799 ASSERT_TRUE(writeRet);
2800 node.memory_ = memory3;
2801 ret = stub.DeserializeDataFromAshmem(node);
2802 EXPECT_EQ(ret, E_ERROR);
2803 LOG_INFO("DeserializeDataFromAshmem002::End");
2804 }
2805
2806 /**
2807 * @tc.name: RecoverRdbChangeNodeData001
2808 * @tc.desc: Test RecoverRdbChangeNodeData function for normal recovery and non-recovery scenarios
2809 * @tc.type: FUNC
2810 * @tc.require: None
2811 * @tc.precon: None
2812 * @tc.step:
2813 1. Prepare an RdbChangeNode with shared memory containing 2 URIs using PrepareNodeContent
2814 2. Create an RdbObserverStub with OnChangeCallback
2815 3. Call RecoverRdbChangeNodeData on the stub with the node and verify return value
2816 4. Check that node data is correctly recovered, memory is nullified, and size is 0
2817 5. Prepare a second RdbChangeNode with shared memory but set isSharedMemory_ to false
2818 6. Call RecoverRdbChangeNodeData on the second node and verify return value
2819 7. Check that node data remains empty, memory is retained, and size is unchanged
2820 * @tc.expect:
2821 1.First recovery returns E_OK, node contains 2 URIs, memory is null, size is 0, and isSharedMemory_ is false
2822 2.non-recovery returns E_OK, node data is empty, memory is not null, size is 82, and isSharedMemory_ is false
2823 */
2824 HWTEST_F(MediaDataShareUnitTest, RecoverRdbChangeNodeData001, TestSize.Level0)
2825 {
2826 LOG_INFO("RecoverRdbChangeNodeData::Start");
2827
2828 // Recover
2829 RdbChangeNode node;
2830 PrepareNodeContent(node);
2831 RdbObserverStub stub(OnChangeCallback);
2832 int ret = stub.RecoverRdbChangeNodeData(node);
2833 EXPECT_EQ(ret, E_OK);
2834 EXPECT_EQ(node.data_.size(), 2);
2835 for (int i = 0; i < 2; i++) {
2836 EXPECT_EQ(node.data_[i], DATA_SHARE_URI);
2837 }
2838 EXPECT_EQ(node.memory_, nullptr);
2839 EXPECT_EQ(node.size_, 0);
2840 ASSERT_FALSE(node.isSharedMemory_);
2841
2842 // Not recover
2843 RdbChangeNode node2;
2844 PrepareNodeContent(node2);
2845 node2.isSharedMemory_ = false;
2846 ret = stub.RecoverRdbChangeNodeData(node2);
2847 EXPECT_EQ(ret, E_OK);
2848 EXPECT_EQ(node2.data_.size(), 0);
2849 EXPECT_NE(node2.memory_, nullptr);
2850 EXPECT_EQ(node2.size_, 82);
2851 ASSERT_FALSE(node2.isSharedMemory_);
2852
2853 LOG_INFO("RecoverRdbChangeNodeData End");
2854 }
2855
2856 /**
2857 * @tc.name: RecoverRdbChangeNodeData002
2858 * @tc.desc: Test RecoverRdbChangeNodeData function with error scenario (null shared memory)
2859 * @tc.type: FUNC
2860 * @tc.require: None
2861 * @tc.precon: None
2862 * @tc.step:
2863 1. Create an RdbChangeNode with isSharedMemory_ set to true but no memory allocated
2864 2. Create an RdbObserverStub with OnChangeCallback
2865 3. Call RecoverRdbChangeNodeData on the stub with the node
2866 4. Verify the return value and node state after recovery
2867 * @tc.expect:
2868 1.Recovery returns E_ERROR
2869 2.Node data is empty, memory is null, size is 0, and isSharedMemory_ is false
2870 */
2871 HWTEST_F(MediaDataShareUnitTest, RecoverRdbChangeNodeData002, TestSize.Level0)
2872 {
2873 LOG_INFO("RecoverRdbChangeNodeData002::Start");
2874
2875 RdbChangeNode node;
2876 node.isSharedMemory_ = true;
2877 RdbObserverStub stub(OnChangeCallback);
2878 int ret = stub.RecoverRdbChangeNodeData(node);
2879 EXPECT_EQ(ret, E_ERROR);
2880 EXPECT_EQ(node.data_.size(), 0);
2881 EXPECT_EQ(node.memory_, nullptr);
2882 EXPECT_EQ(node.size_, 0);
2883 ASSERT_FALSE(node.isSharedMemory_);
2884 LOG_INFO("RecoverRdbChangeNodeData002::End");
2885 }
2886
2887 /**
2888 * @tc.name: OnChangeFromRdb001
2889 * @tc.desc: Test OnChangeFromRdb function for normal data processing
2890 * @tc.type: FUNC
2891 * @tc.require: None
2892 * @tc.precon: None
2893 * @tc.step:
2894 1. Prepare an RdbChangeNode with shared memory containing 2 URIs using PrepareNodeContent
2895 2. Create an RdbObserverStub with OnChangeCallback
2896 3. Call OnChangeFromRdb on the stub with the node
2897 4. Verify the node's data, memory, size, and isSharedMemory_ state
2898 * @tc.expect:
2899 1.Node contains 2 URIs matching DATA_SHARE_URI
2900 2.Node memory is null, size is 0, and isSharedMemory_ is false
2901 */
2902 HWTEST_F(MediaDataShareUnitTest, OnChangeFromRdb001, TestSize.Level0)
2903 {
2904 LOG_INFO("OnChangeFromRdb001::Start");
2905
2906 RdbChangeNode node;
2907 PrepareNodeContent(node);
2908 RdbObserverStub stub(OnChangeCallback);
2909 stub.OnChangeFromRdb(node);
2910 EXPECT_EQ(node.data_.size(), 2);
2911 for (int i = 0; i < 2; i++) {
2912 EXPECT_EQ(node.data_[i], DATA_SHARE_URI);
2913 }
2914 EXPECT_EQ(node.memory_, nullptr);
2915 EXPECT_EQ(node.size_, 0);
2916 ASSERT_FALSE(node.isSharedMemory_);
2917 LOG_INFO("OnChangeFromRdb001::End");
2918 }
2919
2920 /**
2921 * @tc.name: OnChangeFromRdb002
2922 * @tc.desc: Test OnChangeFromRdb function with error scenario (null shared memory)
2923 * @tc.type: FUNC
2924 * @tc.require: None
2925 * @tc.precon: None
2926 * @tc.step:
2927 1. Create an RdbChangeNode with isSharedMemory_ set to true but no memory allocated
2928 2. Create an RdbObserverStub with OnChangeCallback
2929 3. Call OnChangeFromRdb on the stub with the node
2930 4. Verify the node's data, memory, size, and isSharedMemory_ state
2931 * @tc.expect:
2932 1.Node data is empty
2933 2.Node memory is null, size is 0, and isSharedMemory_ is false
2934 */
2935 HWTEST_F(MediaDataShareUnitTest, OnChangeFromRdb002, TestSize.Level0)
2936 {
2937 LOG_INFO("OnChangeFromRdb002::Start");
2938 RdbChangeNode node;
2939 node.isSharedMemory_ = true;
2940 RdbObserverStub stub(OnChangeCallback);
2941 stub.OnChangeFromRdb(node);
2942 EXPECT_EQ(node.data_.size(), 0);
2943 EXPECT_EQ(node.memory_, nullptr);
2944 EXPECT_EQ(node.size_, 0);
2945 ASSERT_FALSE(node.isSharedMemory_);
2946 LOG_INFO("OnChangeFromRdb002::End");
2947 }
2948
2949 /**
2950 * @tc.name: OnremoteRequestTest001
2951 * @tc.desc: Test OnRemoteRequest function with invalid and valid interface tokens and request codes
2952 * @tc.type: FUNC
2953 * @tc.require: None
2954 * @tc.precon: None
2955 * @tc.step:
2956 1. Create an RdbObserverStub with OnChangeCallback
2957 2. Prepare MessageParcel, reply, and option objects
2958 3. Write an invalid interface token to the parcel and call OnRemoteRequest with code 0
2959 4. Write the correct interface token and call OnRemoteRequest with code 1
2960 5. Call OnRemoteRequest with the correct token and code 0
2961 6. Verify the return values for each scenario
2962 * @tc.expect:
2963 1.Request with invalid token returns ERR_INVALID_STATE
2964 2.Request with valid token and invalid code (1) returns ERR_INVALID_STATE
2965 3.Request with valid token and code 0 returns ERR_INVALID_VALUE
2966 */
2967 HWTEST_F(MediaDataShareUnitTest, OnremoteRequestTest001, TestSize.Level0)
2968 {
2969 LOG_INFO("OnremoteRequestTest001::Start");
2970 RdbObserverStub stub(OnChangeCallback);
2971 MessageParcel data;
2972 MessageParcel reply;
2973 MessageOption option;
2974 std::u16string descriptorError = u"ERROR";
2975 std::u16string descriptorCorrect = RdbObserverStub::GetDescriptor();
2976 data.WriteInterfaceToken(descriptorError);
2977 std::u16string descriptor;
2978 int ret = stub.OnRemoteRequest(0, data, reply, option);
2979 EXPECT_EQ(ret, ERR_INVALID_STATE);
2980 data.WriteInterfaceToken(descriptorCorrect);
2981 ret = stub.OnRemoteRequest(1, data, reply, option);
2982 EXPECT_EQ(ret, ERR_INVALID_STATE);
2983 data.WriteInterfaceToken(descriptorCorrect);
2984 ret = stub.OnRemoteRequest(0, data, reply, option);
2985 EXPECT_EQ(ret, ERR_INVALID_VALUE);
2986 LOG_INFO("OnremoteRequestTest001::End");
2987 }
2988
2989 /**
2990 * @tc.name: ReadAshmemTest001
2991 * @tc.desc: Test ReadAshmem function with null shared memory
2992 * @tc.type: FUNC
2993 * @tc.require: None
2994 * @tc.precon: None
2995 * @tc.step:
2996 1. Create an RdbObserverStub with OnChangeCallback
2997 2. Create an RdbChangeNode with a null Ashmem pointer
2998 3. Call ReadAshmem on the stub with the node, null data pointer, size 0, and undefined offset
2999 4. Verify the return value
3000 * @tc.expect: ReadAshmem returns E_ERROR
3001 */
3002 HWTEST_F(MediaDataShareUnitTest, ReadAshmemTest001, TestSize.Level0)
3003 {
3004 LOG_INFO("ReadAshmemTest001::Start");
3005 RdbObserverStub stub(OnChangeCallback);
3006 RdbChangeNode changeNode;
3007 changeNode.memory_ = OHOS::sptr<Ashmem>(nullptr);
3008 const void *data = nullptr;
3009 int size = 0;
3010 int offset;
3011 int ret = stub.ReadAshmem(changeNode, &data, size, offset);
3012 EXPECT_EQ(ret, E_ERROR);
3013 LOG_INFO("ReadAshmemTest001::End");
3014 }
3015
3016 /**
3017 * @tc.name: MediaDataShare_User_Define_Func_Test_001
3018 * @tc.desc: Test UserDefineFunc with no interface descriptor
3019 * @tc.type: FUNC
3020 * @tc.require: None
3021 * @tc.precon: None
3022 * @tc.step:
3023 1. Get the DataShare helper instance
3024 2. Prepare empty MessageParcel, reply, and option objects (no descriptor written)
3025 3. Call UserDefineFunc on the helper
3026 4. Verify the error code
3027 * @tc.expect: UserDefineFunc returns -1 (failure due to missing descriptor)
3028 */
3029 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_User_Define_Func_Test_001, TestSize.Level0)
3030 {
3031 LOG_INFO("MediaDataShare_User_Define_Func_Test_001::Start");
3032 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
3033 MessageParcel data;
3034 MessageParcel reply;
3035 MessageOption option;
3036 auto errCode = helper->UserDefineFunc(data, reply, option);
3037 // 10 is IPC error ERR_INVALID_STATE
3038 EXPECT_EQ(errCode, 10);
3039 LOG_INFO("MediaDataShare_User_Define_Func_Test_001 End");
3040 }
3041
3042 /**
3043 * @tc.name: MediaDataShare_User_Define_Func_Test_002
3044 * @tc.desc: Test UserDefineFunc with a valid interface descriptor
3045 * @tc.type: FUNC
3046 * @tc.require: None
3047 * @tc.precon: None
3048 * @tc.step:
3049 1. Get the DataShare helper instance
3050 2. Prepare MessageParcel, reply, and option objects
3051 3. Write the valid interface descriptor ("OHOS.DataShare.IDataShare") to the parcel
3052 4. Call UserDefineFunc on the helper
3053 5. Verify the error code
3054 * @tc.expect: UserDefineFunc returns 0 (success with valid descriptor)
3055 */
3056 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_User_Define_Func_Test_002, TestSize.Level0)
3057 {
3058 LOG_INFO("MediaDataShare_User_Define_Func_Test_002::Start");
3059 std::shared_ptr<DataShare::DataShareHelper> helper = g_dataShareHelper;
3060 MessageParcel data;
3061 std::u16string descriptor = u"OHOS.DataShare.IDataShare";
3062 MessageParcel reply;
3063 MessageOption option;
3064 if (data.WriteInterfaceToken(descriptor)) {
3065 auto errCode = helper->UserDefineFunc(data, reply, option);
3066 EXPECT_EQ(errCode, 0);
3067 }
3068 LOG_INFO("MediaDataShare_User_Define_Func_Test_002 End");
3069 }
3070
3071 /**
3072 * @tc.name: MediaDataShare_RegisterObserverExtProvider_Test_001
3073 * @tc.desc: Test RegisterObserverExtProvider with null observer and null controller scenarios
3074 * @tc.type: FUNC
3075 * @tc.require: None
3076 * @tc.precon: None
3077 * @tc.step:
3078 1. Create a DataShare helper instance and verify it is not null
3079 2. Attempt to register a null observer with an empty URI, check error code
3080 3. Create a valid observer and use a media library URI
3081 4. Release the helper's controller and attempt to register the observer, check error code
3082 * @tc.expect:
3083 1.Registering null observer returns E_NULL_OBSERVER
3084 2.Registering with released (null) controller returns E_HELPER_DIED
3085 */
3086 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_RegisterObserverExtProvider_Test_001, TestSize.Level0)
3087 {
3088 LOG_INFO("MediaDataShare_RegisterObserverExtProvider_Test_001::Start");
3089
3090 Uri uri("");
3091 // GetObserver return not nullptr
3092 std::shared_ptr<DataShareObserver> dataObserver = nullptr;
3093 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3094 ASSERT_NE(helper, nullptr);
3095 int errCode = helper->RegisterObserverExtProvider(uri, dataObserver, false);
3096 EXPECT_EQ(errCode, E_NULL_OBSERVER);
3097
3098 // GetObserver return is not nullptr but controller is nullptr
3099 uri = Uri(MEDIALIBRARY_DATA_URI);
3100 dataObserver = std::make_shared<DataShareObserverTest>();
3101 ASSERT_NE(dataObserver, nullptr);
3102 bool ret = helper->Release();
3103 EXPECT_TRUE(ret);
3104 errCode = helper->RegisterObserverExtProvider(uri, dataObserver, false);
3105 EXPECT_EQ(errCode, E_HELPER_DIED);
3106
3107 LOG_INFO("MediaDataShare_RegisterObserverExtProvider_Test_001::End");
3108 }
3109
3110 /**
3111 * @tc.name: MediaDataShare_RegisterObserverExtProvider_Test_002
3112 * @tc.desc: Test normal functionality of RegisterObserverExtProvider
3113 * @tc.type: FUNC
3114 * @tc.require: None
3115 * @tc.precon: None
3116 * @tc.step:
3117 1. Create a media library URI and a valid DataShareObserverTest instance
3118 2. Create a DataShare helper instance and verify it is not null
3119 3. Call RegisterObserverExtProvider with the URI, observer, and false flag
3120 4. Verify the error code
3121 * @tc.expect: RegisterObserverExtProvider returns E_OK (success)
3122 */
3123 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_RegisterObserverExtProvider_Test_002, TestSize.Level0)
3124 {
3125 LOG_INFO("MediaDataShare_RegisterObserverExtProvider_Test_002::Start");
3126
3127 Uri uri(MEDIALIBRARY_DATA_URI);
3128 std::shared_ptr<DataShareObserver> dataObserver = std::make_shared<DataShareObserverTest>();
3129 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3130 int errCode = helper->RegisterObserverExtProvider(uri, dataObserver, false);
3131 ASSERT_NE(helper, nullptr);
3132 EXPECT_EQ(errCode, E_OK);
3133
3134 LOG_INFO("MediaDataShare_RegisterObserverExtProvider_Test_002::End");
3135 }
3136
3137 /**
3138 * @tc.name: MediaDataShare_UnregisterObserverExtProvider_Test_001
3139 * @tc.desc: Test UnregisterObserverExtProvider with null observer, unregistered observer, and null controller
3140 * @tc.type: FUNC
3141 * @tc.require: None
3142 * @tc.precon: None
3143 * @tc.step:
3144 1. Create a DataShare helper instance and verify it is not null
3145 2. Attempt to unregister a null observer, check error code
3146 3. Create a valid observer and attempt to unregister it (not previously registered), check error code
3147 4. Register the observer, release the helper's controller, then attempt to unregister, check error code
3148 * @tc.expect:
3149 - Unregistering null observer returns E_NULL_OBSERVER
3150 - Unregistering unregistered observer returns E_NULL_OBSERVER
3151 - Unregistering with released (null) controller returns E_HELPER_DIED
3152 */
3153 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_UnregisterObserverExtProvider_Test_001, TestSize.Level0)
3154 {
3155 LOG_INFO("MediaDataShare_UnregisterObserverExtProvider_Test_001::Start");
3156
3157 Uri uri(MEDIALIBRARY_DATA_URI);
3158 // dataObserver is nullptr
3159 std::shared_ptr<DataShareObserver> dataObserver = nullptr;
3160 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3161 ASSERT_NE(helper, nullptr);
3162 int errCode = helper->UnregisterObserverExtProvider(uri, dataObserver);
3163 EXPECT_EQ(errCode, E_NULL_OBSERVER);
3164
3165 // FindObserver return false
3166 dataObserver = std::make_shared<DataShareObserverTest>();
3167 ASSERT_NE(dataObserver, nullptr);
3168 errCode = helper->UnregisterObserverExtProvider(uri, dataObserver);
3169 EXPECT_EQ(errCode, E_NULL_OBSERVER);
3170
3171 // FindObserver return true and general controller is nullptr
3172 errCode = helper->RegisterObserverExtProvider(uri, dataObserver, false);
3173 EXPECT_EQ(errCode, E_OK);
3174 bool ret = helper->Release();
3175 EXPECT_TRUE(ret);
3176 errCode = helper->UnregisterObserverExtProvider(uri, dataObserver);
3177 EXPECT_EQ(errCode, E_HELPER_DIED);
3178
3179 LOG_INFO("MediaDataShare_UnregisterObserverExtProvider_Test_001::End");
3180 }
3181
3182 /**
3183 * @tc.name: MediaDataShare_UnregisterObserverExtProvider_Test_002
3184 * @tc.desc: Test normal functionality of UnregisterObserverExtProvider
3185 * @tc.type: FUNC
3186 * @tc.require: None
3187 * @tc.precon: None
3188 * @tc.step:
3189 1. Create a media library URI and a valid DataShareObserverTest instance
3190 2. Create a DataShare helper instance and verify it is not null
3191 3. Register the observer using RegisterObserverExtProvider and verify success
3192 4. Unregister the observer using UnregisterObserverExtProvider
3193 5. Verify the error code of unregistration
3194 * @tc.expect:
3195 1.Registration returns E_OK
3196 2.Unregistration returns E_OK (success)
3197 */
3198 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_UnregisterObserverExtProvider_Test_002, TestSize.Level0)
3199 {
3200 LOG_INFO("MediaDataShare_UnregisterObserverExtProvider_Test_002::Start");
3201
3202 Uri uri(MEDIALIBRARY_DATA_URI);
3203 // dataObserver is not nullptr
3204 std::shared_ptr<DataShareObserver> dataObserver = std::make_shared<DataShareObserverTest>();
3205 ASSERT_NE(dataObserver, nullptr);
3206 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3207 ASSERT_NE(helper, nullptr);
3208
3209 // FindObserver return true and general controller is not nullptr
3210 int errCode = helper->RegisterObserverExtProvider(uri, dataObserver, true);
3211 EXPECT_EQ(errCode, E_OK);
3212
3213 errCode = helper->UnregisterObserverExtProvider(uri, dataObserver);
3214 EXPECT_EQ(errCode, E_OK);
3215
3216 LOG_INFO("MediaDataShare_UnregisterObserverExtProvider_Test_002::End");
3217 }
3218
3219 /**
3220 * @tc.name: MediaDataShare_NotifyChangeExtProvider_Test_001
3221 * @tc.desc: Test NotifyChangeExtProvider with null controller (released helper)
3222 * @tc.type: FUNC
3223 * @tc.require: None
3224 * @tc.precon: None
3225 * @tc.step:
3226 1. Create a media library URI and a valid DataShareObserverTest instance
3227 2. Create a DataShare helper instance, register the observer, and verify registration success
3228 3. Release the helper's controller to make it null
3229 4. Create an INSERT-type ChangeInfo and call NotifyChangeExtProvider with it
3230 * @tc.expect: NotifyChangeExtProvider executes without crashing (no explicit error code check in test)
3231 */
3232 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_NotifyChangeExtProvider_Test_001, TestSize.Level0)
3233 {
3234 LOG_INFO("MediaDataShare_NotifyChangeExtProvider_Test_001::Start");
3235
3236 Uri uri(MEDIALIBRARY_DATA_URI);
3237 std::shared_ptr<DataShareObserver> dataObserver = std::make_shared<DataShareObserverTest>();
3238 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3239 ASSERT_NE(helper, nullptr);
3240 ASSERT_NE(dataObserver, nullptr);
3241
3242 int errCode = helper->RegisterObserverExtProvider(uri, dataObserver, false);
3243 EXPECT_EQ(errCode, E_OK);
3244 // generalCtl is nullptr
3245 bool ret = helper->Release();
3246 EXPECT_TRUE(ret);
3247
3248 ChangeInfo changeInfo = { DataShareObserver::ChangeType::INSERT, { uri } };
3249 helper->NotifyChangeExtProvider(changeInfo);
3250 LOG_INFO("MediaDataShare_NotifyChangeExtProvider_Test_001::End");
3251 }
3252
3253 /**
3254 * @tc.name: MediaDataShare_NotifyChangeExtProvider_Test_002
3255 * @tc.desc: Test normal functionality of NotifyChangeExtProvider with valid controller
3256 * @tc.type: FUNC
3257 * @tc.require: None
3258 * @tc.precon: None
3259 * @tc.step:
3260 1. Create a media library URI and a valid DataShareObserverTest instance
3261 2. Create a DataShare helper instance, register the observer, and verify registration success
3262 3. Create an INSERT-type ChangeInfo and call NotifyChangeExtProvider with it
3263 * @tc.expect: NotifyChangeExtProvider executes successfully (no errors)
3264 */
3265 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_NotifyChangeExtProvider_Test_002, TestSize.Level0)
3266 {
3267 LOG_INFO("MediaDataShare_NotifyChangeExtProvider_Test_002::Start");
3268
3269 Uri uri(MEDIALIBRARY_DATA_URI);
3270 // generalCtl is not nullptr
3271 std::shared_ptr<DataShareObserver> dataObserver = std::make_shared<DataShareObserverTest>();
3272 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3273 ASSERT_NE(helper, nullptr);
3274 ASSERT_NE(dataObserver, nullptr);
3275
3276 int errCode = helper->RegisterObserverExtProvider(uri, dataObserver, false);
3277 EXPECT_EQ(errCode, E_OK);
3278
3279 ChangeInfo changeInfo = { DataShareObserver::ChangeType::INSERT, { uri } };
3280 helper->NotifyChangeExtProvider(changeInfo);
3281 LOG_INFO("MediaDataShare_NotifyChangeExtProvider_Test_002::End");
3282 }
3283
3284 /**
3285 * @tc.name: MediaDataShare_OpenFileWithErrCode_Test_001
3286 * @tc.desc: Test OpenFileWithErrCode function for file opening scenario
3287 * @tc.type: FUNC
3288 * @tc.require: None
3289 * @tc.precon: None
3290 * @tc.step:
3291 1. Create a DataShare helper instance and verify it is not null
3292 2. Create a media library URI and specify "rw" mode
3293 3. Call OpenFileWithErrCode with the URI, mode, and error code pointer
3294 4. Verify the returned file descriptor (fd) and error code
3295 * @tc.expect:
3296 1.File descriptor (fd) is negative (failure to open)
3297 2.Error code is -1
3298 */
3299 HWTEST_F(MediaDataShareUnitTest, MediaDataShare_OpenFileWithErrCode_Test_001, TestSize.Level0)
3300 {
3301 LOG_INFO("MediaDataShare_OpenFileWithErrCode_Test_001::Start");
3302
3303 std::shared_ptr<DataShare::DataShareHelper> helper = CreateDataShareHelper(STORAGE_MANAGER_MANAGER_ID);
3304 ASSERT_NE(helper, nullptr);
3305
3306 Uri uri(MEDIALIBRARY_DATA_URI);
3307 std::string mode = "rw";
3308
3309 int32_t errCode = 0;
3310 int fd = helper->OpenFileWithErrCode(uri, mode, errCode);
3311 EXPECT_LT(fd, 0);
3312 EXPECT_EQ(errCode, -1);
3313 LOG_INFO("MediaDataShare_OpenFileWithErrCode_Test_001::End");
3314 }
3315 } // namespace DataShare
3316 } // namespace OHOS