From 4044de0466188464e04bb30088316cfe93fae3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=9F=E9=92=B0?= Date: Fri, 2 Aug 2024 10:20:06 +0800 Subject: [PATCH 01/40] =?UTF-8?q?=E8=A7=A3=E5=86=B3fuzz=E7=9A=84asan?= =?UTF-8?q?=E6=8F=92=E6=A1=A9=E7=BC=96=E8=AF=91=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张晟钰 --- test/unittest/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 004bfe13..b8fec90c 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -400,6 +400,7 @@ ohos_unittest("js_file_access_ext_ability_test") { ] deps = [ + "${user_file_service_path}/interfaces/inner_api/file_access:file_access_extension_ability_kit", "//third_party/googletest:gmock_main", "//third_party/googletest:gtest_main", ] -- Gitee From 44114921111319085806f4870a69895ba6484445 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Tue, 30 Jul 2024 20:28:04 +0800 Subject: [PATCH 02/40] fix:log Signed-off-by: zhouoaoteng --- .../file_access/src/file_access_ext_proxy.cpp | 4 +- interfaces/kits/picker/picker.js | 72 ++++++++++++++----- .../kits/picker/src/modal_ui_callback.cpp | 3 +- .../kits/picker/src/picker_n_exporter.cpp | 3 +- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp index d6efb180..c784b497 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp @@ -572,8 +572,8 @@ static int ReadFileFilterResults(MessageParcel &reply, SharedMemoryInfo &memInfo return ERR_OK; } -int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, - SharedMemoryInfo &memInfo) +int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, + const FileFilter &filter, SharedMemoryInfo &memInfo) { UserAccessTracer trace; trace.Start("ListFile"); diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index 3ff7d7dd..b2f7af6e 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -21,7 +21,7 @@ const PhotoViewMIMETypes = { VIDEO_TYPE: 'video/*', IMAGE_VIDEO_TYPE: '*/*', INVALID_TYPE: '' -} +}; const DocumentSelectMode = { FILE: 0, @@ -50,7 +50,7 @@ const ErrCode = { RESULT_ERROR: 13900042, NAME_TOO_LONG: 13900030, CONTEXT_NO_EXIST: 16000011, -} +}; const ERRCODE_MAP = new Map([ [ErrCode.INVALID_ARGS, 'Invalid argument'], @@ -70,7 +70,7 @@ const ACTION = { SELECT_ACTION_MODAL: 'ohos.want.action.OPEN_FILE_SERVICE', SAVE_ACTION: 'ohos.want.action.CREATE_FILE', SAVE_ACTION_MODAL: 'ohos.want.action.CREATE_FILE_SERVICE', -} +}; const CREATE_FILE_NAME_LENGTH_LIMIT = 256; const ARGS_ZERO = 0; @@ -78,6 +78,7 @@ const ARGS_ONE = 1; const ARGS_TWO = 2; const RESULT_CODE_ERROR = -1; const RESULT_CODE_OK = 0; +const FILENAME_LENGTH = 3; /* * UTF-8字符编码数值对应的存储长度: @@ -109,7 +110,6 @@ function strSizeUTF8(str) { function checkArguments(args) { let checkArgumentsResult = undefined; - if (args.length === ARGS_TWO && typeof args[ARGS_ONE] !== 'function') { checkArgumentsResult = getErr(ErrCode.INVALID_ARGS); } @@ -122,13 +122,15 @@ function checkArguments(args) { } } - if (option.newFileNames !== undefined && option.newFileNames.length > 0) { - for (let i = 0; i < option.newFileNames.length; i++) { - let value = option.newFileNames[i]; - if (strSizeUTF8(value) >= CREATE_FILE_NAME_LENGTH_LIMIT) { - console.log('[picker] checkArguments Invalid name: ' + value); - checkArgumentsResult = getErr(ErrCode.NAME_TOO_LONG); - } + if (option.newFileNames === undefined || option.newFileNames.length <= 0) { + return checkArgumentsResult; + } + + for (let i = 0; i < option.newFileNames.length; i++) { + let value = option.newFileNames[i]; + if (strSizeUTF8(value) >= CREATE_FILE_NAME_LENGTH_LIMIT) { + console.log('[picker] checkArguments Invalid name: ' + value); + checkArgumentsResult = getErr(ErrCode.NAME_TOO_LONG); } } } @@ -165,6 +167,32 @@ function parsePhotoPickerSelectOption(args) { return config; } +function anonymousPathArray(geturi) { + let anonymousPathArrays = []; + let anonymousPath = ''; + if (geturi === undefined) { + return anonymousPathArrays; + } + for (let i = 0; i < geturi.length; ++i) { + let lastSlashIndex = geturi[i].lastIndexOf('/'); + if (lastSlashIndex === -1) { + anonymousPathArrays.push(geturi[i]); + } else { + let dirPath = geturi[i].substring(0, lastSlashIndex + 1); + let fileName = geturi[i].substring(lastSlashIndex + 1); + if (fileName.length <= 0) { + anonymousPath = '******'; + } else { + let lastLetter = fileName.slice(-1); + let maskedName = '******' + lastLetter; + anonymousPath = dirPath + maskedName; + } + anonymousPathArrays.push(anonymousPath); + } + } + return anonymousPathArrays; +} + function getPhotoPickerSelectResult(args) { let selectResult = { error: undefined, @@ -227,7 +255,7 @@ async function photoPickerSelect(...args) { } else { reject(photoSelectResult.error); } - }) + }); } catch (error) { console.error('[picker] photo select error: ' + error); } @@ -303,7 +331,9 @@ function getDocumentPickerSelectResult(args) { selectResult.data = []; selectResult.error = args.resultCode; } - console.log('[picker] document select selectResult: ' + JSON.stringify(selectResult)); + + console.log('[picker] document select selectResult: : errorcode is = ' + selectResult.error + + ', selecturi is = ' + anonymousPathArray(selectResult.data)); return selectResult; } @@ -340,7 +370,6 @@ async function documentPickerSelect(...args) { } catch (paramError) { console.error('[picker] DocumentSelect paramError: ' + JSON.stringify(paramError)); } - console.log('[picker] DocumentSelect result: ' + JSON.stringify(documentSelectResult)); selectResult = getDocumentPickerSelectResult(documentSelectResult); return sendResult(args, selectResult); } @@ -394,12 +423,17 @@ function getAudioPickerSelectResult(args) { if (args.uriArr) { selectResult.data = args.uriArr; selectResult.error = args.resultCode; + } else { + selectResult.data = []; + selectResult.error = args.resultCode; } } else if (args.resultCode === RESULT_CODE_ERROR) { selectResult.data = []; selectResult.error = args.resultCode; } - console.log('[picker] getAudioPickerSelectResult selectResult: ' + JSON.stringify(selectResult)); + + console.log('[picker] getAudioPickerSelectResult selectResult: errorcode is = ' + selectResult.error + + ', selecturi is = ' + anonymousPathArray(selectResult.data)); return selectResult; } @@ -427,7 +461,9 @@ function getDocumentPickerSaveResult(args) { saveResult.data = []; saveResult.error = args.resultCode; } - console.log('[picker] getDocumentPickerSaveResult saveResult: ' + JSON.stringify(saveResult)); + + console.log('[picker] getDocumentPickerSaveResult saveResult: errorcode is = ' + saveResult.error + + ', selecturi is = ' + anonymousPathArray(saveResult.data) + ', usersavesuffix = ' + saveResult.suffix); return saveResult; } @@ -491,7 +527,6 @@ async function documentPickerSave(...args) { documentSaveResult = await modalPicker(args, documentSaveContext, documentSaveConfig); saveResult = getDocumentPickerSaveResult(documentSaveResult); this.suffixIndex = saveResult.suffix; - console.log('[picker] download save result: ' + JSON.stringify(saveResult)); return sendResult(args, saveResult); } @@ -502,6 +537,7 @@ function getSelectedSuffixIndex() { console.log('[picker] Get Selected Suffix Index end: ' + index); return index; } + async function sendResult(args, result) { try { if (result === undefined) { @@ -641,4 +677,4 @@ export default { PhotoViewPicker : PhotoViewPicker, DocumentViewPicker: DocumentViewPicker, AudioViewPicker : AudioViewPicker, -} +}; diff --git a/interfaces/kits/picker/src/modal_ui_callback.cpp b/interfaces/kits/picker/src/modal_ui_callback.cpp index f1f1564e..7193d1c3 100644 --- a/interfaces/kits/picker/src/modal_ui_callback.cpp +++ b/interfaces/kits/picker/src/modal_ui_callback.cpp @@ -46,8 +46,7 @@ void ModalUICallback::OnError(int32_t code, const std::string& name, const std:: void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Want &result) { - HILOG_INFO("modal picker: OnResultForModal enter. resultCode is %{public}d, %{public}s", - resultCode, result.ToString().c_str()); + HILOG_INFO("modal picker: OnResultForModal enter. resultCode is %{public}d,", resultCode); pickerCallBack_->resultCode = resultCode; pickerCallBack_->want = result; pickerCallBack_->ready = true; diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index 168193c2..f0e03c14 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -106,8 +106,7 @@ static napi_value MakeResultWithPickerCallBack(napi_env env, std::shared_ptrresultCode; - HILOG_INFO("modal picker: resCode is %{public}d. want is %{public}s.", - resCode, pickerCallBack->want.ToString().c_str()); + HILOG_INFO("modal picker: resCode is %{public}d.", resCode); napi_value resultCode = nullptr; napi_create_int32(env, resCode, &resultCode); status = napi_set_named_property(env, result, "resultCode", resultCode); -- Gitee From bdd0e5ba7baa4fd2506f9c1285bc08c1f15e111c Mon Sep 17 00:00:00 2001 From: wangpggg Date: Tue, 6 Aug 2024 09:29:12 +0800 Subject: [PATCH 03/40] add ut to cover branches Signed-off-by: wangpeng --- test/unittest/BUILD.gn | 2 +- .../js_file_access_ext_ability_other_test.cpp | 482 ++++++++++++++++++ .../js_file_access_ext_ability_test.cpp | 3 +- 3 files changed, 485 insertions(+), 2 deletions(-) create mode 100644 test/unittest/js_file_access_ext_ability_other_test.cpp diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index b8fec90c..f844c853 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -384,6 +384,7 @@ ohos_unittest("js_file_access_ext_ability_test") { "${commonlibrary_path}/c_utils/base/include", "${file_api_path}/utils/filemgmt_libn/include", "${user_file_service_path}/interfaces/inner_api/file_access/include", + "${user_file_service_path}/interfaces/inner_api/file_access/src", "${user_file_service_path}/interfaces/kits/js/src/common", "${user_file_service_path}/services/native/file_access_service/include", "${user_file_service_path}/utils", @@ -393,7 +394,6 @@ ohos_unittest("js_file_access_ext_ability_test") { sources = [ "${user_file_service_path}/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp", - "${user_file_service_path}/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp", "${user_file_service_path}/interfaces/inner_api/file_access/src/napi_common_fileaccess.cpp", "js_file_access_ext_ability_test.cpp", "mock/js_native_api_mock.cpp", diff --git a/test/unittest/js_file_access_ext_ability_other_test.cpp b/test/unittest/js_file_access_ext_ability_other_test.cpp new file mode 100644 index 00000000..9230e98a --- /dev/null +++ b/test/unittest/js_file_access_ext_ability_other_test.cpp @@ -0,0 +1,482 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveFile_0000 + * @tc.name: js_file_access_ext_ability_MoveFile_0000 + * @tc.desc: Test function of MoveFile interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveFile_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveFile_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceFile(""); + Uri targetParent(""); + string fileName(""); + Uri newFile(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveFile_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveFile_0001 + * @tc.name: js_file_access_ext_ability_MoveFile_0001 + * @tc.desc: Test function of MoveFile interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveFile_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveFile_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + string fileName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取srcUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取dstUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取name为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveFile_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveFile_0002 + * @tc.name: js_file_access_ext_ability_MoveFile_0002 + * @tc.desc: Test function of MoveFile interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveFile_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveFile_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + string fileName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(Return(napi_ok)); + result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveFile_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveFile_0003 + * @tc.name: js_file_access_ext_ability_MoveFile_0003 + * @tc.desc: Test function of MoveFile interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveFile_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveFile_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + string fileName(""); + Uri newFile(""); + string path = "test"; + ability->jsObj_ = make_shared(); + + // 模拟MoveFile调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(path.length()), Return(napi_ok))) + .WillOnce(DoAll(SetArrayArgument(path.begin(), path.end()), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->MoveFile(sourceFile, targetParent, fileName, newFile); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveFile_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveItem_0000 + * @tc.name: js_file_access_ext_ability_MoveItem_0000 + * @tc.desc: Test function of MoveItem interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveItem_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveItem_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceFile(""); + Uri targetParent(""); + vector moveResult; + bool force = false; + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->MoveItem(sourceFile, targetParent, moveResult, force); + EXPECT_EQ(result, EXCEPTION); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveItem_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveItem_0001 + * @tc.name: js_file_access_ext_ability_MoveItem_0001 + * @tc.desc: Test function of MoveItem interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveItem_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveItem_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + vector moveResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取srcNativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->MoveItem(sourceFile, targetParent, moveResult, force); + EXPECT_EQ(result, EXCEPTION); + + // 模拟获取dstNativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->MoveItem(sourceFile, targetParent, moveResult, force); + EXPECT_EQ(result, EXCEPTION); + + // 模拟获取forceMove为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->MoveItem(sourceFile, targetParent, moveResult, force); + EXPECT_EQ(result, EXCEPTION); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveItem_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MoveItem_0002 + * @tc.name: js_file_access_ext_ability_MoveItem_0002 + * @tc.desc: Test function of MoveItem interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MoveItem_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MoveItem_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + vector moveResult; + bool force = false; + string path = "test"; + ability->jsObj_ = make_shared(); + + // 模拟MoveItem调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + auto result = ability->MoveItem(sourceFile, targetParent, moveResult, force); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MoveItem_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_GetRootInfo_0000 + * @tc.name: js_file_access_ext_ability_GetRootInfo_0000 + * @tc.desc: Test function of GetRootInfo interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetRootInfo_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_GetRootInfo_0000"; + try { + EXPECT_NE(ability, nullptr); + napi_env env = nullptr; + napi_value nativeRootInfo = {}; + RootInfo rootInfo; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->GetRootInfo(env, nativeRootInfo, rootInfo); + EXPECT_EQ(result, napi_generic_failure); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + result = ability->GetRootInfo(env, nativeRootInfo, rootInfo); + EXPECT_EQ(result, napi_generic_failure); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_invalid_arg)); + result = ability->GetRootInfo(env, nativeRootInfo, rootInfo); + EXPECT_EQ(result, napi_generic_failure); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_invalid_arg)); + result = ability->GetRootInfo(env, nativeRootInfo, rootInfo); + EXPECT_EQ(result, napi_generic_failure); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetRootInfo_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_GetRootInfo_0001 + * @tc.name: js_file_access_ext_ability_GetRootInfo_0001 + * @tc.desc: Test function of GetRootInfo interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetRootInfo_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_GetRootInfo_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_env env = nullptr; + napi_value nativeRootInfo = {}; + RootInfo rootInfo; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + auto result = ability->GetRootInfo(env, nativeRootInfo, rootInfo); + EXPECT_EQ(result, napi_generic_failure); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + result = ability->GetRootInfo(env, nativeRootInfo, rootInfo); + EXPECT_EQ(result, napi_ok); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetRootInfo_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_ConstructQueryArg_0001 + * @tc.name: js_file_access_ext_ability_ConstructQueryArg_0001 + * @tc.desc: Test function of ConstructQueryArg interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ConstructQueryArg_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_ConstructQueryArg_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value argv[2] = {}; + size_t argc = 0; + Uri uri(""); + vector columns; + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->ConstructQueryArg(env, argv, argc, uri, columns); + EXPECT_EQ(result, napi_generic_failure); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->ConstructQueryArg(env, argv, argc, uri, columns); + EXPECT_EQ(result, napi_generic_failure); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + result = ability->ConstructQueryArg(env, argv, argc, uri, columns); + EXPECT_EQ(result, napi_ok); + + columns.emplace_back("test"); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + result = ability->ConstructQueryArg(env, argv, argc, uri, columns); + EXPECT_EQ(result, napi_generic_failure); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ConstructQueryArg_0001"; +} \ No newline at end of file diff --git a/test/unittest/js_file_access_ext_ability_test.cpp b/test/unittest/js_file_access_ext_ability_test.cpp index bcb52230..51d830c8 100644 --- a/test/unittest/js_file_access_ext_ability_test.cpp +++ b/test/unittest/js_file_access_ext_ability_test.cpp @@ -25,7 +25,7 @@ #include "js_native_api_types.h" #include "native_reference_mock.h" -constexpr int EXCEPTION = -1; +#include "js_file_access_ext_ability.cpp" namespace OHOS::FileAccessFwk { using namespace std; @@ -1951,4 +1951,5 @@ HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Rename_0003, tes } #include "js_file_access_ext_ability_ex_test.cpp" +#include "js_file_access_ext_ability_other_test.cpp" } \ No newline at end of file -- Gitee From 1a9f9860082c9cea89524eafb5f5aaabbc57f0bc Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Sat, 3 Aug 2024 15:43:36 +0800 Subject: [PATCH 04/40] fix:crash Signed-off-by: zhouoaoteng --- .../include/file_access_service.h | 1 + .../file_access_service/src/file_access_service.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/services/native/file_access_service/include/file_access_service.h b/services/native/file_access_service/include/file_access_service.h index 5d4984c2..8822896b 100644 --- a/services/native/file_access_service/include/file_access_service.h +++ b/services/native/file_access_service/include/file_access_service.h @@ -259,6 +259,7 @@ private: int32_t OperateObsNode(Uri &uri, bool notifyForDescendants, uint32_t code, const std::shared_ptr &info); void CleanRelativeObserver(const sptr &observer); + std::vector GetUriList(uint32_t code); void SendListNotify(std::string uri, NotifyType notifyType, const std::vector &list); void RemoveRelations(std::string &uriStr, std::shared_ptr obsNode); int FindUri(const std::string &uriStr, std::shared_ptr &outObsNode); diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 526a54f9..0ce00c63 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -245,15 +245,26 @@ void FileAccessService::CleanRelativeObserver(const sptr &o uint32_t code = obsManager_.getId([obsContext](const shared_ptr &afterContext) { return obsContext->EqualTo(afterContext); }); + std::vector uriLists = GetUriList(code); + for (int i = 0; i < uriLists.size(); ++i) { + UnregisterNotify(uriLists[i], observer); + } +} + +std::vector FileAccessService::GetUriList(uint32_t code) +{ + lock_guard lock(nodeMutex_); + std::vector uriList; for (auto pair : relationshipMap_) { auto codeList = pair.second->obsCodeList_; auto haveCodeIter = find_if(codeList.begin(), codeList.end(), [code](const uint32_t &listCode) { return code == listCode; }); if (haveCodeIter != codeList.end()) { Uri uri(pair.first); - UnregisterNotify(uri, observer); + uriList.push_back(uri); } } + return uriList; } static void convertUris(Uri uri, std::vector &uris) -- Gitee From dd20cc314dec3f29a19f42ac25280bd4bc5103c4 Mon Sep 17 00:00:00 2001 From: wangpggg Date: Wed, 7 Aug 2024 14:54:19 +0800 Subject: [PATCH 05/40] add ut to cover branches Signed-off-by: wangpeng --- .../js_file_access_ext_ability_other_test.cpp | 462 ++++++++++++++++++ test/unittest/mock/assistant.h | 7 + test/unittest/mock/js_native_api_mock.cpp | 17 + 3 files changed, 486 insertions(+) diff --git a/test/unittest/js_file_access_ext_ability_other_test.cpp b/test/unittest/js_file_access_ext_ability_other_test.cpp index 9230e98a..5bdc9777 100644 --- a/test/unittest/js_file_access_ext_ability_other_test.cpp +++ b/test/unittest/js_file_access_ext_ability_other_test.cpp @@ -479,4 +479,466 @@ HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ConstructQueryAr GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ConstructQueryArg_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StartWatcher_0000 + * @tc.name: js_file_access_ext_ability_StartWatcher_0000 + * @tc.desc: Test function of StartWatcher interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StartWatcher_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StartWatcher_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri uri(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->StartWatcher(uri); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StartWatcher_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StartWatcher_0001 + * @tc.name: js_file_access_ext_ability_StartWatcher_0001 + * @tc.desc: Test function of StartWatcher interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StartWatcher_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StartWatcher_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取nativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->StartWatcher(uri); + EXPECT_EQ(result, false); + + // 模拟创建FuncCallback失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_function(_, _, _, _, _, _)).WillOnce(Return(napi_ok)); + result = ability->StartWatcher(uri); + EXPECT_EQ(result, false); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StartWatcher_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StartWatcher_0002 + * @tc.name: js_file_access_ext_ability_StartWatcher_0002 + * @tc.desc: Test function of StartWatcher interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StartWatcher_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StartWatcher_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取ret失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->StartWatcher(uri); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StartWatcher_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StartWatcher_0003 + * @tc.name: js_file_access_ext_ability_StartWatcher_0003 + * @tc.desc: Test function of StartWatcher interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StartWatcher_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StartWatcher_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + string path = "test"; + ability->jsObj_ = make_shared(); + + // 模拟StartWatcher调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + auto result = ability->StartWatcher(uri); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StartWatcher_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StopWatcher_0000 + * @tc.name: js_file_access_ext_ability_StopWatcher_0000 + * @tc.desc: Test function of StopWatcher interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StopWatcher_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StopWatcher_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri uri(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->StopWatcher(uri); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StopWatcher_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StopWatcher_0001 + * @tc.name: js_file_access_ext_ability_StopWatcher_0001 + * @tc.desc: Test function of StopWatcher interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StopWatcher_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StopWatcher_0001"; + try { + EXPECT_NE(ability, nullptr); + Uri uri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取nativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->StopWatcher(uri); + EXPECT_EQ(result, false); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StopWatcher_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StopWatcher_0002 + * @tc.name: js_file_access_ext_ability_StopWatcher_0002 + * @tc.desc: Test function of StopWatcher interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StopWatcher_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StopWatcher_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取ret失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->StopWatcher(uri); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StopWatcher_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_StopWatcher_0003 + * @tc.name: js_file_access_ext_ability_StopWatcher_0003 + * @tc.desc: Test function of StopWatcher interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StopWatcher_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_StopWatcher_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + string path = "test"; + ability->jsObj_ = make_shared(); + + // 模拟StopWatcher调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + auto result = ability->StopWatcher(uri); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StopWatcher_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_FuncCallback_0000 + * @tc.name: js_file_access_ext_ability_FuncCallback_0000 + * @tc.desc: Test function of FuncCallback interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_FuncCallback_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_FuncCallback_0000"; + try { + EXPECT_NE(ability, nullptr); + int value = 0; + napi_env env = nullptr; + napi_callback_info info = nullptr; + + auto result = ability->FuncCallback(env, info); + EXPECT_TRUE(result == nullptr); + + env = reinterpret_cast(&value); + EXPECT_CALL(*insMoc, napi_get_undefined(_, _)).WillOnce(Return(napi_ok)); + result = ability->FuncCallback(env, info); + EXPECT_TRUE(result == nullptr); + + info = reinterpret_cast(&value); + EXPECT_CALL(*insMoc, napi_get_cb_info(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*insMoc, napi_get_undefined(_, _)).WillOnce(Return(napi_ok)); + result = ability->FuncCallback(env, info); + EXPECT_TRUE(result == nullptr); + + EXPECT_CALL(*insMoc, napi_get_cb_info(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee((0)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_undefined(_, _)).WillOnce(Return(napi_ok)); + result = ability->FuncCallback(env, info); + EXPECT_TRUE(result == nullptr); + + EXPECT_CALL(*insMoc, napi_get_cb_info(_, _, _, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*insMoc, napi_get_undefined(_, _)).WillOnce(Return(napi_ok)); + result = ability->FuncCallback(env, info); + EXPECT_TRUE(result == nullptr); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_FuncCallback_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_ParserQueryFileJsResult_0000 + * @tc.name: js_file_access_ext_ability_ParserQueryFileJsResult_0000 + * @tc.desc: Test function of ParserQueryFileJsResult interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ParserQueryFileJsResult_0000, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_ParserQueryFileJsResult_0000"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value nativeValue = {}; + JsFileAccessExtAbility::Value> value; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_invalid_arg)); + result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_TRUE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ParserQueryFileJsResult_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_ParserQueryFileJsResult_0001 + * @tc.name: js_file_access_ext_ability_ParserQueryFileJsResult_0001 + * @tc.desc: Test function of ParserQueryFileJsResult interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ParserQueryFileJsResult_0001, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_ParserQueryFileJsResult_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value nativeValue = {}; + JsFileAccessExtAbility::Value> value; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + result = ability->ParserQueryFileJsResult(env, nativeValue, value); + EXPECT_TRUE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ParserQueryFileJsResult_0001"; } \ No newline at end of file diff --git a/test/unittest/mock/assistant.h b/test/unittest/mock/assistant.h index e2746383..8e320261 100644 --- a/test/unittest/mock/assistant.h +++ b/test/unittest/mock/assistant.h @@ -56,6 +56,9 @@ public: virtual napi_status napi_create_array_with_length(napi_env, size_t, napi_value*) = 0; virtual napi_status napi_create_double(napi_env, double, napi_value*) = 0; virtual napi_status napi_set_named_property(napi_env, napi_value, const char*, napi_value) = 0; + virtual napi_status napi_create_function(napi_env, const char*, size_t, napi_callback, void*, napi_value*) = 0; + virtual napi_status napi_get_cb_info(napi_env, napi_callback_info, size_t*, napi_value*, napi_value*, void**) = 0; + virtual napi_status napi_get_undefined(napi_env, napi_value*) = 0; public: static inline std::shared_ptr ins_ = nullptr; }; @@ -87,6 +90,10 @@ public: MOCK_METHOD3(napi_create_array_with_length, napi_status(napi_env, size_t, napi_value*)); MOCK_METHOD3(napi_create_double, napi_status(napi_env, double, napi_value*)); MOCK_METHOD4(napi_set_named_property, napi_status(napi_env, napi_value, const char*, napi_value)); + MOCK_METHOD6(napi_create_function, napi_status(napi_env, const char*, size_t, napi_callback, void*, napi_value*)); + MOCK_METHOD6(napi_get_cb_info, napi_status(napi_env, napi_callback_info, size_t*, napi_value*, napi_value*, + void**)); + MOCK_METHOD2(napi_get_undefined, napi_status(napi_env, napi_value*)); }; } // End of namespace FileAccessFwk diff --git a/test/unittest/mock/js_native_api_mock.cpp b/test/unittest/mock/js_native_api_mock.cpp index 039aeb46..5d79a197 100644 --- a/test/unittest/mock/js_native_api_mock.cpp +++ b/test/unittest/mock/js_native_api_mock.cpp @@ -126,4 +126,21 @@ napi_status napi_create_double(napi_env env, double value, napi_value* result) napi_status napi_set_named_property(napi_env env, napi_value object, const char* utf8Name, napi_value value) { return OHOS::FileAccessFwk::Assistant::ins_->napi_set_named_property(env, object, utf8Name, value); +} + +napi_status napi_create_function(napi_env env, const char* utf8name, size_t length, napi_callback cb, void* data, + napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_create_function(env, utf8name, length, cb, data, result); +} + +napi_status napi_get_cb_info(napi_env env, napi_callback_info cbinfo, size_t* argc, napi_value* argv, + napi_value* thisArg, void** data) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_cb_info(env, cbinfo, argc, argv, thisArg, data); +} + +napi_status napi_get_undefined(napi_env env, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_undefined(env, result); } \ No newline at end of file -- Gitee From cb47b0453eb519148ba7e6895f6f8f7ff4b73259 Mon Sep 17 00:00:00 2001 From: hunili Date: Tue, 6 Aug 2024 20:43:24 +0800 Subject: [PATCH 06/40] Fix the bug: scan root file uri err issue: https://gitee.com/openharmony/filemanagement_user_file_service/issues/IAIAP6 Signed-off-by: hunili --- .../FileExtensionAbility/ListScanFileInfo.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts index ba33e37c..b7c5e7d0 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts @@ -152,6 +152,10 @@ function getListFileInfos(sourceFileUri: string, offset: number, count: number, if (i === listNum) { break; } + if (path === CURRENT_USER_PATH && fileNameList[i] === APP_DATA) { + hilog.info(DOMAIN_CODE, TAG, `filter appdata doc`); + continue; + } let mode = documentFlag.SUPPORTS_READ | documentFlag.SUPPORTS_WRITE; let filePath = getNewPathOrUri(path, fileNameList[i]); let stat = fs.statSync(filePath); @@ -162,15 +166,8 @@ function getListFileInfos(sourceFileUri: string, offset: number, count: number, } let newFileUri = getNewPathOrUri(sourceFileUri, fileNameList[i]); newFileUri = encodePathOfUri(newFileUri); - infos.push({ - uri: newFileUri, - relativePath: filePath, - fileName: genNewFileName(fileNameList[i]), - mode: mode, - size: stat.size, - mtime: stat.mtime, - mimeType: '', - }); + infos.push({ uri: newFileUri, relativePath: filePath, fileName: genNewFileName(fileNameList[i]), + mode: mode, size: stat.size, mtime: stat.mtime, mimeType: '' }); } } catch (e) { hilog.error(DOMAIN_CODE, TAG, `getFileInfos error: ${e.message},code: ${e.code}`); @@ -210,7 +207,12 @@ function getSubFileInfos( let infos: Fileinfo[] = []; let tmpStat = fs.statSync(needInfo.subPath); let bIsDct = tmpStat.isDirectory(); - let fileNameList = bIsDct ? fs.listFileSync(needInfo.subPath, changeData.options) : [needInfo.subPath]; + let fileNameList = bIsDct ? fs.listFileSync(needInfo.subPath, changeData.options) : + [needInfo.subPath.substring(CURRENT_USER_PATH.length)]; + let subPath = needInfo.subPath; + if (needInfo.isRootPath) { + subPath = bIsDct ? subPath.substring(CURRENT_USER_PATH.length) : ''; + } let listLen = fileNameList.length; if (changeData.tempOffset >= listLen) { changeData.tempOffset -= listLen; @@ -225,7 +227,7 @@ function getSubFileInfos( let stat = bIsDct ? fs.statSync(filePath) : tmpStat; mode |= (bIsDct | stat.isDirectory()) ? documentFlag.REPRESENTS_DIR : documentFlag.REPRESENTS_FILE; let newFileUri = getNewPathOrUri( - needInfo.isRootPath ? needInfo.sourceFileUri + needInfo.subPath : needInfo.sourceFileUri, fileNameList[j]); + needInfo.isRootPath ? needInfo.sourceFileUri + subPath : needInfo.sourceFileUri, fileNameList[j]); newFileUri = encodePathOfUri(newFileUri); infos.push({ uri: newFileUri, relativePath: filePath, fileName: genNewFileName(fileNameList[j]), mode: mode, size: stat.size, mtime: stat.mtime, mimeType: '' }); -- Gitee From fe238745d56bfd24d235a6634ad129557c1601f3 Mon Sep 17 00:00:00 2001 From: wangpggg Date: Thu, 8 Aug 2024 11:12:52 +0800 Subject: [PATCH 07/40] add ut to cover branches Signed-off-by: wangpeng --- .../file_access/src/file_access_ext_proxy.cpp | 4 +- .../js_file_access_ext_ability_other_test.cpp | 456 ++++++++++++++++++ test/unittest/mock/assistant.h | 2 + test/unittest/mock/js_native_api_mock.cpp | 5 + 4 files changed, 465 insertions(+), 2 deletions(-) diff --git a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp index c784b497..09273855 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp @@ -700,12 +700,12 @@ int FileAccessExtProxy::Query(const Uri &uri, std::vector &columns, HILOG_ERROR("fail to WriteParcelable sourceFile"); return E_IPCS; } - int64_t count = columns.size(); + size_t count = columns.size(); if (!data.WriteInt64(count)) { HILOG_ERROR("Parameter Query fail to WriteInt64 count"); return E_IPCS; } - if (static_cast(count) > FILE_RESULT_TYPE.size()) { + if (count > FILE_RESULT_TYPE.size()) { HILOG_ERROR(" The number of query operations exceeds %{public}zu ", FILE_RESULT_TYPE.size()); return EINVAL; } diff --git a/test/unittest/js_file_access_ext_ability_other_test.cpp b/test/unittest/js_file_access_ext_ability_other_test.cpp index 5bdc9777..2f2444f1 100644 --- a/test/unittest/js_file_access_ext_ability_other_test.cpp +++ b/test/unittest/js_file_access_ext_ability_other_test.cpp @@ -941,4 +941,460 @@ HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ParserQueryFileJ GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ParserQueryFileJsResult_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_ParserGetRootsJsResult_0000 + * @tc.name: js_file_access_ext_ability_ParserGetRootsJsResult_0000 + * @tc.desc: Test function of ParserGetRootsJsResult interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ParserGetRootsJsResult_0000, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_ParserGetRootsJsResult_0000"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value nativeValue = nullptr; + JsFileAccessExtAbility::Value> value; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_invalid_arg)); + result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_TRUE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ParserGetRootsJsResult_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_ParserGetRootsJsResult_0001 + * @tc.name: js_file_access_ext_ability_ParserGetRootsJsResult_0001 + * @tc.desc: Test function of ParserGetRootsJsResult interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ParserGetRootsJsResult_0001, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_ParserGetRootsJsResult_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value nativeValue = nullptr; + JsFileAccessExtAbility::Value> value; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_invalid_arg)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_FALSE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ParserGetRootsJsResult_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_ParserGetRootsJsResult_0002 + * @tc.name: js_file_access_ext_ability_ParserGetRootsJsResult_0002 + * @tc.desc: Test function of ParserGetRootsJsResult interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ParserGetRootsJsResult_0002, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_ParserGetRootsJsResult_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value nativeValue = nullptr; + JsFileAccessExtAbility::Value> value; + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + auto result = ability->ParserGetRootsJsResult(env, nativeValue, value); + EXPECT_TRUE(result); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ParserGetRootsJsResult_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_GetRoots_0000 + * @tc.name: js_file_access_ext_ability_GetRoots_0000 + * @tc.desc: Test function of GetRoots interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetRoots_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_GetRoots_0000"; + try { + EXPECT_NE(ability, nullptr); + vector rootInfoVec; + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->GetRoots(rootInfoVec); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetRoots_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_GetRoots_0002 + * @tc.name: js_file_access_ext_ability_GetRoots_0002 + * @tc.desc: Test function of GetRoots interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetRoots_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_GetRoots_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + vector rootInfoVec; + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->GetRoots(rootInfoVec); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetRoots_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_GetRoots_0003 + * @tc.name: js_file_access_ext_ability_GetRoots_0003 + * @tc.desc: Test function of GetRoots interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetRoots_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_GetRoots_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + string path = "test"; + vector rootInfoVec; + ability->jsObj_ = make_shared(); + + // 模拟GetRoots调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->GetRoots(rootInfoVec); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetRoots_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Access_0000 + * @tc.name: js_file_access_ext_ability_Access_0000 + * @tc.desc: Test function of Access interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Access_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Access_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri uri(""); + bool isExist = false; + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Access(uri, isExist); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Access_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Access_0001 + * @tc.name: js_file_access_ext_ability_Access_0001 + * @tc.desc: Test function of Access interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Access_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Access_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + bool isExist = false; + ability->jsObj_ = make_shared(); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_bool(_, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Access(uri, isExist); + EXPECT_EQ(result, ERR_OK); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_bool(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + result = ability->Access(uri, isExist); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Access_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Access_0002 + * @tc.name: js_file_access_ext_ability_Access_0002 + * @tc.desc: Test function of Access interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Access_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Access_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + bool isExist = false; + ability->jsObj_ = make_shared(); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_bool(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->Access(uri, isExist); + EXPECT_EQ(result, ERR_OK); + + // 模拟获取value->code失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_bool(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + result = ability->Access(uri, isExist); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Access_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Access_0003 + * @tc.name: js_file_access_ext_ability_Access_0003 + * @tc.desc: Test function of Access interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Access_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Access_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri uri(""); + bool isExist = false; + ability->jsObj_ = make_shared(); + + // 模拟Access调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_bool(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + auto result = ability->Access(uri, isExist); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Access_0003"; } \ No newline at end of file diff --git a/test/unittest/mock/assistant.h b/test/unittest/mock/assistant.h index 8e320261..616d1673 100644 --- a/test/unittest/mock/assistant.h +++ b/test/unittest/mock/assistant.h @@ -59,6 +59,7 @@ public: virtual napi_status napi_create_function(napi_env, const char*, size_t, napi_callback, void*, napi_value*) = 0; virtual napi_status napi_get_cb_info(napi_env, napi_callback_info, size_t*, napi_value*, napi_value*, void**) = 0; virtual napi_status napi_get_undefined(napi_env, napi_value*) = 0; + virtual napi_status napi_get_value_bool(napi_env, napi_value, bool*) = 0; public: static inline std::shared_ptr ins_ = nullptr; }; @@ -94,6 +95,7 @@ public: MOCK_METHOD6(napi_get_cb_info, napi_status(napi_env, napi_callback_info, size_t*, napi_value*, napi_value*, void**)); MOCK_METHOD2(napi_get_undefined, napi_status(napi_env, napi_value*)); + MOCK_METHOD3(napi_get_value_bool, napi_status(napi_env, napi_value, bool*)); }; } // End of namespace FileAccessFwk diff --git a/test/unittest/mock/js_native_api_mock.cpp b/test/unittest/mock/js_native_api_mock.cpp index 5d79a197..8f36dfda 100644 --- a/test/unittest/mock/js_native_api_mock.cpp +++ b/test/unittest/mock/js_native_api_mock.cpp @@ -143,4 +143,9 @@ napi_status napi_get_cb_info(napi_env env, napi_callback_info cbinfo, size_t* ar napi_status napi_get_undefined(napi_env env, napi_value* result) { return OHOS::FileAccessFwk::Assistant::ins_->napi_get_undefined(env, result); +} + +napi_status napi_get_value_bool(napi_env env, napi_value value, bool* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_value_bool(env, value, result); } \ No newline at end of file -- Gitee From e2bc8682183c0d8e228a3186f067a0c42712ec55 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Sun, 11 Aug 2024 12:04:18 +0800 Subject: [PATCH 08/40] fix:user_after_free Signed-off-by: zhouoaoteng --- interfaces/kits/picker/include/modal_ui_callback.h | 4 ++-- interfaces/kits/picker/src/modal_ui_callback.cpp | 2 +- interfaces/kits/picker/src/picker_n_exporter.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interfaces/kits/picker/include/modal_ui_callback.h b/interfaces/kits/picker/include/modal_ui_callback.h index eef34d8c..3ad79529 100644 --- a/interfaces/kits/picker/include/modal_ui_callback.h +++ b/interfaces/kits/picker/include/modal_ui_callback.h @@ -27,7 +27,7 @@ namespace Picker { class ModalUICallback { public: - explicit ModalUICallback(Ace::UIContent* uiContent, PickerCallBack* pickerCallBack); + explicit ModalUICallback(Ace::UIContent* uiContent, std::shared_ptr pickerCallBack); void OnRelease(int32_t releaseCode); void OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Want& result); void OnReceive(const OHOS::AAFwk::WantParams& request); @@ -38,7 +38,7 @@ public: private: int32_t sessionId_ = 0; Ace::UIContent* uiContent; - PickerCallBack* pickerCallBack_; + std::shared_ptr pickerCallBack_; }; } // namespace Picker } // namespace OHOS diff --git a/interfaces/kits/picker/src/modal_ui_callback.cpp b/interfaces/kits/picker/src/modal_ui_callback.cpp index 7193d1c3..ea4f059b 100644 --- a/interfaces/kits/picker/src/modal_ui_callback.cpp +++ b/interfaces/kits/picker/src/modal_ui_callback.cpp @@ -20,7 +20,7 @@ namespace OHOS { namespace Picker { using namespace OHOS::Ace; using namespace std; -ModalUICallback::ModalUICallback(Ace::UIContent* uiContent, PickerCallBack* pickerCallBack) +ModalUICallback::ModalUICallback(Ace::UIContent* uiContent, std::shared_ptr pickerCallBack) { this->uiContent = uiContent; this->pickerCallBack_ = pickerCallBack; diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index f0e03c14..41f50d2f 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -197,7 +197,7 @@ static napi_value StartPickerExtension(napi_env env, napi_callback_info info, } request.SetParam(ABILITY_WANT_PARAMS_UIEXTENSIONTARGETTYPE, targetType); AsyncContext->pickerCallBack = make_shared(); - auto callback = std::make_shared(uiContent, AsyncContext->pickerCallBack.get()); + auto callback = std::make_shared(uiContent, AsyncContext->pickerCallBack); Ace::ModalUIExtensionCallbacks extensionCallback = { .onRelease = std::bind(&ModalUICallback::OnRelease, callback, std::placeholders::_1), .onResult = std::bind(&ModalUICallback::OnResultForModal, callback, std::placeholders::_1, -- Gitee From 6b1c8504a4abdbcfd9f51e61df26b29bce4ae2db Mon Sep 17 00:00:00 2001 From: wangpggg Date: Tue, 13 Aug 2024 09:44:33 +0800 Subject: [PATCH 09/40] add ut, modify worning and so on. Signed-off-by: wangpeng --- .../src/file_access_service.cpp | 2 +- .../js_file_access_ext_ability_other_test.cpp | 288 ++++++++++++++++++ 2 files changed, 289 insertions(+), 1 deletion(-) diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 0ce00c63..f8d42472 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -246,7 +246,7 @@ void FileAccessService::CleanRelativeObserver(const sptr &o return obsContext->EqualTo(afterContext); }); std::vector uriLists = GetUriList(code); - for (int i = 0; i < uriLists.size(); ++i) { + for (size_t i = 0; i < uriLists.size(); ++i) { UnregisterNotify(uriLists[i], observer); } } diff --git a/test/unittest/js_file_access_ext_ability_other_test.cpp b/test/unittest/js_file_access_ext_ability_other_test.cpp index 2f2444f1..8c39956a 100644 --- a/test/unittest/js_file_access_ext_ability_other_test.cpp +++ b/test/unittest/js_file_access_ext_ability_other_test.cpp @@ -1397,4 +1397,292 @@ HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Access_0003, tes GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Access_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_GetResultByJs_0000 + * @tc.name: js_file_access_ext_ability_GetResultByJs_0000 + * @tc.desc: Test function of GetResultByJs interface for success and failure branches. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetResultByJs_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_GetResultByJs_0000"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + napi_value nativeResult = nullptr; + Result result; + int ret = NOEXCEPTION; + + EXPECT_FALSE(GetResultByJs(env, nativeResult, result, ret)); + + nativeResult = reinterpret_cast(&rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_FALSE(GetResultByJs(env, nativeResult, result, ret)); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_invalid_arg)); + EXPECT_FALSE(GetResultByJs(env, nativeResult, result, ret)); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_FALSE(GetResultByJs(env, nativeResult, result, ret)); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_TRUE(GetResultByJs(env, nativeResult, result, ret)); + + ret = EXCEPTION; + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + EXPECT_FALSE(GetResultByJs(env, nativeResult, result, ret)); + + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_TRUE(GetResultByJs(env, nativeResult, result, ret)); + + ret = MAX_ARG_COUNT; + EXPECT_TRUE(GetResultByJs(env, nativeResult, result, ret)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetResultByJs_0000"; +} + +static void InvokeCreateNativeValueSucceed(shared_ptr insMoc) +{ + // 模拟调用CreateNativeValue成功 + napi_value rslt = nullptr; + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int64(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_double(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MakeJsNativeFileFilter_0000 + * @tc.name: js_file_access_ext_ability_MakeJsNativeFileFilter_0000 + * @tc.desc: Test function of MakeJsNativeFileFilter interface for success and failure branches. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MakeJsNativeFileFilter_0000, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MakeJsNativeFileFilter_0000"; + try { + EXPECT_NE(ability, nullptr); + napi_env env = nullptr; + FileFilter filter; + napi_value nativeFilter = nullptr; + + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)).WillOnce(Return(napi_ok)); + auto ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, E_GETRESULT); + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_invalid_arg)); + ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, EINVAL); + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_invalid_arg)); + ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, EINVAL); + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_invalid_arg)); + ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, EINVAL); + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_invalid_arg)); + ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MakeJsNativeFileFilter_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_MakeJsNativeFileFilter_0001 + * @tc.name: js_file_access_ext_ability_MakeJsNativeFileFilter_0001 + * @tc.desc: Test function of MakeJsNativeFileFilter interface for success and failure branches. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_MakeJsNativeFileFilter_0001, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_MakeJsNativeFileFilter_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_env env = nullptr; + FileFilter filter; + napi_value nativeFilter = nullptr; + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_invalid_arg)); + auto ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, EINVAL); + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_invalid_arg)); + ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, EINVAL); + + InvokeCreateNativeValueSucceed(insMoc); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + ret = ability->MakeJsNativeFileFilter(env, filter, nativeFilter); + EXPECT_EQ(ret, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_MakeJsNativeFileFilter_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_BuildFileInfoNumParam_0000 + * @tc.name: js_file_access_ext_ability_BuildFileInfoNumParam_0000 + * @tc.desc: Test function of BuildFileInfoNumParam interface for success and failure branches. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_BuildFileInfoNumParam_0000, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_BuildFileInfoNumParam_0000"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + napi_env env = nullptr; + FileFilter filter; + FileInfoNumParam param { "", filter, false }; + napi_value argv; + size_t argc; + + filter.hasFilter_ = true; + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_object(_, _)).WillOnce(Return(napi_ok)); + EXPECT_FALSE(ability->BuildFileInfoNumParam(env, param, &argv, argc)); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_object(_, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_FALSE(ability->BuildFileInfoNumParam(env, param, &argv, argc)); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_int64(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_object(_, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array_with_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_double(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_set_named_property(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_FALSE(ability->BuildFileInfoNumParam(env, param, &argv, argc)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_BuildFileInfoNumParam_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_BuildFileInfoNumParam_0001 + * @tc.name: js_file_access_ext_ability_BuildFileInfoNumParam_0001 + * @tc.desc: Test function of BuildFileInfoNumParam interface for success and failure branches. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_BuildFileInfoNumParam_0001, + testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_BuildFileInfoNumParam_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + FileFilter filter; + FileInfoNumParam param { "", filter, false }; + napi_value argv[3]; + size_t argc; + + filter.hasFilter_ = false; + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_null(_, _)).WillOnce(Return(napi_ok)); + EXPECT_FALSE(ability->BuildFileInfoNumParam(env, param, argv, argc)); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_null(_, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_FALSE(ability->BuildFileInfoNumParam(env, param, argv, argc)); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_null(_, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + EXPECT_FALSE(ability->BuildFileInfoNumParam(env, param, argv, argc)); + + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_null(_, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_TRUE(ability->BuildFileInfoNumParam(env, param, argv, argc)); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_BuildFileInfoNumParam_0001"; } \ No newline at end of file -- Gitee From 7a397ff0411d6f68ca29b8572eab6de321f48547 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Wed, 14 Aug 2024 19:13:38 +0800 Subject: [PATCH 10/40] add :close ui Signed-off-by: zhouoaoteng --- interfaces/kits/picker/src/modal_ui_callback.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interfaces/kits/picker/src/modal_ui_callback.cpp b/interfaces/kits/picker/src/modal_ui_callback.cpp index ea4f059b..9f05b37c 100644 --- a/interfaces/kits/picker/src/modal_ui_callback.cpp +++ b/interfaces/kits/picker/src/modal_ui_callback.cpp @@ -42,6 +42,7 @@ void ModalUICallback::OnError(int32_t code, const std::string& name, const std:: { HILOG_ERROR("modal picker: OnError enter. errorCode=%{public}d, name=%{public}s, message=%{public}s", code, name.c_str(), message.c_str()); + this->uiContent->CloseModalUIExtension(this->sessionId_); } void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Want &result) @@ -50,6 +51,7 @@ void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Wa pickerCallBack_->resultCode = resultCode; pickerCallBack_->want = result; pickerCallBack_->ready = true; + this->uiContent->CloseModalUIExtension(this->sessionId_); } void ModalUICallback::OnReceive(const OHOS::AAFwk::WantParams &request) -- Gitee From d2833ee32d47a3b7d2e5c6f1c4377fd386cb11f4 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Fri, 16 Aug 2024 18:53:22 +0800 Subject: [PATCH 11/40] fix:nullptr Signed-off-by: zhouoaoteng --- .../file_access_service/src/file_access_service.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index f8d42472..6001e2b3 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -201,9 +201,14 @@ sptr FileAccessService::ConnectExtension(Uri &uri, const sha void FileAccessService::ResetProxy(const wptr &remote) { + HILOG_DEBUG("FileAccessService::ResetProxy start"); lock_guard lock(mapMutex_); if (remote != nullptr && extensionDeathRecipient_ != nullptr) { for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { + if (iter->second == nullptr) { + HILOG_ERROR("iter->second is null or extensionDeathRecipient_ is null."); + continue; + } auto proxyRemote = iter->second->AsObject(); if (proxyRemote != nullptr && proxyRemote == remote.promote()) { proxyRemote->RemoveDeathRecipient(extensionDeathRecipient_); @@ -396,6 +401,7 @@ void FileAccessService::RemoveRelations(string &uriStr, shared_ptr int FileAccessService::FindUri(const string &uriStr, shared_ptr &outObsNode) { lock_guard lock(nodeMutex_); + HILOG_DEBUG("FindUri start"); auto iter = relationshipMap_.find(uriStr); if (iter == relationshipMap_.end()) { HILOG_ERROR("Can not find uri"); @@ -581,6 +587,7 @@ int32_t FileAccessService::OnChange(Uri uri, NotifyType notifyType) return ERR_URI; } string uris = uriStr.substr(uriIndex); + HILOG_DEBUG("OnChange FindUri start"); //When the path is not found, search for its parent path if (FindUri(uriStr, node) != ERR_OK) { size_t slashIndex = uriStr.rfind("/"); @@ -600,6 +607,7 @@ int32_t FileAccessService::OnChange(Uri uri, NotifyType notifyType) SendListNotify(uris, notifyType, node->obsCodeList_); return ERR_OK; } + HILOG_DEBUG("OnChange FindUri end"); SendListNotify(uris, notifyType, node->obsCodeList_); if ((node->parent_ == nullptr) || (!node->parent_->needChildNote_)) { HILOG_DEBUG("Do not need notify parent"); -- Gitee From 42f47ba9fa089d5a20ba8724d07f542b32d1c437 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Fri, 16 Aug 2024 17:41:15 +0800 Subject: [PATCH 12/40] fix:code Signed-off-by: zhouoaoteng --- .../kits/native/recent/recent_n_exporter.cpp | 40 ++++++++++++++----- .../trash/src/file_trash_n_exporter.cpp | 37 ++++++++++++----- .../FileExtensionAbility.ts | 3 +- .../FileExtensionAbility/ListScanFileInfo.ts | 5 ++- 4 files changed, 64 insertions(+), 21 deletions(-) diff --git a/interfaces/kits/native/recent/recent_n_exporter.cpp b/interfaces/kits/native/recent/recent_n_exporter.cpp index 77bc688f..762992f4 100644 --- a/interfaces/kits/native/recent/recent_n_exporter.cpp +++ b/interfaces/kits/native/recent/recent_n_exporter.cpp @@ -25,6 +25,7 @@ #include "file_utils.h" #include "hilog_wrapper.h" #include "ipc_skeleton.h" +#include "tokenid_kit.h" #include "user_access_common_utils.h" namespace OHOS { @@ -43,6 +44,27 @@ static bool CheckPermission(const std::string &permission) Security::AccessToken::PermissionState::PERMISSION_GRANTED; } +static bool IsSystemApp() +{ + uint64_t accessTokenIDEx = OHOS::IPCSkeleton::GetCallingFullTokenID(); + return OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIDEx); +} + +static bool CheckSystemAppAndPermission(const std::string &permission, napi_env env) +{ + if (!IsSystemApp()) { + HILOG_ERROR("FileTrashNExporter::Recover check IsSystemAppByFullTokenID failed"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return false; + } + if (!CheckPermission(FILE_ACCESS_PERMISSION)) { + HILOG_ERROR("Check permission error"); + NError(E_PERMISSION).ThrowErr(env); + return false; + } + return true; +} + static napi_value SetFileTime(napi_env env, const string &recentFilePath) { if (lutimes(recentFilePath.c_str(), nullptr) < 0) { @@ -59,11 +81,11 @@ static napi_value SetFileTime(napi_env env, const string &recentFilePath) napi_value RecentNExporter::AddRecentFile(napi_env env, napi_callback_info cbinfo) { - if (!CheckPermission(FILE_ACCESS_PERMISSION)) { - HILOG_ERROR("Failed to get file access permission"); - NError(E_PERMISSION).ThrowErr(env); + if (!CheckSystemAppAndPermission(FILE_ACCESS_PERMISSION, env)) { + HILOG_ERROR("AddRecentFile CheckSystemAppAndPermission error"); return nullptr; } + NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ONE)) { HILOG_ERROR("Number of arguments unmatched"); @@ -107,11 +129,11 @@ napi_value RecentNExporter::AddRecentFile(napi_env env, napi_callback_info cbinf napi_value RecentNExporter::RemoveRecentFile(napi_env env, napi_callback_info cbinfo) { - if (!CheckPermission(FILE_ACCESS_PERMISSION)) { - HILOG_ERROR("Failed to get file access permission"); - NError(E_PERMISSION).ThrowErr(env); + if (!CheckSystemAppAndPermission(FILE_ACCESS_PERMISSION, env)) { + HILOG_ERROR("AddRecentFile CheckSystemAppAndPermission error"); return nullptr; } + NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ONE)) { HILOG_ERROR("Number of arguments unmatched"); @@ -291,11 +313,11 @@ static napi_value ListFileCore(napi_env env) napi_value RecentNExporter::ListRecentFile(napi_env env, napi_callback_info cbinfo) { - if (!CheckPermission(FILE_ACCESS_PERMISSION)) { - HILOG_ERROR("Failed to get file access permission"); - NError(E_PERMISSION).ThrowErr(env); + if (!CheckSystemAppAndPermission(FILE_ACCESS_PERMISSION, env)) { + HILOG_ERROR("ListRecentFile CheckSystemAppAndPermission error"); return nullptr; } + NFuncArg funcArg(env, cbinfo); if (!funcArg.InitArgs(NARG_CNT::ZERO)) { HILOG_ERROR("Number of arguments unmatched"); diff --git a/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp b/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp index 69ae0ac8..dfb19a2e 100644 --- a/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp +++ b/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp @@ -25,6 +25,7 @@ #include "file_util.h" #include "ipc_skeleton.h" #include "rust_file.h" +#include "tokenid_kit.h" #include "user_access_common_utils.h" namespace OHOS { @@ -40,6 +41,12 @@ using namespace FileAccessFwk; static std::mutex g_trashPathMutex; +static bool IsSystemApp() +{ + uint64_t accessTokenIDEx = OHOS::IPCSkeleton::GetCallingFullTokenID(); + return OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(accessTokenIDEx); +} + static bool CheckCallingPermission(const std::string &permission) { Security::AccessToken::AccessTokenID tokenCaller = IPCSkeleton::GetCallingTokenID(); @@ -51,6 +58,21 @@ static bool CheckCallingPermission(const std::string &permission) return true; } +static bool CheckSystemAppAndPermission(const std::string &permission, napi_env env) +{ + if (!IsSystemApp()) { + HILOG_ERROR("FileTrashNExporter::Recover check IsSystemAppByFullTokenID failed"); + NError(E_PERMISSION_SYS).ThrowErr(env); + return false; + } + if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) { + HILOG_ERROR("Check permission error"); + NError(E_PERMISSION).ThrowErr(env); + return false; + } + return true; +} + static bool GetRealPath(string &path) { unique_ptr absPath = make_unique(PATH_MAX + 1); @@ -387,9 +409,8 @@ static bool GenerateFileInfoEntity(FileInfo& fileInfoEntity, string filterDirent napi_value FileTrashNExporter::ListFile(napi_env env, napi_callback_info info) { - if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) { - HILOG_ERROR("permission error"); - NError(E_PERMISSION).ThrowErr(env); + if (!CheckSystemAppAndPermission(FILE_ACCESS_PERMISSION, env)) { + HILOG_ERROR("ListFile CheckSystemAppAndPermission error"); return nullptr; } @@ -560,9 +581,8 @@ static napi_value RecoverDir(napi_env env, const string &dirPath) napi_value FileTrashNExporter::Recover(napi_env env, napi_callback_info info) { - if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) { - HILOG_ERROR("permission error"); - NError(E_PERMISSION).ThrowErr(env); + if (!CheckSystemAppAndPermission(FILE_ACCESS_PERMISSION, env)) { + HILOG_ERROR("Recover CheckSystemAppAndPermission error"); return nullptr; } @@ -616,9 +636,8 @@ napi_value FileTrashNExporter::Recover(napi_env env, napi_callback_info info) napi_value FileTrashNExporter::CompletelyDelete(napi_env env, napi_callback_info info) { - if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) { - HILOG_ERROR("permission error"); - NError(E_PERMISSION).ThrowErr(env); + if (!CheckSystemAppAndPermission(FILE_ACCESS_PERMISSION, env)) { + HILOG_ERROR("CompletelyDelete CheckSystemAppAndPermission error"); return nullptr; } diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index 00e2a039..0a528306 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -769,6 +769,7 @@ export default class FileExtAbility extends Extension { deviceType: deviceType.DEVICE_SHARED_TERMINAL, deviceFlags: deviceFlag.SUPPORTS_READ | deviceFlag.SUPPORTS_WRITE, }; + hilog.info(DOMAIN_CODE, TAG, `df count: ${hmdfsInfo.length}`); hmdfsInfoList.push(hmdfsInfo); } return hmdfsInfoList; @@ -806,7 +807,7 @@ export default class FileExtAbility extends Extension { volumeInfoList.push(volumeInfo); } roots = roots.concat(volumeInfoList); - + hilog.info(DOMAIN_CODE, TAG, `External file count: ${volumeInfoList.length}`); try { roots = roots.concat(getHmdfsPath()); } catch (e) { diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts index b7c5e7d0..03db99f8 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/ListScanFileInfo.ts @@ -23,6 +23,7 @@ const documentFlag = fileExtensionInfo.DocumentFlag; const ERR_OK = 0; const E_GETRESULT = 14300004; const APP_DATA = 'appdata'; +const BACKUP_DIR = '.backup'; const CURRENT_USER_PATH = '/storage/Users/currentUser'; function hasFilter(filter: Filter) : boolean { @@ -152,8 +153,8 @@ function getListFileInfos(sourceFileUri: string, offset: number, count: number, if (i === listNum) { break; } - if (path === CURRENT_USER_PATH && fileNameList[i] === APP_DATA) { - hilog.info(DOMAIN_CODE, TAG, `filter appdata doc`); + if (path === CURRENT_USER_PATH && (fileNameList[i] === APP_DATA || fileNameList[i] === BACKUP_DIR)) { + hilog.info(DOMAIN_CODE, TAG, `filter appdata doc or backup dir`); continue; } let mode = documentFlag.SUPPORTS_READ | documentFlag.SUPPORTS_WRITE; -- Gitee From f6545da659bd74cfcf664cfa46f0a83a6af7840c Mon Sep 17 00:00:00 2001 From: zhangxiaoliang25 Date: Tue, 23 Jul 2024 20:34:10 +0800 Subject: [PATCH 13/40] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangxiaoliang25 Change-Id: Ia92f4474e9f7a7806ae13b6c77437f84eb0de8a3 Signed-off-by: zhangxiaoliang25 --- bundle.json | 3 +- interfaces/inner_api/file_access/BUILD.gn | 2 +- .../include/app_file_access_ext_connection.h | 74 +++++++++ .../file_access/include/file_access_helper.h | 4 +- .../libfile_access_extension_ability_kit.map | 2 +- ...cpp => app_file_access_ext_connection.cpp} | 49 +++--- .../file_access/src/file_access_helper.cpp | 8 +- .../src/js_file_access_ext_ability.cpp | 2 +- services/BUILD.gn | 2 + .../include/file_access_ext_connection.h | 31 ++-- .../include/file_access_service.h | 25 ++- .../file_access_service_ipc_interface_code.h | 4 +- .../include/file_access_service_proxy.h | 7 +- .../include/file_access_service_stub.h | 2 + .../include/holder_manager.h | 7 + .../include/ifile_access_service_base.h | 6 +- .../src/file_access_ext_connection.cpp | 144 ++++++++++++++++++ .../src/file_access_service.cpp | 122 ++++++++++++++- .../src/file_access_service_proxy.cpp | 97 +++++++++++- .../src/file_access_service_stub.cpp | 53 ++++++- .../fileaccessextconnection_fuzzer/BUILD.gn | 4 +- .../fileaccessextconnection_fuzzer.cpp | 17 +++ .../fileaccessservicemock.h | 5 +- .../fileaccessserviceproxy_fuzzer.cpp | 2 +- .../fileaccessservicemock.h | 5 +- .../file_access_service_proxy_test.cpp | 16 +- .../js_file_access_ext_ability_test.cpp | 13 +- test/unittest/mock/file_access_service_mock.h | 5 +- 28 files changed, 638 insertions(+), 73 deletions(-) create mode 100644 interfaces/inner_api/file_access/include/app_file_access_ext_connection.h rename interfaces/inner_api/file_access/src/{file_access_ext_connection.cpp => app_file_access_ext_connection.cpp} (71%) rename {interfaces/inner_api/file_access => services/native/file_access_service}/include/file_access_ext_connection.h (70%) create mode 100644 services/native/file_access_service/src/file_access_ext_connection.cpp diff --git a/bundle.json b/bundle.json index 450283ee..a3be8dd5 100644 --- a/bundle.json +++ b/bundle.json @@ -66,7 +66,8 @@ "header_files": [ "file_access_ext_ability.h", "file_access_extension_info.h", - "file_access_ext_stub_impl.h" + "file_access_ext_stub_impl.h", + "file_access_ext_proxy.h" ], "header_base": "//foundation/filemanagement/user_file_service/interfaces/inner_api/file_access/include" } diff --git a/interfaces/inner_api/file_access/BUILD.gn b/interfaces/inner_api/file_access/BUILD.gn index 4cb4a40e..fa96e19c 100644 --- a/interfaces/inner_api/file_access/BUILD.gn +++ b/interfaces/inner_api/file_access/BUILD.gn @@ -56,8 +56,8 @@ ohos_shared_library("file_access_extension_ability_kit") { sources = [ "${user_file_service_path}/services/native/file_access_service/src/file_access_service_proxy.cpp", + "src/app_file_access_ext_connection.cpp", "src/file_access_ext_ability.cpp", - "src/file_access_ext_connection.cpp", "src/file_access_ext_proxy.cpp", "src/file_access_ext_stub.cpp", "src/file_access_ext_stub_impl.cpp", diff --git a/interfaces/inner_api/file_access/include/app_file_access_ext_connection.h b/interfaces/inner_api/file_access/include/app_file_access_ext_connection.h new file mode 100644 index 00000000..b41bd4b6 --- /dev/null +++ b/interfaces/inner_api/file_access/include/app_file_access_ext_connection.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef APP_FILE_ACCESS_EXT_CONNECTION_H +#define APP_FILE_ACCESS_EXT_CONNECTION_H + +#include +#include + +#include "ability_connect_callback_stub.h" +#include "element_name.h" +#include "ifile_access_ext_base.h" +#include "iremote_object.h" +#include "refbase.h" +#include "want.h" + +namespace OHOS { +namespace FileAccessFwk { +class AppFileAccessExtConnection : public AAFwk::AbilityConnectionStub { +public: + AppFileAccessExtConnection() = default; + virtual ~AppFileAccessExtConnection(); + + void OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override; + void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override; + void ConnectFileExtAbility(const AAFwk::Want &want); + void DisconnectFileExtAbility(); + bool IsExtAbilityConnected(); + void OnSchedulerDied(const wptr &remote); + sptr GetFileExtProxy(); + +private: + void AddFileAccessDeathRecipient(const sptr &token); + void RemoveFileAccessDeathRecipient(const sptr &token); + struct ThreadLockInfo { + std::condition_variable condition; + bool isReady = false; + }; + ThreadLockInfo connectLockInfo_; + + static std::mutex mutex_; + std::atomic isConnected_ = {false}; + sptr fileExtProxy_; + std::mutex deathRecipientMutex_; + std::mutex proxyMutex_; + sptr callerDeathRecipient_ = nullptr; +}; + +class FileAccessDeathRecipient : public IRemoteObject::DeathRecipient { +public: + using RemoteDiedHandler = std::function &)>; + explicit FileAccessDeathRecipient(RemoteDiedHandler handler); + virtual ~FileAccessDeathRecipient(); + virtual void OnRemoteDied(const wptr &remote); + +private: + RemoteDiedHandler handler_; +}; +} // namespace FileAccessFwk +} // namespace OHOS +#endif // APP_FILE_ACCESS_EXT_CONNECTION_H diff --git a/interfaces/inner_api/file_access/include/file_access_helper.h b/interfaces/inner_api/file_access/include/file_access_helper.h index 01902b62..ade315c6 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -25,7 +25,7 @@ #include "bundle_mgr_interface.h" #include "context.h" -#include "file_access_ext_connection.h" +#include "app_file_access_ext_connection.h" #include "file_access_extension_info.h" #include "ifile_access_ext_base.h" #include "iobserver_callback.h" @@ -50,7 +50,7 @@ namespace { struct ConnectInfo { AAFwk::Want want = {}; - sptr fileAccessExtConnection = nullptr; + sptr fileAccessExtConnection = nullptr; }; class FileAccessHelper final : public std::enable_shared_from_this { diff --git a/interfaces/inner_api/file_access/libfile_access_extension_ability_kit.map b/interfaces/inner_api/file_access/libfile_access_extension_ability_kit.map index 2bcb7a53..78a0937a 100644 --- a/interfaces/inner_api/file_access/libfile_access_extension_ability_kit.map +++ b/interfaces/inner_api/file_access/libfile_access_extension_ability_kit.map @@ -21,7 +21,7 @@ *OHOS::FileAccessFwk::FileAccessNotifyManager*; *OHOS::FileAccessFwk::FileAccessExtStub*; *OHOS::FileAccessFwk::FileAccessExtStubImpl*; - *OHOS::FileAccessFwk::FileAccessExtConnection*; + *OHOS::FileAccessFwk::FileAccessExtProxy*; }; local: *; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp b/interfaces/inner_api/file_access/src/app_file_access_ext_connection.cpp similarity index 71% rename from interfaces/inner_api/file_access/src/file_access_ext_connection.cpp rename to interfaces/inner_api/file_access/src/app_file_access_ext_connection.cpp index be93711e..5ce13649 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp +++ b/interfaces/inner_api/file_access/src/app_file_access_ext_connection.cpp @@ -13,22 +13,23 @@ * limitations under the License. */ -#include "file_access_ext_connection.h" +#include "app_file_access_ext_connection.h" #include +#include #include "ability_connect_callback_interface.h" #include "ability_manager_client.h" -#include "file_access_ext_proxy.h" +#include "file_access_service_proxy.h" #include "hilog_wrapper.h" #include "iremote_broker.h" namespace OHOS { -namespace FileAccessFwk { -std::mutex FileAccessExtConnection::mutex_; +namespace FileAccessFwk { +std::mutex AppFileAccessExtConnection::mutex_; -void FileAccessExtConnection::OnAbilityConnectDone( +void AppFileAccessExtConnection::OnAbilityConnectDone( const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) { std::lock_guard lock(proxyMutex_); @@ -36,7 +37,7 @@ void FileAccessExtConnection::OnAbilityConnectDone( HILOG_ERROR("remote is nullptr"); return; } - fileExtProxy_ = iface_cast(remoteObject); + fileExtProxy_ = iface_cast(remoteObject); if (fileExtProxy_ == nullptr) { HILOG_ERROR("fileExtProxy_ is nullptr"); return; @@ -48,7 +49,7 @@ void FileAccessExtConnection::OnAbilityConnectDone( connectLockInfo_.condition.notify_all(); } -void FileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) +void AppFileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) { std::lock_guard lock(proxyMutex_); if (fileExtProxy_) { @@ -58,14 +59,20 @@ void FileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementN HILOG_INFO("OnAbilityDisconnectDone resultCode=%{public}d", resultCode); } -void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, const sptr &token) +void AppFileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want) { std::unique_lock lock(proxyMutex_); if (fileExtProxy_) { fileExtProxy_ = nullptr; } isConnected_.store(false); - ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, token); + auto proxy = FileAccessServiceProxy::GetInstance(); + if (proxy == nullptr) { + HILOG_ERROR("ConnectFileExtAbility FileAccessServiceProxy GetInstance fail"); + return; + } + + ErrCode ret = proxy->ConnectFileExtAbility(want, this); if (ret != ERR_OK) { HILOG_ERROR("ConnectAbility failed, ret=%{public}d", ret); return; @@ -79,13 +86,18 @@ void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, con HILOG_INFO("ConnectFileExtAbility success"); } -void FileAccessExtConnection::DisconnectFileExtAbility() +void AppFileAccessExtConnection::DisconnectFileExtAbility() { std::lock_guard lock(proxyMutex_); if (fileExtProxy_ != nullptr) { RemoveFileAccessDeathRecipient(fileExtProxy_->AsObject()); } - ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(this); + auto proxy = FileAccessServiceProxy::GetInstance(); + if (proxy == nullptr) { + HILOG_ERROR("DisconnectFileExtAbility FileAccessServiceProxy GetInstance fail"); + return; + } + ErrCode ret = proxy->DisConnectFileExtAbility(this); if (ret != ERR_OK) { HILOG_ERROR("DisconnectAbility failed, ret=%{public}d", ret); return; @@ -97,17 +109,17 @@ void FileAccessExtConnection::DisconnectFileExtAbility() HILOG_INFO("DisconnectFileExtAbility done"); } -bool FileAccessExtConnection::IsExtAbilityConnected() +bool AppFileAccessExtConnection::IsExtAbilityConnected() { return isConnected_.load(); } -sptr FileAccessExtConnection::GetFileExtProxy() +sptr AppFileAccessExtConnection::GetFileExtProxy() { return fileExtProxy_; } -void FileAccessExtConnection::AddFileAccessDeathRecipient(const sptr &token) +void AppFileAccessExtConnection::AddFileAccessDeathRecipient(const sptr &token) { std::lock_guard lock(deathRecipientMutex_); if (token != nullptr && callerDeathRecipient_ != nullptr) { @@ -116,14 +128,14 @@ void FileAccessExtConnection::AddFileAccessDeathRecipient(const sptrAddDeathRecipient(callerDeathRecipient_); } } -void FileAccessExtConnection::RemoveFileAccessDeathRecipient(const sptr &token) +void AppFileAccessExtConnection::RemoveFileAccessDeathRecipient(const sptr &token) { std::lock_guard lock(deathRecipientMutex_); if (token != nullptr && callerDeathRecipient_ != nullptr) { @@ -131,7 +143,7 @@ void FileAccessExtConnection::RemoveFileAccessDeathRecipient(const sptr &remote) +void AppFileAccessExtConnection::OnSchedulerDied(const wptr &remote) { std::lock_guard lock(proxyMutex_); HILOG_ERROR("OnSchedulerDied"); @@ -145,8 +157,9 @@ void FileAccessExtConnection::OnSchedulerDied(const wptr &remote) } } -FileAccessExtConnection::~FileAccessExtConnection() +AppFileAccessExtConnection::~AppFileAccessExtConnection() { + HILOG_INFO("~AppFileAccessExtConnection"); if (isConnected_.load()) { DisconnectFileExtAbility(); } diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index b65cc040..36419b3c 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -198,13 +198,13 @@ std::pair, int> FileAccessHelper::DoCreatorHel { std::unordered_map> cMap; for (size_t i = 0; i < wants.size(); i++) { - sptr fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection()); + sptr fileAccessExtConnection(new(std::nothrow) AppFileAccessExtConnection()); if (fileAccessExtConnection == nullptr) { HILOG_ERROR("new fileAccessExtConnection fail"); return {nullptr, E_GETRESULT}; } if (!fileAccessExtConnection->IsExtAbilityConnected()) { - fileAccessExtConnection->ConnectFileExtAbility(wants[i], token); + fileAccessExtConnection->ConnectFileExtAbility(wants[i]); } sptr fileExtProxy = fileAccessExtConnection->GetFileExtProxy(); if (fileExtProxy == nullptr) { @@ -346,7 +346,7 @@ sptr FileAccessHelper::GetProxyByBundleName(const std::strin return nullptr; } if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) { - connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want, token_); + connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want); } auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy(); if (fileAccessExtProxy == nullptr) { @@ -361,7 +361,7 @@ bool FileAccessHelper::GetProxy() for (auto iter = cMap_.begin(); iter != cMap_.end(); ++iter) { auto connectInfo = iter->second; if (!connectInfo->fileAccessExtConnection->IsExtAbilityConnected()) { - connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want, token_); + connectInfo->fileAccessExtConnection->ConnectFileExtAbility(connectInfo->want); } auto fileAccessExtProxy = connectInfo->fileAccessExtConnection->GetFileExtProxy(); if (fileAccessExtProxy == nullptr) { diff --git a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp index e6712d21..5bd801d4 100644 --- a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp @@ -1929,7 +1929,7 @@ int JsFileAccessExtAbility::MoveFile(const Uri &sourceFile, const Uri &targetPar napi_create_string_utf8(env, targetParent.ToString().c_str(), targetParent.ToString().length(), &dstUri); napi_value name = nullptr; napi_create_string_utf8(env, fileName.c_str(), fileName.length(), &name); - if (srcUri == nullptr || dstUri == nullptr || name ==nullptr) { + if (srcUri == nullptr || dstUri == nullptr || name == nullptr) { HILOG_ERROR("create sourceFile uri native js value fail."); return false; } diff --git a/services/BUILD.gn b/services/BUILD.gn index 977071bb..0fbc6854 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -98,9 +98,11 @@ ohos_shared_library("file_access_service") { include_dirs = [ "${user_file_service_path}/services/native/file_access_service/include", + "${user_file_service_path}/interfaces/inner_api/file_access/include", ] shlib_type = "sa" sources = [ + "native/file_access_service/src/file_access_ext_connection.cpp", "native/file_access_service/src/file_access_service.cpp", "native/file_access_service/src/file_access_service_proxy.cpp", "native/file_access_service/src/file_access_service_stub.cpp", diff --git a/interfaces/inner_api/file_access/include/file_access_ext_connection.h b/services/native/file_access_service/include/file_access_ext_connection.h similarity index 70% rename from interfaces/inner_api/file_access/include/file_access_ext_connection.h rename to services/native/file_access_service/include/file_access_ext_connection.h index ee18f6aa..0e6c5dba 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_connection.h +++ b/services/native/file_access_service/include/file_access_ext_connection.h @@ -22,16 +22,20 @@ #include "ability_connect_callback_stub.h" #include "element_name.h" #include "ifile_access_ext_base.h" +#include "file_access_ext_proxy.h" +#include "file_access_service.h" #include "iremote_object.h" #include "refbase.h" #include "want.h" namespace OHOS { namespace FileAccessFwk { +class FileAccessService; + class FileAccessExtConnection : public AAFwk::AbilityConnectionStub { public: FileAccessExtConnection() = default; - virtual ~FileAccessExtConnection(); + virtual ~FileAccessExtConnection() = default; void OnAbilityConnectDone( const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override; @@ -39,14 +43,12 @@ public: void ConnectFileExtAbility(const AAFwk::Want &want, const sptr &token); void DisconnectFileExtAbility(); bool IsExtAbilityConnected(); - void OnSchedulerDied(const wptr &remote); sptr GetFileExtProxy(); private: - void AddFileAccessDeathRecipient(const sptr &token); - void RemoveFileAccessDeathRecipient(const sptr &token); struct ThreadLockInfo { std::condition_variable condition; + std::mutex mutex; bool isReady = false; }; ThreadLockInfo connectLockInfo_; @@ -54,21 +56,22 @@ private: static std::mutex mutex_; std::atomic isConnected_ = {false}; sptr fileExtProxy_; - std::mutex deathRecipientMutex_; - std::mutex proxyMutex_; - sptr callerDeathRecipient_ = nullptr; }; -class FileAccessDeathRecipient : public IRemoteObject::DeathRecipient { -public: - using RemoteDiedHandler = std::function &)>; - explicit FileAccessDeathRecipient(RemoteDiedHandler handler); - virtual ~FileAccessDeathRecipient(); - virtual void OnRemoteDied(const wptr &remote); +class AgentFileAccessExtConnection : public AAFwk::AbilityConnectionStub { +public: + AgentFileAccessExtConnection(const sptr& connection) : connection_(connection){}; + virtual ~AgentFileAccessExtConnection(); + void OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override; + void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override; + void ConnectFileExtAbility(const AAFwk::Want &want); + void DisconnectFileExtAbility(); private: - RemoteDiedHandler handler_; + const sptr connection_ = nullptr; }; + } // namespace FileAccessFwk } // namespace OHOS #endif // FILE_ACCESS_EXT_CONNECTION_H diff --git a/services/native/file_access_service/include/file_access_service.h b/services/native/file_access_service/include/file_access_service.h index 5d4984c2..9aebad9c 100644 --- a/services/native/file_access_service/include/file_access_service.h +++ b/services/native/file_access_service/include/file_access_service.h @@ -25,6 +25,7 @@ #include #include "bundle_mgr_interface.h" +#include "file_access_ext_connection.h" #include "file_access_service_stub.h" #include "ifile_access_ext_base.h" #include "holder_manager.h" @@ -36,7 +37,7 @@ namespace OHOS { namespace FileAccessFwk { - +class AgentFileAccessExtConnection; class ObserverContext { public: ObserverContext(sptr obs): obs_(obs) {} @@ -225,6 +226,9 @@ public: virtual void OnStart() override; virtual void OnStop() override; int32_t Dump(int32_t fd, const std::vector &args) override; + + void DisconnectAppProxy(const sptr& connection); + void RemoveAppProxy(const sptr& connection); protected: int32_t RegisterNotify(Uri uri, bool notifyForDescendants, const sptr &observer, @@ -233,8 +237,11 @@ protected: const std::shared_ptr &info = nullptr) override; int32_t CleanAllNotify(Uri uri, const std::shared_ptr &info) override; int32_t OnChange(Uri uri, NotifyType notifyType) override; - int32_t GetExensionProxy(const std::shared_ptr &info, + int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override; + int32_t ConnectFileExtAbility(const AAFwk::Want &want, + const sptr& connection) override; + int32_t DisConnectFileExtAbility(const sptr& connection) override; private: class ExtensionDeathRecipient : public IRemoteObject::DeathRecipient { @@ -272,6 +279,8 @@ private: const std::shared_ptr &info); sptr FindExtProxyByBundleName(std::string bundleName); void AddExtProxyInfo(std::string bundleName, sptr extProxy); + // 管理对象 方法 + void AddAppProxy(const sptr& key, sptr& value); std::shared_ptr unLoadTimer_ = nullptr; std::shared_ptr onDemandTimer_ = nullptr; static sptr instance_; @@ -285,6 +294,18 @@ private: HolderManager> obsManager_; std::mutex mapMutex_; std::unordered_map> cMap_; + + class AppDeathRecipient : public IRemoteObject::DeathRecipient { + public: + AppDeathRecipient() {} + virtual void OnRemoteDied(const wptr& remote); + virtual ~AppDeathRecipient() = default; + }; + + std::mutex appProxyMutex_; + std::unordered_map> appProxyMap_; + std::unordered_map> appConnection_; + sptr appDeathRecipient_; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/include/file_access_service_ipc_interface_code.h b/services/native/file_access_service/include/file_access_service_ipc_interface_code.h index 6e16398d..00312b0d 100644 --- a/services/native/file_access_service/include/file_access_service_ipc_interface_code.h +++ b/services/native/file_access_service/include/file_access_service_ipc_interface_code.h @@ -22,7 +22,9 @@ namespace FileAccessFwk { CMD_REGISTER_NOTIFY = 0, CMD_UNREGISTER_NOTIFY, CMD_ONCHANGE, - CMD_GET_EXTENSION_PROXY + CMD_GET_EXTENSION_PROXY, + CMD_CONNECT_FILE_EXT_ABILITY, + CMD_DISCONNECT_FILE_EXT_ABILITY }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/include/file_access_service_proxy.h b/services/native/file_access_service/include/file_access_service_proxy.h index 8233430d..b32375af 100644 --- a/services/native/file_access_service/include/file_access_service_proxy.h +++ b/services/native/file_access_service/include/file_access_service_proxy.h @@ -33,9 +33,12 @@ public: const std::shared_ptr &info) override; int32_t UnregisterNotify(Uri uri, const sptr &observer, const std::shared_ptr &info) override; - int32_t GetExensionProxy(const std::shared_ptr &info, + int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override; - + int32_t ConnectFileExtAbility(const AAFwk::Want &want, + const sptr& connection) override; + int32_t DisConnectFileExtAbility(const sptr& connection) override; + class ServiceProxyLoadCallback : public SystemAbilityLoadCallbackStub { public: void OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr &remoteObject) override; diff --git a/services/native/file_access_service/include/file_access_service_stub.h b/services/native/file_access_service/include/file_access_service_stub.h index 94823f82..96067c08 100644 --- a/services/native/file_access_service/include/file_access_service_stub.h +++ b/services/native/file_access_service/include/file_access_service_stub.h @@ -38,6 +38,8 @@ private: ErrCode CmdRegisterNotify(MessageParcel &data, MessageParcel &reply); ErrCode CmdUnregisterNotify(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetExensionProxy(MessageParcel &data, MessageParcel &reply); + ErrCode CmdConnectFileExtAbility(MessageParcel &data, MessageParcel &reply); + ErrCode CmdDisConnectFileExtAbility(MessageParcel &data, MessageParcel &reply); bool CheckCallingPermission(const std::string &permission); using RequestFuncType = int (FileAccessServiceStub::*)(MessageParcel &data, MessageParcel &reply); std::map stubFuncMap_; diff --git a/services/native/file_access_service/include/holder_manager.h b/services/native/file_access_service/include/holder_manager.h index 173710ab..ce2d47c8 100644 --- a/services/native/file_access_service/include/holder_manager.h +++ b/services/native/file_access_service/include/holder_manager.h @@ -37,6 +37,7 @@ public: { std::lock_guard guard(holderMutex_); holder_.clear(); + HILOG_INFO("~HolderManager holder size: %{public}zu", holder_.size()); } uint32_t save(Type content) @@ -47,6 +48,7 @@ public: } while (exist(id)); std::lock_guard guard(holderMutex_); holder_.insert(std::pair(id, content)); + HILOG_INFO("save id:%{public}d holder size: %{public}zu", id, holder_.size()); return id; } @@ -67,8 +69,10 @@ public: if (iter != holder_.end()) { auto res = iter->second; holder_.erase(id); + HILOG_INFO("pop id: %{public}d find holder size: %{public}zu", id, holder_.size()); return res; } + HILOG_INFO("pop id: %{public}d not find holder size: %{public}zu", id, holder_.size()); return Type(); } @@ -76,7 +80,10 @@ public: { std::lock_guard guard(holderMutex_); if (holder_.count(id)) { + HILOG_INFO("release id: %{public}d find holder size: %{public}zu", id, holder_.size()); holder_.erase(id); + } else { + HILOG_INFO("release id: %{public}d not find holder size: %{public}zu", id, holder_.size()); } } diff --git a/services/native/file_access_service/include/ifile_access_service_base.h b/services/native/file_access_service/include/ifile_access_service_base.h index f9748567..02cb61a3 100644 --- a/services/native/file_access_service/include/ifile_access_service_base.h +++ b/services/native/file_access_service/include/ifile_access_service_base.h @@ -16,6 +16,7 @@ #ifndef I_FILE_ACCESS_SERVICE_BASE_H #define I_FILE_ACCESS_SERVICE_BASE_H +#include "ability_connect_callback_interface.h" #include "file_access_helper.h" #include "iremote_broker.h" #include "iremote_object.h" @@ -36,8 +37,11 @@ protected: virtual int32_t UnregisterNotify(Uri uri, const sptr &observer, const std::shared_ptr &info) = 0; //Get exension proxy by SA - virtual int32_t GetExensionProxy(const std::shared_ptr &info, + virtual int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) = 0; + virtual int32_t ConnectFileExtAbility(const AAFwk::Want &want, + const sptr& connection) = 0; + virtual int32_t DisConnectFileExtAbility(const sptr& connection) = 0; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_ext_connection.cpp b/services/native/file_access_service/src/file_access_ext_connection.cpp new file mode 100644 index 00000000..a2928a3d --- /dev/null +++ b/services/native/file_access_service/src/file_access_ext_connection.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "file_access_ext_connection.h" + +#include + +#include "ability_connect_callback_interface.h" +#include "ability_manager_client.h" +#include "file_access_ext_proxy.h" +#include "hilog_wrapper.h" +#include "iremote_broker.h" +#include "ipc_skeleton.h" + +namespace OHOS { +namespace FileAccessFwk { + +std::mutex FileAccessExtConnection::mutex_; + +const int32_t DEFAULT_USER_ID = -1; + +void FileAccessExtConnection::OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) +{ + HILOG_INFO("OnAbilityConnectDone start"); + if (remoteObject == nullptr) { + HILOG_ERROR("remote is nullptr"); + return; + } + + fileExtProxy_ = iface_cast(remoteObject); + if (fileExtProxy_ == nullptr) { + HILOG_ERROR("FileAccessExtConnection fileExtProxy_ is nullptr"); + return; + } + HILOG_INFO("OnAbilityConnectDone set connected info"); + isConnected_.store(true); + std::lock_guard lock(connectLockInfo_.mutex); + connectLockInfo_.isReady = true; + connectLockInfo_.condition.notify_all(); +} + +void FileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) +{ + fileExtProxy_ = nullptr; + isConnected_.store(false); +} + +void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, const sptr &token) +{ + ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, DEFAULT_USER_ID); + HILOG_INFO("ConnectFileExtAbility ret: %{public}d ", ret); + if (ret != ERR_OK) { + HILOG_INFO("ConnectAbility ret=%{public}d", ret); + return; + } + std::unique_lock lock(connectLockInfo_.mutex); + const int WAIT_TIME = 3; // second + if (!connectLockInfo_.condition.wait_for(lock, std::chrono::seconds(WAIT_TIME), + [this] { return fileExtProxy_ != nullptr && connectLockInfo_.isReady; })) { + HILOG_INFO("Wait connect timeout."); + } +} + +void FileAccessExtConnection::DisconnectFileExtAbility() +{ + fileExtProxy_ = nullptr; + isConnected_.store(false); + ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(this); + HILOG_INFO("DisconnectFileExtAbility called end, ret=%{public}d", ret); +} + +bool FileAccessExtConnection::IsExtAbilityConnected() +{ + return isConnected_.load(); +} + +sptr FileAccessExtConnection::GetFileExtProxy() +{ + return fileExtProxy_; +} + +void AgentFileAccessExtConnection::OnAbilityConnectDone( + const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) +{ + HILOG_INFO("start OnAbilityConnectDone"); + if (connection_ == nullptr) { + return ; + } + connection_->OnAbilityConnectDone(element, remoteObject, resultCode); + HILOG_INFO("end OnAbilityConnectDone"); +} + +void AgentFileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) +{ + HILOG_INFO("start OnAbilityDisconnectDone"); + if (connection_ == nullptr) { + HILOG_WARN("OnAbilityDisconnectDone connection_ is nullptr"); + return; + } + connection_->OnAbilityDisconnectDone(element, resultCode); + FileAccessService::GetInstance()->DisconnectAppProxy(connection_); + FileAccessService::GetInstance()->RemoveAppProxy(connection_); + HILOG_INFO("OnAbilityDisconnectDone resultCode=%{public}d", resultCode); +} + +void AgentFileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want) +{ + ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, DEFAULT_USER_ID); + if (ret != ERR_OK) { + HILOG_ERROR("AgentFileAccessExtConnection ConnectAbility failed, ret=%{public}d", ret); + return; + } + HILOG_INFO("AgentFileAccessExtConnection ConnectFileExtAbility success"); +} + +void AgentFileAccessExtConnection::DisconnectFileExtAbility() +{ + ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(this); + if (ret != ERR_OK) { + HILOG_ERROR("DisconnectAbility failed, ret=%{public}d", ret); + return; + } + HILOG_INFO("DisconnectFileExtAbility done"); +} + +AgentFileAccessExtConnection::~AgentFileAccessExtConnection() +{ +} + +} // namespace FileAccessFwk +} // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 526a54f9..f6e83b07 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -15,13 +15,12 @@ #include "file_access_service.h" +#include #include #include "user_access_tracer.h" #include "file_access_framework_errno.h" -#include "file_access_ext_connection.h" #include "file_access_extension_info.h" -#include "file_access_ext_connection.h" #include "hilog_wrapper.h" #include "hitrace_meter.h" #include "ipc_skeleton.h" @@ -141,6 +140,9 @@ void FileAccessService::Init() if (observerDeathRecipient_ == nullptr) { observerDeathRecipient_ = sptr(new ObserverDeathRecipient()); } + if (appDeathRecipient_ == nullptr) { + appDeathRecipient_ = sptr(new AppDeathRecipient()); + } } static bool GetBundleNameFromUri(Uri &uri, string &bundleName) @@ -186,7 +188,7 @@ sptr FileAccessService::ConnectExtension(Uri &uri, const sha sptr extensionProxy; { lock_guard lock(mutex_); - int32_t ret = GetExensionProxy(info, extensionProxy); + int32_t ret = GetExtensionProxy(info, extensionProxy); if (ret != ERR_OK || extensionProxy == nullptr) { return nullptr; } @@ -288,6 +290,7 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u const std::shared_ptr &info) { string uriStr = uri.ToString(); + HILOG_INFO("OperateObsNode uriStr: %{public}s", uriStr.c_str()); lock_guard lock(nodeMutex_); auto iter = relationshipMap_.find(uriStr); shared_ptr obsNode; @@ -340,7 +343,7 @@ int32_t FileAccessService::RegisterNotifyImpl(Uri uri, bool notifyForDescendants { UserAccessTracer trace; trace.Start("RegisterNotifyImpl"); - std::string token = IPCSkeleton::ResetCallingIdentity(); + // std::string token = IPCSkeleton::ResetCallingIdentity(); shared_ptr obsContext = make_shared(observer); // find if obsManager_ has this callback. uint32_t code = obsManager_.getId([obsContext](const shared_ptr &afterContext) { @@ -384,6 +387,7 @@ void FileAccessService::RemoveRelations(string &uriStr, shared_ptr int FileAccessService::FindUri(const string &uriStr, shared_ptr &outObsNode) { + HILOG_INFO("uriStr: %{public}s", uriStr.c_str()); lock_guard lock(nodeMutex_); auto iter = relationshipMap_.find(uriStr); if (iter == relationshipMap_.end()) { @@ -600,7 +604,9 @@ int32_t FileAccessService::OnChange(Uri uri, NotifyType notifyType) bool FileAccessService::IsUnused() { - return obsManager_.isEmpty(); + HILOG_INFO("IsUnused: obsManager_: %{public}d, appProxyMap_: %{public}d", + obsManager_.isEmpty(), appProxyMap_.empty()); + return obsManager_.isEmpty() && appProxyMap_.empty(); } void FileAccessService::InitTimer() @@ -648,7 +654,41 @@ void FileAccessService::InitTimer() unLoadTimer_->start(); } -int32_t FileAccessService::GetExensionProxy(const std::shared_ptr &info, +int32_t FileAccessService::ConnectFileExtAbility(const AAFwk::Want &want, + const sptr& connection) +{ + HILOG_INFO("ConnectFileExtAbility start"); + if (connection == nullptr) { + HILOG_ERROR("connection is nullptr"); + return E_CONNECT; + } + + sptr fileAccessExtConnection( + new(std::nothrow) AgentFileAccessExtConnection(connection)); + if (fileAccessExtConnection == nullptr) { + HILOG_ERROR("new fileAccessExtConnection fail"); + return E_CONNECT; + } + + fileAccessExtConnection->ConnectFileExtAbility(want); + AddAppProxy(connection, fileAccessExtConnection); + return ERR_OK; +} + +int32_t FileAccessService::DisConnectFileExtAbility(const sptr& connection) +{ + HILOG_INFO("ConnectFileExtAbility start"); + if (connection == nullptr) { + HILOG_ERROR("connection is nullptr"); + return E_CONNECT; + } + DisconnectAppProxy(connection); + RemoveAppProxy(connection); + return ERR_OK; +} + + +int32_t FileAccessService::GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) { sptr fileAccessExtConnection(new(std::nothrow) FileAccessExtConnection()); @@ -703,5 +743,75 @@ void FileAccessService::AddExtProxyInfo(std::string bundleName, sptr lock(mapMutex_); cMap_.emplace(bundleName, extProxy); } + +void FileAccessService::AddAppProxy(const sptr& connection, + sptr& value) +{ + if (connection == nullptr || value == nullptr) { + HILOG_ERROR("key is null or value is null"); + return; + } + size_t key = reinterpret_cast(connection->AsObject().GetRefPtr()); + HILOG_INFO("sa add key, %{public}zu", key); + lock_guard lock(appProxyMutex_); + if (appProxyMap_.count(key)) { + HILOG_INFO("sa had proxy,needn't create connection"); + return; + } + connection->AsObject()->AddDeathRecipient(appDeathRecipient_); + appProxyMap_[key] = value; + appConnection_[key] = connection; + HILOG_INFO("appProxyMap_ size: %{public}zu", appProxyMap_.size()); +} + +void FileAccessService::RemoveAppProxy(const sptr& connection) +{ + if (connection == nullptr) { + HILOG_WARN("key is null"); + return; + } + size_t key = reinterpret_cast(connection->AsObject().GetRefPtr()); + if (appProxyMap_.find(key) == appProxyMap_.end()) { + HILOG_WARN("appProxyMap_ not key: %{public}zu", key); + return; + } + lock_guard lock(appProxyMutex_); + if (appProxyMap_.find(key) == appProxyMap_.end()) { + HILOG_INFO("appProxyMap_ not key"); + return; + } + + appProxyMap_.erase(key); + appConnection_.erase(key); + HILOG_INFO("appProxyMap_ size: %{public}zu", appProxyMap_.size()); +} + +void FileAccessService::DisconnectAppProxy(const sptr& connection) +{ + size_t key = reinterpret_cast(connection->AsObject().GetRefPtr()); + lock_guard lock(appProxyMutex_); + if (appProxyMap_.find(key) == appProxyMap_.end()) { + HILOG_WARN("appProxyMap_ not key: %{public}zu", key); + return; + } + HILOG_INFO("DisconnectAppProxy DisconnectFileExtAbility key: %{public}zu", key); + if (appProxyMap_[key] != nullptr) { + appProxyMap_[key]->DisconnectFileExtAbility(); + } +} + +void FileAccessService::AppDeathRecipient::OnRemoteDied(const wptr &remote) +{ + HILOG_INFO("FileAccessService::AppDeathRecipient::OnRemoteDied, remote obj died."); + if (remote == nullptr) { + HILOG_ERROR("remote is nullptr"); + return; + } + auto remoteBroker = iface_cast(remote.promote()); + size_t key = reinterpret_cast(remoteBroker->AsObject().GetRefPtr()); + HILOG_INFO("remote: %{public}zu", key); + FileAccessService::GetInstance()->RemoveAppProxy(remoteBroker); +} + } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_service_proxy.cpp b/services/native/file_access_service/src/file_access_service_proxy.cpp index 8438774d..b476ad71 100644 --- a/services/native/file_access_service/src/file_access_service_proxy.cpp +++ b/services/native/file_access_service/src/file_access_service_proxy.cpp @@ -295,12 +295,103 @@ int32_t FileAccessServiceProxy::UnregisterNotify(Uri uri, const sptr& connection) +{ + UserAccessTracer trace; + trace.Start("ConnectFileExtAbility"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessServiceProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + return E_IPCS; + } + + if (!data.WriteParcelable(&want)) { + HILOG_ERROR("fail to WriteParcelable want"); + return E_IPCS; + } + + if (connection == nullptr || connection->AsObject() == nullptr) { + HILOG_ERROR("connection is nullptr"); + return E_GETINFO; + } + + if (!data.WriteRemoteObject(connection->AsObject())) { + HILOG_ERROR("fail to WriteParcelable connection"); + return E_IPCS; + } + + MessageParcel reply; + MessageOption option; + auto remote = Remote(); + if (!remote) { + HILOG_ERROR("failed to get remote"); + return E_IPCS; + } + int err = remote->SendRequest(static_cast( + FileAccessServiceInterfaceCode::CMD_CONNECT_FILE_EXT_ABILITY), data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + return err; + } + + int ret = E_IPCS; + if (!reply.ReadInt32(ret) || ret != ERR_OK) { + HILOG_ERROR("ConnectFileExtAbility operation failed ret : %{public}d", ret); + return ret; + } + + return ERR_OK; +} + +int32_t FileAccessServiceProxy::DisConnectFileExtAbility(const sptr& connection) +{ + UserAccessTracer trace; + trace.Start("DisConnectFileExtAbility"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessServiceProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + return E_IPCS; + } + + if (connection == nullptr || connection->AsObject() == nullptr) { + HILOG_ERROR("connection is nullptr"); + return E_GETINFO; + } + + if (!data.WriteRemoteObject(connection->AsObject())) { + HILOG_ERROR("fail to WriteParcelable connection"); + return E_IPCS; + } + + MessageParcel reply; + MessageOption option; + auto remote = Remote(); + if (!remote) { + HILOG_ERROR("failed to get remote"); + return E_IPCS; + } + int err = remote->SendRequest(static_cast( + FileAccessServiceInterfaceCode::CMD_DISCONNECT_FILE_EXT_ABILITY), data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + return err; + } + + int ret = E_IPCS; + if (!reply.ReadInt32(ret) || ret != ERR_OK) { + HILOG_ERROR("DisConnectFileExtAbility operation failed ret : %{public}d", ret); + return ret; + } + + return ERR_OK; +} -int32_t FileAccessServiceProxy::GetExensionProxy(const std::shared_ptr &info, +int32_t FileAccessServiceProxy::GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) { UserAccessTracer trace; - trace.Start("GetExensionProxy"); + trace.Start("GetExtensionProxy"); MessageParcel data; if (!data.WriteInterfaceToken(FileAccessServiceProxy::GetDescriptor())) { HILOG_ERROR("WriteInterfaceToken failed"); @@ -333,7 +424,7 @@ int32_t FileAccessServiceProxy::GetExensionProxy(const std::shared_ptr(FileAccessServiceInterfaceCode::CMD_ONCHANGE)] = &FileAccessServiceStub::CmdOnChange; + stubFuncMap_[static_cast(FileAccessServiceInterfaceCode::CMD_CONNECT_FILE_EXT_ABILITY)] = + &FileAccessServiceStub::CmdConnectFileExtAbility; + stubFuncMap_[static_cast(FileAccessServiceInterfaceCode::CMD_DISCONNECT_FILE_EXT_ABILITY)] = + &FileAccessServiceStub::CmdDisConnectFileExtAbility; } FileAccessServiceStub::~FileAccessServiceStub() @@ -190,6 +194,51 @@ bool FileAccessServiceStub::CheckCallingPermission(const std::string &permission return true; } +ErrCode FileAccessServiceStub::CmdConnectFileExtAbility(MessageParcel &data, MessageParcel &reply) +{ + UserAccessTracer trace; + trace.Start("CmdConnectFileExtAbility"); + std::shared_ptr wantPtr(data.ReadParcelable()); + if (wantPtr == nullptr) { + return E_IPCS; + } + AAFwk::Want want = AAFwk::Want(*wantPtr); + + sptr connection = iface_cast(data.ReadRemoteObject()); + if (!connection) { + HILOG_ERROR("fail to read connection"); + return E_IPCS; + } + + int ret = ConnectFileExtAbility(want, connection); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("fail to CmdConnectFileExtAbility"); + return E_IPCS; + } + + return ERR_OK; +} + + +ErrCode FileAccessServiceStub::CmdDisConnectFileExtAbility(MessageParcel &data, MessageParcel &reply) +{ + UserAccessTracer trace; + trace.Start("CmdDisConnectFileExtAbility"); + sptr connection = iface_cast(data.ReadRemoteObject()); + if (!connection) { + HILOG_ERROR("fail to read connection"); + return E_IPCS; + } + + int ret = DisConnectFileExtAbility(connection); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("fail to CmdDisConnectFileExtAbility"); + return E_IPCS; + } + + return ERR_OK; +} + ErrCode FileAccessServiceStub::CmdGetExensionProxy(MessageParcel &data, MessageParcel &reply) { UserAccessTracer trace; @@ -201,9 +250,9 @@ ErrCode FileAccessServiceStub::CmdGetExensionProxy(MessageParcel &data, MessageP } sptr extensionProxy; - int ret = GetExensionProxy(connectExtensionInfo, extensionProxy); + int ret = GetExtensionProxy(connectExtensionInfo, extensionProxy); if (!reply.WriteInt32(ret) || extensionProxy == nullptr) { - HILOG_ERROR("fail to GetExensionProxy"); + HILOG_ERROR("fail to GetExtensionProxy"); return E_IPCS; } if (!reply.WriteRemoteObject(extensionProxy->AsObject())) { diff --git a/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn b/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn index 4dabd0bd..6d169121 100644 --- a/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn +++ b/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn @@ -21,7 +21,9 @@ ohos_fuzztest("FileAccessExtConnectionFuzzTest") { "${user_file_service_path}/test/fuzztest/fileaccessextconnection_fuzzer" include_dirs = [ "${ability_runtime_path}/interfaces/inner_api/ability_manager/include", + "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", "${user_file_service_path}/interfaces/inner_api/file_access/include", + "${user_file_service_path}/services/native/file_access_service/include", "${user_file_service_path}/interfaces/kits/js/src/common", "${user_file_service_path}/utils", ] @@ -32,8 +34,8 @@ ohos_fuzztest("FileAccessExtConnectionFuzzTest") { "-fno-omit-frame-pointer", ] sources = [ - "${user_file_service_path}/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp", "${user_file_service_path}/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp", + "${user_file_service_path}/services/native/file_access_service/src/file_access_ext_connection.cpp", "${user_file_service_path}/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp", ] diff --git a/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp b/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp index d7a29ad0..6392cae8 100644 --- a/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp +++ b/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp @@ -51,6 +51,21 @@ bool GetFileExtProxyFuzzTest(shared_ptr conn) return true; } +bool ConnectFileExtAbility(shared_ptr conn) +{ + AAFwk::Want want; + sptr remoteObject = nullptr; + conn->ConnectFileExtAbility(want, remoteObject); + return true; +} + +bool DisconnectFileExtAbility(shared_ptr conn) +{ + conn->DisconnectFileExtAbility(); + return true; +} + + } // namespace OHOS /* Fuzzer entry point */ @@ -65,6 +80,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::OnAbilityDisconnectDoneFuzzTest(conn); OHOS::IsExtAbilityConnectedFuzzTest(conn); OHOS::GetFileExtProxyFuzzTest(conn); + OHOS::ConnectFileExtAbility(conn); + OHOS::DisconnectFileExtAbility(conn); return 0; } diff --git a/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessservicemock.h b/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessservicemock.h index 363527a7..0918b9cf 100644 --- a/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessservicemock.h +++ b/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessservicemock.h @@ -29,9 +29,12 @@ public: const std::shared_ptr &info) override { return 0; } int32_t UnregisterNotify(Uri uri, const sptr &observer, const std::shared_ptr &info) override { return 0; } - int32_t GetExensionProxy(const std::shared_ptr &info, + int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override { return 0; } int32_t CleanAllNotify(Uri uri, const std::shared_ptr &info) override { return 0; } + int32_t ConnectFileExtAbility(const AAFwk::Want &want, + const sptr& connection) override { return 0; }; + int32_t DisConnectFileExtAbility(const sptr& connection) override { return 0; }; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessserviceproxy_fuzzer.cpp b/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessserviceproxy_fuzzer.cpp index 039d075b..da529976 100644 --- a/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessserviceproxy_fuzzer.cpp +++ b/test/fuzztest/fileaccessserviceproxy_fuzzer/fileaccessserviceproxy_fuzzer.cpp @@ -92,7 +92,7 @@ bool GetExensionProxyFuzzTest(shared_ptr proxy, const ui auto info = make_shared(); sptr extensionProxy = nullptr; - proxy->GetExensionProxy(info, extensionProxy); + proxy->GetExtensionProxy(info, extensionProxy); return true; } } // namespace OHOS diff --git a/test/fuzztest/fileaccessservicestub_fuzzer/fileaccessservicemock.h b/test/fuzztest/fileaccessservicestub_fuzzer/fileaccessservicemock.h index 363527a7..0bbc68f0 100644 --- a/test/fuzztest/fileaccessservicestub_fuzzer/fileaccessservicemock.h +++ b/test/fuzztest/fileaccessservicestub_fuzzer/fileaccessservicemock.h @@ -29,9 +29,12 @@ public: const std::shared_ptr &info) override { return 0; } int32_t UnregisterNotify(Uri uri, const sptr &observer, const std::shared_ptr &info) override { return 0; } - int32_t GetExensionProxy(const std::shared_ptr &info, + int32_t GetExtensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override { return 0; } int32_t CleanAllNotify(Uri uri, const std::shared_ptr &info) override { return 0; } + int32_t ConnectFileExtAbility(const AAFwk::Want &want, + const sptr& connection) override { return 0; } + int32_t DisConnectFileExtAbility(const sptr& connection) override { return 0; } }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/test/unittest/file_access_service_proxy_test.cpp b/test/unittest/file_access_service_proxy_test.cpp index 84467630..72af1e08 100644 --- a/test/unittest/file_access_service_proxy_test.cpp +++ b/test/unittest/file_access_service_proxy_test.cpp @@ -350,7 +350,7 @@ HWTEST_F(FileAccessServiceProxyTest, file_access_service_proxy_UnregisterNotify_ /** * @tc.number: user_file_service_file_access_service_proxy_GetExensionProxy_0000 * @tc.name: file_access_service_proxy_GetExensionProxy_0000 - * @tc.desc: Test function of GetExensionProxy interface for ERROR. + * @tc.desc: Test function of GetExtensionProxy interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC * @tc.level Level 3 @@ -365,36 +365,36 @@ HWTEST_F(FileAccessServiceProxyTest, file_access_service_proxy_GetExensionProxy_ shared_ptr info = nullptr; sptr extensionProxy = nullptr; EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(false)); - auto result = proxy->GetExensionProxy(info, extensionProxy); + auto result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_GETINFO); info = make_shared(); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(false)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(E_URIS)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_URIS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) .WillOnce(Return(false)); EXPECT_CALL(*insMoc, Int()).WillOnce(Return(ERR_OK)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(ERR_OK)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, ERR_OK); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) .WillOnce(Return(true)); EXPECT_CALL(*insMoc, Int()).WillOnce(Return(E_IPCS)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(ERR_OK)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); EXPECT_CALL(*insMoc, Bool()).WillOnce(Return(true)).WillOnce(Return(true)).WillOnce(Return(true)) .WillOnce(Return(true)); EXPECT_CALL(*insMoc, Int()).WillOnce(Return(ERR_OK)); EXPECT_CALL(*impl, SendRequest(_, _, _, _)).WillOnce(Return(ERR_OK)); - result = proxy->GetExensionProxy(info, extensionProxy); + result = proxy->GetExtensionProxy(info, extensionProxy); EXPECT_EQ(result, E_IPCS); } catch (...) { GTEST_LOG_(ERROR) << "FileAccessServiceProxyTest occurs an exception."; diff --git a/test/unittest/js_file_access_ext_ability_test.cpp b/test/unittest/js_file_access_ext_ability_test.cpp index bcb52230..60b1e613 100644 --- a/test/unittest/js_file_access_ext_ability_test.cpp +++ b/test/unittest/js_file_access_ext_ability_test.cpp @@ -58,7 +58,7 @@ int32_t FileAccessServiceProxy::OnChange(Uri uri, NotifyType notifyType) return ERR_OK; } -int32_t FileAccessServiceProxy::GetExensionProxy(const std::shared_ptr &, +int32_t FileAccessServiceProxy::GetExtensionProxy(const std::shared_ptr &, sptr &) { return 0; @@ -70,6 +70,17 @@ int32_t FileAccessServiceProxy::UnregisterNotify(Uri, const sptr&) +{ + return 0; +} + +int32_t FileAccessServiceProxy::DisConnectFileExtAbility(const sptr&) +{ + return 0; +} + void FileAccessExtAbility::Init(const std::shared_ptr &record, const std::shared_ptr &application, std::shared_ptr &handler, diff --git a/test/unittest/mock/file_access_service_mock.h b/test/unittest/mock/file_access_service_mock.h index 1bdfc317..830cc95d 100644 --- a/test/unittest/mock/file_access_service_mock.h +++ b/test/unittest/mock/file_access_service_mock.h @@ -28,13 +28,16 @@ public: const sptr &observer, const std::shared_ptr &info)); MOCK_METHOD3(UnregisterNotify, int32_t(Uri uri, const sptr &observer, const std::shared_ptr &info)); - MOCK_METHOD2(GetExensionProxy, int32_t(const std::shared_ptr &info, + MOCK_METHOD2(GetExtensionProxy, int32_t(const std::shared_ptr &info, sptr &extensionProxy)); MOCK_METHOD0(AsObject, sptr()); MOCK_METHOD2(CleanAllNotify, int32_t(Uri uri, const std::shared_ptr &info)); MOCK_METHOD4(OnRemoteRequest, int32_t(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)); MOCK_METHOD4(SendRequest, int(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)); + MOCK_METHOD2(ConnectFileExtAbility, int32_t(const AAFwk::Want &want, + const sptr& connection)); + MOCK_METHOD1(DisConnectFileExtAbility, int32_t(const sptr& connection)); }; } // namespace FileAccessFwk } // namespace OHOS -- Gitee From e8b4264ddcd855b9df09a205d74b8965dfafd03c Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Thu, 22 Aug 2024 19:43:45 +0800 Subject: [PATCH 14/40] fix code Signed-off-by: zhouoaoteng --- .../src/file_access_service.cpp | 63 ++++++++++--------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 6001e2b3..5272fb55 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -304,27 +304,29 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u const std::shared_ptr &info) { string uriStr = uri.ToString(); - lock_guard lock(nodeMutex_); - auto iter = relationshipMap_.find(uriStr); shared_ptr obsNode; - if (iter != relationshipMap_.end()) { - obsNode = iter->second; - // this node has this callback or not, if has this, unref manager. - auto haveCodeIter = find_if(obsNode->obsCodeList_.begin(), obsNode->obsCodeList_.end(), - [code](const uint32_t &listCode) { return code == listCode; }); - if (haveCodeIter != obsNode->obsCodeList_.end()) { - obsManager_.get(code)->UnRef(); - if (obsNode->needChildNote_ == notifyForDescendants) { - HILOG_DEBUG("Register same uri and same callback and same notifyForDescendants"); + { + lock_guard lock(nodeMutex_); + auto iter = relationshipMap_.find(uriStr); + if (iter != relationshipMap_.end()) { + obsNode = iter->second; + // this node has this callback or not, if has this, unref manager. + auto haveCodeIter = find_if(obsNode->obsCodeList_.begin(), obsNode->obsCodeList_.end(), + [code](const uint32_t &listCode) { return code == listCode; }); + if (haveCodeIter != obsNode->obsCodeList_.end()) { + obsManager_.get(code)->UnRef(); + if (obsNode->needChildNote_ == notifyForDescendants) { + HILOG_DEBUG("Register same uri and same callback and same notifyForDescendants"); + return ERR_OK; + } + // need modify obsNode notifyForDescendants + obsNode->needChildNote_ = notifyForDescendants; + HILOG_DEBUG("Register same uri and same callback but need modify notifyForDescendants"); return ERR_OK; } - // need modify obsNode notifyForDescendants - obsNode->needChildNote_ = notifyForDescendants; - HILOG_DEBUG("Register same uri and same callback but need modify notifyForDescendants"); + obsNode->obsCodeList_.push_back(code); return ERR_OK; } - obsNode->obsCodeList_.push_back(code); - return ERR_OK; } auto extensionProxy = ConnectExtension(uri, info); @@ -333,21 +335,24 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u return E_CONNECT; } extensionProxy->StartWatcher(uri); - obsNode = make_shared(notifyForDescendants); - // add new node relations. - for (auto &[comUri, node] : relationshipMap_) { - if (IsParentUri(comUri, uriStr)) { - obsNode->parent_ = node; - node->children_.push_back(obsNode); - } - if (IsChildUri(comUri, uriStr)) { - obsNode->children_.push_back(node); - node->parent_ = obsNode; + { + lock_guard lock(nodeMutex_); + obsNode = make_shared(notifyForDescendants); + // add new node relations. + for (auto &[comUri, node] : relationshipMap_) { + if (IsParentUri(comUri, uriStr)) { + obsNode->parent_ = node; + node->children_.push_back(obsNode); + } + if (IsChildUri(comUri, uriStr)) { + obsNode->children_.push_back(node); + node->parent_ = obsNode; + } } + // obsCodeList_ is to save callback number + obsNode->obsCodeList_.push_back(code); + relationshipMap_.insert(make_pair(uriStr, obsNode)); } - // obsCodeList_ is to save callback number - obsNode->obsCodeList_.push_back(code); - relationshipMap_.insert(make_pair(uriStr, obsNode)); return ERR_OK; } -- Gitee From 81867aa21a8da17da64ab6d7f253c0fa092eaf60 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Fri, 23 Aug 2024 03:08:59 +0000 Subject: [PATCH 15/40] update services/native/file_access_service/src/file_access_service.cpp. Signed-off-by: zhouoaoteng --- services/native/file_access_service/src/file_access_service.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 258e00f9..1b675930 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -307,7 +307,6 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u { string uriStr = uri.ToString(); HILOG_INFO("OperateObsNode uriStr: %{public}s", uriStr.c_str()); - auto iter = relationshipMap_.find(uriStr); shared_ptr obsNode; { lock_guard lock(nodeMutex_); -- Gitee From ece048dd63392a73b02c68301c3a1c9d71af3f63 Mon Sep 17 00:00:00 2001 From: zhangxiaoliang25 Date: Tue, 27 Aug 2024 16:45:13 +0800 Subject: [PATCH 16/40] =?UTF-8?q?fuzz=20=E6=8F=92=E6=A1=A9=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangxiaoliang25 Change-Id: I73cc4fa64b27da0c5ee4380f0abc76813a21979d --- test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn b/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn index 6d169121..bff3a5ac 100644 --- a/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn +++ b/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn @@ -39,6 +39,8 @@ ohos_fuzztest("FileAccessExtConnectionFuzzTest") { "${user_file_service_path}/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp", ] + deps = [ "${user_file_service_path}/services:file_access_service" ] + external_deps = [ "ability_base:want", "ability_base:zuri", -- Gitee From ed7497fd743253666482a71b8795a417c26f15f1 Mon Sep 17 00:00:00 2001 From: wangpggg Date: Wed, 28 Aug 2024 10:15:33 +0800 Subject: [PATCH 17/40] anonymous print file name Signed-off-by: wangpeng --- interfaces/kits/native/recent/recent_n_exporter.cpp | 4 ++-- .../kits/native/trash/src/file_trash_n_exporter.cpp | 4 ++-- .../file_access_service/src/file_access_service.cpp | 9 +++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/interfaces/kits/native/recent/recent_n_exporter.cpp b/interfaces/kits/native/recent/recent_n_exporter.cpp index 762992f4..be59d42b 100644 --- a/interfaces/kits/native/recent/recent_n_exporter.cpp +++ b/interfaces/kits/native/recent/recent_n_exporter.cpp @@ -171,7 +171,7 @@ static int64_t GetFileMtime(const string &fileName) string filePath = RecentNExporter::recentPath_ + fileName; struct stat statBuf; if (lstat(filePath.c_str(), &statBuf) < 0) { - HILOG_ERROR("Failed to lstat uri, errno=%{public}d, fileName=%{public}s", errno, fileName.c_str()); + HILOG_ERROR("Failed to lstat uri, errno=%{public}d, fileName=%{private}s", errno, fileName.c_str()); return errno; } return static_cast(statBuf.st_mtime); @@ -181,7 +181,7 @@ static string GetName(const string &path) { auto pos = path.find_last_of('/'); if (pos == string::npos) { - HILOGE("Failed to split filename from path, path: %{public}s", path.c_str()); + HILOGE("Failed to split filename from path, path: %{private}s", path.c_str()); } return path.substr(pos + 1); } diff --git a/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp b/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp index dfb19a2e..52da4100 100644 --- a/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp +++ b/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp @@ -185,7 +185,7 @@ static napi_value CreateObjectArray(napi_env env, vector result) static string FindSourceFilePath(const string &path) { - HILOG_INFO("FindSourceFilePath: curFilePath = %{public}s", path.c_str()); + HILOG_INFO("FindSourceFilePath: curFilePath = %{private}s", path.c_str()); size_t slashSize = 1; // 获取/trash目录位置 size_t trashPathPrefixPos = path.find(FileTrashNExporter::trashPath_); @@ -213,7 +213,7 @@ static string FindSourceFilePath(const string &path) string realFileName = realFilePath.substr(pos + TRASH_SUB_DIR.length() + timeSlot.length() + slashSize); realFilePath = "/" + realFilePathPrefix + realFileName; - HILOG_INFO("FindSourceFilePath: realFilePath After = %{public}s", realFilePath.c_str()); + HILOG_INFO("FindSourceFilePath: realFilePath After = %{private}s", realFilePath.c_str()); return realFilePath; } diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 1b675930..93828f42 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -307,17 +307,18 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u { string uriStr = uri.ToString(); HILOG_INFO("OperateObsNode uriStr: %{public}s", uriStr.c_str()); - shared_ptr obsNode; { lock_guard lock(nodeMutex_); auto iter = relationshipMap_.find(uriStr); if (iter != relationshipMap_.end()) { - obsNode = iter->second; + auto obsNode = iter->second; // this node has this callback or not, if has this, unref manager. auto haveCodeIter = find_if(obsNode->obsCodeList_.begin(), obsNode->obsCodeList_.end(), [code](const uint32_t &listCode) { return code == listCode; }); if (haveCodeIter != obsNode->obsCodeList_.end()) { - obsManager_.get(code)->UnRef(); + if (obsManager_.get(code) != nullptr) { + obsManager_.get(code)->UnRef(); + } if (obsNode->needChildNote_ == notifyForDescendants) { HILOG_DEBUG("Register same uri and same callback and same notifyForDescendants"); return ERR_OK; @@ -340,7 +341,7 @@ int32_t FileAccessService::OperateObsNode(Uri &uri, bool notifyForDescendants, u extensionProxy->StartWatcher(uri); { lock_guard lock(nodeMutex_); - obsNode = make_shared(notifyForDescendants); + auto obsNode = make_shared(notifyForDescendants); // add new node relations. for (auto &[comUri, node] : relationshipMap_) { if (IsParentUri(comUri, uriStr)) { -- Gitee From c03af14a7b2d9aaa24aa05f43617e22599f2721f Mon Sep 17 00:00:00 2001 From: wangpggg Date: Wed, 4 Sep 2024 18:33:57 +0800 Subject: [PATCH 18/40] modify failed fuzz Signed-off-by: wangpeng --- .../fileaccessextconnection_fuzzer.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp b/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp index 6392cae8..c906e5f2 100644 --- a/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp +++ b/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp @@ -24,7 +24,7 @@ namespace OHOS { using namespace std; using namespace FileAccessFwk; -bool OnAbilityConnectDoneFuzzTest(shared_ptr conn) +bool OnAbilityConnectDoneFuzzTest(sptr conn) { AppExecFwk::ElementName element; sptr remoteObject = nullptr; @@ -32,26 +32,26 @@ bool OnAbilityConnectDoneFuzzTest(shared_ptr conn) return true; } -bool OnAbilityDisconnectDoneFuzzTest(shared_ptr conn) +bool OnAbilityDisconnectDoneFuzzTest(sptr conn) { AppExecFwk::ElementName element; conn->OnAbilityDisconnectDone(element, 0); return true; } -bool IsExtAbilityConnectedFuzzTest(shared_ptr conn) +bool IsExtAbilityConnectedFuzzTest(sptr conn) { conn->IsExtAbilityConnected(); return true; } -bool GetFileExtProxyFuzzTest(shared_ptr conn) +bool GetFileExtProxyFuzzTest(sptr conn) { conn->GetFileExtProxy(); return true; } -bool ConnectFileExtAbility(shared_ptr conn) +bool ConnectFileExtAbility(sptr conn) { AAFwk::Want want; sptr remoteObject = nullptr; @@ -59,19 +59,17 @@ bool ConnectFileExtAbility(shared_ptr conn) return true; } -bool DisconnectFileExtAbility(shared_ptr conn) +bool DisconnectFileExtAbility(sptr conn) { conn->DisconnectFileExtAbility(); return true; } - - } // namespace OHOS /* Fuzzer entry point */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { - auto conn = std::make_shared(); + auto conn = OHOS::sptr(); if (conn == nullptr) { return 0; } -- Gitee From 929007ed5c59930fe7a1519398a5cb028470769b Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 03:03:31 +0000 Subject: [PATCH 19/40] update interfaces/kits/picker/picker.js. Signed-off-by: BrainL --- interfaces/kits/picker/picker.js | 61 +++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index b2f7af6e..12dc88af 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -308,7 +308,7 @@ function parseAudioPickerSelectOption(args, action) { config.parameters.key_pick_num = option.maxSelectNumber; } } - console.log('modal picker: audio select config: ' + JSON.stringify(config)); + console.log('[picker] audio select config: ' + JSON.stringify(config)); return config; } @@ -348,6 +348,7 @@ async function documentPickerSelect(...args) { let documentSelectConfig = undefined; let documentSelectResult = undefined; let selectResult = undefined; + let documentSelectWindow = undefined; try { if (this.context !== undefined) { @@ -364,9 +365,12 @@ async function documentPickerSelect(...args) { console.error('[picker] documentSelectContext == undefined'); throw getErr(ErrCode.CONTEXT_NO_EXIST); } + if (this.window !== undefined) { + documentSelectWindow = this.window; + } documentSelectConfig = parseDocumentPickerSelectOption(args, ACTION.SELECT_ACTION_MODAL); console.error('[picker] DocumentSelect documentSelectConfig: ' + JSON.stringify(documentSelectConfig)); - documentSelectResult = await modalPicker(args, documentSelectContext, documentSelectConfig); + documentSelectResult = await modalPicker(documentSelectContext, documentSelectConfig, documentSelectWindow); } catch (paramError) { console.error('[picker] DocumentSelect paramError: ' + JSON.stringify(paramError)); } @@ -444,7 +448,7 @@ function getDocumentPickerSaveResult(args) { data: undefined, suffix: -1 }; - if (args.resultCode === undefined) { + if (args === undefined || args.resultCode === undefined) { saveResult.error = getErr(ErrCode.RESULT_ERROR); console.log('[picker] getDocumentPickerSaveResult saveResult: ' + JSON.stringify(saveResult)); return saveResult; @@ -469,31 +473,34 @@ function getDocumentPickerSaveResult(args) { function startModalPicker(context, config) { if (context === undefined) { - console.log('[picker] modal picker: startModalPicker context undefined.'); - throw Error('[picker] modal picker: startModalPicker context undefined.'); + throw Error('[picker] Context undefined.'); } if (config === undefined) { - console.log('[picker] modal picker: startModalPicker config undefined.'); - throw Error('[picker] modal picker: startModalPicker config undefined.'); + throw Error('[picker] Config undefined.'); } gContext = context; if (pickerHelper === undefined) { - console.log('[picker] modal picker: pickerHelper undefined.'); + throw Error('[picker] PickerHelper undefined.'); + } + let helper; + if (window != undefined) { + helper = pickerHelper.startModalPicker(gContext, config, window); + } else { + helper = pickerHelper.startModalPicker(gContext, config); } - let helper = pickerHelper.startModalPicker(gContext, config); if (helper === undefined) { - console.log('[picker] modal picker: startModalPicker helper undefined.'); + throw Error('[picker] Please check the parameter you entered.'); } return helper; } -async function modalPicker(args, context, config) { +async function modalPicker(context, config, window) { try { - console.log('[picker] modal picker: config: ' + JSON.stringify(config)); - let modalResult = await startModalPicker(context, config); + console.log('[picker] Config: ' + JSON.stringify(config)); + let modalResult = await startModalPicker(context, config, window); return modalResult; } catch (resultError) { - console.error('[picker] modal picker: Result error: ' + resultError); + console.error('[picker] Result error: ' + resultError); return undefined; } } @@ -509,6 +516,7 @@ async function documentPickerSave(...args) { let documentSaveConfig = undefined; let documentSaveResult = undefined; let saveResult = undefined; + let documentSaveWindow = undefined; try { if (this.context !== undefined) { @@ -520,11 +528,14 @@ async function documentPickerSave(...args) { console.error('[picker] getContext error: ' + getContextError); throw getErr(ErrCode.CONTEXT_NO_EXIST); } + if (this.window !== undefined) { + documentSaveWindow = this.window; + } documentSaveConfig = parseDocumentPickerSaveOption(args, ACTION.SAVE_ACTION_MODAL); console.log('[picker] document save start'); - documentSaveResult = await modalPicker(args, documentSaveContext, documentSaveConfig); + documentSaveResult = await modalPicker(documentSaveContext, documentSaveConfig, documentSaveWindow); saveResult = getDocumentPickerSaveResult(documentSaveResult); this.suffixIndex = saveResult.suffix; return sendResult(args, saveResult); @@ -573,6 +584,7 @@ async function audioPickerSelect(...args) { console.log('[picker] audio select config: ' + JSON.stringify(audioSelectConfig)); let audioSelectContext = undefined; + let audipSelectWindow = undefined; try { if (this.context !== undefined) { audioSelectContext = this.context; @@ -588,7 +600,7 @@ async function audioPickerSelect(...args) { console.error('[picker] audioSelectContext == undefined'); throw getErr(ErrCode.CONTEXT_NO_EXIST); } - let modalSelectResult = await modalPicker(args, audioSelectContext, audioSelectConfig); + let modalSelectResult = await modalPicker(audioSelectContext, audioSelectConfig, audipSelectWindow); let saveResult = getAudioPickerSelectResult(modalSelectResult); return sendResult(args, saveResult); } catch (error) { @@ -633,12 +645,26 @@ function AudioSaveOptions() { function ParseContext(args) { - if (args.length > ARGS_ONE || args.length < ARGS_ZERO || typeof args[ARGS_ZERO] !== 'object') { + if (args.length > ARGS_TWO || args.length < ARGS_ZERO || typeof args[ARGS_ZERO] !== 'object') { return undefined; } return args[ARGS_ZERO]; } +function ParseWindow(args) +{ + if (args.length != ARGS_TWO) { + console.log('[picker] ParseWindow: not window mode.'); + return undefined; + } + if (args.length == ARGS_TWO && typeof args[ARGS_ONE] !== 'object') { + console.log('[picker] ParseWindow: not window mode or type err.'); + return undefined; + } + console.log('[picker] ParseWindow: window mode.'); + return args[ARGS_ONE]; +} + function PhotoViewPicker(...args) { this.select = photoPickerSelect; this.save = documentPickerSave; @@ -649,6 +675,7 @@ function DocumentViewPicker(...args) { this.select = documentPickerSelect; this.save = documentPickerSave; this.context = ParseContext(args); + this.window = ParseWindow(args); this.getSelectedIndex = getSelectedSuffixIndex; this.suffixIndex = -1; } -- Gitee From 1302c5176e273f88c75b26548d4c08bf7fd9ffc1 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 03:05:30 +0000 Subject: [PATCH 20/40] update interfaces/kits/picker/include/picker_n_exporter.h. Signed-off-by: BrainL --- interfaces/kits/picker/include/picker_n_exporter.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interfaces/kits/picker/include/picker_n_exporter.h b/interfaces/kits/picker/include/picker_n_exporter.h index d85f9d2a..00bd1b08 100644 --- a/interfaces/kits/picker/include/picker_n_exporter.h +++ b/interfaces/kits/picker/include/picker_n_exporter.h @@ -24,6 +24,7 @@ #include "picker_napi_utils.h" #include "napi_base_context.h" #include "napi_common_want.h" +#include "ui_extension_context.h" namespace OHOS { @@ -51,6 +52,8 @@ struct PickerAsyncContext { std::shared_ptr pickerCallBack; }; +static sptr window_; + class PickerNExporter final : public FileManagement::LibN::NExporter { public: inline static const std::string className_ = "Picker"; -- Gitee From b863e5dc51376457c8916a0de4319179a3810b10 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 03:06:46 +0000 Subject: [PATCH 21/40] update interfaces/kits/picker/src/modal_ui_callback.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/modal_ui_callback.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interfaces/kits/picker/src/modal_ui_callback.cpp b/interfaces/kits/picker/src/modal_ui_callback.cpp index 9f05b37c..6fe078d8 100644 --- a/interfaces/kits/picker/src/modal_ui_callback.cpp +++ b/interfaces/kits/picker/src/modal_ui_callback.cpp @@ -33,21 +33,21 @@ void ModalUICallback::SetSessionId(int32_t sessionId) void ModalUICallback::OnRelease(int32_t releaseCode) { - HILOG_INFO("modal picker: OnRelease enter. release code is %{public}d", releaseCode); + HILOG_INFO("[picker] OnRelease enter. release code is %{public}d", releaseCode); this->uiContent->CloseModalUIExtension(this->sessionId_); pickerCallBack_->ready = true; } void ModalUICallback::OnError(int32_t code, const std::string& name, const std::string& message) { - HILOG_ERROR("modal picker: OnError enter. errorCode=%{public}d, name=%{public}s, message=%{public}s", + HILOG_ERROR("[picker] OnError enter. errorCode=%{public}d, name=%{public}s, message=%{public}s", code, name.c_str(), message.c_str()); this->uiContent->CloseModalUIExtension(this->sessionId_); } void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Want &result) { - HILOG_INFO("modal picker: OnResultForModal enter. resultCode is %{public}d,", resultCode); + HILOG_INFO("[picker] OnResultForModal enter. resultCode is %{public}d,", resultCode); pickerCallBack_->resultCode = resultCode; pickerCallBack_->want = result; pickerCallBack_->ready = true; @@ -56,12 +56,12 @@ void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Wa void ModalUICallback::OnReceive(const OHOS::AAFwk::WantParams &request) { - HILOG_INFO("modal picker: OnReceive enter."); + HILOG_INFO("[picker] OnReceive enter."); } void ModalUICallback::OnDestroy() { - HILOG_INFO("modal picker: OnDestroy enter."); + HILOG_INFO("[picker] OnDestroy enter."); } } // namespace Picker } // namespace OHOS \ No newline at end of file -- Gitee From 27accb949d98a1e2772eb81b89672c8e159542c8 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 04:41:05 +0000 Subject: [PATCH 22/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- .../kits/picker/src/picker_n_exporter.cpp | 151 ++++++++++++++---- 1 file changed, 121 insertions(+), 30 deletions(-) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index 41f50d2f..f3c4a1ad 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -47,12 +47,12 @@ string PickerNExporter::GetClassName() static void StartModalPickerExecute(napi_env env, void *data) { - HILOG_INFO("modal picker: StartModalPickerExecute begin"); + HILOG_INFO("[picker]: StartModalPickerExecute begin"); auto *context = static_cast(data); while (!context->pickerCallBack->ready) { std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_TIME_MS)); } - HILOG_INFO("modal picker: StartModalPickerExecute is ready."); + HILOG_INFO("[picker]: StartModalPickerExecute is ready."); } static void MakeResultWithArr(napi_env env, std::string key, napi_value &result, @@ -63,7 +63,7 @@ static void MakeResultWithArr(napi_env env, std::string key, napi_value &result, napi_status status = napi_generic_failure; if (pickerCallBack->want.GetParams().HasParam(key.c_str())) { std::vector list = pickerCallBack->want.GetStringArrayParam(key.c_str()); - HILOG_INFO("modal picker: %{public}s size. %{public}zu ", key.c_str(), list.size()); + HILOG_INFO("[picker]: %{public}s size. %{public}zu ", key.c_str(), list.size()); for (size_t i = 0; i < list.size(); i++) { napi_value uri = nullptr; napi_create_string_utf8(env, list[i].c_str(), NAPI_AUTO_LENGTH, &uri); @@ -74,7 +74,7 @@ static void MakeResultWithArr(napi_env env, std::string key, napi_value &result, } status = napi_set_named_property(env, result, key.c_str(), array); if (status != napi_ok) { - HILOG_ERROR("modal picker: napi_set_named_property uri failed"); + HILOG_ERROR("[picker]: napi_set_named_property uri failed"); } } } @@ -85,12 +85,12 @@ static void MakeResultWithInt(napi_env env, std::string key, napi_value &result, napi_status status = napi_generic_failure; if (pickerCallBack->want.GetParams().HasParam(key.c_str())) { const int32_t suffixindex = pickerCallBack->want.GetIntParam(key.c_str(), -1); - HILOG_INFO("Modal picker: %{public}s is %{public}d ", key.c_str(), suffixindex); + HILOG_INFO("[picker]: %{public}s is %{public}d ", key.c_str(), suffixindex); napi_value suffix = nullptr; napi_create_int32(env, suffixindex, &suffix); status = napi_set_named_property(env, result, key.c_str(), suffix); if (status != napi_ok) { - HILOG_ERROR("Modal picker: napi_set_named_property suffix failed"); + HILOG_ERROR("[picker]: napi_set_named_property suffix failed"); } } } @@ -106,12 +106,12 @@ static napi_value MakeResultWithPickerCallBack(napi_env env, std::shared_ptrresultCode; - HILOG_INFO("modal picker: resCode is %{public}d.", resCode); + HILOG_INFO("[picker]: resCode is %{public}d.", resCode); napi_value resultCode = nullptr; napi_create_int32(env, resCode, &resultCode); status = napi_set_named_property(env, result, "resultCode", resultCode); if (status != napi_ok) { - HILOG_ERROR("modal picker: napi_set_named_property resultCode failed"); + HILOG_ERROR("[picker]: napi_set_named_property resultCode failed"); } MakeResultWithArr(env, "ability.params.stream", result, pickerCallBack); MakeResultWithArr(env, "uriArr", result, pickerCallBack); @@ -121,7 +121,7 @@ static napi_value MakeResultWithPickerCallBack(napi_env env, std::shared_ptr(data); if (context == nullptr) { HILOG_ERROR("Async context is null"); @@ -131,11 +131,11 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat jsContext->status = false; status = napi_get_undefined(env, &jsContext->data); if (status != napi_ok) { - HILOG_ERROR("modal picker: napi_get_undefined jsContext->data failed"); + HILOG_ERROR("[picker]: napi_get_undefined jsContext->data failed"); } status = napi_get_undefined(env, &jsContext->error); if (status != napi_ok) { - HILOG_ERROR("modal picker: napi_get_undefined jsContext->error failed"); + HILOG_ERROR("[picker]: napi_get_undefined jsContext->error failed"); } napi_value result = MakeResultWithPickerCallBack(env, context->pickerCallBack); if (result != nullptr) { @@ -152,25 +152,101 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat delete context; } +static bool IsTypeRight(napi_env env, napi_value val, napi_value_type type) +{ + napi_valuetype valueType; + napi_status status = napi_typeof(env, val, &valueType); + if (status != napi_ok || valueType != type) { + HILOG_ERROR("[picker] Type is not right, type: %{public}d", valueType); + return false; + } + return true; +} + +static ErrCode GetWindowName(napi_env env, napi_value properties, sptr &window) +{ + HILOG_INFO("[picker] Begin GetWindowName."); + napi_value name; + napi_status status; + status = napi_get_named_property(env, properties, "name", &name); + if (status != napi_ok) { + HILOG_ERROR("Get name from properties fail."); + return ERR_INV; + } + size_t nameLen; + status = napi_get_value_string_utf8(env, name, NULL, 0, &nameLen); + if (status != napi_ok) { + HILOG_ERROR("[picker] Get window name length fail.") + return ERR_INV; + } + char *nameBuf = new char[nameLen + 1]; + status = napi_get_value_string_utf8(env, name, nameBuf, nameLen + 1, &nameLen); + if (status != napi_ok) { + HILOG_ERROR("[picker] Get value string UTF8 fail."); + return ERR_INV; + } + HILOG_INFO("[picker] Get window name: %{public}s", nameBuf); + auto customWindow = Rosen::Window::Find(nameBuf); + if (!customWindow) { + HILOG_ERROR("[picker] Window find fail."); + return ERR_INV; + } + window = customWindow; + HILOG_INFO("[picker] Window found: %{public}s", nameBuf); + delete[] nameBuf; + return ERR_OK; +} + +template +static ErrCode GetCustomShowingWindow(napi_env, AsyncContext &asyncContext, + const napi_callback_info info, sptr &window) +{ + HILOG_INFO("[picker] GetCustomShowingWindow enter."); + napi_valuetype valueType; + napi_status status; + if (!IsTypeRight(env, asyncContext->argv[ARGS_TWO], napi_object)) { + HILOG_ERROR("[picker] The type of the parameter transferred to the window is not object."); + return ERR_INV; + } + auto windowObj = asyncContext->argv[ARGS_TWO]; + napi_value getPropertiesFunc; + status = napi_get_name_property(env, windowObj, "getWindowProperties", &getPropertiesFunc); + if (status != napi_ok || !getPropertiesFunc) { + HILOG_ERROR("[picker] getWindowProperties fail."); + return ERR_INV; + } + if (!IsTypeRight(env, getPropertiesFunc, napi_function)) { + HILOG_ERROR("[picker] The type of the parameter transferred to the getPropertiesFunc is not function."); + return ERR_INV; + } + napi_value properties; + status = napi_call_function(env, windowObj, getPropertiesFunc, 0, nullptr, &properties); + if (status != napi_ok || !properties) { + HILOG_INFO("[picker] Call getPropertiesFunc fail."); + return ERR_INV; + } + return GetWindowName(env, properties, window); +} + Ace::UIContent *GetUIContent(napi_env env, napi_callback_info info, unique_ptr &AsyncContext) { bool isStageMode = false; napi_status status = AbilityRuntime::IsStageContext(env, AsyncContext->argv[ARGS_ZERO], isStageMode); if (status != napi_ok || !isStageMode) { - HILOG_ERROR("modal picker: is not StageMode context"); + HILOG_ERROR("[picker]: is not StageMode context"); return nullptr; } auto context = AbilityRuntime::GetStageModeContext(env, AsyncContext->argv[ARGS_ZERO]); if (context == nullptr) { - HILOG_ERROR("modal picker: Failed to get native stage context instance"); + HILOG_ERROR("[picker]: Failed to get native stage context instance"); return nullptr; } auto abilityContext = AbilityRuntime::Context::ConvertTo(context); if (abilityContext == nullptr) { auto uiExtensionContext = AbilityRuntime::Context::ConvertTo(context); if (uiExtensionContext == nullptr) { - HILOG_ERROR("modal picker: Fail to convert to abilityContext or uiExtensionContext"); + HILOG_ERROR("[picker]: Fail to convert to abilityContext or uiExtensionContext"); return nullptr; } return uiExtensionContext->GetUIContent(); @@ -179,16 +255,23 @@ Ace::UIContent *GetUIContent(napi_env env, napi_callback_info info, } static napi_value StartPickerExtension(napi_env env, napi_callback_info info, - unique_ptr &AsyncContext) + unique_ptr &asyncContext) { - HILOG_INFO("modal picker: StartPickerExtension begin."); - Ace::UIContent *uiContent = GetUIContent(env, info, AsyncContext); + HILOG_INFO("[picker]: StartPickerExtension begin."); + Ace::UIContent *uiContent; + if (asyncContext->argc == 3 && window_) { + HILOG_INFO("[picker] Will get uiContent by window."); + uiContent = window_->GetUIContent(); + } else { + uiContent= GetUIContent(env, info, asyncContext); + } + if (uiContent == nullptr) { - HILOG_ERROR("modal picker: get uiContent failed"); + HILOG_ERROR("[picker]: get uiContent failed"); return nullptr; } AAFwk::Want request; - AppExecFwk::UnwrapWant(env, AsyncContext->argv[ARGS_ONE], request); + AppExecFwk::UnwrapWant(env, asyncContext->argv[ARGS_ONE], request); std::string targetType = request.GetStringParam("extType"); std::string pickerType; @@ -196,8 +279,8 @@ static napi_value StartPickerExtension(napi_env env, napi_callback_info info, pickerType = request.GetStringParam("pickerType"); } request.SetParam(ABILITY_WANT_PARAMS_UIEXTENSIONTARGETTYPE, targetType); - AsyncContext->pickerCallBack = make_shared(); - auto callback = std::make_shared(uiContent, AsyncContext->pickerCallBack); + asyncContext->pickerCallBack = make_shared(); + auto callback = std::make_shared(uiContent, asyncContext->pickerCallBack); Ace::ModalUIExtensionCallbacks extensionCallback = { .onRelease = std::bind(&ModalUICallback::OnRelease, callback, std::placeholders::_1), .onResult = std::bind(&ModalUICallback::OnResultForModal, callback, std::placeholders::_1, @@ -208,11 +291,11 @@ static napi_value StartPickerExtension(napi_env env, napi_callback_info info, .onDestroy = std::bind(&ModalUICallback::OnDestroy, callback), }; Ace::ModalUIExtensionConfig config; - HILOG_INFO("modal picker: will CreateModalUIExtension by extType: %{public}s, pickerType: %{public}s", + HILOG_INFO("[picker]: will CreateModalUIExtension by extType: %{public}s, pickerType: %{public}s", targetType.c_str(), pickerType.c_str()); int sessionId = uiContent->CreateModalUIExtension(request, extensionCallback, config); if (sessionId == 0) { - HILOG_ERROR("modal picker: create modalUIExtension failed"); + HILOG_ERROR("[picker]: create modalUIExtension failed"); return nullptr; } callback->SetSessionId(sessionId); @@ -225,22 +308,29 @@ template static napi_status AsyncContextSetStaticObjectInfo(napi_env env, napi_callback_info info, AsyncContext &asyncContext, const size_t minArgs, const size_t maxArgs) { - HILOG_INFO("modal picker: AsyncContextSetStaticObjectInfo begin."); + HILOG_INFO("[picker]: AsyncContextSetStaticObjectInfo begin."); napi_value thisVar = nullptr; asyncContext->argc = maxArgs; napi_status ret = napi_get_cb_info(env, info, &asyncContext->argc, &(asyncContext->argv[ARGS_ZERO]), &thisVar, nullptr); if (ret != napi_ok) { - HILOG_ERROR("modal picker: Failed to get cb info"); + HILOG_ERROR("[picker]: Failed to get cb info"); return ret; } + if (asyncContext->argc == ARGS_THREE) { + int res = GetCustomShowingWindow(env, asyncContext, info, window_); + if (res != ERR_OK) { + HILOG_ERROR("[picker] Failed to get cb window_ info."); + return napi_invalid_arg; + } + } if (!((asyncContext->argc >= minArgs) && (asyncContext->argc <= maxArgs))) { - HILOG_ERROR("modal picker: Number of args is invalid"); + HILOG_ERROR("[picker]: Number of args is invalid"); return napi_invalid_arg; } if (minArgs > 0) { if (asyncContext->argv[ARGS_ZERO] == nullptr) { - HILOG_ERROR("modal picker: Argument list is empty"); + HILOG_ERROR("[picker]: Argument list is empty"); return napi_invalid_arg; } } @@ -250,12 +340,13 @@ static napi_status AsyncContextSetStaticObjectInfo(napi_env env, napi_callback_i static napi_value ParseArgsStartModalPicker(napi_env env, napi_callback_info info, unique_ptr &context) { - HILOG_INFO("modal picker: ParseArgsStartModalPicker begin."); + HILOG_INFO("[picker]: ParseArgsStartModalPicker begin."); constexpr size_t minArgs = ARGS_TWO; constexpr size_t maxArgs = ARGS_THREE; napi_status status = AsyncContextSetStaticObjectInfo(env, info, context, minArgs, maxArgs); if (status != napi_ok) { - HILOG_ERROR("modal picker: AsyncContextSetStaticObjectInfo faild"); + HILOG_ERROR("[picker]: AsyncContextSetStaticObjectInfo faild"); + return nullptr; } napi_value result = nullptr; napi_value ret = StartPickerExtension(env, info, context); @@ -268,7 +359,7 @@ static napi_value ParseArgsStartModalPicker(napi_env env, napi_callback_info inf napi_value PickerNExporter::StartModalPicker(napi_env env, napi_callback_info info) { - HILOG_INFO("modal picker: StartModalPicker begin."); + HILOG_INFO("[picker]: StartModalPicker begin."); unique_ptr asyncContext = make_unique(); napi_value ret = ParseArgsStartModalPicker(env, info, asyncContext); if (ret == nullptr) { -- Gitee From 015884e072455bef6c101ff73901479681c968b3 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 04:44:48 +0000 Subject: [PATCH 23/40] update interfaces/kits/picker/include/picker_napi_utils.h. Signed-off-by: BrainL --- interfaces/kits/picker/include/picker_napi_utils.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interfaces/kits/picker/include/picker_napi_utils.h b/interfaces/kits/picker/include/picker_napi_utils.h index 47418156..2816b337 100644 --- a/interfaces/kits/picker/include/picker_napi_utils.h +++ b/interfaces/kits/picker/include/picker_napi_utils.h @@ -44,9 +44,10 @@ constexpr uint32_t NAPI_INIT_REF_COUNT = 1; constexpr size_t NAPI_ARGC_MAX = 5; // Error codes -const int32_t ERR_DEFAULT = 0; +const int32_t ERR_OK = 0; const int32_t ERR_MEM_ALLOCATION = 2; const int32_t ERR_INVALID_OUTPUT = 3; +const int32_t ERR_INV = -1; struct JSAsyncContextOutput { napi_value error; -- Gitee From 1454aecf2bcb91d267e838e85e8f3c35ec7f3f52 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 04:50:23 +0000 Subject: [PATCH 24/40] update interfaces/kits/picker/picker.js. Signed-off-by: BrainL --- interfaces/kits/picker/picker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index 12dc88af..484a75c4 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -317,7 +317,7 @@ function getDocumentPickerSelectResult(args) { error: undefined, data: undefined }; - if (args.resultCode === undefined) { + if (args === undefined || args.resultCode === undefined) { selectResult.error = getErr(ErrCode.RESULT_ERROR); console.log('[picker] document select selectResult: ' + JSON.stringify(selectResult)); return selectResult; @@ -418,7 +418,7 @@ function getAudioPickerSelectResult(args) { error: undefined, data: undefined }; - if (args.resultCode === undefined) { + if (args === undefined || args.resultCode === undefined) { selectResult.error = getErr(ErrCode.RESULT_ERROR); console.log('[picker] getAudioPickerSelectResult selectResult: ' + JSON.stringify(selectResult)); return selectResult; -- Gitee From 51dfca22ad740731bca51043de6e7297ce1d7b51 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 04:58:39 +0000 Subject: [PATCH 25/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/picker_n_exporter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index f3c4a1ad..613a6af5 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -152,7 +152,7 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat delete context; } -static bool IsTypeRight(napi_env env, napi_value val, napi_value_type type) +static bool IsTypeRight(napi_env env, napi_value val, napi_valuetype type) { napi_valuetype valueType; napi_status status = napi_typeof(env, val, &valueType); @@ -176,7 +176,7 @@ static ErrCode GetWindowName(napi_env env, napi_value properties, sptr -static ErrCode GetCustomShowingWindow(napi_env, AsyncContext &asyncContext, +static ErrCode GetCustomShowingWindow(napi_env env, AsyncContext &asyncContext, const napi_callback_info info, sptr &window) { HILOG_INFO("[picker] GetCustomShowingWindow enter."); -- Gitee From a9a85e375f9defcfadc8af3d05191d7b26f7f49e Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 04:59:12 +0000 Subject: [PATCH 26/40] update interfaces/kits/picker/include/picker_n_exporter.h. Signed-off-by: BrainL --- interfaces/kits/picker/include/picker_n_exporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/picker/include/picker_n_exporter.h b/interfaces/kits/picker/include/picker_n_exporter.h index 00bd1b08..fc72bc9c 100644 --- a/interfaces/kits/picker/include/picker_n_exporter.h +++ b/interfaces/kits/picker/include/picker_n_exporter.h @@ -52,7 +52,7 @@ struct PickerAsyncContext { std::shared_ptr pickerCallBack; }; -static sptr window_; +static sptr window_; class PickerNExporter final : public FileManagement::LibN::NExporter { public: -- Gitee From 83fd6cfd53744fd6c85d46cc012d5ce46a1ef943 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 05:08:07 +0000 Subject: [PATCH 27/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/picker_n_exporter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index 613a6af5..cd4eeb99 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -202,7 +202,6 @@ static ErrCode GetCustomShowingWindow(napi_env env, AsyncContext &asyncContext, const napi_callback_info info, sptr &window) { HILOG_INFO("[picker] GetCustomShowingWindow enter."); - napi_valuetype valueType; napi_status status; if (!IsTypeRight(env, asyncContext->argv[ARGS_TWO], napi_object)) { HILOG_ERROR("[picker] The type of the parameter transferred to the window is not object."); @@ -210,7 +209,7 @@ static ErrCode GetCustomShowingWindow(napi_env env, AsyncContext &asyncContext, } auto windowObj = asyncContext->argv[ARGS_TWO]; napi_value getPropertiesFunc; - status = napi_get_name_property(env, windowObj, "getWindowProperties", &getPropertiesFunc); + status = napi_get_named_property(env, windowObj, "getWindowProperties", &getPropertiesFunc); if (status != napi_ok || !getPropertiesFunc) { HILOG_ERROR("[picker] getWindowProperties fail."); return ERR_INV; -- Gitee From 5a982c1811fdb12b6fc6c293e30ba558dc71c92f Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 08:51:39 +0000 Subject: [PATCH 28/40] update interfaces/kits/picker/picker.js. Signed-off-by: BrainL --- interfaces/kits/picker/picker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index 484a75c4..b0a662ba 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -471,7 +471,7 @@ function getDocumentPickerSaveResult(args) { return saveResult; } -function startModalPicker(context, config) { +function startModalPicker(context, config, window) { if (context === undefined) { throw Error('[picker] Context undefined.'); } -- Gitee From 51d952c7680f1c06fc0650fa5d405fed4c4bfc53 Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 09:32:13 +0000 Subject: [PATCH 29/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/picker_n_exporter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index cd4eeb99..187e093a 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -150,6 +150,9 @@ static void StartModalPickerAsyncCallbackComplete(napi_env env, napi_status stat context->work, *jsContext); } delete context; + if (window_) { + window_ = nullptr; + } } static bool IsTypeRight(napi_env env, napi_value val, napi_valuetype type) -- Gitee From 099f3bbdd6153ec505738ba408356e40efef606b Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 14:59:44 +0000 Subject: [PATCH 30/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/picker_n_exporter.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index 187e093a..2651502c 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -170,8 +170,7 @@ static ErrCode GetWindowName(napi_env env, napi_value properties, sptrargc == 3 && window_) { + if (asyncContext->argc == ARGS_THREE && window_) { HILOG_INFO("[picker] Will get uiContent by window."); uiContent = window_->GetUIContent(); } else { -- Gitee From d6137e0903f4d7ba86c78624c80af82cd49a9dbc Mon Sep 17 00:00:00 2001 From: BrainL Date: Mon, 9 Sep 2024 15:02:23 +0000 Subject: [PATCH 31/40] update interfaces/kits/picker/picker.js. Signed-off-by: BrainL --- interfaces/kits/picker/picker.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index b0a662ba..4a9c4a33 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -483,7 +483,7 @@ function startModalPicker(context, config, window) { throw Error('[picker] PickerHelper undefined.'); } let helper; - if (window != undefined) { + if (window !== undefined) { helper = pickerHelper.startModalPicker(gContext, config, window); } else { helper = pickerHelper.startModalPicker(gContext, config); @@ -651,13 +651,13 @@ function ParseContext(args) return args[ARGS_ZERO]; } -function ParseWindow(args) +function parseWindow(args) { if (args.length != ARGS_TWO) { console.log('[picker] ParseWindow: not window mode.'); return undefined; } - if (args.length == ARGS_TWO && typeof args[ARGS_ONE] !== 'object') { + if (args.length === ARGS_TWO && typeof args[ARGS_ONE] !== 'object') { console.log('[picker] ParseWindow: not window mode or type err.'); return undefined; } @@ -675,7 +675,7 @@ function DocumentViewPicker(...args) { this.select = documentPickerSelect; this.save = documentPickerSave; this.context = ParseContext(args); - this.window = ParseWindow(args); + this.window = parseWindow(args); this.getSelectedIndex = getSelectedSuffixIndex; this.suffixIndex = -1; } -- Gitee From 1cd604a4445ba74d9c16f8fd58d0b7eabe76238d Mon Sep 17 00:00:00 2001 From: BrainL Date: Tue, 10 Sep 2024 06:14:22 +0000 Subject: [PATCH 32/40] update interfaces/kits/picker/picker.js. Signed-off-by: BrainL --- interfaces/kits/picker/picker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index 4a9c4a33..b12bd07e 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -653,7 +653,7 @@ function ParseContext(args) function parseWindow(args) { - if (args.length != ARGS_TWO) { + if (args.length !== ARGS_TWO) { console.log('[picker] ParseWindow: not window mode.'); return undefined; } -- Gitee From 60ef81b4e18cd153e7a92c2772b3999cc008dc17 Mon Sep 17 00:00:00 2001 From: BrainL Date: Tue, 10 Sep 2024 18:54:07 +0000 Subject: [PATCH 33/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/picker_n_exporter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index 2651502c..b866fa88 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -264,6 +264,7 @@ static napi_value StartPickerExtension(napi_env env, napi_callback_info info, HILOG_INFO("[picker] Will get uiContent by window."); uiContent = window_->GetUIContent(); } else { + HILOG_INFO("[picker] Will get uiContent by context."); uiContent= GetUIContent(env, info, asyncContext); } -- Gitee From 3aac184b522ba79105db5fcff5ef9e0e7cd3a3e7 Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Fri, 13 Sep 2024 18:39:07 +0800 Subject: [PATCH 34/40] fix:code Signed-off-by: zhouoaoteng --- .../native/file_access_service/src/file_access_service.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 93828f42..1b76afee 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -796,13 +796,9 @@ void FileAccessService::RemoveAppProxy(const sptr& co return; } size_t key = reinterpret_cast(connection->AsObject().GetRefPtr()); - if (appProxyMap_.find(key) == appProxyMap_.end()) { - HILOG_WARN("appProxyMap_ not key: %{public}zu", key); - return; - } lock_guard lock(appProxyMutex_); if (appProxyMap_.find(key) == appProxyMap_.end()) { - HILOG_INFO("appProxyMap_ not key"); + HILOG_INFO("appProxyMap_ not key %{public}zu", key); return; } -- Gitee From 1e6b43d555cdecc17b2bda92358f8b23688a07df Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Fri, 13 Sep 2024 18:28:19 +0800 Subject: [PATCH 35/40] add free arg Signed-off-by: zhouoaoteng --- interfaces/inner_api/file_access/src/file_access_helper.cpp | 2 ++ interfaces/kits/native/recent/recent_n_exporter.cpp | 2 ++ utils/file_util.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 36419b3c..6bbd80be 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -219,6 +219,7 @@ std::pair, int> FileAccessHelper::DoCreatorHel connectInfo->want = wants[i]; connectInfo->fileAccessExtConnection = fileAccessExtConnection; std::string bundleName = wants[i].GetElement().GetBundleName(); + HILOG_INFO("DoCreatorHelper bundleName is %{public}s", bundleName.c_str()); cMap.insert(std::pair>(bundleName, connectInfo)); } @@ -341,6 +342,7 @@ sptr FileAccessHelper::GetProxyByUri(Uri &uri) sptr FileAccessHelper::GetProxyByBundleName(const std::string &bundleName) { auto connectInfo = GetConnectInfo(bundleName); + HILOG_INFO("GetProxyByBundleName start %{public}s", bundleName.c_str()); if (connectInfo == nullptr) { HILOG_ERROR("GetProxyByUri failed with invalid connectInfo"); return nullptr; diff --git a/interfaces/kits/native/recent/recent_n_exporter.cpp b/interfaces/kits/native/recent/recent_n_exporter.cpp index be59d42b..1695d158 100644 --- a/interfaces/kits/native/recent/recent_n_exporter.cpp +++ b/interfaces/kits/native/recent/recent_n_exporter.cpp @@ -164,6 +164,8 @@ static void Deleter(struct NameListArg *arg) (arg->namelist)[i] = nullptr; } free(arg->namelist); + free(arg); + arg = nullptr; } static int64_t GetFileMtime(const string &fileName) diff --git a/utils/file_util.h b/utils/file_util.h index 5d497add..32487323 100644 --- a/utils/file_util.h +++ b/utils/file_util.h @@ -57,6 +57,8 @@ static void Deleter(struct NameListArg *arg) (arg->namelist)[i] = nullptr; } free(arg->namelist); + free(arg); + arg = nullptr; } static int32_t FilterFunc(const struct dirent *filename) -- Gitee From fb532298835c970a4c14a66981869f8d61e7453d Mon Sep 17 00:00:00 2001 From: zhouoaoteng Date: Thu, 19 Sep 2024 17:20:43 +0800 Subject: [PATCH 36/40] fix: closeuiextension Signed-off-by: zhouoaoteng --- interfaces/kits/picker/src/modal_ui_callback.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interfaces/kits/picker/src/modal_ui_callback.cpp b/interfaces/kits/picker/src/modal_ui_callback.cpp index 6fe078d8..6c09f6bc 100644 --- a/interfaces/kits/picker/src/modal_ui_callback.cpp +++ b/interfaces/kits/picker/src/modal_ui_callback.cpp @@ -50,8 +50,6 @@ void ModalUICallback::OnResultForModal(int32_t resultCode, const OHOS::AAFwk::Wa HILOG_INFO("[picker] OnResultForModal enter. resultCode is %{public}d,", resultCode); pickerCallBack_->resultCode = resultCode; pickerCallBack_->want = result; - pickerCallBack_->ready = true; - this->uiContent->CloseModalUIExtension(this->sessionId_); } void ModalUICallback::OnReceive(const OHOS::AAFwk::WantParams &request) -- Gitee From 2cb3afcfc404cf7ddb886d7c84196d2dfa012f00 Mon Sep 17 00:00:00 2001 From: wangpggg Date: Tue, 24 Sep 2024 14:27:18 +0800 Subject: [PATCH 37/40] modify fuzz compile failed on pc. Signed-off-by: wangpeng --- .../file_info/napi_file_iterator_exporter.cpp | 3 +++ test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp b/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp index 0550ce84..b4ebc81e 100644 --- a/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp +++ b/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp @@ -204,6 +204,9 @@ static int GetNextIterator(napi_value &objFileInfoExporter, FileIteratorEntity * } while (!isDone && FilterTrashAndRecentDir(fileInfoEntity->fileInfo.uri)) { fileInfoEntity = NClass::GetEntityOf(env, objFileInfoExporter); + if (fileInfoEntity == nullptr) { + return E_GETRESULT; + } retNVal = NVal::CreateObject(env); HILOG_DEBUG("TRASH_DIR or RECENT_DIR: %{public}s", fileInfoEntity->fileInfo.uri.c_str()); if (fileIteratorEntity->flag == CALL_LISTFILE) { diff --git a/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn b/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn index bff3a5ac..d5d1635e 100644 --- a/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn +++ b/test/fuzztest/fileaccessextconnection_fuzzer/BUILD.gn @@ -33,13 +33,12 @@ ohos_fuzztest("FileAccessExtConnectionFuzzTest") { "-Wno-unused-variable", "-fno-omit-frame-pointer", ] - sources = [ - "${user_file_service_path}/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp", - "${user_file_service_path}/services/native/file_access_service/src/file_access_ext_connection.cpp", - "${user_file_service_path}/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp", - ] + sources = [ "${user_file_service_path}/test/fuzztest/fileaccessextconnection_fuzzer/fileaccessextconnection_fuzzer.cpp" ] - deps = [ "${user_file_service_path}/services:file_access_service" ] + deps = [ + "${user_file_service_path}/interfaces/inner_api/file_access:file_access_extension_ability_kit", + "${user_file_service_path}/services:file_access_service", + ] external_deps = [ "ability_base:want", -- Gitee From cae81204409ed23f0579505a95b46758b83492dd Mon Sep 17 00:00:00 2001 From: BrainL Date: Tue, 8 Oct 2024 11:58:43 +0000 Subject: [PATCH 38/40] update interfaces/kits/picker/picker.js. Signed-off-by: BrainL --- interfaces/kits/picker/picker.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/interfaces/kits/picker/picker.js b/interfaces/kits/picker/picker.js index b12bd07e..6ca1b034 100644 --- a/interfaces/kits/picker/picker.js +++ b/interfaces/kits/picker/picker.js @@ -37,6 +37,7 @@ const DocumentPickerMode = { const ExtTypes = { DOWNLOAD_TYPE: 'filePicker', AUDIO_PICKER_TYPE: 'audioPicker', + PHOTO_PICKER_TYPE: 'photoPicker', }; const PickerDetailType = { @@ -148,6 +149,7 @@ function parsePhotoPickerSelectOption(args) { type: 'multipleselect', parameters: { uri: 'multipleselect', + extType: ExtTypes.PHOTO_PICKER_TYPE, }, }; @@ -200,11 +202,9 @@ function getPhotoPickerSelectResult(args) { }; if (args.resultCode === 0) { - if (args.want && args.want.parameters) { - let uris = args.want.parameters['select-item-list']; - let isOrigin = args.want.parameters.isOriginal; - selectResult.data = new PhotoSelectResult(uris, isOrigin); - } + let uris = args.photoUris; + let isOriginal = args.isOriginal; + selectResult.data = new PhotoSelectResult(uris, isOriginal); } else if (args.resultCode === -1) { selectResult.data = new PhotoSelectResult([], undefined); } else { @@ -225,6 +225,7 @@ async function photoPickerSelect(...args) { console.log('[picker] Photo config: ' + JSON.stringify(config)); let photoSelectContext = undefined; + let photoSelectWindow = undefined; try { if (this.context !== undefined) { photoSelectContext = this.context; @@ -240,9 +241,9 @@ async function photoPickerSelect(...args) { console.error('[picker] photoSelectContext == undefined'); throw getErr(ErrCode.CONTEXT_NO_EXIST); } - let result = await photoSelectContext.startAbilityForResult(config, {windowMode: 0}); - console.log('[picker] photo select result: ' + JSON.stringify(result)); - const photoSelectResult = getPhotoPickerSelectResult(result); + let modalSelectResult = await modalPicker(photoSelectContext, config, photoSelectWindow); + console.log('[picker] photo select result: ' + JSON.stringify(modalSelectResult)); + const photoSelectResult = getPhotoPickerSelectResult(modalSelectResult); console.log('[picker] photoSelectResult: ' + JSON.stringify(photoSelectResult)); if (args.length === ARGS_TWO && typeof args[ARGS_ONE] === 'function') { return args[ARGS_ONE](photoSelectResult.error, photoSelectResult.data); -- Gitee From 1ed97a6a6d31dfd037bc9adf8915bb6e73ac2ef8 Mon Sep 17 00:00:00 2001 From: BrainL Date: Tue, 8 Oct 2024 12:08:22 +0000 Subject: [PATCH 39/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- .../kits/picker/src/picker_n_exporter.cpp | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index b866fa88..de0db377 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -33,6 +33,8 @@ using namespace FileManagement::LibN; using namespace AppExecFwk; #define WAIT_TIME_MS 100 +static const string PHOTO_URIS_KEY = "photoUris"; + bool PickerNExporter::Export() { return exports_.AddProp({ @@ -72,9 +74,12 @@ static void MakeResultWithArr(napi_env env, std::string key, napi_value &result, if (key == "ability.params.stream") { key = "ability_params_stream"; } + if (key == "select-item-list") { + key = PHOTO_URIS_KEY; + } status = napi_set_named_property(env, result, key.c_str(), array); if (status != napi_ok) { - HILOG_ERROR("[picker]: napi_set_named_property uri failed"); + HILOG_ERROR("[picker]: napi_set_named_property %{public}s failed", key.c_str()); } } } @@ -90,7 +95,23 @@ static void MakeResultWithInt(napi_env env, std::string key, napi_value &result, napi_create_int32(env, suffixindex, &suffix); status = napi_set_named_property(env, result, key.c_str(), suffix); if (status != napi_ok) { - HILOG_ERROR("[picker]: napi_set_named_property suffix failed"); + HILOG_ERROR("[picker]: napi_set_named_property %{public}s failed", key.c_str()); + } + } +} + +static void MakeResultWithBool(napi_env env, std::string key, napi_value &result, + std::shared_ptr pickerCallBack) +{ + napi_status status = napi_generic_failure; + if (pickerCallBack->want.GetParams().HasParam(key.c_str())) { + const bool boolVal = pickerCallBack->want.GetIntParam(key.c_str(), false); + HILOG_INFO("[picker]: %{public}s is %{public}d ", key.c_str(), boolVal); + napi_value nBoolVal = nullptr; + napi_get_boolean(env, boolVal, &nBoolVal); + status = napi_set_named_property(env, result, key.c_str(), nBoolVal); + if (status != napi_ok) { + HILOG_ERROR("[picker]: napi_set_named_property %{public}s failed", key.c_str()); } } } @@ -115,6 +136,8 @@ static napi_value MakeResultWithPickerCallBack(napi_env env, std::shared_ptr Date: Tue, 8 Oct 2024 12:23:14 +0000 Subject: [PATCH 40/40] update interfaces/kits/picker/src/picker_n_exporter.cpp. Signed-off-by: BrainL --- interfaces/kits/picker/src/picker_n_exporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/picker/src/picker_n_exporter.cpp b/interfaces/kits/picker/src/picker_n_exporter.cpp index de0db377..fdeea7d8 100644 --- a/interfaces/kits/picker/src/picker_n_exporter.cpp +++ b/interfaces/kits/picker/src/picker_n_exporter.cpp @@ -105,7 +105,7 @@ static void MakeResultWithBool(napi_env env, std::string key, napi_value &result { napi_status status = napi_generic_failure; if (pickerCallBack->want.GetParams().HasParam(key.c_str())) { - const bool boolVal = pickerCallBack->want.GetIntParam(key.c_str(), false); + const bool boolVal = pickerCallBack->want.GetBoolParam(key.c_str(), false); HILOG_INFO("[picker]: %{public}s is %{public}d ", key.c_str(), boolVal); napi_value nBoolVal = nullptr; napi_get_boolean(env, boolVal, &nBoolVal); -- Gitee