From a849e61013aa4f895deb73678aac2e1333134f13 Mon Sep 17 00:00:00 2001 From: caochuan Date: Wed, 22 Mar 2023 17:41:43 +0800 Subject: [PATCH] feat: add copy interface for faf Signed-off-by: caochuan --- test/unittest/BUILD.gn | 42 +++ ...rnal_and_medialibrary_file_access_test.cpp | 357 ++++++++++++++++++ 2 files changed, 399 insertions(+) create mode 100644 test/unittest/external_and_medialibrary_file_access_test.cpp diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index cab8c725..9e892360 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -48,6 +48,7 @@ ohos_unittest("medialibrary_file_access_test") { "access_token:libaccesstoken_sdk", "access_token:libnativetoken", "c_utils:utils", + "hiviewdfx_hilog_native:libhilog", "ipc:ipc_core", "ipc_js:rpc", "multimedia_image_framework:image_native", @@ -97,10 +98,51 @@ ohos_unittest("external_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 = [ + "//third_party/googletest/googlemock/include/gmock", + "//foundation/ability/ability_runtime/frameworks/kits/appkit/native/ability_runtime/context", + "${BASE_DIR}/interfaces/inner_api/file_access/include", + "//foundation/distributeddatamgr/distributedfile/interfaces/kits/js/src/common", + ] + + configs = [ "//build/config/compiler:exceptions" ] + + deps = [ + "${BASE_DIR}/interfaces/inner_api/file_access:file_access_extension_ability_kit", + "${ability_runtime_path}/frameworks/native/ability/native:abilitykit_native", + "${ability_runtime_path}/frameworks/native/appkit:app_context", + "//base/security/access_token/frameworks/accesstoken:accesstoken_communication_adapter_cxx", + "//base/security/access_token/interfaces/innerkits/token_setproc:libtoken_setproc", + "//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", + "ipc:ipc_core", + "ipc_js:rpc", + "samgr:samgr_proxy", + ] +} + group("user_file_service_unit_test") { testonly = true deps = [ + ":external_and_medialibrary_file_access_test", ":external_file_access_test", ":medialibrary_file_access_test", ] 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..7d473887 --- /dev/null +++ b/test/unittest/external_and_medialibrary_file_access_test.cpp @@ -0,0 +1,357 @@ +/* + * 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 "file_access_extension_info.h" +#include "file_access_framework_errno.h" +#include "file_access_helper.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 = "datashare://"; +static const std::string MEDIA_BNUDLE_NAME_ALIAS = "media"; +static const std::string EXTERNAL_BNUDLE_NAME = "com.ohos.UserFile.ExternalFileManager"; + +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(){}; +}; + +//Uri g_mediaParentUri; +//Uri g_externalParentUri; +static Uri GetMediaParentUri() +{ + vector infos; + int result = g_fah->GetRoots(infos); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri {""}; + for (auto info: infos) { + HILOG_ERROR("info.uri = %{public}s", info.uri.c_str()); + 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()+1, MEDIA_BNUDLE_NAME_ALIAS.length()) ; + HILOG_ERROR("bundleName %{public}s", bundleName.c_str()); + if (bundleName == MEDIA_BNUDLE_NAME_ALIAS) { + parentUri = Uri(info.uri + "/file"); + HILOG_ERROR("parentUri: %{public}s", parentUri.ToString().c_str()); + 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) { + HILOG_ERROR("info.uri = %{public}s", info.uri.c_str()); + 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()+1, EXTERNAL_BNUDLE_NAME.length()) ; + HILOG_ERROR("bundleName %{public}s", bundleName.c_str()); + if (bundleName == EXTERNAL_BNUDLE_NAME) { + parentUri = Uri(info.uri); + HILOG_ERROR("parentUri: %{public}s", parentUri.ToString().c_str()); + 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; + int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(fileInfoVec.size(), 0); + for (size_t i = 0; i < fileInfoVec.size(); i++) { + if (fileInfoVec[i].fileName.compare("Download") == 0) { + return Uri {fileInfoVec[i].uri}; + } + } + + Uri mediaParentUri = GetMediaParentUri(); + result = g_fah->Mkdir(mediaParentUri, "Download", newDirUriTest); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + return newDirUriTest; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Copy_0000 + * @tc.name: medialibrary_file_access_Copy_0000 + * @tc.desc: Test function of Copy interface, copy single file from external storage to media library + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +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 downloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "Copy_0000_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + Uri aUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = g_fah->OpenFile(aUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + std::string aBuff = "Copy test content for a.txt"; + ssize_t aSize = write(fd, aBuff.c_str(), aBuff.size()); + EXPECT_EQ(aSize, aBuff.size()); + close(fd); + Uri destUri(""); + result = g_fah->Mkdir(downloadUri, "Copy_0000_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector resultVect; + result = g_fah->Copy(aUri, destUri, resultVect); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + 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_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: SR000H0386 + */ +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"; + try { + Uri externalParentUri = GetExternalParentUri(); + Uri downloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(externalParentUri, "Copy_0001_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = g_fah->OpenFile(aUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + std::string aBuff = "Copy test content for a.txt"; + ssize_t aSize = write(fd, aBuff.c_str(), aBuff.size()); + EXPECT_EQ(aSize, aBuff.size()); + close(fd); + Uri destUri(""); + result = g_fah->Mkdir(downloadUri, "Copy_0001_dest", destUri); + HILOG_ERROR("destUri: %{public}s", destUri.ToString().c_str()); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector resultVect; + result = g_fah->Copy(srcUri, destUri, resultVect); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + 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"; +} + +/** + * @tc.number: user_file_service_medialibrary_file_access_Copy_0002 + * @tc.name: medialibrary_file_access_Copy_0002 + * @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: SR000H0386 + */ +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 downloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(downloadUri, "Copy_0002_src", srcUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = g_fah->OpenFile(aUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + std::string aBuff = "Copy test content for a.txt"; + ssize_t aSize = write(fd, aBuff.c_str(), aBuff.size()); + EXPECT_EQ(aSize, aBuff.size()); + close(fd); + + Uri destUri(""); + result = g_fah->Mkdir(externalParentUri, "Copy_0002_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector resultVect; + result = g_fah->Copy(aUri, destUri, resultVect); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + 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_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: SR000H0386 + */ +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 downloadUri = GetMediaLibraryDownloadDir(); + + Uri srcUri{""}; + int result = g_fah->Mkdir(downloadUri, "Copy_0003_src", srcUri); // g_newDirUri对应开发板目录: /storage/media/100/local/files/Download/ + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aUri{""}; + result = g_fah->CreateFile(srcUri, "a.txt", aUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd; + result = g_fah->OpenFile(aUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + std::string aBuff = "Copy test content for a.txt"; + ssize_t aSize = write(fd, aBuff.c_str(), aBuff.size()); + EXPECT_EQ(aSize, aBuff.size()); + close(fd); + + Uri destUri(""); + result = g_fah->Mkdir(externalParentUri, "Copy_0003_dest", destUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + vector resultVect; + result = g_fah->Copy(srcUri, destUri, resultVect); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + 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"; +} +} // namespace -- Gitee