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