From 68a350e1e70ee029c941b21ad643aea34a016736 Mon Sep 17 00:00:00 2001 From: caochuan Date: Mon, 5 Jun 2023 14:55:45 +0800 Subject: [PATCH] feat: listFile shared memory Signed-off-by: caochuan --- filemanagement_aafwk.gni | 1 + .../js/napi/file_access_module/BUILD.gn | 1 + .../file_info/file_info_entity.h | 3 +- .../file_info/file_iterator_entity.h | 7 +- .../file_info/napi_file_info_exporter.cpp | 18 +- .../file_info/napi_file_iterator_exporter.cpp | 32 +- .../js/napi/file_access_module/napi_utils.h | 3 +- .../root_info/napi_root_info_exporter.cpp | 10 +- interfaces/inner_api/file_access/BUILD.gn | 2 + .../include/file_access_ext_ability.h | 3 +- .../include/file_access_ext_proxy.h | 2 +- .../include/file_access_ext_stub_impl.h | 2 +- .../file_access/include/file_access_helper.h | 2 +- .../include/ifile_access_ext_base.h | 3 +- .../include/js_file_access_ext_ability.h | 2 +- .../src/file_access_ext_ability.cpp | 2 +- .../file_access/src/file_access_ext_proxy.cpp | 23 +- .../file_access/src/file_access_ext_stub.cpp | 25 +- .../src/file_access_ext_stub_impl.cpp | 4 +- .../file_access/src/file_access_helper.cpp | 5 +- .../src/js_file_access_ext_ability.cpp | 14 +- .../js/src/common/file_info_shared_memory.h | 294 ++++++ .../external_file_access_fuzzer.cpp | 8 +- .../medialibrary_file_access_fuzzer.cpp | 8 +- test/unittest/BUILD.gn | 45 + test/unittest/abnormal_file_access_test.cpp | 8 +- ...rnal_and_medialibrary_file_access_test.cpp | 845 ++++++++++++++++++ test/unittest/external_file_access_test.cpp | 159 +++- .../medialibrary_file_access_test.cpp | 130 +-- test/unittest/resources/ohos_test.xml | 7 +- utils/file_access_framework_errno.h | 1 + 31 files changed, 1504 insertions(+), 165 deletions(-) create mode 100644 interfaces/kits/js/src/common/file_info_shared_memory.h create mode 100644 test/unittest/external_and_medialibrary_file_access_test.cpp diff --git a/filemanagement_aafwk.gni b/filemanagement_aafwk.gni index ae2dcc19..80abb43a 100644 --- a/filemanagement_aafwk.gni +++ b/filemanagement_aafwk.gni @@ -20,3 +20,4 @@ access_token_path = "//base/security/access_token" file_api_path = "//foundation/filemanagement/file_api" user_file_service_path = "//foundation/filemanagement/user_file_service" distributed_file_path = "//foundation/distributeddatamgr/distributedfile" +commonlibrary_path = "//commonlibrary" diff --git a/frameworks/js/napi/file_access_module/BUILD.gn b/frameworks/js/napi/file_access_module/BUILD.gn index f759a807..0b90e332 100644 --- a/frameworks/js/napi/file_access_module/BUILD.gn +++ b/frameworks/js/napi/file_access_module/BUILD.gn @@ -53,6 +53,7 @@ ohos_shared_library("fileaccess") { "common_event_service:cesfwk_innerkits", "file_api:filemgmt_libn", "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", "multimedia_image_framework:image", ] } diff --git a/frameworks/js/napi/file_access_module/file_info/file_info_entity.h b/frameworks/js/napi/file_access_module/file_info/file_info_entity.h index 3450af5b..dfa203e2 100644 --- a/frameworks/js/napi/file_access_module/file_info/file_info_entity.h +++ b/frameworks/js/napi/file_access_module/file_info/file_info_entity.h @@ -19,6 +19,7 @@ #include "file_access_extension_info.h" #include "file_access_helper.h" #include "file_filter.h" +#include "file_info_shared_memory.h" namespace OHOS { namespace FileAccessFwk { @@ -31,4 +32,4 @@ struct FileInfoEntity { }; } // namespace FileAccessFwk } // namespace OHOS -#endif // FILE_INFO_ENTITY_H \ No newline at end of file +#endif // FILE_INFO_ENTITY_H diff --git a/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h b/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h index b945eb29..3802983b 100644 --- a/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h +++ b/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h @@ -22,6 +22,7 @@ #include "file_access_helper.h" #include "hilog_wrapper.h" #include "file_filter.h" +#include "file_info_shared_memory.h" namespace OHOS { namespace FileAccessFwk { @@ -30,10 +31,14 @@ using namespace DistributedFS; constexpr int64_t MAX_COUNT = 1000; // ListFile get file's max count struct FileIteratorEntity { + ~FileIteratorEntity() { + SharedMemoryOperation::DestroySharedMemory(memInfo); + } FileAccessHelper *fileAccessHelper { nullptr }; std::mutex entityOperateMutex; FileInfo fileInfo; std::vector fileInfoVec; + SharedMemoryInfo memInfo; int64_t offset { 0 }; uint64_t pos { 0 }; FileFilter filter { {}, {}, {}, 0, 0, false, false }; @@ -41,4 +46,4 @@ struct FileIteratorEntity { }; } // namespace FileAccessFwk } // namespace OHOS -#endif // FILE_ITERATOR_ENTITY_H \ No newline at end of file +#endif // FILE_ITERATOR_ENTITY_H diff --git a/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp b/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp index 676fd18e..db7de75c 100644 --- a/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp +++ b/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp @@ -126,19 +126,27 @@ napi_value NapiFileInfoExporter::ListFile(napi_env env, napi_callback_info info) { std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + int ret = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", MAX_COUNT, fileIteratorEntity->memInfo); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env); + return nullptr; + } + fileIteratorEntity->fileAccessHelper = fileInfoEntity->fileAccessHelper; fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; - fileIteratorEntity->fileInfoVec.clear(); + HILOG_ERROR("fileIteratorEntiry->fileInfo.uri: %{public}s", fileIteratorEntity->fileInfo.uri.c_str()); + fileIteratorEntity->memInfo.currentCounts = 0; fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; fileIteratorEntity->filter = std::move(filter); fileIteratorEntity->flag = 0; - auto ret = fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, - MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + HILOG_ERROR("NapiFileInfoExporter::ListFile ready call helper ListFile"); + ret = fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, + fileIteratorEntity->memInfo.maxCounts, fileIteratorEntity->filter, fileIteratorEntity->memInfo); if (ret != ERR_OK) { NError(ret).ThrowErr(env); return nullptr; } + fileIteratorEntity->memInfo.offsetCounts = 0; } return NVal(env, objFileIteratorExporter).val_; @@ -308,4 +316,4 @@ std::string NapiFileInfoExporter::GetClassName() return NapiFileInfoExporter::className_; } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS 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 935f828e..b389ee46 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 @@ -76,10 +76,10 @@ static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileI FileInfoEntity *fileInfoEntity, napi_env env, NVal &nVal) { std::lock_guard lock(fileIteratorEntity->entityOperateMutex); - if (fileIteratorEntity->fileInfoVec.size() == 0) { - fileIteratorEntity->fileInfoVec.clear(); + if (fileIteratorEntity->memInfo.currentCounts == 0) { fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; + fileIteratorEntity->pos = 0; // delete + SharedMemoryOperation::DestroySharedMemory(fileIteratorEntity->memInfo); fileInfoEntity = nullptr; objFileInfoExporter = NVal::CreateUndefined(env).val_; nVal.AddProp("value", objFileInfoExporter); @@ -87,13 +87,13 @@ static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileI return ERR_OK; } - if (fileIteratorEntity->pos == MAX_COUNT) { - fileIteratorEntity->fileInfoVec.clear(); - fileIteratorEntity->offset += MAX_COUNT; - fileIteratorEntity->pos = 0; + if (fileIteratorEntity->memInfo.offsetCounts == fileIteratorEntity->memInfo.maxCounts) { + fileIteratorEntity->offset += fileIteratorEntity->memInfo.maxCounts; + fileIteratorEntity->memInfo.offsetCounts = 0; if (fileIteratorEntity->flag == 0) { int ret = fileIteratorEntity->fileAccessHelper->ListFile(fileIteratorEntity->fileInfo, - fileIteratorEntity->offset, MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + fileIteratorEntity->offset, fileIteratorEntity->memInfo.maxCounts, fileIteratorEntity->filter, + fileIteratorEntity->memInfo); if (ret != ERR_OK) { HILOG_ERROR("exec ListFile fail, code:%{public}d", ret); return ret; @@ -108,10 +108,10 @@ static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileI } } - if (fileIteratorEntity->pos == fileIteratorEntity->fileInfoVec.size()) { - fileIteratorEntity->fileInfoVec.clear(); + if (fileIteratorEntity->memInfo.offsetCounts == fileIteratorEntity->memInfo.currentCounts) { + fileIteratorEntity->memInfo.currentCounts = 0; fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; + SharedMemoryOperation::DestroySharedMemory(fileIteratorEntity->memInfo); fileInfoEntity = nullptr; objFileInfoExporter = NVal::CreateUndefined(env).val_; nVal.AddProp("value", objFileInfoExporter); @@ -120,8 +120,12 @@ static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileI } fileInfoEntity->fileAccessHelper = fileIteratorEntity->fileAccessHelper; - fileInfoEntity->fileInfo = fileIteratorEntity->fileInfoVec[fileIteratorEntity->pos]; - fileIteratorEntity->pos++; + + int ret = SharedMemoryOperation::ReadFileInfo(fileInfoEntity->fileInfo, fileIteratorEntity->memInfo); + if (ret < 0) { + HILOG_ERROR("Napi ReadFileInfo error"); + return ret; + } nVal.AddProp("value", objFileInfoExporter); nVal.AddProp("done", NVal::CreateBool(env, false).val_); return ERR_OK; @@ -178,4 +182,4 @@ std::string NapiFileIteratorExporter::GetClassName() return NapiFileIteratorExporter::className_; } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/frameworks/js/napi/file_access_module/napi_utils.h b/frameworks/js/napi/file_access_module/napi_utils.h index 345cfb95..6a751ae4 100644 --- a/frameworks/js/napi/file_access_module/napi_utils.h +++ b/frameworks/js/napi/file_access_module/napi_utils.h @@ -20,6 +20,7 @@ #include "filemgmt_libn.h" #include "file_filter.h" +#include "file_info_shared_memory.h" namespace OHOS { namespace FileAccessFwk { @@ -31,4 +32,4 @@ int GetFileFilterParam(const NVal &argv, FileFilter &filter); const int MAX_SUFFIX_LENGTH = 20; } // namespace FileAccessFwk } // namespace OHOS -#endif // NAPI_UTILS_H \ No newline at end of file +#endif // NAPI_UTILS_H diff --git a/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp b/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp index f8ee7085..3a054120 100644 --- a/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp +++ b/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp @@ -128,13 +128,15 @@ napi_value NapiRootInfoExporter::ListFile(napi_env env, napi_callback_info info) std::lock_guard lock(fileIteratorEntity->entityOperateMutex); fileIteratorEntity->fileAccessHelper = rootEntity->fileAccessHelper; fileIteratorEntity->fileInfo = fileInfo; - fileIteratorEntity->fileInfoVec.clear(); + //fileIteratorEntity->fileInfoVec.clear(); + fileIteratorEntity->memInfo.currentCounts = 0; fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; + //fileIteratorEntity->pos = 0; + fileIteratorEntity->memInfo.offsetCounts = 0; fileIteratorEntity->filter = std::move(filter); fileIteratorEntity->flag = 0; auto ret = rootEntity->fileAccessHelper->ListFile(fileInfo, fileIteratorEntity->offset, - MAX_COUNT, filter, fileIteratorEntity->fileInfoVec); + MAX_COUNT, filter, fileIteratorEntity->memInfo); if (ret != ERR_OK) { NError(ret).ThrowErr(env); return nullptr; @@ -298,4 +300,4 @@ std::string NapiRootInfoExporter::GetClassName() } } // namespace FileAccessFwk } // namespace OHOS -#endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file +#endif // NAPI_FILEACCESS_HELPER_H diff --git a/interfaces/inner_api/file_access/BUILD.gn b/interfaces/inner_api/file_access/BUILD.gn index a4fd96c1..dd0e866e 100644 --- a/interfaces/inner_api/file_access/BUILD.gn +++ b/interfaces/inner_api/file_access/BUILD.gn @@ -50,6 +50,7 @@ ohos_shared_library("file_access_extension_ability_kit") { include_dirs = [ "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", "${file_api_path}/utils/filemgmt_libn/include", + "${commonlibrary_path}/c_utils/base/include", ] sources = [ @@ -73,6 +74,7 @@ ohos_shared_library("file_access_extension_ability_kit") { deps = [ "${ability_runtime_path}/frameworks/native/appkit:app_context", "${access_token_path}/interfaces/innerkits/accesstoken:libtokenid_sdk", + "${commonlibrary_path}/c_utils/base:utils", ] external_deps = [ diff --git a/interfaces/inner_api/file_access/include/file_access_ext_ability.h b/interfaces/inner_api/file_access/include/file_access_ext_ability.h index f807b363..b97c21c5 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_ability.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_ability.h @@ -20,6 +20,7 @@ #include "file_access_extension_info.h" #include "file_access_observer_common.h" #include "file_filter.h" +#include "file_info_shared_memory.h" #include "image_source.h" namespace OHOS { @@ -52,7 +53,7 @@ public: virtual int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false); virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile); virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec); + const FileFilter &filter, SharedMemoryInfo &memInfo); virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec); virtual int GetThumbnail(const Uri &uri, const Size &size, std::unique_ptr &pixelMap); diff --git a/interfaces/inner_api/file_access/include/file_access_ext_proxy.h b/interfaces/inner_api/file_access/include/file_access_ext_proxy.h index c681ae6b..1941a363 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_proxy.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_proxy.h @@ -47,7 +47,7 @@ public: bool force = false) override; virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) override; + const FileFilter &filter, SharedMemoryInfo &memInfo) override; virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; virtual int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, diff --git a/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h b/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h index 9acb2c65..aeaca2b9 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h @@ -45,7 +45,7 @@ public: bool force = false) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) override; + const FileFilter &filter, SharedMemoryInfo &memInfo) override; int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap) override; 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 80fe58d6..9ebecf1a 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -77,7 +77,7 @@ public: int Copy(Uri &sourceUri, Uri &destUri, std::vector ©Result, bool force = false); int Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile); int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, - std::vector &fileInfoVec); + SharedMemoryInfo &memInfo); int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec); int GetThumbnail(Uri &uri, ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap); diff --git a/interfaces/inner_api/file_access/include/ifile_access_ext_base.h b/interfaces/inner_api/file_access/include/ifile_access_ext_base.h index b01a81db..c001ae74 100644 --- a/interfaces/inner_api/file_access/include/ifile_access_ext_base.h +++ b/interfaces/inner_api/file_access/include/ifile_access_ext_base.h @@ -24,6 +24,7 @@ #include "file_access_extension_info.h" #include "file_access_framework_errno.h" #include "file_filter.h" +#include "file_info_shared_memory.h" #include "image_source.h" #include "uri.h" @@ -65,7 +66,7 @@ public: bool force = false) = 0; virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) = 0; virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) = 0; + const FileFilter &filter, SharedMemoryInfo &memInfo) = 0; virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) = 0; virtual int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, diff --git a/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h b/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h index 2b690e94..258d9242 100644 --- a/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h +++ b/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h @@ -67,7 +67,7 @@ public: int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, - std::vector &fileInfoVec) override; + SharedMemoryInfo &memInfo) override; int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) override; int GetRoots(std::vector &rootInfoVec) override; int Access(const Uri &uri, bool &isExist) override; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp index c56c4fd6..fe6374c4 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp @@ -104,7 +104,7 @@ int FileAccessExtAbility::Rename(const Uri &sourceFile, const std::string &displ } int FileAccessExtAbility::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) + const FileFilter &filter, SharedMemoryInfo &memInfo) { HILOG_ERROR("FileAccessExtAbility::ListFile Undefined operation"); return EPERM; 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 130b4ab3..d6c3b325 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 @@ -490,7 +490,7 @@ static int GetListFileResult(MessageParcel &reply, std::vector &fileIn } int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) + const FileFilter &filter, SharedMemoryInfo &memInfo) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); MessageParcel data; @@ -524,6 +524,12 @@ int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, return E_IPCS; } + if (!data.WriteParcelable(&memInfo)) { + HILOG_ERROR("fail to WriteParcelable memInfo"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + MessageParcel reply; MessageOption option; int err = Remote()->SendRequest(CMD_LIST_FILE, data, reply, option); @@ -532,16 +538,21 @@ int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return err; } + int ret = E_IPCS; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } - err = GetListFileResult(reply, fileInfoVec); - if (err != ERR_OK) { - HILOG_ERROR("fail to GetListFileResult. err: %{public}d", err); + if (!reply.ReadUint64(memInfo.currentCounts)) { + HILOG_ERROR("fail to ReadUnt64 currentCount"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return err; + return E_IPCS; } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return ERR_OK; + return ret; } int FileAccessExtProxy::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, diff --git a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp index 4c2e17b8..f6754258 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp @@ -437,29 +437,24 @@ ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply return E_IPCS; } - std::vector fileInfoVec; - int ret = ListFile(*fileInfo, offset, maxCount, *filter, fileInfoVec); + std::shared_ptr memInfo(data.ReadParcelable()); + if (memInfo == nullptr) { + HILOG_ERROR("parameter ListFile SharedMemoryInfo is invalid"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return E_IPCS; + } + int ret = SharedMemoryOperation::MapSharedMemory(*memInfo); + ret = ListFile(*fileInfo, offset, maxCount, *filter, *memInfo); if (!reply.WriteInt32(ret)) { HILOG_ERROR("Parameter ListFile fail to WriteInt32 ret"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_IPCS; } - - int64_t count {fileInfoVec.size()}; - if (!reply.WriteInt64(count)) { - HILOG_ERROR("Parameter ListFile fail to WriteInt64 count"); + if (!reply.WriteUint64(memInfo->currentCounts)) { + HILOG_ERROR("Parameter ListFile fail to WriteUint64 currentCounts"); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return E_IPCS; } - - for (const auto &fileInfo : fileInfoVec) { - if (!reply.WriteParcelable(&fileInfo)) { - HILOG_ERROR("parameter ListFile fail to WriteParcelable fileInfoVec"); - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); - return E_IPCS; - } - } - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } diff --git a/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp b/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp index dc53c8f8..28f2d493 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp @@ -127,7 +127,7 @@ int FileAccessExtStubImpl::Rename(const Uri &sourceFile, const std::string &disp } int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) + const FileFilter &filter, SharedMemoryInfo &memInfo) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); if (extension_ == nullptr) { @@ -136,7 +136,7 @@ int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offs return E_IPCS; } - int ret = extension_->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int ret = extension_->ListFile(fileInfo, offset, maxCount, filter, memInfo); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } 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 df45fb58..fc7d7aa5 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -782,7 +782,7 @@ int FileAccessHelper::Rename(Uri &sourceFile, const std::string &displayName, Ur } int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) + const FileFilter &filter, SharedMemoryInfo &memInfo) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); if (!IsSystemApp()) { @@ -805,13 +805,12 @@ int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, c return E_IPCS; } - int ret = fileExtProxy->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int ret = fileExtProxy->ListFile(fileInfo, offset, maxCount, filter, memInfo); if (ret != ERR_OK) { HILOG_ERROR("ListFile get result error, code:%{public}d", ret); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ret; } - FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } 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 88980de2..f6777dbd 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 @@ -802,7 +802,7 @@ static int MakeJsNativeFileFilter(NativeEngine &engine, const FileFilter &filter } int JsFileAccessExtAbility::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) + const FileFilter &filter, SharedMemoryInfo &memInfo) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); auto value = std::make_shared>>(); @@ -873,13 +873,23 @@ int JsFileAccessExtAbility::ListFile(const FileInfo &fileInfo, const int64_t off return errCode; } + HILOG_ERROR("CallJsMethod listFile, code:%{public}d.", value->code); if (value->code != ERR_OK) { + memInfo.currentCounts = 0; HILOG_ERROR("fileio fail."); FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return value->code; } - fileInfoVec = std::move(value->data); + std::vector &fileInfoVec = value->data; + memInfo.currentCounts = 0; + for (auto &info : fileInfoVec) { + int ret = SharedMemoryOperation::WriteFileInfo(info, memInfo); + if (ret < 0) { + HILOG_ERROR("Write shared memory fail."); + return ret; + } + } FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return ERR_OK; } diff --git a/interfaces/kits/js/src/common/file_info_shared_memory.h b/interfaces/kits/js/src/common/file_info_shared_memory.h new file mode 100644 index 00000000..4a19ffe2 --- /dev/null +++ b/interfaces/kits/js/src/common/file_info_shared_memory.h @@ -0,0 +1,294 @@ +/* + * Copyright (C) 2022 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 FILE_INFO_RESULT_SET_H +#define FILE_INFO_RESULT_SET_H + +#include +#include +#include +#include +#include +#include +#include + +#include "parcel.h" +#include "ashmem.h" +#include "file_access_extension_info.h" +#include "file_access_framework_errno.h" +#include "hilog_wrapper.h" +#include "ipc_file_descriptor.h" +#include "securec.h" + +namespace OHOS { +namespace DistributedFS { +namespace { + #define NAME_MAX 255 + #define PATH_MAX 4096 + const uint32_t URI_MAX = 64+PATH_MAX; + const uint32_t MIMETYPE_MAX = 512; + const uint64_t FILEINFO_SIZE = URI_MAX + PATH_MAX + NAME_MAX + sizeof(int32_t) + sizeof(int64_t) + sizeof(int64_t) + MIMETYPE_MAX; + const uint64_t DEFAULT_FILE_COUNT = 1000; + const int32_t ERR_OK = 0; +} +class SharedMemoryInfo : public OHOS::Parcelable { +public: + int memFd { -1 }; + void *memAddr { nullptr }; + uint64_t offsetCounts { 0 }; + uint64_t offsetBytes { 0 }; + uint64_t currentCounts { 0 }; + uint64_t maxCounts { DEFAULT_FILE_COUNT }; + + bool Marshalling(Parcel &parcel) const override + { + if (!WriteFileDescriptor(parcel, memFd)) { + HILOG_ERROR("WriteFileDescriptor fail"); + return false; + } + if (!parcel.WriteUint64(currentCounts)) { + return false; + } + if (!parcel.WriteUint64(maxCounts)) { + return false; + } + return true; + } + + static SharedMemoryInfo *Unmarshalling(Parcel &parcel) + { + auto *obj = new (std::nothrow) SharedMemoryInfo(); + if (obj != nullptr && !obj->ReadFromParcel(parcel)) { + delete obj; + obj = nullptr; + } + return obj; + } + + bool ReadFromParcel(Parcel &parcel) + { + if (!ReadFileDescriptor(parcel)) { + return false; + } + + currentCounts = parcel.ReadUint64(); + maxCounts = parcel.ReadUint64(); + return true; + } + +private: + bool WriteFileDescriptor(Parcel &parcel, int fd) const + { + if (fd < 0) { + return false; + } + int dupFd = dup(fd); + if (dupFd < 0) { + return false; + } + sptr descriptor = new IPCFileDescriptor(dupFd); + if (descriptor == nullptr) { + return false; + } + return parcel.WriteObject(descriptor); + } + + bool ReadFileDescriptor(Parcel &parcel) + { + sptr descriptor = parcel.ReadObject(); + if (descriptor == nullptr) { + return false; + } + int fd = descriptor->GetFd(); + if (fd < 0) { + return false; + } + memFd = dup(fd); + return true; + } + +}; + +class SharedMemoryOperation { +public: + SharedMemoryOperation() = default; + ~SharedMemoryOperation() = default; + + static int CreatSharedMemory(const char *memName, int64_t maxCounts, SharedMemoryInfo &memInfo) + { + memInfo.maxCounts = maxCounts; + //memInfo.memName = memName; + uint64_t memSize = memInfo.maxCounts * FILEINFO_SIZE; + //memInfo.memFd = AshmemCreate(memInfo.memName.c_str(), memSize); + memInfo.memFd = AshmemCreate(memName, memSize); + if (memInfo.memFd < 0) { + HILOG_ERROR("Create shared memory error, shared memory name is %{public}s code: %{public}d", + memName, memInfo.memFd); + return memInfo.memFd; + } + + int ret = AshmemSetProt(memInfo.memFd, PROT_READ | PROT_WRITE); + if (ret < 0) { + HILOG_ERROR("Set shared memory protection mask error, code: %{public}d", ret); + ::close(memInfo.memFd); + return ret; + } + + return MapSharedMemory(memInfo); + } + + static void DestroySharedMemory(SharedMemoryInfo &memInfo) + { + if (memInfo.memAddr != nullptr) { + ::munmap(memInfo.memAddr, memInfo.maxCounts * FILEINFO_SIZE); + ::close(memInfo.memFd); + memInfo.memAddr = nullptr; + } + } + + static int MapSharedMemory(SharedMemoryInfo &memInfo) + { + uint64_t memSize = memInfo.maxCounts * FILEINFO_SIZE; + memInfo.memAddr = ::mmap(nullptr, memSize, PROT_READ | PROT_WRITE, MAP_SHARED, memInfo.memFd, 0); + if (memInfo.memAddr == MAP_FAILED) { + int ret = errno; + ::close(memInfo.memFd); + HILOG_ERROR("Shared memory map error, code: %{public}d", ret); + return ret; + } + return ERR_OK; + } + + template + static void WriteInteger(T integer, SharedMemoryInfo &memInfo) + { + uint8_t *dest = static_cast(memInfo.memAddr) + memInfo.currentCounts * FILEINFO_SIZE + memInfo.offsetBytes; + *(reinterpret_cast(dest)) = integer; + memInfo.offsetBytes += sizeof(T); + } + + template + static T ReadInteger(SharedMemoryInfo &memInfo) + { + uint8_t *src = static_cast(memInfo.memAddr) + memInfo.offsetCounts * FILEINFO_SIZE + memInfo.offsetBytes; + T integer = *(reinterpret_cast(src)); + memInfo.offsetBytes += sizeof(T); + return integer; + } + + static void WriteInt32(int32_t value, SharedMemoryInfo &memInfo) + { + WriteInteger(value, memInfo); + } + + static void WriteInt64(int64_t value, SharedMemoryInfo &memInfo) + { + WriteInteger(value, memInfo); + } + + static void ReadInt32(int32_t &value, SharedMemoryInfo &memInfo) + { + value = ReadInteger(memInfo); + } + + static void ReadInt64(int64_t &value, SharedMemoryInfo &memInfo) + { + value = ReadInteger(memInfo); + } + + static void WriteString(std::string &inVal, SharedMemoryInfo &memInfo) + { + std::string::size_type len =inVal.size(); + WriteInteger(len, memInfo); + if (len == 0) { + HILOG_ERROR("WriteString inVal.size() = %{public}d", len); + return; + } + + uint8_t *src = const_cast(reinterpret_cast(inVal.c_str())); + uint8_t *dest = static_cast(memInfo.memAddr) + memInfo.currentCounts * FILEINFO_SIZE + memInfo.offsetBytes; + if (memcpy_s(dest, len, src, len) != ERR_OK) { + HILOG_ERROR("WriteString copy inVal string failed"); + return; + } + memInfo.offsetBytes += len; + } + + static void ReadString(std::string &outVal, SharedMemoryInfo &memInfo) + { + std::string::size_type len = ReadInteger(memInfo); + if (len == 0) { + outVal = ""; + return; + } + + uint8_t *src = static_cast(memInfo.memAddr) + memInfo.offsetCounts * FILEINFO_SIZE + memInfo.offsetBytes; + //outVal.resize(len); + //outVal.assign(reinterpret_cast(src), len); + outVal.clear(); + outVal.assign(src, src + len); + memInfo.offsetBytes += len; + } + + static int WriteFileInfo(OHOS::FileAccessFwk::FileInfo &info, SharedMemoryInfo &memInfo) + { + if (memInfo.currentCounts == memInfo.maxCounts) { + HILOG_ERROR("Shared memory cannot hold current data"); + return FileAccessFwk::ERR_NOMEM; + } + + memInfo.offsetBytes = 0; + WriteString(info.uri, memInfo); + WriteString(info.relativePath, memInfo); + WriteString(info.fileName, memInfo); + WriteInt32(info.mode, memInfo); + WriteInt64(info.size, memInfo); + WriteInt64(info.mtime, memInfo); + WriteString(info.mimeType, memInfo); + memInfo.currentCounts++; + return ERR_OK; + } + + static int32_t ReadFileInfo(OHOS::FileAccessFwk::FileInfo &info, SharedMemoryInfo &memInfo) + { + if (memInfo.offsetCounts == memInfo.currentCounts) { + HILOG_ERROR("No space left in shared memory"); + return FileAccessFwk::ERR_NOSPC; + } + + memInfo.offsetBytes = 0; + ReadString(info.uri, memInfo); + ReadString(info.relativePath, memInfo); + ReadString(info.fileName, memInfo); + ReadInt32(info.mode, memInfo); + ReadInt64(info.size, memInfo); + ReadInt64(info.mtime, memInfo); + ReadString(info.mimeType, memInfo); + memInfo.offsetCounts++; + return ERR_OK; + } + + static bool GetFileInfoMemory(OHOS::FileAccessFwk::FileInfo *&info, SharedMemoryInfo &memInfo) + { + if (memInfo.currentCounts == memInfo.maxCounts) { + HILOG_ERROR("Shared memory cannot hold current data"); + return false; + } + info = static_cast(memInfo.memAddr) + memInfo.currentCounts * FILEINFO_SIZE; + return true; + } +}; +} // namespace DistributedFS +} // namespace OHOS +#endif // FILE_INFO_RESULT_SET_H diff --git a/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp b/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp index 4bfce42e..15721c40 100644 --- a/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp +++ b/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp @@ -371,9 +371,11 @@ bool ListFileFuzzTest(const uint8_t* data, size_t size) fileInfo.uri = std::string(reinterpret_cast(data), size); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - int result = helper->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + SharedMemoryOperation::CreatSharedMemory("FileInfo List", maxCount, memInfo); + int result = helper->ListFile(fileInfo, offset, maxCount, filter, memInfo); + SharedMemoryOperation::DestroySharedMemory(memInfo); if (result != OHOS::FileAccessFwk::ERR_OK) { HILOG_ERROR("ListFile failed. ret : %{public}d", result); return false; @@ -446,4 +448,4 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) OHOS::ScanFileFuzzTest(data, size); OHOS::GetFileInfoFromUriFuzzTest(data, size); return 0; -} \ No newline at end of file +} diff --git a/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp b/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp index 1a9e07f0..f4104c0b 100644 --- a/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp +++ b/test/fuzztest/medialibraryfileaccess_fuzzer/medialibrary_file_access_fuzzer.cpp @@ -369,9 +369,11 @@ bool ListFileFuzzTest(const uint8_t* data, size_t size) fileInfo.uri = downloadUri.ToString() + "/" + std::string(reinterpret_cast(data), size); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - int result = helper->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + SharedMemoryOperation::CreatSharedMemory("FileInfo List", maxCount, memInfo); + int result = helper->ListFile(fileInfo, offset, maxCount, filter, memInfo); + SharedMemoryOperation::DestroySharedMemory(memInfo); if (result != OHOS::FileAccessFwk::ERR_OK) { HILOG_ERROR("ListFile failed. ret : %{public}d", result); return false; @@ -421,4 +423,4 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) OHOS::ListFileFuzzTest(data, size); OHOS::ScanFileFuzzTest(data, size); return 0; -} \ No newline at end of file +} diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index abea929a..3d0a33ab 100755 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -90,10 +90,13 @@ ohos_unittest("external_file_access_test") { "access_token:libnativetoken", "access_token:libtoken_setproc", "c_utils:utils", + "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", "ipc_js:rpc", "samgr:samgr_proxy", ] + resource_config_file = + "${user_file_service_path}/test/unittest/resources/ohos_test.xml" } ohos_unittest("abnormal_file_access_test") { @@ -134,11 +137,53 @@ ohos_unittest("abnormal_file_access_test") { ] } +ohos_unittest("external_and_medialibrary_file_access_test") { + module_out_path = "filemanagement/user_file_service" + + sources = [ "external_and_medialibrary_file_access_test.cpp" ] + + include_dirs = [ + "${distributed_file_path}/interfaces/kits/js/src/common", + "//third_party/googletest/googlemock/include/gmock", + "${ability_runtime_kits_path}/appkit/native/ability_runtime/context", + "${user_file_service_path}/interfaces/inner_api/file_access/include", + ] + + configs = [ "//build/config/compiler:exceptions" ] + + deps = [ + "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", + "${ability_runtime_path}/frameworks/native/appkit:app_context", + "${access_token_path}/frameworks/accesstoken:accesstoken_communication_adapter_cxx", + "${access_token_path}/interfaces/innerkits/token_setproc:libtoken_setproc", + "${user_file_service_path}/interfaces/inner_api/file_access:file_access_extension_ability_kit", + "//third_party/googletest:gmock_main", + ] + + external_deps = [ + "ability_base:want", + "ability_base:zuri", + "ability_runtime:ability_context_native", + "ability_runtime:ability_manager", + "ability_runtime:app_manager", + "ability_runtime:runtime", + "ability_runtime:wantagent_innerkits", + "access_token:libaccesstoken_sdk", + "access_token:libnativetoken", + "c_utils:utils", + "hiviewdfx_hilog_native:libhilog", + "ipc:ipc_core", + "ipc_js:rpc", + "samgr:samgr_proxy", + ] +} + group("user_file_service_unit_test") { testonly = true deps = [ ":abnormal_file_access_test", + ":external_and_medialibrary_file_access_test", ":external_file_access_test", ":medialibrary_file_access_test", ] diff --git a/test/unittest/abnormal_file_access_test.cpp b/test/unittest/abnormal_file_access_test.cpp index 1739f759..56772421 100755 --- a/test/unittest/abnormal_file_access_test.cpp +++ b/test/unittest/abnormal_file_access_test.cpp @@ -290,8 +290,10 @@ HWTEST_F(AbnormalFileExtensionHelperTest, abnormal_external_file_access_ListFile int64_t offset = 0; int64_t maxCount = 0; FileFilter filter; - vector fileInfoVec; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + SharedMemoryOperation::CreatSharedMemory("FileInfo List", maxCount, memInfo); + int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); + SharedMemoryOperation::DestroySharedMemory(memInfo); EXPECT_EQ(result, E_PERMISSION_SYS); } catch (...) { GTEST_LOG_(ERROR) << "abnormal_external_file_access_ListFile_0000 occurs an exception."; @@ -494,4 +496,4 @@ HWTEST_F(AbnormalFileExtensionHelperTest, abnormal_external_file_access_GetFileI GTEST_LOG_(INFO) << "AbnormalFileExtensionHelperTest-end" "abnormal_external_file_access_GetFileInfoFromRelativePath_0000"; } -} // namespace \ No newline at end of file +} // namespace diff --git a/test/unittest/external_and_medialibrary_file_access_test.cpp b/test/unittest/external_and_medialibrary_file_access_test.cpp new file mode 100644 index 00000000..d1bba0bd --- /dev/null +++ b/test/unittest/external_and_medialibrary_file_access_test.cpp @@ -0,0 +1,845 @@ +/* + * Copyright (c) 2022 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 +#include +#include +#include + +#include + +#include "accesstoken_kit.h" +#include "context_impl.h" +#include "file_access_extension_info.h" +#include "file_access_framework_errno.h" +#include "file_access_helper.h" +#include "file_info_shared_memory.h" +#include "iservice_registry.h" +#include "image_source.h" +#include "nativetoken_kit.h" +#include "token_setproc.h" + +namespace { +using namespace std; +using namespace OHOS; +using namespace FileAccessFwk; +using namespace OHOS::Media; +const int ABILITY_ID = 5003; +shared_ptr g_fah = nullptr; +const int UID_TRANSFORM_TMP = 20000000; +const int UID_DEFAULT = 0; +static const std::string SCHEME_NAME_FMT = "file://"; +static const std::string MEDIA_BNUDLE_NAME_ALIAS = "media"; +static const std::string EXTERNAL_BNUDLE_NAME = "com.ohos.UserFile.ExternalFileManager"; +constexpr int64_t MAX_COUNT = 1000; + +void SetNativeToken() +{ + uint64_t tokenId; + const char **perms = new const char *[1]; + perms[0] = "ohos.permission.FILE_ACCESS_MANAGER"; + NativeTokenInfoParams infoInstance = { + .dcapsNum = 0, + .permsNum = 1, + .aclsNum = 0, + .dcaps = nullptr, + .perms = perms, + .acls = nullptr, + .aplStr = "system_core", + }; + + infoInstance.processName = "SetUpTestCase"; + tokenId = GetAccessTokenId(&infoInstance); + const uint64_t systemAppMask = (static_cast(1) << 32); + tokenId |= systemAppMask; + SetSelfTokenID(tokenId); + OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo(); + delete[] perms; +} + +class ExternalAndMediaFileAccessHelperTest : public testing::Test { +public: + static void SetUpTestCase(void) + { + cout << "FileAccessHelperTest code test" << endl; + SetNativeToken(); + auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + auto remoteObj = saManager->GetSystemAbility(ABILITY_ID); + AAFwk::Want want; + vector wants; + setuid(UID_TRANSFORM_TMP); + int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wants); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + g_fah = FileAccessHelper::Creator(remoteObj, wants); + if (g_fah == nullptr) { + GTEST_LOG_(ERROR) << "medialibrary_file_access_test g_fah is nullptr"; + exit(1); + } + setuid(UID_DEFAULT); + } + static void TearDownTestCase() + { + g_fah->Release(); + g_fah = nullptr; + }; + void SetUp(){}; + void TearDown(){}; +}; + +static Uri GetMediaParentUri() +{ + vector infos; + int result = g_fah->GetRoots(infos); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri {""}; + for (auto info: infos) { + if (strncmp(info.uri.c_str(), SCHEME_NAME_FMT.c_str(), SCHEME_NAME_FMT.length()) == 0) { + std::string bundleName = info.uri.substr(SCHEME_NAME_FMT.length(), MEDIA_BNUDLE_NAME_ALIAS.length()) ; + if (bundleName == MEDIA_BNUDLE_NAME_ALIAS) { + parentUri = Uri(info.uri + "/file"); + break; + } + } + } + return parentUri; +} + +static Uri GetExternalParentUri() +{ + vector infos; + int result = g_fah->GetRoots(infos); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri {""}; + for (auto info: infos) { + if (strncmp(info.uri.c_str(), SCHEME_NAME_FMT.c_str(), SCHEME_NAME_FMT.length()) == 0) { + std::string bundleName = info.uri.substr(SCHEME_NAME_FMT.length(), EXTERNAL_BNUDLE_NAME.length()) ; + HILOG_ERROR("info.uri: %{public}s", info.uri.c_str()); + HILOG_ERROR("bundleName: %{public}s", bundleName.c_str()); + if (bundleName == EXTERNAL_BNUDLE_NAME) { + parentUri = Uri(info.uri); + break; + } + } + } + return parentUri; +} + +static Uri GetMediaLibraryDownloadDir() +{ + Uri newDirUriTest("datashare:///media/root/file"); + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + //std::vector fileInfoVec; + FileFilter filter; + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = !result && g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); + if (result != OHOS::FileAccessFwk::ERR_OK) { + HILOG_ERROR("ListFile get result error, code:%{public}d", result); + return Uri {""}; + } + + memInfo.offsetCounts = 0; + for (uint64_t i = 0; i < memInfo.currentCounts; ++i) { + FileInfo info; + auto ret = SharedMemoryOperation::ReadFileInfo(info, memInfo); + if (!ret) { + HILOG_ERROR("Test Case ReadFileInfo error"); + continue; + } + if (info.fileName.compare("Download") == 0) { + return Uri {info.uri}; + } + } + + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); + Uri mediaParentUri = GetMediaParentUri(); + result = g_fah->Mkdir(mediaParentUri, "Download", newDirUriTest); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + return newDirUriTest; +} + +int GetTargetFileUri(Uri &targetPathUri, const std::string &targetFileName, Uri &targetUri) +{ + FileAccessFwk::FileInfo fileInfo; + int ret = g_fah->GetFileInfoFromUri(targetPathUri, fileInfo); + if (ret != OHOS::FileAccessFwk::ERR_OK) { + HILOG_ERROR("get FileInfo from uri error, code:%{public}d", ret); + return ret; + } + + std::vector fileInfoVec; + FileFilter filter { {}, {}, {}, 0, 0, false, false }; + int64_t offset { 0 }; + do { + SharedMemoryInfo memInfo; + ret = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + ret = !ret && g_fah->ListFile(fileInfo, offset, MAX_COUNT, filter, memInfo); + if (ret != OHOS::FileAccessFwk::ERR_OK) { + HILOG_ERROR("ListFile get result error, code:%{public}d", ret); + return ret; + } + memInfo.offsetCounts = 0; + for (uint64_t i = 0; i < memInfo.currentCounts; ++i) { + FileInfo info; + auto ret = SharedMemoryOperation::ReadFileInfo(info, memInfo); + if (!ret) { + HILOG_ERROR("Test Case ReadFileInfo error"); + continue; + } + if (info.fileName == targetFileName) { + Uri uri { info.uri }; + targetUri = uri; + return OHOS::FileAccessFwk::ERR_OK; + } + } + offset += MAX_COUNT; + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); + } while (fileInfoVec.size() == MAX_COUNT); + + return OHOS::FileAccessFwk::ERR_OK; +} + +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_ListFile_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_ListFile_0000"; + try { + Uri externalParentUri = GetExternalParentUri(); + //Uri externalParentUri{"file://com.ohos.UserFile.ExternalFileManager/data/storage/el1/bundle/storage_daemon"}; + + HILOG_ERROR("externalParentUri = %{public}s", externalParentUri.ToString().c_str()); + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "ListFile_test_0000", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri srcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", srcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(srcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + + FileInfo fileInfo; + fileInfo.uri = srcUri.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + FileFilter filter; + // std::vector fileInfoVec; + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(memInfo.currentCounts, 0); + memInfo.offsetCounts = 0; + for (uint64_t i = 0; i < memInfo.currentCounts; ++i) { + FileInfo info; + auto ret = SharedMemoryOperation::ReadFileInfo(info, memInfo); + if (!ret) { + HILOG_ERROR("Test Case ReadFileInfo error"); + continue; + } + HILOG_ERROR("uri: %{public}s", info.uri.c_str()); + HILOG_ERROR("relativePath: %{public}s", info.relativePath.c_str()); + HILOG_ERROR("fileName: %{public}s", info.fileName.c_str()); + HILOG_ERROR("mode: %{public}d", info.mode); + HILOG_ERROR("size: %{public}" PRId64, info.size); + HILOG_ERROR("mtime: %{public}" PRId64, info.mtime); + HILOG_ERROR("memeType: %{public}s", info.mimeType.c_str()); + } + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); + + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_ListFile_0000 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_ListFile_0000"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0000 + * @tc.name: medialibrary_file_access_Copy_0000 + * @tc.desc: Test function of Copy interface, copy file from external storage to media library + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0000"; + try { + Uri externalParentUri = GetExternalParentUri(); + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "Copy_0000_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri srcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", srcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(srcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + + Uri destUri(""); + result = g_fah->Mkdir(mediaDownloadUri, "Copy_0000_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcFileUri, destUri, copyResult, false); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 0); + + Uri targetUri(""); + result = GetTargetFileUri(destUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, destFileSize); + close(fd); + + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0000 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0000"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0001 + * @tc.name: medialibrary_file_access_Copy_0001 + * @tc.desc: Test function of Copy interface, copy directory from external storage to media library + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0001"; + HILOG_ERROR("Copy_0001 ---------------------->"); + try { + Uri externalParentUri = GetExternalParentUri(); + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "Copy_0001_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri srcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", srcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(srcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + + Uri destUri(""); + result = g_fah->Mkdir(mediaDownloadUri, "Copy_0001_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destFileUri(""); + result = g_fah->CreateFile(destUri, "a.txt", destFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcFileUri, destUri, copyResult, true); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 0); + + Uri targetUri(""); + result = GetTargetFileUri(destUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, destFileSize); + close(fd); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0001 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0001"; + HILOG_ERROR("Copy_0001 <----------------------"); +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0002 + * @tc.name: medialibrary_file_access_Copy_0002 + * @tc.desc: Test function of Copy interface, copy file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0002"; + try { + Uri externalParentUri = GetExternalParentUri(); + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "Copy_0002_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri srcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", srcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(srcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + + Uri destUri(""); + result = g_fah->Mkdir(mediaDownloadUri, "Copy_0002_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destFileUri(""); + result = g_fah->CreateFile(destUri, "a.txt", destFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcFileUri, destUri, copyResult); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 1); + + Uri targetUri(""); + result = GetTargetFileUri(destUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(destFileSize, 0); + close(fd); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0002 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0002"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0003 + * @tc.name: medialibrary_file_access_Copy_0003 + * @tc.desc: Test function of Copy interface, copy file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0003"; + try { + Uri externalParentUri = GetExternalParentUri(); + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "Copy_0003_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri srcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", srcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(srcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + + Uri destUri(""); + result = g_fah->Mkdir(mediaDownloadUri, "Copy_0003_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destFileUri(""); + result = g_fah->CreateFile(destUri, "a.txt", destFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcFileUri, destUri, copyResult, false); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 1); + + Uri targetUri(""); + result = GetTargetFileUri(destUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(destFileSize, 0); + close(fd); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0003 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0003"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0003 + * @tc.name: medialibrary_file_access_Copy_0003 + * @tc.desc: Test function of Copy interface, copy directory file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0004, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0004"; + try { + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + Uri externalParentUri = GetExternalParentUri(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(mediaDownloadUri, "Copy_0004_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(aFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + Uri bFileUri{""}; + result = g_fah->CreateFile(srcUri, "b.txt", bFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri destUri(""); + result = g_fah->Mkdir(externalParentUri, "Copy_0004_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcUri, destUri, copyResult, false); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 0); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0004 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0004"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0005 + * @tc.name: medialibrary_file_access_Copy_0005 + * @tc.desc: Test function of Copy interface, copy single file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0005, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0005"; + HILOG_ERROR("Copy_0005 ---------------------->"); + try { + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + Uri externalParentUri = GetExternalParentUri(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(mediaDownloadUri, "Copy_0005_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(aSrcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + Uri bSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "b.txt", bSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri destUri(""); + result = g_fah->Mkdir(externalParentUri, "Copy_0005_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destSrcUri(""); + result = g_fah->Mkdir(destUri, "Copy_0005_em_src", destSrcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aDestFileUri{""}; + result = g_fah->CreateFile(destSrcUri, "a.txt", aDestFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcUri, destUri, copyResult, true); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 0); + + Uri targetUri(""); + result = GetTargetFileUri(destSrcUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, destFileSize); + close(fd); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0005 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0005"; + HILOG_ERROR("Copy_0005 <----------------------"); +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0006 + * @tc.name: medialibrary_file_access_Copy_0006 + * @tc.desc: Test function of Copy interface, copy single file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0006, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0006"; + try { + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + Uri externalParentUri = GetExternalParentUri(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(mediaDownloadUri, "Copy_0006_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(aSrcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + Uri bSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "b.txt", bSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri destUri(""); + result = g_fah->Mkdir(externalParentUri, "Copy_0006_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destSrcUri(""); + result = g_fah->Mkdir(destUri, "Copy_0006_em_src", destSrcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aDestFileUri{""}; + result = g_fah->CreateFile(destSrcUri, "a.txt", aDestFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcUri, destUri, copyResult); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 1); + + Uri targetUri(""); + result = GetTargetFileUri(destSrcUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(destFileSize, 0); + close(fd); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0006 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0006"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0007 + * @tc.name: medialibrary_file_access_Copy_0007 + * @tc.desc: Test function of Copy interface, copy single file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0007, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0007"; + try { + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + Uri externalParentUri = GetExternalParentUri(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(mediaDownloadUri, "Copy_0007_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(aSrcFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for a.txt"; + ssize_t srcFileSize = write(fd, buff, sizeof(buff)); + EXPECT_EQ(srcFileSize, sizeof(buff)); + close(fd); + Uri bSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "b.txt", bSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri destUri(""); + result = g_fah->Mkdir(externalParentUri, "Copy_0007_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destSrcUri(""); + result = g_fah->Mkdir(destUri, "Copy_0007_em_src", destSrcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aDestFileUri{""}; + result = g_fah->CreateFile(destSrcUri, "a.txt", aDestFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcUri, destUri, copyResult, false); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 1); + + Uri targetUri(""); + result = GetTargetFileUri(destSrcUri, "a.txt", targetUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->OpenFile(targetUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t destFileSize = read(fd, buff, sizeof(buff)); + EXPECT_EQ(destFileSize, 0); + close(fd); + + //result = g_fah->Delete(srcUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0007 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0007"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0008 + * @tc.name: medialibrary_file_access_Copy_0008 + * @tc.desc: Test function of Copy interface, copy single file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0008, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0008"; + try { + Uri externalParentUri = GetExternalParentUri(); + + Uri srcFileUri("datashare:///xxx/root/file"); + Uri destUri(""); + int result = g_fah->Mkdir(externalParentUri, "Copy_0008_em_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector copyResult; + result = g_fah->Copy(srcFileUri, destUri, copyResult, false); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 1); + + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0008 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0008"; +} + +/** + * @tc.number: user_file_service_external_and_medialibrary_file_access_Copy_0009 + * @tc.name: medialibrary_file_access_Copy_0009 + * @tc.desc: Test function of Copy interface, copy single file from media library to external storage + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6W8ET + */ +HWTEST_F(ExternalAndMediaFileAccessHelperTest, external_and_medialibrary_file_access_Copy_0009, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-begin external_and_medialibrary_file_access_Copy_0009"; + try { + Uri mediaDownloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(mediaDownloadUri, "Copy_0009_em_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aSrcFileUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aSrcFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri destUri("data:///foo/bar"); + + vector copyResult; + result = g_fah->Copy(aSrcFileUri, destUri, copyResult, false); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(copyResult.size(), 1); + + //result = g_fah->Delete(destUri); + //EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_and_medialibrary_file_access_Copy_0009 occurs an exception."; + } + GTEST_LOG_(INFO) << "ExternalAndMediaFileAccessHelperTest-end external_and_medialibrary_file_access_Copy_0009"; +} +} // namespace diff --git a/test/unittest/external_file_access_test.cpp b/test/unittest/external_file_access_test.cpp index 43b1ef94..14f2deb5 100644 --- a/test/unittest/external_file_access_test.cpp +++ b/test/unittest/external_file_access_test.cpp @@ -23,6 +23,7 @@ #include "accesstoken_kit.h" #include "context_impl.h" #include "file_access_framework_errno.h" +#include "file_info_shared_memory.h" #include "iservice_registry.h" #include "nativetoken_kit.h" #include "token_setproc.h" @@ -2421,13 +2422,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0000, testing::e fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0000 occurs an exception."; @@ -2453,11 +2456,13 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0001, testing::e fileInfo.uri = sourceFileUri.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0001 occurs an exception."; } @@ -2494,13 +2499,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0002, testing::e Uri sourceFile(fileInfo.uri); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0002 occurs an exception."; @@ -2527,11 +2534,13 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0003, testing::e Uri sourceFile(fileInfo.uri); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0003 occurs an exception."; } @@ -2539,10 +2548,10 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0003, testing::e } static void ListFileTdd(FileInfo fileInfo, int offset, int maxCount, FileFilter filter, - std::vector fileInfoVec) + SharedMemoryInfo &memInfo) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_ListFileTdd"; - int ret = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int ret = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); if (ret != OHOS::FileAccessFwk::ERR_OK) { GTEST_LOG_(ERROR) << "ListFile get result error, code:" << ret; return; @@ -2580,16 +2589,18 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0004, testing::e fileInfo.uri = newDirUriTest.ToString(); int offset = 0; int maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; g_num = 0; + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); for (int j = 0; j < INIT_THREADS_NUMBER; j++) { - std::thread execthread(ListFileTdd, fileInfo, offset, maxCount, filter, fileInfoVec); + std::thread execthread(ListFileTdd, fileInfo, offset, maxCount, filter, std::ref(memInfo)); execthread.join(); } EXPECT_EQ(g_num, INIT_THREADS_NUMBER); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0004 occurs an exception."; @@ -2631,12 +2642,14 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0005, testing::e fileInfo.uri = str; int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::E_IPCS); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0005 occurs an exception."; @@ -2674,13 +2687,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0006, testing::e fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0006 occurs an exception."; @@ -2688,6 +2703,58 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0006, testing::e GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_ListFile_0006"; } +HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0007, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_ListFile_0007"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + for (size_t i = 0; i < info.size(); i++) { + Uri parentUri(info[i].uri); + Uri newDirUriTest(""); + result = g_fah->Mkdir(parentUri, "test", newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri testUri(""); + result = g_fah->CreateFile(newDirUriTest, "test1.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "test2.mp3", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "test3.mp4", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "test4.jpg", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "test5", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "test6_测试", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->CreateFile(newDirUriTest, "test7_测试.txt", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newDirUriTest0008(""); + result = g_fah->Mkdir(newDirUriTest, "test_dir_0008", newDirUriTest0008); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + FileInfo fileInfo; + fileInfo.uri = newDirUriTest.ToString(); + int64_t offset = 0; + int64_t maxCount = 1000; + FileFilter filter; + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + + result = g_fah->Delete(newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); + } + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_ListFile_0007 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_ListFile_0007"; +} + /** * @tc.number: user_file_service_external_file_access_GetRoots_0000 * @tc.name: external_file_access_GetRoots_0000 @@ -2867,17 +2934,19 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0000, EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); - FileInfo fileinfo; - result = g_fah->GetFileInfoFromUri(parentUri, fileinfo); + FileInfo fileInfo; + result = g_fah->GetFileInfoFromUri(parentUri, fileInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_GetFileInfoFromUri_0000 occurs an exception."; @@ -2915,10 +2984,12 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0001, int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(dirInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(dirInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); @@ -2955,17 +3026,19 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0002, result = g_fah->CreateFile(newDirUriTest, "external_file_access_GetFileInfoFromUri_0002.txt", newFileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - FileInfo fileinfo; - result = g_fah->GetFileInfoFromUri(newFileUri, fileinfo); + FileInfo fileInfo; + result = g_fah->GetFileInfoFromUri(newFileUri, fileInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); @@ -3102,10 +3175,12 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0006, int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(dirInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(dirInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); @@ -3151,10 +3226,12 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0007, int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileinfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); @@ -3901,4 +3978,4 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Query_0007, testing::ext: } GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_Query_0007"; } -} // namespace \ No newline at end of file +} // namespace diff --git a/test/unittest/medialibrary_file_access_test.cpp b/test/unittest/medialibrary_file_access_test.cpp index a6b2a61b..0cb9038b 100644 --- a/test/unittest/medialibrary_file_access_test.cpp +++ b/test/unittest/medialibrary_file_access_test.cpp @@ -148,17 +148,21 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_OpenFile_0000, testing:: fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - for (size_t i = 0; i < fileInfoVec.size(); i++) { - if (fileInfoVec[i].fileName.compare("Download") == 0) { - g_newDirUri = Uri(fileInfoVec[i].uri); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + memInfo.offsetCounts = 0; + for (size_t i = 0; i < memInfo.currentCounts; i++) { + DistributedFS::SharedMemoryOperation::ReadFileInfo(fileInfo, memInfo); + if (fileInfo.fileName.compare("Download") == 0) { + g_newDirUri = Uri(fileInfo.uri); break; } } + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Mkdir(g_newDirUri, "test1", newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri newFileUri(""); @@ -2053,12 +2057,14 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0000, testing:: fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - GTEST_LOG_(INFO) << "ListFile_0000 result:" << fileInfoVec.size() << endl; + EXPECT_GT(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "ListFile_0000 result:" << memInfo.currentCounts << endl; + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -2085,12 +2091,14 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0001, testing:: fileInfo.uri = sourceFileUri.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - vector fileInfoVec; FileFilter filter({}, {}, {}, 0, 0, false, false); - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - GTEST_LOG_(INFO) << "ListFile_0001 result:" << fileInfoVec.size() << endl; + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "ListFile_0001 result:" << memInfo.currentCounts << endl; + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "medialibrary_file_access_ListFile_0001 occurs an exception."; } @@ -2121,12 +2129,14 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0002, testing:: fileInfo.uri = sourceFileUri.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - vector fileInfoVec; FileFilter filter({}, {}, {}, 0, 0, false, false); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - GTEST_LOG_(INFO) << "ListFile_0002 result:" << fileInfoVec.size() << endl; + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "ListFile_0002 result:" << memInfo.currentCounts << endl; + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -2153,12 +2163,14 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0003, testing:: fileInfo.uri = sourceFileUri.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - vector fileInfoVec; FileFilter filter; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - GTEST_LOG_(INFO) << "ListFile_0003 result:" << fileInfoVec.size() << endl; + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << "ListFile_0003 result:" << memInfo.currentCounts << endl; + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "medialibrary_file_access_ListFile_0003 occurs an exception."; } @@ -2191,11 +2203,13 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0004, testing:: fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter({".txt"}, {}, {}, 0, 0, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), 1); + EXPECT_EQ(memInfo.currentCounts, 1); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -2205,16 +2219,16 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0004, testing:: } static void ListFileTdd(shared_ptr fahs, FileInfo fileInfo, int offset, int maxCount, - FileFilter filter, std::vector fileInfoVec) + FileFilter filter, SharedMemoryInfo &memInfo) { GTEST_LOG_(INFO) << "FileAccessHelperTest-begin medialibrary_file_access_ListFileTdd"; - int ret = fahs->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int ret = fahs->ListFile(fileInfo, offset, maxCount, filter, memInfo); if (ret != OHOS::FileAccessFwk::ERR_OK) { GTEST_LOG_(ERROR) << "ListFileTdd get result error, code:" << ret; return; } EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), 1); + EXPECT_EQ(memInfo.currentCounts, 1); g_num++; GTEST_LOG_(INFO) << "FileAccessHelperTest-end medialibrary_file_access_ListFileTdd"; } @@ -2245,12 +2259,15 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_ListFile_0005, testing:: fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; int64_t maxCount = 1000; - std::vector fileInfoVec; g_num = 0; FileFilter filter({".txt"}, {}, {}, 0, 0, false, true); for (int j = 0; j < INIT_THREADS_NUMBER; j++) { - std::thread execthread(ListFileTdd, g_fah, fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + std::thread execthread(ListFileTdd, g_fah, fileInfo, offset, maxCount, filter, std::ref(memInfo)); execthread.join(); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } EXPECT_GE(g_num, ACTUAL_SUCCESS_THREADS_NUMBER); result = g_fah->Delete(newDirUriTest); @@ -2616,10 +2633,12 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetFileInfoFromUri_0000, int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileinfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "medialibrary_file_access_GetFileInfoFromUri_0000 occurs an exception."; @@ -2652,11 +2671,12 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetFileInfoFromUri_0001, int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(dirInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(dirInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - + EXPECT_GE(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -2693,11 +2713,12 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetFileInfoFromUri_0002, int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileinfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); - + EXPECT_EQ(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -2912,11 +2933,12 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetFileInfoFromRelativeP int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - + EXPECT_GT(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newFile); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -2956,10 +2978,11 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetFileInfoFromRelativeP int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newFile); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { @@ -3006,11 +3029,12 @@ HWTEST_F(FileAccessHelperTest, medialibrary_file_access_GetFileInfoFromRelativeP int64_t offset = 0; int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = DistributedFS::SharedMemoryOperation::CreatSharedMemory("FileInfo List", 1000, memInfo); + result = g_fah->ListFile(fileInfo, offset, maxCount, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); - + EXPECT_GT(memInfo.currentCounts, OHOS::FileAccessFwk::ERR_OK); + DistributedFS::SharedMemoryOperation::DestroySharedMemory(memInfo); result = g_fah->Delete(newDir); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { diff --git a/test/unittest/resources/ohos_test.xml b/test/unittest/resources/ohos_test.xml index d94c4f2e..3b8fc5ab 100644 --- a/test/unittest/resources/ohos_test.xml +++ b/test/unittest/resources/ohos_test.xml @@ -34,4 +34,9 @@