• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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