• 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 #define MLOG_TAG "NotifyTest"
16 
17 #include "notify_test.h"
18 
19 #include "ability_context_impl.h"
20 #include "fetch_result.h"
21 #include "get_self_permissions.h"
22 #include "iservice_registry.h"
23 #include "media_file_utils.h"
24 #include "media_log.h"
25 #include "medialibrary_album_operations.h"
26 #include "medialibrary_data_manager.h"
27 #include "medialibrary_db_const.h"
28 #include "medialibrary_errno.h"
29 #define private public
30 #include "medialibrary_notify.h"
31 #undef private
32 #include "medialibrary_rdbstore.h"
33 #include "medialibrary_unistore_manager.h"
34 #include "photo_album_column.h"
35 #include "photo_map_column.h"
36 #include "rdb_predicates.h"
37 #include "result_set_utils.h"
38 #include "system_ability_definition.h"
39 
40 
41 namespace OHOS::Media {
42 using namespace std;
43 using namespace testing::ext;
44 using namespace OHOS::NativeRdb;
45 using namespace OHOS::DataShare;
46 using OHOS::DataShare::DataShareValuesBucket;
47 using OHOS::DataShare::DataSharePredicates;
48 
49 enum DefaultAlbumId: int32_t {
50     FAVORITE_ALBUM = 1,
51     VIDEO_ALBUM,
52     HIDDEN_ALBUM,
53     TRASH_ALBUM,
54     SCREENSHOTS_ALBUM,
55     CAMERA_ALBUM,
56 };
57 static constexpr int STORAGE_MANAGER_ID = 5003;
58 static constexpr int OBS_TMP_ID = 1;
59 static constexpr int OBS_TMP_ALBUM_ID = 10;
60 static constexpr int LIST_SIZE = 1;
61 static constexpr int64_t DATE_ADD = 6666666;
62 static constexpr int64_t DATE_MODIFY = 6666667;
63 shared_ptr<DataShare::DataShareHelper> sDataShareHelper_ = nullptr;
64 
CheckGetAlbumIdBySubType(PhotoAlbumSubType photoAlbumSubType,DefaultAlbumId defaultAlbumId)65 void CheckGetAlbumIdBySubType(PhotoAlbumSubType photoAlbumSubType, DefaultAlbumId defaultAlbumId)
66 {
67     auto context = make_shared<OHOS::AbilityRuntime::AbilityContextImpl>();
68     MediaLibraryUnistoreManager::GetInstance().Init(context);
69     auto watch = MediaLibraryNotify::GetInstance();
70     int albumId = watch->GetAlbumIdBySubType(photoAlbumSubType);
71     EXPECT_EQ(defaultAlbumId, albumId);
72     MediaLibraryUnistoreManager::GetInstance().Stop();
73 }
74 
CheckFileNotify(NotifyType notifyType)75 void CheckFileNotify(NotifyType notifyType)
76 {
77     string uriStr = PhotoColumn::PHOTO_URI_PREFIX + to_string(OBS_TMP_ID);
78     Uri uri(uriStr);
79     shared_ptr<TestObserver> obs = make_shared<TestObserver>();
80     if (sDataShareHelper_ == nullptr) {
81         return;
82     }
83     sDataShareHelper_->RegisterObserverExt(uri, obs, true);
84     MediaLibraryNotify::GetInstance()->Notify(uriStr, notifyType);
85     {
86         unique_lock<mutex> lock(obs->mutex_);
87         if (obs->condition_.wait_for(lock, 2s) == cv_status::no_timeout) {
88             EXPECT_EQ(obs->changeInfo_.changeType_, static_cast<DataShareObserver::ChangeType>(notifyType));
89             EXPECT_EQ(obs->changeInfo_.uris_.size(), 1);
90             EXPECT_EQ(obs->changeInfo_.uris_.begin()->ToString(), uriStr);
91         } else {
92             EXPECT_TRUE(false);
93         }
94     }
95 }
96 
SolveAlbumNotify(shared_ptr<TestObserver> obs,string assetStr)97 void SolveAlbumNotify(shared_ptr<TestObserver> obs, string assetStr)
98 {
99     uint8_t *data = new (nothrow) uint8_t[obs->changeInfo_.size_];
100     if (data == nullptr) {
101         return;
102     }
103     int copyRet = memcpy_s(data, obs->changeInfo_.size_, obs->changeInfo_.data_, obs->changeInfo_.size_);
104     if (copyRet != 0) {
105         return;
106     }
107     shared_ptr<MessageParcel> parcel = make_shared<MessageParcel>();
108     if (parcel->ParseFrom(reinterpret_cast<uintptr_t>(data), obs->changeInfo_.size_)) {
109         uint32_t len = 0;
110         if (!parcel->ReadUint32(len)) {
111             return;
112         }
113         EXPECT_EQ(len, LIST_SIZE);
114         for (uint32_t i = 0; i < len; i++) {
115             string subUri = parcel->ReadString();
116             if (subUri.empty()) {
117                 return;
118             }
119             EXPECT_EQ(subUri, assetStr);
120         }
121     }
122 }
123 
CheckAlbumNotify(NotifyType notifyType,DataShareObserver::ChangeType changeType)124 void CheckAlbumNotify(NotifyType notifyType, DataShareObserver::ChangeType changeType)
125 {
126     string assetStr = PhotoColumn::PHOTO_URI_PREFIX + to_string(OBS_TMP_ID);
127     string albumStr = PhotoAlbumColumns::ALBUM_URI_PREFIX  + to_string(OBS_TMP_ALBUM_ID);
128     Uri uri(albumStr);
129     shared_ptr<TestObserver> obs = make_shared<TestObserver>();
130     if (sDataShareHelper_ == nullptr) {
131         return;
132     }
133     sDataShareHelper_->RegisterObserverExt(uri, obs, true);
134     MediaLibraryNotify::GetInstance()->Notify(assetStr, notifyType, OBS_TMP_ALBUM_ID);
135     {
136         unique_lock<mutex> lock(obs->mutex_);
137         if (obs->condition_.wait_for(lock, 2s) == cv_status::no_timeout) {
138             if (obs->changeInfo_.size_ > 0) {
139                 SolveAlbumNotify(obs, assetStr);
140             } else {
141                 EXPECT_TRUE(false);
142             }
143             EXPECT_EQ(obs->changeInfo_.changeType_, changeType);
144             EXPECT_EQ(obs->changeInfo_.uris_.size(), LIST_SIZE);
145             EXPECT_EQ(obs->changeInfo_.uris_.begin()->ToString(), albumStr);
146         } else {
147             EXPECT_TRUE(false);
148         }
149     }
150 }
151 
CheckCloseAssetNotify(bool isCreate)152 void CheckCloseAssetNotify(bool isCreate)
153 {
154     string uriStr = PhotoColumn::PHOTO_URI_PREFIX + to_string(OBS_TMP_ID);
155     Uri uri(uriStr);
156     shared_ptr<TestObserver> obs = make_shared<TestObserver>();
157     if (sDataShareHelper_ == nullptr) {
158         return;
159     }
160     sDataShareHelper_->RegisterObserverExt(uri, obs, true);
161     shared_ptr<FileAsset> closeAsset = make_shared<FileAsset>();
162     closeAsset->SetId(OBS_TMP_ID);
163     closeAsset->SetMediaType(MediaType::MEDIA_TYPE_IMAGE);
164     if (isCreate) {
165         closeAsset->SetDateAdded(DATE_ADD);
166         closeAsset->SetDateModified(0);
167     } else {
168         closeAsset->SetDateAdded(DATE_ADD);
169         closeAsset->SetDateModified(DATE_MODIFY);
170     }
171     MediaLibraryNotify::GetInstance()->Notify(closeAsset);
172     {
173         unique_lock<mutex> lock(obs->mutex_);
174         if (obs->condition_.wait_for(lock, 2s) == cv_status::no_timeout) {
175             if (isCreate) {
176                 EXPECT_EQ(obs->changeInfo_.changeType_,
177                     static_cast<DataShareObserver::ChangeType>(NotifyType::NOTIFY_ADD));
178             } else {
179                 EXPECT_EQ(obs->changeInfo_.changeType_,
180                     static_cast<DataShareObserver::ChangeType>(NotifyType::NOTIFY_UPDATE));
181             }
182             EXPECT_EQ(obs->changeInfo_.uris_.size(), 1);
183             EXPECT_EQ(obs->changeInfo_.uris_.begin()->ToString(), uriStr);
184         } else {
185             EXPECT_TRUE(false);
186         }
187     }
188 }
189 
SetUpTestCase()190 void NotifyTest::SetUpTestCase()
191 {
192     vector<string> perms;
193     perms.push_back("ohos.permission.READ_MEDIA");
194     perms.push_back("ohos.permission.WRITE_MEDIA");
195     uint64_t tokenId = 0;
196     PermissionUtilsUnitTest::SetAccessTokenPermission("MediaLibraryQueryPerfUnitTest", perms, tokenId);
197     ASSERT_TRUE(tokenId != 0);
198 
199     auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
200     ASSERT_TRUE(saManager != nullptr);
201 
202     auto remoteObj = saManager->GetSystemAbility(STORAGE_MANAGER_ID);
203     ASSERT_TRUE(remoteObj != nullptr);
204 
205     sDataShareHelper_ = DataShare::DataShareHelper::Creator(remoteObj, MEDIALIBRARY_DATA_URI);
206     ASSERT_TRUE(sDataShareHelper_ != nullptr);
207 }
208 
TearDownTestCase()209 void NotifyTest::TearDownTestCase() {}
210 
211 // SetUp:Execute before each test case
SetUp()212 void NotifyTest::SetUp() {}
213 
TearDown()214 void NotifyTest::TearDown() {}
215 
216 /**
217  * @tc.name: notify_init_001
218  * @tc.desc: init notify
219  *           1. init notify "notify_init_001"
220  * @tc.type: FUNC
221  * @tc.require:
222  */
223 HWTEST_F(NotifyTest, notify_init_001, TestSize.Level0)
224 {
225     MEDIA_INFO_LOG("notify_init_001 enter");
226     int errCode = MediaLibraryNotify().Init();
227     ASSERT_TRUE(errCode == E_OK);
228     MEDIA_INFO_LOG("notify_init_001 exit");
229 }
230 
231 /**
232  * @tc.name: get_album_id_by_subtype_001
233  * @tc.desc: Get default album id
234  *           1. Create an album called "get_album_id_by_subtype_001"
235  *           2. VIDEO_ALBUM
236  * @tc.type: FUNC
237  * @tc.require:
238  */
239 HWTEST_F(NotifyTest, get_album_id_by_subtype_001, TestSize.Level0)
240 {
241     MEDIA_INFO_LOG("get_album_id_by_subtype_001 enter");
242     CheckGetAlbumIdBySubType(PhotoAlbumSubType::VIDEO, DefaultAlbumId::VIDEO_ALBUM);
243     MEDIA_INFO_LOG("get_album_id_by_subtype_001 exit");
244 }
245 
246 /**
247  * @tc.name: get_album_id_by_subtype_002
248  * @tc.desc: Get default album id
249  *           1. Create an album called "get_album_id_by_subtype_002"
250  *           2. FAVORITE_ALBUM
251  * @tc.type: FUNC
252  * @tc.require:
253  */
254 HWTEST_F(NotifyTest, get_album_id_by_subtype_002, TestSize.Level0)
255 {
256     MEDIA_INFO_LOG("get_album_id_by_subtype_002 enter");
257     CheckGetAlbumIdBySubType(PhotoAlbumSubType::FAVORITE, DefaultAlbumId::FAVORITE_ALBUM);
258     MEDIA_INFO_LOG("get_album_id_by_subtype_002 exit");
259 }
260 
261 /**
262  * @tc.name: get_album_id_by_subtype_003
263  * @tc.desc: Get default album id
264  *           1. Create an album called "get_album_id_by_subtype_003"
265  *           2. HIDDEN_ALBUM
266  * @tc.type: FUNC
267  * @tc.require:
268  */
269 HWTEST_F(NotifyTest, get_album_id_by_subtype_003, TestSize.Level0)
270 {
271     MEDIA_INFO_LOG("get_album_id_by_subtype_003 enter");
272     CheckGetAlbumIdBySubType(PhotoAlbumSubType::HIDDEN, DefaultAlbumId::HIDDEN_ALBUM);
273     MEDIA_INFO_LOG("get_album_id_by_subtype_003 exit");
274 }
275 
276 /**
277  * @tc.name: get_album_id_by_subtype_004
278  * @tc.desc: Get default album id
279  *           1. Create an album called "get_album_id_by_subtype_004"
280  *           2. TRASH_ALBUM
281  * @tc.type: FUNC
282  * @tc.require:
283  */
284 HWTEST_F(NotifyTest, get_album_id_by_subtype_004, TestSize.Level0)
285 {
286     MEDIA_INFO_LOG("get_album_id_by_subtype_004 enter");
287     CheckGetAlbumIdBySubType(PhotoAlbumSubType::TRASH, DefaultAlbumId::TRASH_ALBUM);
288     MEDIA_INFO_LOG("get_album_id_by_subtype_004 exit");
289 }
290 
291 /**
292  * @tc.name: get_album_id_by_subtype_005
293  * @tc.desc: Get default album id
294  *           1. Create an album called "get_album_id_by_subtype_005"
295  *           2. SCREENSHOTS_ALBUM
296  * @tc.type: FUNC
297  * @tc.require:
298  */
299 HWTEST_F(NotifyTest, get_album_id_by_subtype_005, TestSize.Level0)
300 {
301     MEDIA_INFO_LOG("get_album_id_by_subtype_005 enter");
302     CheckGetAlbumIdBySubType(PhotoAlbumSubType::SCREENSHOT, DefaultAlbumId::SCREENSHOTS_ALBUM);
303     MEDIA_INFO_LOG("get_album_id_by_subtype_005 exit");
304 }
305 
306 /**
307  * @tc.name: get_album_id_by_subtype_006
308  * @tc.desc: Get default album id
309  *           1. Create an album called "get_album_id_by_subtype_006"
310  *           2. CAMERA_ALBUM
311  * @tc.type: FUNC
312  * @tc.require:
313  */
314 HWTEST_F(NotifyTest, get_album_id_by_subtype_006, TestSize.Level0)
315 {
316     MEDIA_INFO_LOG("get_album_id_by_subtype_006 enter");
317     CheckGetAlbumIdBySubType(PhotoAlbumSubType::CAMERA, DefaultAlbumId::CAMERA_ALBUM);
318     MEDIA_INFO_LOG("get_album_id_by_subtype_006 exit");
319 }
320 
321 /**
322  * @tc.name: asset_on_change_001
323  * @tc.desc: solve asset and get message
324  *           1. RegisterObserverExt called "asset_on_change_001"
325  *           2. NotifyType::NOTIFY_ADD
326  * @tc.type: FUNC
327  * @tc.require:
328  */
329 HWTEST_F(NotifyTest, asset_on_change_001, TestSize.Level0)
330 {
331     MEDIA_INFO_LOG("asset_on_change_001 enter");
332     CheckFileNotify(NotifyType::NOTIFY_ADD);
333     MEDIA_INFO_LOG("asset_on_change_001 exit");
334 }
335 
336 /**
337  * @tc.name: asset_on_change_002
338  * @tc.desc: solve asset and get message
339  *           1. RegisterObserverExt called "asset_on_change_002"
340  *           2. NotifyType::NOTIFY_UPDATE
341  * @tc.type: FUNC
342  * @tc.require:
343  */
344 HWTEST_F(NotifyTest, asset_on_change_002, TestSize.Level0)
345 {
346     MEDIA_INFO_LOG("asset_on_change_002 enter");
347     CheckFileNotify(NotifyType::NOTIFY_UPDATE);
348     MEDIA_INFO_LOG("asset_on_change_002 exit");
349 }
350 
351 /**
352  * @tc.name: asset_on_change_003
353  * @tc.desc: solve asset and get message
354  *           1. RegisterObserverExt called "asset_on_change_003"
355  *           2. NotifyType::NOTIFY_REMOVE
356  * @tc.type: FUNC
357  * @tc.require:
358  */
359 HWTEST_F(NotifyTest, asset_on_change_003, TestSize.Level0)
360 {
361     MEDIA_INFO_LOG("asset_on_change_003 enter");
362     CheckFileNotify(NotifyType::NOTIFY_REMOVE);
363     MEDIA_INFO_LOG("asset_on_change_003 exit");
364 }
365 
366 /**
367  * @tc.name: album_on_change_001
368  * @tc.desc: solve album and get message
369  *           1. RegisterObserverExt called "album_on_change_001"
370  *           2. NotifyType::NOTIFY_ALBUM_ADD_ASSERT
371  * @tc.type: FUNC
372  * @tc.require:
373  */
374 HWTEST_F(NotifyTest, album_on_change_001, TestSize.Level0)
375 {
376     MEDIA_INFO_LOG("album_on_change_001 enter");
377     CheckAlbumNotify(NotifyType::NOTIFY_ALBUM_ADD_ASSERT, DataShareObserver::ChangeType::INSERT);
378     MEDIA_INFO_LOG("album_on_change_001 exit");
379 }
380 
381 /**
382  * @tc.name: album_on_change_002
383  * @tc.desc: solve album and get message
384  *           1. RegisterObserverExt called "album_on_change_002"
385  *           2. NotifyType::NOTIFY_ALBUM_REMOVE_ASSET
386  * @tc.type: FUNC
387  * @tc.require:
388  */
389 HWTEST_F(NotifyTest, album_on_change_002, TestSize.Level0)
390 {
391     MEDIA_INFO_LOG("album_on_change_002 enter");
392     CheckAlbumNotify(NotifyType::NOTIFY_ALBUM_REMOVE_ASSET, DataShareObserver::ChangeType::DELETE);
393     MEDIA_INFO_LOG("album_on_change_002 exit");
394 }
395 
396 /**
397  * @tc.name: close_asset_on_change_001
398  * @tc.desc: solve close asset and get message
399  *           1. RegisterObserverExt called "close_asset_on_change_001"
400  *           2. isCreate == true
401  * @tc.type: FUNC
402  * @tc.require:
403  */
404 HWTEST_F(NotifyTest, close_asset_on_change_001, TestSize.Level0)
405 {
406     MEDIA_INFO_LOG("close_asset_on_change_001 enter");
407     CheckCloseAssetNotify(true);
408     MEDIA_INFO_LOG("close_asset_on_change_001 exit");
409 }
410 
411 /**
412  * @tc.name: close_asset_on_change_002
413  * @tc.desc: solve close asset and get message
414  *           1. RegisterObserverExt called "close_asset_on_change_002"
415  *           2. isCreate == false
416  * @tc.type: FUNC
417  * @tc.require:
418  */
419 HWTEST_F(NotifyTest, close_asset_on_change_002, TestSize.Level0)
420 {
421     MEDIA_INFO_LOG("close_asset_on_change_002 enter");
422     CheckCloseAssetNotify(false);
423     MEDIA_INFO_LOG("close_asset_on_change_002 exit");
424 }
425 } // namespace OHOS::Media
426