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 #define MLOG_TAG "MultiStagesPhotoCaptureUnitTest"
17
18 #include "medialibrary_multistages_capture_test.h"
19
20 #include <chrono>
21 #include <thread>
22
23 #include "gmock/gmock.h"
24 #include "image_source.h"
25 #include "media_exif.h"
26 #include "media_column.h"
27 #include "media_file_utils.h"
28 #include "media_log.h"
29 #include "medialibrary_command.h"
30 #include "medialibrary_common_utils.h"
31 #include "medialibrary_data_manager.h"
32 #include "medialibrary_db_const_sqls.h"
33 #include "medialibrary_errno.h"
34 #include "medialibrary_photo_operations.h"
35 #include "medialibrary_rdbstore.h"
36 #include "medialibrary_unistore_manager.h"
37 #include "medialibrary_unittest_utils.h"
38 #include "result_set_utils.h"
39 #include "values_bucket.h"
40 #include "picture_adapter.h"
41 #define private public
42 #define protected public
43 #include "exif_utils.h"
44 #include "file_utils.h"
45 #include "mock_deferred_photo_proc_adapter.h"
46 #include "multistages_capture_deferred_photo_proc_session_callback.h"
47 #include "multistages_capture_dfx_first_visit.h"
48 #include "multistages_capture_dfx_result.h"
49 #include "multistages_capture_dfx_total_time.h"
50 #include "multistages_capture_dfx_request_policy.h"
51 #include "multistages_capture_dfx_trigger_ratio.h"
52 #include "multistages_capture_request_task_manager.h"
53 #include "multistages_photo_capture_manager.h"
54 #undef private
55 #undef protected
56
57 using namespace std;
58 using namespace OHOS;
59 using namespace OHOS::NativeRdb;
60 using namespace testing::ext;
61 using namespace testing;
62
63 namespace OHOS {
64 namespace Media {
65 static shared_ptr<MediaLibraryRdbStore> g_rdbStore;
66 static constexpr int32_t SLEEP_FIVE_SECONDS = 5;
67
68 namespace {
CleanTestTables()69 void CleanTestTables()
70 {
71 vector<string> dropTableList = {
72 PhotoColumn::PHOTOS_TABLE,
73 AudioColumn::AUDIOS_TABLE,
74 MEDIALIBRARY_TABLE,
75 ASSET_UNIQUE_NUMBER_TABLE
76 };
77 for (auto &dropTable : dropTableList) {
78 string dropSql = "DROP TABLE " + dropTable + ";";
79 int32_t ret = g_rdbStore->ExecuteSql(dropSql);
80 if (ret != NativeRdb::E_OK) {
81 MEDIA_ERR_LOG("Drop %{public}s table failed", dropTable.c_str());
82 return;
83 }
84 MEDIA_DEBUG_LOG("Drop %{public}s table success", dropTable.c_str());
85 }
86 }
87
88 struct UniqueMemberValuesBucket {
89 string assetMediaType;
90 int32_t startNumber;
91 };
92
PrepareUniqueNumberTable()93 void PrepareUniqueNumberTable()
94 {
95 if (g_rdbStore == nullptr) {
96 MEDIA_ERR_LOG("can not get g_rdbStore");
97 return;
98 }
99
100 string queryRowSql = "SELECT COUNT(*) as count FROM " + ASSET_UNIQUE_NUMBER_TABLE;
101 auto resultSet = g_rdbStore->QuerySql(queryRowSql);
102 if (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK) {
103 MEDIA_ERR_LOG("Can not get AssetUniqueNumberTable count");
104 return;
105 }
106 if (GetInt32Val("count", resultSet) != 0) {
107 MEDIA_DEBUG_LOG("AssetUniqueNumberTable is already inited");
108 return;
109 }
110
111 UniqueMemberValuesBucket imageBucket = { IMAGE_ASSET_TYPE, 1 };
112 UniqueMemberValuesBucket videoBucket = { VIDEO_ASSET_TYPE, 1 };
113 UniqueMemberValuesBucket audioBucket = { AUDIO_ASSET_TYPE, 1 };
114
115 vector<UniqueMemberValuesBucket> uniqueNumberValueBuckets = {
116 imageBucket, videoBucket, audioBucket
117 };
118
119 for (const auto& uniqueNumberValueBucket : uniqueNumberValueBuckets) {
120 ValuesBucket valuesBucket;
121 valuesBucket.PutString(ASSET_MEDIA_TYPE, uniqueNumberValueBucket.assetMediaType);
122 valuesBucket.PutInt(UNIQUE_NUMBER, uniqueNumberValueBucket.startNumber);
123 int64_t outRowId = -1;
124 int32_t insertResult = g_rdbStore->Insert(outRowId, ASSET_UNIQUE_NUMBER_TABLE, valuesBucket);
125 if (insertResult != NativeRdb::E_OK || outRowId <= 0) {
126 MEDIA_ERR_LOG("Prepare PrepareUniqueNumberTable failed");
127 }
128 }
129 }
130
SetTables()131 void SetTables()
132 {
133 vector<string> createTableSqlList = {
134 PhotoColumn::CREATE_PHOTO_TABLE,
135 AudioColumn::CREATE_AUDIO_TABLE,
136 CREATE_MEDIA_TABLE,
137 CREATE_ASSET_UNIQUE_NUMBER_TABLE
138 };
139 for (auto &createTableSql : createTableSqlList) {
140 int32_t ret = g_rdbStore->ExecuteSql(createTableSql);
141 if (ret != NativeRdb::E_OK) {
142 MEDIA_ERR_LOG("Execute sql %{private}s failed", createTableSql.c_str());
143 return;
144 }
145 MEDIA_DEBUG_LOG("Execute sql %{private}s success", createTableSql.c_str());
146 }
147 PrepareUniqueNumberTable();
148 }
149
ClearAndRestart()150 void ClearAndRestart()
151 {
152 if (!MediaLibraryUnitTestUtils::IsValid()) {
153 MediaLibraryUnitTestUtils::Init();
154 }
155
156 system("rm -rf /storage/cloud/files/*");
157 system("rm -rf /storage/cloud/files/.thumbs");
158 system("rm -rf /storage/cloud/files/.editData");
159 for (const auto &dir : TEST_ROOT_DIRS) {
160 string ROOT_PATH = "/storage/cloud/100/files/";
161 bool ret = MediaFileUtils::CreateDirectory(ROOT_PATH + dir + "/");
162 CHECK_AND_PRINT_LOG(ret, "make %{public}s dir failed, ret=%{public}d", dir.c_str(), ret);
163 }
164 CleanTestTables();
165 SetTables();
166 }
167
CreatePhotoApi10(int mediaType,const string & displayName)168 inline int32_t CreatePhotoApi10(int mediaType, const string &displayName)
169 {
170 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::CREATE,
171 MediaLibraryApi::API_10);
172 ValuesBucket values;
173 values.PutString(MediaColumn::MEDIA_NAME, displayName);
174 values.PutInt(MediaColumn::MEDIA_TYPE, mediaType);
175 cmd.SetValueBucket(values);
176 return MediaLibraryPhotoOperations::Create(cmd);
177 }
178
GetFilePath(int fileId)179 string GetFilePath(int fileId)
180 {
181 if (fileId < 0) {
182 MEDIA_ERR_LOG("this file id %{private}d is invalid", fileId);
183 return "";
184 }
185
186 vector<string> columns = { PhotoColumn::MEDIA_FILE_PATH };
187 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::QUERY,
188 MediaLibraryApi::API_10);
189 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
190 if (g_rdbStore == nullptr) {
191 MEDIA_ERR_LOG("can not get rdbstore");
192 return "";
193 }
194 auto resultSet = g_rdbStore->Query(cmd, columns);
195 if (resultSet == nullptr || resultSet->GoToFirstRow() != NativeRdb::E_OK) {
196 MEDIA_ERR_LOG("Can not get file Path");
197 return "";
198 }
199 string path = GetStringVal(PhotoColumn::MEDIA_FILE_PATH, resultSet);
200 return path;
201 }
202
MakePhotoUnpending(int fileId)203 int32_t MakePhotoUnpending(int fileId)
204 {
205 if (fileId < 0) {
206 MEDIA_ERR_LOG("this file id %{private}d is invalid", fileId);
207 return E_INVALID_FILEID;
208 }
209
210 string path = GetFilePath(fileId);
211 if (path.empty()) {
212 MEDIA_ERR_LOG("Get path failed");
213 return E_INVALID_VALUES;
214 }
215 int32_t errCode = MediaFileUtils::CreateAsset(path);
216 if (errCode != E_OK) {
217 MEDIA_ERR_LOG("Can not create asset");
218 return errCode;
219 }
220
221 if (g_rdbStore == nullptr) {
222 MEDIA_ERR_LOG("can not get rdbstore");
223 return E_HAS_DB_ERROR;
224 }
225 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE);
226 ValuesBucket values;
227 values.PutLong(PhotoColumn::MEDIA_TIME_PENDING, 0);
228 cmd.SetValueBucket(values);
229 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
230 int32_t changedRows = -1;
231 errCode = g_rdbStore->Update(cmd, changedRows);
232 if (errCode != E_OK || changedRows <= 0) {
233 MEDIA_ERR_LOG("Update pending failed, errCode = %{public}d, changeRows = %{public}d",
234 errCode, changedRows);
235 return errCode;
236 }
237
238 return E_OK;
239 }
240
SetDefaultPhotoApi10(int mediaType,const string & displayName)241 int32_t SetDefaultPhotoApi10(int mediaType, const string &displayName)
242 {
243 int fileId = CreatePhotoApi10(mediaType, displayName);
244 if (fileId < 0) {
245 MEDIA_ERR_LOG("create photo failed, res=%{public}d", fileId);
246 return fileId;
247 }
248 int32_t errCode = MakePhotoUnpending(fileId);
249 if (errCode != E_OK) {
250 return errCode;
251 }
252 return fileId;
253 }
254
255 const string PHOTO_ID_FOR_TEST = "202312071614";
256
PrepareForFirstVisit()257 int32_t PrepareForFirstVisit()
258 {
259 auto fileId = SetDefaultPhotoApi10(MediaType::MEDIA_TYPE_IMAGE, "MultiStagesCaptureTest001.jpg");
260 EXPECT_GT(fileId, 0);
261
262 // update multi-stages capture db info
263 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE, MediaLibraryApi::API_10);
264 ValuesBucket values;
265 values.Put(PhotoColumn::PHOTO_QUALITY, static_cast<int32_t>(MultiStagesPhotoQuality::LOW));
266 values.Put(PhotoColumn::PHOTO_ID, PHOTO_ID_FOR_TEST);
267 values.Put(PhotoColumn::PHOTO_DEFERRED_PROC_TYPE, 1);
268 cmd.SetValueBucket(values);
269 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
270 EXPECT_GT(MediaLibraryPhotoOperations::Update(cmd), E_OK);
271
272 return fileId;
273 }
274 } // namespace
275
SetUpTestCase(void)276 void MediaLibraryMultiStagesPhotoCaptureTest::SetUpTestCase(void)
277 {
278 MediaLibraryUnitTestUtils::Init();
279 g_rdbStore = MediaLibraryUnistoreManager::GetInstance().GetRdbStore();
280 if (g_rdbStore == nullptr) {
281 MEDIA_ERR_LOG("Start MediaLibraryPhotoOperationsTest failed, can not get rdbstore");
282 exit(1);
283 }
284 SetTables();
285 }
286
TearDownTestCase(void)287 void MediaLibraryMultiStagesPhotoCaptureTest::TearDownTestCase(void)
288 {
289 if (!MediaLibraryUnitTestUtils::IsValid()) {
290 MediaLibraryUnitTestUtils::Init();
291 }
292
293 system("rm -rf /storage/cloud/files/*");
294 ClearAndRestart();
295 g_rdbStore = nullptr;
296 MediaLibraryDataManager::GetInstance()->ClearMediaLibraryMgr();
297 this_thread::sleep_for(chrono::seconds(SLEEP_FIVE_SECONDS));
298 MEDIA_INFO_LOG("Clean is finish");
299 }
300
301 // SetUp:Execute before each test case
SetUp()302 void MediaLibraryMultiStagesPhotoCaptureTest::SetUp()
303 {
304 if (g_rdbStore == nullptr) {
305 MEDIA_ERR_LOG("Start MediaLibraryPhotoOperationsTest failed, can not get rdbstore");
306 exit(1);
307 }
308 ClearAndRestart();
309 }
310
TearDown(void)311 void MediaLibraryMultiStagesPhotoCaptureTest::TearDown(void) {}
312
313 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_result_001, TestSize.Level1)
314 {
315 MEDIA_INFO_LOG("dfx_result_001 Start");
316 EXPECT_NE(g_rdbStore, nullptr);
317 MultiStagesCaptureDfxResult::Report("123456", 0, static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
318 MEDIA_INFO_LOG("dfx_result_001 End");
319 }
320
321 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_result_invalid_param_002, TestSize.Level1)
322 {
323 MEDIA_INFO_LOG("dfx_result_invalid_param_002 Start");
324 EXPECT_NE(g_rdbStore, nullptr);
325 MultiStagesCaptureDfxResult::Report("", 0, static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
326 MEDIA_INFO_LOG("dfx_result_invalid_param_002 End");
327 }
328
329 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_total_time_001, TestSize.Level1)
330 {
331 MEDIA_INFO_LOG("dfx_total_time_001 Start");
332 string photoId = "1234566";
333 MultiStagesCaptureDfxTotalTime::GetInstance().AddStartTime(photoId);
334 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), false);
335
336 // sleep for 1234 milliseconds
337 this_thread::sleep_for(chrono::milliseconds(1234));
338 MultiStagesCaptureDfxTotalTime::GetInstance().Report(photoId,
339 static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
340 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), true);
341
342 MEDIA_INFO_LOG("dfx_total_time_001 End");
343 }
344
345 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_total_time_two_start_002, TestSize.Level1)
346 {
347 MEDIA_INFO_LOG("dfx_total_time_two_start_002 Start");
348 string photoId = "1234566";
349
350 // test that photo_id is not add start time
351 MultiStagesCaptureDfxTotalTime::GetInstance().Report(photoId,
352 static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
353 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), true);
354
355 string photoId2 = "12345666";
356 MultiStagesCaptureDfxTotalTime::GetInstance().AddStartTime(photoId2);
357 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), false);
358
359 // sleep for 1234 milliseconds
360 this_thread::sleep_for(chrono::milliseconds(1234));
361 MultiStagesCaptureDfxTotalTime::GetInstance().Report(photoId,
362 static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
363 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), false);
364
365 MultiStagesCaptureDfxTotalTime::GetInstance().Report(photoId2,
366 static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
367 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), true);
368
369 MEDIA_INFO_LOG("dfx_total_time_two_start_002 End");
370 }
371
372 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_total_time_remove_start_time_003, TestSize.Level1)
373 {
374 MEDIA_INFO_LOG("dfx_total_time_remove_start_time_003 Start");
375
376 string photoId = "1234566";
377 MultiStagesCaptureDfxTotalTime::GetInstance().RemoveStartTime(photoId);
378 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), true);
379
380 MultiStagesCaptureDfxTotalTime::GetInstance().AddStartTime(photoId);
381 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), false);
382 sleep(1);
383 MultiStagesCaptureDfxTotalTime::GetInstance().RemoveStartTime(photoId);
384 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), true);
385
386 MEDIA_INFO_LOG("dfx_total_time_remove_start_time_003 End");
387 }
388
389 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_total_time_invalid_param_004, TestSize.Level1)
390 {
391 MEDIA_INFO_LOG("dfx_total_time_invalid_param_004 Start");
392 string photoId = "";
393 MultiStagesCaptureDfxTotalTime::GetInstance().AddStartTime(photoId);
394 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), false);
395
396 // sleep for 1234 milliseconds
397 this_thread::sleep_for(chrono::milliseconds(1234));
398 MultiStagesCaptureDfxTotalTime::GetInstance().Report(photoId,
399 static_cast<int32_t>(MultiStagesCaptureMediaType::IMAGE));
400 EXPECT_EQ(MultiStagesCaptureDfxTotalTime::GetInstance().startTimes_.empty(), true);
401
402 MEDIA_INFO_LOG("dfx_total_time_invalid_param_004 End");
403 }
404
405 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_request_policy_get_count_001, TestSize.Level1)
406 {
407 MEDIA_INFO_LOG("dfx_request_policy_get_count_001 Start");
408 RequestCount requestCount { 0, 0, 0 };
409 MultiStagesCaptureDfxRequestPolicy::GetInstance().GetCount(RequestPolicy::HIGH_QUALITY_MODE, requestCount);
410 EXPECT_EQ(requestCount.highQualityCount, 1);
411
412 MultiStagesCaptureDfxRequestPolicy::GetInstance().GetCount(RequestPolicy::BALANCE_MODE, requestCount);
413 EXPECT_EQ(requestCount.highQualityCount, 1);
414 EXPECT_EQ(requestCount.balanceQualityCount, 1);
415
416 MultiStagesCaptureDfxRequestPolicy::GetInstance().GetCount(RequestPolicy::FAST_MODE, requestCount);
417 EXPECT_EQ(requestCount.highQualityCount, 1);
418 EXPECT_EQ(requestCount.balanceQualityCount, 1);
419 EXPECT_EQ(requestCount.emergencyQualityCount, 1);
420
421 MultiStagesCaptureDfxRequestPolicy::GetInstance().GetCount(RequestPolicy::BALANCE_MODE, requestCount);
422 EXPECT_EQ(requestCount.highQualityCount, 1);
423 EXPECT_EQ(requestCount.balanceQualityCount, 2);
424 EXPECT_EQ(requestCount.emergencyQualityCount, 1);
425
426 MultiStagesCaptureDfxRequestPolicy::GetInstance().GetCount(static_cast<RequestPolicy>(3), requestCount);
427 EXPECT_EQ(requestCount.highQualityCount, 1);
428 EXPECT_EQ(requestCount.balanceQualityCount, 2);
429 EXPECT_EQ(requestCount.emergencyQualityCount, 1);
430
431 MEDIA_INFO_LOG("dfx_request_policy_get_count_001 End");
432 }
433
434 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_request_policy_set_policy_002, TestSize.Level1)
435 {
436 MEDIA_INFO_LOG("dfx_request_policy_set_policy_002 Start");
437
438 MultiStagesCaptureDfxRequestPolicy &requestPolicyInstance = MultiStagesCaptureDfxRequestPolicy::GetInstance();
439
440 string callingPackageName = "com.examples.photos";
441 requestPolicyInstance.SetPolicy(callingPackageName, RequestPolicy::HIGH_QUALITY_MODE);
442 // It will definitely be reported for the first time
443 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 0);
444
445 requestPolicyInstance.SetPolicy(callingPackageName, RequestPolicy::HIGH_QUALITY_MODE);
446 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 1);
447 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).highQualityCount, 1);
448
449 requestPolicyInstance.SetPolicy(callingPackageName, RequestPolicy::HIGH_QUALITY_MODE);
450 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 1);
451 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).highQualityCount, 2);
452
453 requestPolicyInstance.SetPolicy(callingPackageName, RequestPolicy::BALANCE_MODE);
454 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 1);
455 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).highQualityCount, 2);
456 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).balanceQualityCount, 1);
457
458 requestPolicyInstance.SetPolicy(callingPackageName, RequestPolicy::FAST_MODE);
459 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 1);
460 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).highQualityCount, 2);
461 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).balanceQualityCount, 1);
462 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName).emergencyQualityCount, 1);
463
464 // add another caller request
465 string callingPackageName2 = "com.examples.camera";
466 requestPolicyInstance.SetPolicy(callingPackageName2, RequestPolicy::HIGH_QUALITY_MODE);
467 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 2);
468 EXPECT_EQ(requestPolicyInstance.requestCountMap_.ReadVal(callingPackageName2).highQualityCount, 1);
469
470 // Simulate scenarios exceeding 24 hours
471 requestPolicyInstance.lastReportTime_ -= (24 * 60 * 60 * 1000L + 1);
472 requestPolicyInstance.SetPolicy(callingPackageName2, RequestPolicy::FAST_MODE);
473 EXPECT_EQ(requestPolicyInstance.requestCountMap_.Size(), 0);
474
475 requestPolicyInstance.requestCountMap_.Clear();
476 MEDIA_INFO_LOG("dfx_request_policy_set_policy_002 End");
477 }
478
479 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_first_visit_001, TestSize.Level1)
480 {
481 MEDIA_INFO_LOG("dfx_first_visit_001 Start");
482 auto fileId = PrepareForFirstVisit();
483 EXPECT_GT(fileId, 0);
484
485 // sleep for 1234 milliseconds
486 this_thread::sleep_for(chrono::milliseconds(1234));
487
488 MultiStagesCaptureDfxFirstVisit &instance = MultiStagesCaptureDfxFirstVisit::GetInstance();
489 instance.Report(PHOTO_ID_FOR_TEST);
490
491 // report again, it will not report to hiview
492 instance.Report(PHOTO_ID_FOR_TEST);
493
494 MEDIA_INFO_LOG("dfx_first_visit_001 End");
495 }
496
497 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_first_visit_invalid_param_002, TestSize.Level1)
498 {
499 MEDIA_INFO_LOG("dfx_first_visit_invalid_param_002 Start");
500 auto fileId = PrepareForFirstVisit();
501 EXPECT_GT(fileId, 0);
502
503 // sleep for 1234 milliseconds
504 this_thread::sleep_for(chrono::milliseconds(1234));
505
506 MultiStagesCaptureDfxFirstVisit &instance = MultiStagesCaptureDfxFirstVisit::GetInstance();
507 // photo id is empty
508 instance.Report("");
509
510 // photo id is not exist
511 instance.Report("1");
512
513 // report success
514 instance.Report(PHOTO_ID_FOR_TEST);
515
516 MEDIA_INFO_LOG("dfx_first_visit_invalid_param_002 End");
517 }
518
519 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, dfx_trigger_ratio_001, TestSize.Level1)
520 {
521 MEDIA_INFO_LOG("dfx_trigger_ratio_001 Start");
522 MultiStagesCaptureDfxTriggerRatio &instance = MultiStagesCaptureDfxTriggerRatio::GetInstance();
523 instance.SetTrigger(MultiStagesCaptureTriggerType::AUTO);
524 // report for first time
525 EXPECT_EQ(instance.autoCount_, 0);
526
527 instance.SetTrigger(MultiStagesCaptureTriggerType::AUTO);
528 EXPECT_EQ(instance.autoCount_, 1);
529 instance.SetTrigger(MultiStagesCaptureTriggerType::AUTO);
530 EXPECT_EQ(instance.autoCount_, 2);
531 instance.SetTrigger(MultiStagesCaptureTriggerType::THIRD_PART);
532 EXPECT_EQ(instance.autoCount_, 2);
533 EXPECT_EQ(instance.thirdPartCount_, 1);
534
535 // Simulate scenarios exceeding 24 hours
536 instance.lastReportTime_ -= (24 * 60 * 60 * 1000L + 1);
537 instance.SetTrigger(MultiStagesCaptureTriggerType::THIRD_PART);
538 EXPECT_EQ(instance.autoCount_, 0);
539 EXPECT_EQ(instance.thirdPartCount_, 0);
540
541 MEDIA_INFO_LOG("dfx_trigger_ratio_001 End");
542 }
543
544 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, manager_photo_id_add_and_rmv_001, TestSize.Level1)
545 {
546 MEDIA_INFO_LOG("manager_photo_id_add_and_rmv_001 Start");
547 string photoId = "202312251533001";
548 int32_t fileId = 1;
549 MultiStagesCaptureRequestTaskManager::AddPhotoInProgress(fileId, photoId, false);
550 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::fileId2PhotoId_.at(fileId), photoId);
551 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.at(photoId)->fileId, fileId);
552 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.at(photoId)->state, PhotoState::NORMAL);
553
554 string photoId2 = "202312251533002";
555 int32_t fileId2 = 2;
556 MultiStagesCaptureRequestTaskManager::AddPhotoInProgress(fileId2, photoId2, true);
557 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::fileId2PhotoId_.at(fileId2), photoId2);
558 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.at(photoId2)->fileId, fileId2);
559 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.at(photoId2)->state, PhotoState::TRASHED);
560
561 MultiStagesCaptureRequestTaskManager::RemovePhotoInProgress(photoId, false);
562 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::fileId2PhotoId_.count(fileId), 0);
563 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.count(photoId), 0);
564
565 MultiStagesCaptureRequestTaskManager::RemovePhotoInProgress(photoId2, false);
566 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::fileId2PhotoId_.count(fileId2), 0);
567 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.count(photoId2), 0);
568
569 // remove photo id not in progress
570 string invalidPhotoId = "202312251533003";
571 MultiStagesCaptureRequestTaskManager::RemovePhotoInProgress(invalidPhotoId, false);
572 MultiStagesCaptureRequestTaskManager::RemovePhotoInProgress(invalidPhotoId, true);
573 MEDIA_INFO_LOG("manager_photo_id_add_and_rmv_001 End");
574 }
575
576 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, exif_utils_location_value_to_string_001, TestSize.Level1)
577 {
578 MEDIA_INFO_LOG("exif_utils_location_value_to_string_001 Start");
579 double latitude = 31.2592678069444;
580 EXPECT_EQ(ExifUtils::LocationValueToString(latitude), "31, 15, 33.364105");
581
582 double longitude = 121.617393493611;
583 EXPECT_EQ(ExifUtils::LocationValueToString(longitude), "121, 37, 2.616577");
584 MEDIA_INFO_LOG("exif_utils_location_value_to_string_001 End");
585 }
586
587 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, exif_utils_location_value_to_string_002, TestSize.Level1)
588 {
589 MEDIA_INFO_LOG("exif_utils_location_value_to_string_002 Start");
590 double latitude = -31.2592678069444;
591 EXPECT_EQ(ExifUtils::LocationValueToString(latitude), "31, 15, 33.364105");
592
593 double longitude = -121.617393493611;
594 EXPECT_EQ(ExifUtils::LocationValueToString(longitude), "121, 37, 2.616577");
595 MEDIA_INFO_LOG("exif_utils_location_value_to_string_002 End");
596 }
597
598 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, session_callback_on_error_001, TestSize.Level1)
599 {
600 MEDIA_INFO_LOG("session_callback_on_error_001 Start");
601 auto fileId = PrepareForFirstVisit();
602 EXPECT_GT(fileId, 0);
603
604 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
605 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
606 callback->OnError(PHOTO_ID_FOR_TEST, CameraStandard::ERROR_IMAGE_PROC_FAILED);
607 delete callback;
608
609 vector<string> columns = { PhotoColumn::PHOTO_QUALITY };
610 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::QUERY, MediaLibraryApi::API_10);
611 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
612 ASSERT_NE(g_rdbStore, nullptr);
613
614 auto resultSet = g_rdbStore->Query(cmd, columns);
615 ASSERT_NE(resultSet, nullptr);
616 ASSERT_EQ(resultSet->GoToFirstRow(), NativeRdb::E_OK);
617
618 int32_t photoQuality = GetInt32Val(PhotoColumn::PHOTO_QUALITY, resultSet);
619 EXPECT_EQ(photoQuality, static_cast<int32_t>(MultiStagesPhotoQuality::FULL));
620
621 MEDIA_INFO_LOG("session_callback_on_error_001 End");
622 }
623
624 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, session_callback_on_error_002, TestSize.Level1)
625 {
626 MEDIA_INFO_LOG("session_callback_on_error_002 Start");
627 auto fileId = PrepareForFirstVisit();
628 EXPECT_GT(fileId, 0);
629
630 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
631 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
632 callback->OnError(PHOTO_ID_FOR_TEST, CameraStandard::ERROR_IMAGE_PROC_ABNORMAL);
633
634 vector<string> columns = { PhotoColumn::PHOTO_QUALITY };
635 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::QUERY, MediaLibraryApi::API_10);
636 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
637 ASSERT_NE(g_rdbStore, nullptr);
638
639 auto resultSet = g_rdbStore->Query(cmd, columns);
640 ASSERT_NE(resultSet, nullptr);
641 ASSERT_EQ(resultSet->GoToFirstRow(), NativeRdb::E_OK);
642
643 callback->NotifyIfTempFile(resultSet, true);
644 delete callback;
645 MEDIA_INFO_LOG("session_callback_on_error_002 End");
646 }
647
648 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, deferred_proc_adapter_null_session_001, TestSize.Level1)
649 {
650 MEDIA_INFO_LOG("deferred_proc_adapter_null_session_001 Start");
651 std::shared_ptr<DeferredPhotoProcessingAdapter> deferredProcSession = make_shared<DeferredPhotoProcessingAdapter>();
652 EXPECT_NE(deferredProcSession, nullptr);
653 // test deferredProcSession_ is nullptr;
654 deferredProcSession->deferredPhotoProcSession_ = nullptr;
655
656 deferredProcSession->BeginSynchronize();
657 deferredProcSession->EndSynchronize();
658 deferredProcSession->RestoreImage(PHOTO_ID_FOR_TEST);
659 deferredProcSession->ProcessImage("com.test.demo", PHOTO_ID_FOR_TEST);
660 deferredProcSession->CancelProcessImage(PHOTO_ID_FOR_TEST);
661 MEDIA_INFO_LOG("deferred_proc_adapter_null_session_001 End");
662 }
663
664 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, normal_deferred_proc_adapter_session, TestSize.Level1)
665 {
666 MEDIA_INFO_LOG("normal_deferred_proc_adapter_session Start");
667 std::shared_ptr<DeferredPhotoProcessingAdapter> deferredProcSession = make_shared<DeferredPhotoProcessingAdapter>();
668 EXPECT_NE(deferredProcSession, nullptr);
669
670 deferredProcSession->BeginSynchronize();
671 deferredProcSession->EndSynchronize();
672 deferredProcSession->RestoreImage(PHOTO_ID_FOR_TEST);
673 deferredProcSession->ProcessImage("com.test.demo", PHOTO_ID_FOR_TEST);
674 deferredProcSession->CancelProcessImage(PHOTO_ID_FOR_TEST);
675 MEDIA_INFO_LOG("normal_deferred_proc_adapter_session End");
676 }
677
678 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, file_utils_save_file_001, TestSize.Level1)
679 {
680 MEDIA_INFO_LOG("file_utils_save_file_001 Start");
681 const string testFileName = "/data/test/test.jpg";
682 char testOutput[] = "test.jpg";
683 FileUtils::SaveImage(testFileName, (void*)testOutput, sizeof(testOutput));
684 FileUtils::SaveMovingPhotoVideo(testFileName, false, false);
685
686 EXPECT_EQ(FileUtils::IsFileExist(testFileName), true);
687 EXPECT_EQ(FileUtils::IsFileExist(testFileName + ".tmp"), false);
688 EXPECT_EQ(FileUtils::DeleteFile(testFileName), 0);
689 MEDIA_INFO_LOG("file_utils_save_file_001 End");
690 }
691
692 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, file_utils_save_file_002, TestSize.Level1)
693 {
694 MEDIA_INFO_LOG("file_utils_save_file_002 Start");
695 const string testFileName = "/data/test/test.jpg";
696 std::shared_ptr<Media::Picture> picture;
697 bool isEdited = false;
698 bool isLowQualityPicture = false;
699 auto result = FileUtils::SavePicture(testFileName,
700 picture, isEdited, isLowQualityPicture);
701
702 EXPECT_EQ(result, -1);
703 }
704
705 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, manager_add_image_001, TestSize.Level1)
706 {
707 MEDIA_INFO_LOG("manager_add_image_001 Start");
708 auto fileId = PrepareForFirstVisit();
709 EXPECT_GT(fileId, 0);
710
711 MultiStagesPhotoCaptureManager &instance = MultiStagesPhotoCaptureManager::GetInstance();
712 instance.AddImage(fileId, PHOTO_ID_FOR_TEST, 0);
713 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::fileId2PhotoId_.count(fileId), 1);
714 EXPECT_EQ(MultiStagesCaptureRequestTaskManager::photoIdInProcess_.count(PHOTO_ID_FOR_TEST), 1);
715 MEDIA_INFO_LOG("manager_add_image_001 End");
716 }
717
718 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdatePhotoQuality_001, TestSize.Level1)
719 {
720 MEDIA_INFO_LOG("UpdatePhotoQuality_001 Start");
721 auto fileId = PrepareForFirstVisit();
722 EXPECT_GT(fileId, 0);
723
724 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
725 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
726 auto result = callback->UpdatePhotoQuality(PHOTO_ID_FOR_TEST);
727 EXPECT_EQ(result, E_OK);
728 delete callback;
729
730 vector<string> columns = { PhotoColumn::PHOTO_QUALITY, PhotoColumn::PHOTO_DIRTY, PhotoColumn::PHOTO_IS_TEMP };
731 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::QUERY, MediaLibraryApi::API_10);
732 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
733 ASSERT_NE(g_rdbStore, nullptr);
734
735 auto resultSet = g_rdbStore->Query(cmd, columns);
736 ASSERT_NE(resultSet, nullptr);
737 ASSERT_EQ(resultSet->GoToFirstRow(), NativeRdb::E_OK);
738
739 int32_t photoQuality = GetInt32Val(PhotoColumn::PHOTO_QUALITY, resultSet);
740 EXPECT_EQ(photoQuality, static_cast<int32_t>(MultiStagesPhotoQuality::FULL));
741 EXPECT_EQ(GetInt32Val(PhotoColumn::PHOTO_DIRTY, resultSet), 1);
742 EXPECT_EQ(GetInt32Val(PhotoColumn::PHOTO_IS_TEMP, resultSet), 0);
743
744 MEDIA_INFO_LOG("UpdatePhotoQuality_001 End");
745 }
746
747 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdateCEAvailable_test, TestSize.Level1)
748 {
749 MEDIA_INFO_LOG("UpdateCEAvailable_test Start");
750 auto fileId = PrepareForFirstVisit();
751 EXPECT_GT(fileId, 0);
752
753 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
754 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
755 vector<string> columns = { PhotoColumn::MEDIA_NAME, PhotoColumn::MEDIA_FILE_PATH, PhotoColumn::MEDIA_TYPE };
756 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::QUERY, MediaLibraryApi::API_10);
757 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, to_string(fileId));
758
759 auto resultSet = g_rdbStore->Query(cmd, columns);
760 ASSERT_NE(resultSet, nullptr);
761
762 callback->NotifyIfTempFile(resultSet);
763 callback->UpdateCEAvailable(to_string(fileId), 1);
764 callback->UpdateCEAvailable(to_string(fileId), 2);
765 callback->OnError(PHOTO_ID_FOR_TEST, CameraStandard::ERROR_SESSION_SYNC_NEEDED);
766 callback->OnError(PHOTO_ID_FOR_TEST, CameraStandard::ERROR_IMAGE_PROC_INTERRUPTED);
767 callback->OnStateChanged(CameraStandard::SESSION_STATE_RUNNALBE);
768 delete callback;
769 MEDIA_INFO_LOG("UpdateCEAvailable_test End");
770 }
771
772 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, ProcessAndSaveHighQualityImage_test_001, TestSize.Level1)
773 {
774 MEDIA_INFO_LOG("ProcessAndSaveHighQualityImage_test_001 Start");
775 auto fileId = PrepareForFirstVisit();
776 EXPECT_GT(fileId, 0);
777
778 MultiStagesCaptureDeferredPhotoProcSessionCallback * callback =
779 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
780 sptr<SurfaceBuffer> surfaceBuffer = SurfaceBuffer::Create();
781 std::shared_ptr<CameraStandard::PictureIntf> picture = std::make_shared<CameraStandard::PictureAdapter>();
782 picture->Create(surfaceBuffer);
783
784 callback->OnProcessImageDone(PHOTO_ID_FOR_TEST, picture, true);
785 callback->OnProcessImageDone(to_string(fileId), picture, false);
786
787 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE, MediaLibraryApi::API_10);
788 ValuesBucket values;
789 values.Put(PhotoColumn::PHOTO_IS_TEMP, 1);
790 cmd.SetValueBucket(values);
791 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, fileId);
792 EXPECT_GT(MediaLibraryPhotoOperations::Update(cmd), E_OK);
793
794 callback->OnProcessImageDone(PHOTO_ID_FOR_TEST, picture, false);
795 callback->GetCommandByImageId(PHOTO_ID_FOR_TEST, cmd);
796 callback->GetCommandByImageId("2011/11/11", cmd);
797
798 delete callback;
799 MEDIA_INFO_LOG("ProcessAndSaveHighQualityImage_test_001 End");
800 }
801
802 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdateHighQualityPictureInfo_test, TestSize.Level1)
803 {
804 MEDIA_INFO_LOG("UpdateHighQualityPictureInfo_test Start");
805 auto fileId = PrepareForFirstVisit();
806 EXPECT_GT(fileId, 0);
807
808 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
809 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
810
811 callback->UpdateHighQualityPictureInfo(to_string(fileId), true);
812 callback->UpdateHighQualityPictureInfo(to_string(fileId), false);
813 delete callback;
814 MEDIA_INFO_LOG("UpdateHighQualityPictureInfo_test End");
815 }
816
817 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, OnDeliveryLowQualityImage_test, TestSize.Level1)
818 {
819 MEDIA_INFO_LOG("OnDeliveryLowQualityImage_test Start");
820 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
821 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
822
823 auto fileId = PrepareForFirstVisit();
824 EXPECT_GT(fileId, 0);
825
826 sptr<SurfaceBuffer> surfaceBuffer = SurfaceBuffer::Create();
827 std::shared_ptr<CameraStandard::PictureIntf> picture = std::make_shared<CameraStandard::PictureAdapter>();
828 callback->OnDeliveryLowQualityImage(to_string(fileId), picture);
829 picture->Create(surfaceBuffer);
830 callback->OnDeliveryLowQualityImage(to_string(fileId), picture);
831 callback->OnDeliveryLowQualityImage("fileId", picture);
832 delete callback;
833 MEDIA_INFO_LOG("OnDeliveryLowQualityImage_test End");
834 }
835
836 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, OnProcessImageDone_test_002, TestSize.Level1)
837 {
838 MEDIA_INFO_LOG("OnProcessImageDone_test_002 Start");
839 MultiStagesCaptureDeferredPhotoProcSessionCallback *callback =
840 new MultiStagesCaptureDeferredPhotoProcSessionCallback();
841
842 auto fileId = PrepareForFirstVisit();
843 EXPECT_GT(fileId, 0);
844
845 uint8_t addr = 1;
846 long bytes = 8;
847 MultiStagesCaptureRequestTaskManager::AddPhotoInProgress(1, to_string(fileId), true);
848 MultiStagesCaptureRequestTaskManager::AddPhotoInProgress(2, PHOTO_ID_FOR_TEST, false);
849 callback->OnProcessImageDone(to_string(fileId), &addr, bytes, true);
850 callback->OnProcessImageDone(PHOTO_ID_FOR_TEST, &addr, bytes, false);
851
852 ValuesBucket values;
853 MediaLibraryCommand cmd(OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE, MediaLibraryApi::API_10);
854 values.Put(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::MOVING_PHOTO));
855 cmd.SetValueBucket(values);
856 cmd.GetAbsRdbPredicates()->EqualTo(PhotoColumn::MEDIA_ID, fileId);
857 EXPECT_GT(MediaLibraryPhotoOperations::Update(cmd), E_OK);
858
859 callback->OnProcessImageDone(to_string(fileId), &addr, bytes, false);
860 delete callback;
861 MEDIA_INFO_LOG("OnProcessImageDone_test_002 End");
862 }
863
864 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdateDbInfoTest_normal_001, TestSize.Level1)
865 {
866 // test 1 PhotoColumn::PHOTO_SUBTYPE + PhotoSubType::MOVING_PHOTO
867 MEDIA_INFO_LOG("UpdateDbInfoTest_normal_001 Start");
868 auto fileId = PrepareForFirstVisit();
869 EXPECT_GT(fileId, 0);
870
871 ValuesBucket bucket;
872 MultiStagesPhotoCaptureManager &instance = MultiStagesPhotoCaptureManager::GetInstance();
873 MediaLibraryCommand cmd (OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE);
874 bucket.PutInt(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::MOVING_PHOTO));
875 cmd.SetValueBucket(bucket);
876
877 auto ret = instance.UpdateDbInfo(cmd);
878 EXPECT_EQ(ret, 0);
879 MEDIA_INFO_LOG("UpdateDbInfoTest_normal_001 End");
880 }
881
882 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdateDbInfoTest_normal_002, TestSize.Level1)
883 {
884 MEDIA_INFO_LOG("UpdateDbInfoTest_normal_002 Start");
885 // test 2 PhotoColumn::PHOTO_SUBTYPE + !PhotoSubType::MOVING_PHOTO
886 auto fileId = PrepareForFirstVisit();
887 EXPECT_GT(fileId, 0);
888
889 ValuesBucket bucket;
890 MultiStagesPhotoCaptureManager &instance = MultiStagesPhotoCaptureManager::GetInstance();
891 MediaLibraryCommand cmd (OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE);
892 bucket.PutInt(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::CAMERA));
893 cmd.SetValueBucket(bucket);
894
895 auto ret = instance.UpdateDbInfo(cmd);
896 EXPECT_EQ(ret, 0);
897 MEDIA_INFO_LOG("UpdateDbInfoTest_normal_002 End");
898 }
899
900 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdateDbInfoTest_empty_bucket_003, TestSize.Level1)
901 {
902 MEDIA_INFO_LOG("UpdateDbInfoTest_empty_bucket_003 Start");
903 // test3 empty bucket
904 auto fileId = PrepareForFirstVisit();
905 EXPECT_GT(fileId, 0);
906
907 ValuesBucket bucket;
908 MultiStagesPhotoCaptureManager &instance = MultiStagesPhotoCaptureManager::GetInstance();
909 MediaLibraryCommand cmd (OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE);
910 cmd.SetValueBucket(bucket);
911
912 auto ret = instance.UpdateDbInfo(cmd);
913 EXPECT_EQ(ret, 0);
914 MEDIA_INFO_LOG("UpdateDbInfoTest_empty_bucket_003 End");
915 }
916
917 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, UpdateDbInfoTest_nodata_004, TestSize.Level1)
918 {
919 MEDIA_INFO_LOG("UpdateDbInfoTest_nodata_004 Start");
920 // no data
921 ValuesBucket bucket;
922 MultiStagesPhotoCaptureManager &instance = MultiStagesPhotoCaptureManager::GetInstance();
923 MediaLibraryCommand cmd (OperationObject::FILESYSTEM_PHOTO, OperationType::UPDATE);
924 bucket.PutInt(PhotoColumn::PHOTO_SUBTYPE, static_cast<int32_t>(PhotoSubType::MOVING_PHOTO));
925 cmd.SetValueBucket(bucket);
926
927 auto ret = instance.UpdateDbInfo(cmd);
928 EXPECT_NE(ret, 0);
929 MEDIA_INFO_LOG("UpdateDbInfoTest_nodata_004 End");
930 }
931
932 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, WriteGpsExifInfo_test_001, TestSize.Level1)
933 {
934 MEDIA_INFO_LOG("WriteGpsExifInfo_test_001 start");
935
936 string path = "/valid/path";
937 double longitude = 0.0;
938 double latitude = 0.0;
939 auto ret = ExifUtils::WriteGpsExifInfo(path, longitude, latitude);
940 EXPECT_EQ(ret, -1);
941
942 MEDIA_INFO_LOG("WriteGpsExifInfo_test_001 end");
943 }
944
945 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, WriteGpsExifInfo_test_002, TestSize.Level1)
946 {
947 MEDIA_INFO_LOG("WriteGpsExifInfo_test_002 start");
948 string path = "/data/test/res/no_gps.jpg";
949 double longitude = 12.334455f;
950 double latitude = 35.667788f;
951 auto ret = ExifUtils::WriteGpsExifInfo(path, longitude, latitude);
952 EXPECT_EQ(ret, E_OK);
953
954 // check result
955 uint32_t errorCode = 0;
956 SourceOptions opts;
957 std::unique_ptr<ImageSource> imageSource = ImageSource::CreateImageSource(path, opts, errorCode);
958 ASSERT_NE(imageSource, nullptr);
959
960 string propertyStr;
961 string refStr;
962 auto err = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LONGITUDE, propertyStr);
963 auto refErr = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LONGITUDE_REF, refStr);
964 EXPECT_EQ(err, 0);
965 EXPECT_EQ(refErr, 0);
966 EXPECT_NE(propertyStr, "");
967 EXPECT_EQ(refStr, "E");
968
969 err = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LATITUDE, propertyStr);
970 refErr = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LATITUDE_REF, refStr);
971 EXPECT_EQ(err, 0);
972 EXPECT_EQ(refErr, 0);
973 EXPECT_NE(propertyStr, "");
974 EXPECT_EQ(refStr, "N");
975
976 MEDIA_INFO_LOG("WriteGpsExifInfo_test_002 end");
977 }
978
979 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, WriteGpsExifInfo_test_003, TestSize.Level1)
980 {
981 MEDIA_INFO_LOG("WriteGpsExifInfo_test_003 start");
982 string path = "/data/test/res/no_gps.jpg";
983 double longitude = -120.334455f;
984 double latitude = -33.667788f;
985 auto ret = ExifUtils::WriteGpsExifInfo(path, longitude, latitude);
986 EXPECT_EQ(ret, E_OK);
987
988 // check result
989 uint32_t errorCode = 0;
990 SourceOptions opts;
991 std::unique_ptr<ImageSource> imageSource = ImageSource::CreateImageSource(path, opts, errorCode);
992 ASSERT_NE(imageSource, nullptr);
993
994 string propertyStr;
995 string refStr;
996 auto err = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LONGITUDE, propertyStr);
997 auto refErr = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LONGITUDE_REF, refStr);
998 EXPECT_EQ(err, 0);
999 EXPECT_EQ(refErr, 0);
1000 EXPECT_NE(propertyStr, "");
1001 EXPECT_EQ(refStr, "W");
1002
1003 err = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LATITUDE, propertyStr);
1004 refErr = imageSource->GetImagePropertyString(0, PHOTO_DATA_IMAGE_GPS_LATITUDE_REF, refStr);
1005 EXPECT_EQ(err, 0);
1006 EXPECT_EQ(refErr, 0);
1007 EXPECT_NE(propertyStr, "");
1008 EXPECT_EQ(refStr, "S");
1009
1010 MEDIA_INFO_LOG("WriteGpsExifInfo_test_003 end");
1011 }
1012
1013 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, IsPhotoDeleted_test_001, TestSize.Level1)
1014 {
1015 MultiStagesPhotoCaptureManager& manager = MultiStagesPhotoCaptureManager::GetInstance();
1016 std::string photoId;
1017 auto ret = manager.IsPhotoDeleted(photoId);
1018 EXPECT_EQ(ret, false);
1019 }
1020
1021 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, IsPhotoDeleted_test_002, TestSize.Level1)
1022 {
1023 MultiStagesPhotoCaptureManager& manager = MultiStagesPhotoCaptureManager::GetInstance();
1024 std::string photoId = "abc";
1025 auto ret = manager.IsPhotoDeleted(photoId);
1026 EXPECT_EQ(ret, false);
1027 }
1028
1029 HWTEST_F(MediaLibraryMultiStagesPhotoCaptureTest, BeginSynchronize_test_001, TestSize.Level1)
1030 {
1031 DeferredPhotoProcessingAdapter adapter;
1032 EXPECT_NE(adapter.deferredPhotoProcSession_, nullptr);
1033 adapter.BeginSynchronize();
1034 }
1035 }
1036 }