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 c95ceeebb5825d85a0f800cde43d98e7955017fa..d903818935cd986baed61f06be661460e17050ad 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 @@ -85,6 +85,18 @@ napi_value NapiFileInfoExporter::ThrowError(napi_env env, int code) return nullptr; } +static int CallListFile(const FileInfoEntity* fileInfoEntity, FileIteratorEntity* fileIteratorEntity, + FileFilter& filter) +{ + fileIteratorEntity->fileAccessHelper = fileInfoEntity->fileAccessHelper; + fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; + fileIteratorEntity->offset = 0; + fileIteratorEntity->filter = std::move(filter); + fileIteratorEntity->flag = CALL_LISTFILE; + return fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, + fileIteratorEntity->filter, fileIteratorEntity->memInfo); +} + napi_value NapiFileInfoExporter::ListFile(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); @@ -126,13 +138,7 @@ napi_value NapiFileInfoExporter::ListFile(napi_env env, napi_callback_info info) return nullptr; } - fileIteratorEntity->fileAccessHelper = fileInfoEntity->fileAccessHelper; - fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; - fileIteratorEntity->offset = 0; - fileIteratorEntity->filter = std::move(filter); - fileIteratorEntity->flag = CALL_LISTFILE; - ret = fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, - fileIteratorEntity->filter, fileIteratorEntity->memInfo); + ret = CallListFile(fileInfoEntity, fileIteratorEntity, filter); if (ret != ERR_OK) { FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(fileIteratorEntity->memInfo); return ThrowError(env, ret); 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 897e65adb6f31d033b281372ac4d589de2efffdc..d458b1c0d215651d8892e6a7bb242b546d9e18af 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 @@ -165,6 +165,29 @@ static bool FilterTrashAndRecentDir(const std::string &uri) return std::regex_match(uri, matchResult, TRASH_RECENT_DIR_REGEX) && matchResult.length() > 0; } +static int GetNextIterator(napi_value &objFileInfoExporter, FileIteratorEntity *fileIteratorEntity, + FileInfoEntity *fileInfoEntity, napi_env env, NVal& retNVal) +{ + int ret = E_GETRESULT; + bool isDone = false; + if (fileIteratorEntity->flag == CALL_LISTFILE) { + ret = MakeListFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } else if (fileIteratorEntity->flag == CALL_SCANFILE) { + ret = MakeScanFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } + while (!isDone && FilterTrashAndRecentDir(fileInfoEntity->fileInfo.uri)) { + fileInfoEntity = NClass::GetEntityOf(env, objFileInfoExporter); + retNVal = NVal::CreateObject(env); + HILOG_DEBUG("TRASH_DIR or RECENT_DIR: %{public}s", fileInfoEntity->fileInfo.uri.c_str()); + if (fileIteratorEntity->flag == CALL_LISTFILE) { + ret = MakeListFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } else if (fileIteratorEntity->flag == CALL_SCANFILE) { + ret = MakeScanFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } + } + return ret; +} + napi_value NapiFileIteratorExporter::Next(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); @@ -202,24 +225,7 @@ napi_value NapiFileIteratorExporter::Next(napi_env env, napi_callback_info info) } auto retNVal = NVal::CreateObject(env); - int ret = E_GETRESULT; - bool isDone = false; - if (fileIteratorEntity->flag == CALL_LISTFILE) { - ret = MakeListFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); - } else if (fileIteratorEntity->flag == CALL_SCANFILE) { - ret = MakeScanFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); - } - while (!isDone && FilterTrashAndRecentDir(fileInfoEntity->fileInfo.uri)) { - fileInfoEntity = NClass::GetEntityOf(env, objFileInfoExporter); - retNVal = NVal::CreateObject(env); - HILOG_DEBUG("TRASH_DIR or RECENT_DIR: %{public}s", fileInfoEntity->fileInfo.uri.c_str()); - if (fileIteratorEntity->flag == CALL_LISTFILE) { - ret = MakeListFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); - } else if (fileIteratorEntity->flag == CALL_SCANFILE) { - ret = MakeScanFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); - } - } - + int ret = GetNextIterator(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal); if (ret != ERR_OK) { NError(ret).ThrowErr(env); return nullptr; diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index 7282e9c82e312a8298bebcf45340e160207ab2cf..506305c076fd9f83f81df24819068f5fd78dc1ec 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "file_access_framework_errno.h" #include "file_access_helper.h" @@ -49,7 +50,24 @@ namespace { using CallbackComplete = std::function; } -std::list> g_fileAccessHelperList = {}; +static std::mutex g_fileAccessHelperMutex; +static std::list> g_fileAccessHelperList = {}; + +static void AddFileAccessHelperList(std::pair, int> &createResult) +{ + std::lock_guard lock(g_fileAccessHelperMutex); + g_fileAccessHelperList.emplace_back(createResult.first); + HILOG_INFO("g_fileAccessHelperList size %{public}zu", g_fileAccessHelperList.size()); +} + +static void RemoveFileAccessHelperList(FileAccessHelper *objectInfo) +{ + std::lock_guard lock(g_fileAccessHelperMutex); + g_fileAccessHelperList.remove_if([objectInfo](const std::shared_ptr &fileAccessHelper) { + return objectInfo == fileAccessHelper.get(); + }); + HILOG_INFO("g_fileAccessHelperList size %{public}zu", g_fileAccessHelperList.size()); +} static napi_value FileAccessHelperConstructor(napi_env env, napi_callback_info info) { @@ -80,15 +98,12 @@ static napi_value FileAccessHelperConstructor(napi_env env, napi_callback_info i CHECK_STATUS_RETURN(!(createResult.first == nullptr || createResult.second != ERR_OK), NapiFileInfoExporter::ThrowError(env, createResult.second), "FileAccessHelperConstructor: Creator failed ret=%{public}d", createResult.second); - g_fileAccessHelperList.emplace_back(createResult.first); - HILOG_INFO("g_fileAccessHelperList size %{public}zu", g_fileAccessHelperList.size()); + AddFileAccessHelperList(createResult); auto finalize = [](napi_env env, void *data, void *hint) { FileAccessHelper *objectInfo = static_cast(data); if (objectInfo != nullptr) { objectInfo->Release(); - g_fileAccessHelperList.remove_if([objectInfo](const std::shared_ptr &fileAccessHelper) { - return objectInfo == fileAccessHelper.get(); - }); + RemoveFileAccessHelperList(objectInfo); objectInfo = nullptr; } }; 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 7c1f257b4254125956372624cc04d2339312d0af..4df5b5698d63248f28e4931cf1b567a73a5093df 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 @@ -82,6 +82,18 @@ napi_value NapiRootInfoExporter::Constructor(napi_env env, napi_callback_info in return funcArg.GetThisVar(); } +static int CallListFile(const RootInfoEntity* rootEntity, FileIteratorEntity* fileIteratorEntity, FileFilter& filter, + const FileInfo& fileInfo) +{ + fileIteratorEntity->fileAccessHelper = rootEntity->fileAccessHelper; + fileIteratorEntity->fileInfo = fileInfo; + fileIteratorEntity->offset = 0; + fileIteratorEntity->filter = std::move(filter); + fileIteratorEntity->flag = CALL_LISTFILE; + return rootEntity->fileAccessHelper->ListFile(fileInfo, fileIteratorEntity->offset, filter, + fileIteratorEntity->memInfo); +} + napi_value NapiRootInfoExporter::ListFile(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); @@ -121,13 +133,8 @@ napi_value NapiRootInfoExporter::ListFile(napi_env env, napi_callback_info info) NError(ret).ThrowErr(env); return nullptr; } - fileIteratorEntity->fileAccessHelper = rootEntity->fileAccessHelper; - fileIteratorEntity->fileInfo = fileInfo; - fileIteratorEntity->offset = 0; - fileIteratorEntity->filter = std::move(filter); - fileIteratorEntity->flag = CALL_LISTFILE; - ret = rootEntity->fileAccessHelper->ListFile(fileInfo, fileIteratorEntity->offset, filter, - fileIteratorEntity->memInfo); + + ret = CallListFile(rootEntity, fileIteratorEntity, filter, fileInfo); if (ret != ERR_OK) { FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(fileIteratorEntity->memInfo); return NapiFileInfoExporter::ThrowError(env, ret); diff --git a/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp b/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp index 5ef6698ba9a7470bae6a4bd3fd78df249cd4009d..6dab686d59c122fab2141d0f3be3bd9f01ff8c83 100644 --- a/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp +++ b/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp @@ -281,14 +281,10 @@ bool MoveFuzzTest(const uint8_t* data, size_t size) Uri parentUri(info[i].uri); Uri newDirUriTest1(""); Uri newDirUriTest2(""); - result = helper->Mkdir(parentUri, "test1", newDirUriTest1); - if (result != OHOS::FileAccessFwk::ERR_OK) { - HILOG_ERROR("Mkdir failed. ret : %{public}d", result); - return false; - } - result = helper->Mkdir(parentUri, "test2", newDirUriTest2); - if (result != OHOS::FileAccessFwk::ERR_OK) { - HILOG_ERROR("Mkdir failed. ret : %{public}d", result); + int result1 = helper->Mkdir(parentUri, "test1", newDirUriTest1); + int result2 = helper->Mkdir(parentUri, "test2", newDirUriTest2); + if (result1 != OHOS::FileAccessFwk::ERR_OK || result2 != OHOS::FileAccessFwk::ERR_OK) { + HILOG_ERROR("Mkdir failed. ret : %{public}d, %{public}d", result1, result2); return false; } Uri testUri(""); @@ -303,14 +299,10 @@ bool MoveFuzzTest(const uint8_t* data, size_t size) HILOG_ERROR("Move failed. ret : %{public}d", result); return false; } - result = helper->Delete(newDirUriTest1); - if (result != OHOS::FileAccessFwk::ERR_OK) { - HILOG_ERROR("Delete failed. ret : %{public}d", result); - return false; - } - result = helper->Delete(newDirUriTest2); - if (result != OHOS::FileAccessFwk::ERR_OK) { - HILOG_ERROR("Delete failed. ret : %{public}d", result); + result1 = helper->Delete(newDirUriTest1); + result2 = helper->Delete(newDirUriTest2); + if (result1 != OHOS::FileAccessFwk::ERR_OK || result2 != OHOS::FileAccessFwk::ERR_OK) { + HILOG_ERROR("Delete failed. ret : %{public}d, %{public}d", result1, result2); return false; } } @@ -375,6 +367,10 @@ bool ListFileFuzzTest(const uint8_t* data, size_t size) SharedMemoryInfo memInfo; int result = SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, memInfo); + if (result != OHOS::FileAccessFwk::ERR_OK) { + HILOG_ERROR("CreateSharedMemory failed. ret : %{public}d", result); + return false; + } FileFilter filter; result = helper->ListFile(fileInfo, offset, filter, memInfo); SharedMemoryOperation::DestroySharedMemory(memInfo); diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 3378d7a7b0ccc425850b62adf1f97245dafdd5dd..e3a26bafd0f7207bf9cd0a26d715ca51bee07ef3 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -71,7 +71,10 @@ ohos_unittest("external_file_access_test") { } module_out_path = "user_file_service/tests" - sources = [ "external_file_access_test.cpp" ] + sources = [ + "external_file_access_test.cpp", + "external_notify_test.cpp", + ] include_dirs = [ "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", @@ -155,44 +158,6 @@ ohos_unittest("abnormal_file_access_test") { ] } -ohos_unittest("js_file_access_ext_ability_test") { - module_out_path = "user_file_service/tests" - - sources = [ "js_file_access_ext_ability_test.cpp" ] - - include_dirs = [ - "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", - "//third_party/googletest/googlemock/include/gmock", - "${user_file_service_path}/interfaces/inner_api/file_access/include", - ".", - ] - - configs = [ "//build/config/compiler:exceptions" ] - - deps = [ - "${user_file_service_path}/interfaces/inner_api/file_access:file_access_extension_ability_kit", - "//third_party/googletest:gmock_main", - ] - - external_deps = [ - "ability_base:zuri", - "ability_runtime:ability_manager", - "ability_runtime:app_context", - "ability_runtime:extensionkit_native", - "ability_runtime:napi_common", - "ability_runtime:runtime", - "access_token:libaccesstoken_sdk", - "access_token:libtokenid_sdk", - "bundle_framework:appexecfwk_base", - "bundle_framework:appexecfwk_core", - "c_utils:utils", - "hilog:libhilog", - "hitrace:hitrace_meter", - "napi:ace_napi", - "samgr:samgr_proxy", - ] -} - ohos_unittest("file_access_ext_stub_impl_test") { module_out_path = "user_file_service/tests" @@ -264,6 +229,7 @@ ohos_unittest("file_access_service_proxy_test") { "hitrace:hitrace_meter", "image_framework:image", "ipc:ipc_core", + "napi:ace_napi", "safwk:system_ability_fwk", ] @@ -272,6 +238,55 @@ ohos_unittest("file_access_service_proxy_test") { use_exceptions = true } +ohos_unittest("js_file_access_ext_ability_test") { + module_out_path = "user_file_service/tests" + + include_dirs = [ + "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", + "${commonlibrary_path}/c_utils/base/include", + "${file_api_path}/utils/filemgmt_libn/include", + "${user_file_service_path}/interfaces/inner_api/file_access/include", + "${user_file_service_path}/interfaces/kits/js/src/common", + "${user_file_service_path}/services/native/file_access_service/include", + "${user_file_service_path}/utils", + "//third_party/googletest/googlemock/include/gmock", + "mock", + ] + + sources = [ + "${user_file_service_path}/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp", + "${user_file_service_path}/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp", + "${user_file_service_path}/interfaces/inner_api/file_access/src/napi_common_fileaccess.cpp", + "js_file_access_ext_ability_test.cpp", + "mock/js_native_api_mock.cpp", + ] + + deps = [ + "//third_party/googletest:gmock_main", + "//third_party/googletest:gtest_main", + ] + + external_deps = [ + "ability_base:zuri", + "ability_runtime:app_context", + "ability_runtime:extensionkit_native", + "ability_runtime:napi_common", + "ability_runtime:runtime", + "access_token:libaccesstoken_sdk", + "c_utils:utils", + "hilog:libhilog", + "hitrace:hitrace_meter", + "init:libbegetutil", + "ipc:ipc_core", + "napi:ace_napi", + "os_account:os_account_innerkits", + ] + + defines = [ "private=public" ] + + use_exceptions = true +} + group("user_file_service_unit_test") { testonly = true diff --git a/test/unittest/external_file_access_test.cpp b/test/unittest/external_file_access_test.cpp index 863b37d8b29d7c95d2c6dd26f732ade3db8389e8..3fb5f9df4b5aad7fe085304ae25ad19e9033399a 100644 --- a/test/unittest/external_file_access_test.cpp +++ b/test/unittest/external_file_access_test.cpp @@ -2403,6 +2403,26 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Copy_0005, testing::ext:: GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_Copy_0005"; } +static int ReadyToCopy06(Uri& parentUri, Uri& srcDir, const char* buff, int len) +{ + int result = g_fah->Mkdir(parentUri, "Copy_0006_src", srcDir); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aFileUri(""); + result = g_fah->CreateFile(srcDir, "a.txt", aFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri bFileUri(""); + result = g_fah->CreateFile(srcDir, "b.txt", bFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(bFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + ssize_t srcFileSize = write(fd, buff, len); + EXPECT_EQ(srcFileSize, len); + close(fd); + return srcFileSize; +} + /** * @tc.number: user_file_service_external_file_access_Copy_0006 * @tc.name: external_file_access_Copy_0006 @@ -2419,25 +2439,13 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Copy_0006, testing::ext:: vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for b.txt"; for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); Uri srcDir(""); - result = g_fah->Mkdir(parentUri, "Copy_0006_src", srcDir); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri aFileUri(""); - result = g_fah->CreateFile(srcDir, "a.txt", aFileUri); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri bFileUri(""); - result = g_fah->CreateFile(srcDir, "b.txt", bFileUri); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - int fd = -1; - result = g_fah->OpenFile(bFileUri, WRITE_READ, fd); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - char buff[] = "Copy test content for b.txt"; - ssize_t srcFileSize = write(fd, buff, sizeof(buff)); - EXPECT_EQ(srcFileSize, sizeof(buff)); - close(fd); + Uri parentUri(info[i].uri); + int srcFileSize = ReadyToCopy06(parentUri, srcDir, buff, sizeof(buff)); + Uri bFileUri(""); Uri destDir(""); result = g_fah->Mkdir(parentUri, "Copy_0006_dest", destDir); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); @@ -2452,6 +2460,7 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Copy_0006, testing::ext:: EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); EXPECT_EQ(copyResult.size(), 0); + int fd = -1; result = g_fah->OpenFile(bFileUri, WRITE_READ, fd); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); ssize_t destFileSize = read(fd, buff, sizeof(buff)); @@ -2585,6 +2594,26 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Copy_0008, testing::ext:: GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_Copy_0008"; } +static int ReadyToCopy09(Uri& parentUri, Uri& srcDir, const char* buff, int len) +{ + int result = g_fah->Mkdir(parentUri, "Copy_0009_src", srcDir); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri aFileUri(""); + result = g_fah->CreateFile(srcDir, "a.txt", aFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri bFileUri(""); + result = g_fah->CreateFile(srcDir, "b.txt", bFileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + int fd = -1; + result = g_fah->OpenFile(bFileUri, WRITE_READ, fd); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + ssize_t srcFileSize = write(fd, buff, len); + EXPECT_EQ(srcFileSize, len); + close(fd); + + return srcFileSize; +} + /** * @tc.number: user_file_service_external_file_access_Copy_0009 * @tc.name: external_file_access_Copy_0009 @@ -2601,28 +2630,16 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Copy_0009, testing::ext:: vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + char buff[] = "Copy test content for b.txt"; for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); Uri srcDir(""); - result = g_fah->Mkdir(parentUri, "Copy_0009_src", srcDir); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri aFileUri(""); - result = g_fah->CreateFile(srcDir, "a.txt", aFileUri); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri bFileUri(""); - result = g_fah->CreateFile(srcDir, "b.txt", bFileUri); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - int fd = -1; - result = g_fah->OpenFile(bFileUri, WRITE_READ, fd); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - char buff[] = "Copy test content for b.txt"; - ssize_t srcFileSize = write(fd, buff, sizeof(buff)); - EXPECT_EQ(srcFileSize, sizeof(buff)); - close(fd); + int srcFileSize = ReadyToCopy09(parentUri, srcDir, buff, sizeof(buff)); for (size_t j = i + 1; j < info.size(); j++) { Uri targetUri(info[j].uri); Uri destDir(""); + Uri bFileUri(""); result = g_fah->Mkdir(targetUri, "Copy_0009_dest", destDir); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); Uri destSrcDir(""); @@ -2636,6 +2653,7 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Copy_0009, testing::ext:: EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); EXPECT_EQ(copyResult.size(), 0); + int fd = -1; result = g_fah->OpenFile(bFileUri, WRITE_READ, fd); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); ssize_t destFileSize = read(fd, buff, sizeof(buff)); @@ -4782,6 +4800,32 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetProxyByUri_0001, testi GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_GetProxyByUri_0001"; } +static void CheckJson(Uri& newDirUriTest1, const std::string displayName, const std::string relativePath, int len) +{ + json testJson = { + {RELATIVE_PATH, " "}, + {DISPLAY_NAME, " "}, + {FILE_SIZE, " "}, + {DATE_MODIFIED, " "}, + {DATE_ADDED, " "}, + {HEIGHT, " "}, + {WIDTH, " "}, + {DURATION, " "} + }; + auto testJsonString = testJson.dump(); + int result = g_fah->Query(newDirUriTest1, testJsonString); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + auto jsonObject = json::parse(testJsonString); + EXPECT_EQ(jsonObject.at(DISPLAY_NAME), displayName); + EXPECT_EQ(jsonObject.at(FILE_SIZE), len + len); + EXPECT_EQ(jsonObject.at(RELATIVE_PATH), relativePath); + ASSERT_TRUE(jsonObject.at(DATE_MODIFIED) > 0); + ASSERT_TRUE(jsonObject.at(DATE_ADDED) > 0); + GTEST_LOG_(INFO) << " result" << testJsonString; + result = g_fah->Delete(newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); +} + /** * @tc.number: user_file_service_external_file_access_Query_0000 * @tc.name: external_file_access_Query_0000 @@ -4827,28 +4871,7 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Query_0000, testing::ext: fileSize = write(fd, buff.c_str(), buff.size()); close(fd); EXPECT_EQ(fileSize, buff.size()); - json testJson = { - {RELATIVE_PATH, " "}, - {DISPLAY_NAME, " "}, - {FILE_SIZE, " "}, - {DATE_MODIFIED, " "}, - {DATE_ADDED, " "}, - {HEIGHT, " "}, - {WIDTH, " "}, - {DURATION, " "} - }; - auto testJsonString = testJson.dump(); - result = g_fah->Query(newDirUriTest1, testJsonString); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - auto jsonObject = json::parse(testJsonString); - EXPECT_EQ(jsonObject.at(DISPLAY_NAME), displayName); - EXPECT_EQ(jsonObject.at(FILE_SIZE), buff.size() * 2); - EXPECT_EQ(jsonObject.at(RELATIVE_PATH), relativePath); - ASSERT_TRUE(jsonObject.at(DATE_MODIFIED) > 0); - ASSERT_TRUE(jsonObject.at(DATE_ADDED) > 0); - GTEST_LOG_(INFO) << " result" << testJsonString; - result = g_fah->Delete(newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + CheckJson(newDirUriTest1, displayName, relativePath, buff.size()); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_Query_0000 occurs an exception."; } @@ -5164,28 +5187,7 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Query_0007, testing::ext: fileSize = write(fd, buff.c_str(), buff.size()); close(fd); EXPECT_EQ(fileSize, buff.size()); - json testJson = { - {RELATIVE_PATH, " "}, - {DISPLAY_NAME, " "}, - {FILE_SIZE, " "}, - {DATE_MODIFIED, " "}, - {DATE_ADDED, " "}, - {HEIGHT, " "}, - {WIDTH, " "}, - {DURATION, " "} - }; - auto testJsonString = testJson.dump(); - result = g_fah->Query(newDirUriTest1, testJsonString); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - auto jsonObject = json::parse(testJsonString); - EXPECT_EQ(jsonObject.at(DISPLAY_NAME), displayName); - EXPECT_EQ(jsonObject.at(FILE_SIZE), buff.size() * 2); - EXPECT_EQ(jsonObject.at(RELATIVE_PATH), relativePath); - ASSERT_TRUE(jsonObject.at(DATE_MODIFIED) > 0); - ASSERT_TRUE(jsonObject.at(DATE_ADDED) > 0); - GTEST_LOG_(INFO) << " result" << testJsonString; - result = g_fah->Delete(newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + CheckJson(newDirUriTest1, displayName, relativePath, buff.size()); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_Query_0007 occurs an exception."; } diff --git a/test/unittest/external_notify_test.cpp b/test/unittest/external_notify_test.cpp index da00c6c688b757f4927be63acc09fe85c8310fec..18fcca90dbf092766cf7d7e15c19166bcb1234d9 100644 --- a/test/unittest/external_notify_test.cpp +++ b/test/unittest/external_notify_test.cpp @@ -45,7 +45,8 @@ shared_ptr g_fah = nullptr; int g_notifyEvent = -1; int g_notifyFlag = -1; string g_notifyUri = ""; -const int SLEEP_TIME = 100 * 1000; +vector g_notifyUris; +const int SLEEP_TIME = 600 * 1000; const int UID_TRANSFORM_TMP = 20000000; const int UID_DEFAULT = 0; shared_ptr g_context = nullptr; @@ -130,7 +131,8 @@ void MyObserver::OnChange(NotifyMessage ¬ifyMessage) g_notifyEvent = static_cast(notifyMessage.notifyType_); std::string notifyUri = notifyMessage.uris_[0]; g_notifyUri = notifyUri; - GTEST_LOG_(INFO) << "enter notify uri =" + notifyUri + "type =" + std::to_string(g_notifyEvent); + GTEST_LOG_(INFO) << "enter notify uri =" + notifyUri + " type =" + std::to_string(g_notifyEvent) +" uri size" + + std::to_string(notifyMessage.uris_.size()); } class TestObserver : public ObserverCallbackStub { @@ -144,9 +146,78 @@ void TestObserver::OnChange(NotifyMessage ¬ifyMessage) { g_notifyFlag = static_cast(notifyMessage.notifyType_); std::string notifyUri = notifyMessage.uris_[0]; + g_notifyUris = notifyMessage.uris_; GTEST_LOG_(INFO) << "enter TestObserver uri =" + notifyUri + "type =" + std::to_string(g_notifyFlag); } +static tuple ReadyRegisterNotify00(Uri& parentUri, + sptr& myObserver1, + sptr& myObserver2, + sptr& myObserver3, + sptr& myObserver4) +{ + bool notifyForDescendants = false; + Uri newDirUriTest1(""); + int result = g_fah->Mkdir(parentUri, "uri_dir1", newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newDirUriTest2(""); + result = g_fah->Mkdir(parentUri, "uri_dir2", newDirUriTest2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + GTEST_LOG_(INFO) << newFileUri1.ToString(); + Uri newFileUri2(""); + result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + result = g_fah->RegisterNotify(newDirUriTest1, true, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newDirUriTest2, notifyForDescendants, myObserver2); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver3); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserver4); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + + return {newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2}; +} + +static tuple TriggerNotify00(Uri& newDirUriTest1, Uri& newDirUriTest2, Uri& newFileUri1, Uri& newFileUri2) +{ + Uri testUri(""); + int result = g_fah->CreateFile(newDirUriTest1, "testUri", testUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, ADD_EVENT); + EXPECT_EQ(g_notifyUri, testUri.ToString()); + Uri renameDirUri1(""); + result = g_fah->Rename(newDirUriTest1, "testDir", renameDirUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newDirUriTest1.ToString()); + result = g_fah->Delete(newDirUriTest2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newDirUriTest2.ToString()); + + Uri renameUri1(""); + result = g_fah->Rename(newFileUri1, "renameUri1", renameUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + result = g_fah->Delete(newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri2.ToString()); + + return {renameDirUri1, renameUri1}; +} + /** * @tc.number: user_file_service_external_file_access_notify_0000 * @tc.name: external_file_access_notify_0000 @@ -163,64 +234,15 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0000, testing::ext vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - bool notifyForDescendants = false; sptr myObserver1 = new (std::nothrow) MyObserver(); sptr myObserver2 = new (std::nothrow) MyObserver(); sptr myObserver3 = new (std::nothrow) MyObserver(); sptr myObserver4 = new (std::nothrow) MyObserver(); Uri parentUri(info[1].uri); - Uri newDirUriTest1(""); - result = g_fah->Mkdir(parentUri, "uri_dir1", newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newDirUriTest2(""); - result = g_fah->Mkdir(parentUri, "uri_dir2", newDirUriTest2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - GTEST_LOG_(INFO) << newFileUri1.ToString(); - Uri newFileUri2(""); - result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + auto [newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2] = + ReadyRegisterNotify00(parentUri, myObserver1, myObserver2, myObserver3, myObserver4); - result = g_fah->RegisterNotify(newDirUriTest1, true, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest2, notifyForDescendants, myObserver2); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver3); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserver4); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - - Uri testUri(""); - result = g_fah->CreateFile(newDirUriTest1, "testUri", testUri); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, ADD_EVENT); - EXPECT_EQ(g_notifyUri, testUri.ToString()); - Uri renameDirUri1(""); - result = g_fah->Rename(newDirUriTest1, "testDir", renameDirUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, newDirUriTest1.ToString()); - result = g_fah->Delete(newDirUriTest2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newDirUriTest2.ToString()); - - Uri renameUri1(""); - result = g_fah->Rename(newFileUri1, "renameUri1", renameUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - result = g_fah->Delete(newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri2.ToString()); + auto [renameDirUri1, renameUri1] = TriggerNotify00(newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2); sleep(1); result = g_fah->UnregisterNotify(newDirUriTest1, myObserver1); @@ -241,6 +263,30 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0000, testing::ext GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0000"; } +static tuple ReadyRegisterNotify01(Uri& parentUri, sptr myObserver1, + sptr myObserver2, sptr myObserver3) +{ + bool notifyForDescendants1 = true; + bool notifyForDescendants2 = false; + Uri newFileUri1(""); + int result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri2(""); + result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri3(""); + result = g_fah->CreateFile(parentUri, "uri_file3", newFileUri3); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants1, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants1, myObserver2); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri3, notifyForDescendants2, myObserver3); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + return {newFileUri1, newFileUri2, newFileUri3}; +} + /** * @tc.number: user_file_service_external_file_access_notify_0001 * @tc.name: external_file_access_notify_0001 @@ -257,64 +303,96 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0001, testing::ext vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - bool notifyForDescendants1 = true; - bool notifyForDescendants2 = false; + sptr myObserver1 = new (std::nothrow) MyObserver(); sptr myObserver2 = new (std::nothrow) MyObserver(); sptr myObserver3 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri2(""); - result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri3(""); - result = g_fah->CreateFile(parentUri, "uri_file3", newFileUri3); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants1, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants1, myObserver2); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri3, notifyForDescendants2, myObserver3); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[1].uri); + auto [newFileUri1, newFileUri2, newFileUri3] = + ReadyRegisterNotify01(parentUri, myObserver1, myObserver2, myObserver3); - Uri renameFileUri1(""); - result = g_fah->Rename(newFileUri1, "renamefile", renameFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - - result = g_fah->Delete(newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri2.ToString()); - result = g_fah->Delete(newFileUri3); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri3.ToString()); + Uri renameFileUri1(""); + result = g_fah->Rename(newFileUri1, "renamefile", renameFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + + result = g_fah->Delete(newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri2.ToString()); + result = g_fah->Delete(newFileUri3); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri3.ToString()); - sleep(1); - result = g_fah->UnregisterNotify(newFileUri1, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri2, myObserver2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri3, myObserver3); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(renameFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - } + sleep(1); + result = g_fah->UnregisterNotify(newFileUri1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri2, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri3, myObserver3); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(renameFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0001 occurs an exception."; } GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0001"; } +static tuple ReadyRegisterNotify02(Uri& parentUri) +{ + Uri newDirUriTest1(""); + int result = g_fah->Mkdir(parentUri, "uri_dir1", newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newDirUriTest2(""); + result = g_fah->Mkdir(parentUri, "uri_dir2", newDirUriTest2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri2(""); + result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + return {newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2}; +} + +static tuple TriggerNotify02(Uri& newDirUriTest1, Uri& newDirUriTest2, Uri& newFileUri1, Uri& newFileUri2) +{ + const int tm = 2; + Uri testFile(""); + int result = g_fah->CreateFile(newDirUriTest1, "test_file", testFile); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri renameDirUri1(""); + result = g_fah->Rename(newDirUriTest1, "renameDir", renameDirUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newDirUriTest1.ToString()); + result = g_fah->Delete(newDirUriTest2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newDirUriTest2.ToString()); + Uri renameFileUri1(""); + result = g_fah->Rename(newFileUri1, "renamefile", renameFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + result = g_fah->Delete(newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri2.ToString()); + sleep(tm); + return {renameDirUri1, renameFileUri1}; +} /** * @tc.number: user_file_service_external_file_access_notify_0002 * @tc.name: external_file_access_notify_0002 @@ -332,111 +410,39 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0002, testing::ext int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); bool notifyForDescendants = true; - sptr myObserverDir11 = new (std::nothrow) MyObserver(); - sptr myObserverDir12 = new (std::nothrow) MyObserver(); - sptr myObserverDir13 = new (std::nothrow) MyObserver(); - sptr myObserverDir21 = new (std::nothrow) MyObserver(); - sptr myObserverDir22 = new (std::nothrow) MyObserver(); - sptr myObserverDir23 = new (std::nothrow) MyObserver(); - sptr myObserverFile11 = new (std::nothrow) MyObserver(); - sptr myObserverFile12 = new (std::nothrow) MyObserver(); - sptr myObserverFile13 = new (std::nothrow) MyObserver(); - sptr myObserverFile21 = new (std::nothrow) MyObserver(); - sptr myObserverFile22 = new (std::nothrow) MyObserver(); - sptr myObserverFile23 = new (std::nothrow) MyObserver(); + vector> observers; + const int len = 12; + const int group = 3; + for (int i = 0; i < len; i++) { + observers.emplace_back(new (std::nothrow) MyObserver()); + } Uri parentUri(info[1].uri); - Uri newDirUriTest1(""); - result = g_fah->Mkdir(parentUri, "uri_dir1", newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newDirUriTest2(""); - result = g_fah->Mkdir(parentUri, "uri_dir2", newDirUriTest2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri2(""); - result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - - result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserverDir11); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserverDir12); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserverDir13); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + auto [newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2] = ReadyRegisterNotify02(parentUri); - result = g_fah->RegisterNotify(newDirUriTest2, notifyForDescendants, myObserverDir21); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest2, notifyForDescendants, myObserverDir22); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest2, notifyForDescendants, myObserverDir23); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserverFile11); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserverFile12); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserverFile13); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - - result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserverFile21); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserverFile22); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserverFile23); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + for (int i = 0; i < group; i++) { + result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, observers[i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newDirUriTest2, notifyForDescendants, observers[3 + i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, observers[6 + i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, observers[9 + i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } - Uri testFile(""); - result = g_fah->CreateFile(newDirUriTest1, "test_file", testFile); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri renameDirUri1(""); - result = g_fah->Rename(newDirUriTest1, "renameDir", renameDirUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, newDirUriTest1.ToString()); - result = g_fah->Delete(newDirUriTest2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newDirUriTest2.ToString()); - Uri renameFileUri1(""); - result = g_fah->Rename(newFileUri1, "renamefile", renameFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - result = g_fah->Delete(newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri2.ToString()); - sleep(2); - result = g_fah->UnregisterNotify(newDirUriTest1, myObserverDir11); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newDirUriTest1, myObserverDir12); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newDirUriTest1, myObserverDir13); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newDirUriTest2, myObserverDir21); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newDirUriTest2, myObserverDir22); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newDirUriTest2, myObserverDir23); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserverFile11); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserverFile12); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserverFile13); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri2, myObserverFile21); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri2, myObserverFile22); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri2, myObserverFile23); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + auto [renameDirUri1, renameFileUri1] = + TriggerNotify02(newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2); + for (int i = 0; i < group; i++) { + result = g_fah->UnregisterNotify(newDirUriTest1, observers[i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newDirUriTest2, observers[3 + i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, observers[6 + i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri2, observers[9 + i]); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + } result = g_fah->Delete(renameDirUri1); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(renameFileUri1); @@ -466,38 +472,64 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0003, testing::ext bool notifyForDescendants = true; sptr myObserver1 = new (std::nothrow) MyObserver(); sptr myObserver2 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newDirUriTest1(""); - result = g_fah->Mkdir(parentUri, "uri_dir1", newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[1].uri); + Uri newDirUriTest1(""); + result = g_fah->Mkdir(parentUri, "uri_dir1", newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newDirUriTest1, notifyForDescendants, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver2); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver2); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newDirUriTest1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - } + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver2); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver2); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newDirUriTest1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0003 occurs an exception."; } GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0003"; } +static tuple ReadyRegisterNotify05(Uri& parentUri, sptr& myObserver1) +{ + bool notifyForDescendants = true; + Uri uri_dir(""); + int result = g_fah->Mkdir(parentUri, "uri_dir123", uri_dir); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri uri_dirSub1(""); + result = g_fah->Mkdir(uri_dir, "uri_dirSub1", uri_dirSub1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(uri_dir, notifyForDescendants, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(uri_dirSub1, notifyForDescendants, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + Uri uri_dirSub2(""); + result = g_fah->Mkdir(uri_dir, "uri_dirSub2", uri_dirSub2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, ADD_EVENT); + EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); + result = g_fah->RegisterNotify(uri_dirSub2, notifyForDescendants, myObserver1); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + Uri renameDirUri1(""); + result = g_fah->Rename(uri_dirSub2, "renameDir1", renameDirUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + return {uri_dir, uri_dirSub1, uri_dirSub2, renameDirUri1}; +} + /** * @tc.number: user_file_service_external_file_access_notify_0005 * @tc.name: external_file_access_notify_0005 @@ -514,58 +546,35 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0005, testing::ext vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - bool notifyForDescendants = true; sptr myObserver1 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri uri_dir(""); - result = g_fah->Mkdir(parentUri, "uri_dir123", uri_dir); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri uri_dirSub1(""); - result = g_fah->Mkdir(uri_dir, "uri_dirSub1", uri_dirSub1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(uri_dir, notifyForDescendants, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(uri_dirSub1, notifyForDescendants, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - Uri uri_dirSub2(""); - result = g_fah->Mkdir(uri_dir, "uri_dirSub2", uri_dirSub2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, ADD_EVENT); - EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); - result = g_fah->RegisterNotify(uri_dirSub2, notifyForDescendants, myObserver1); - EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); - Uri renameDirUri1(""); - result = g_fah->Rename(uri_dirSub2, "renameDir1", renameDirUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - if (g_notifyEvent != MOVED_TO) { - if (g_notifyEvent != MOVED_SELF) { - EXPECT_EQ(g_notifyEvent, MOVED_FROM); - EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); - } else { - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); - } + Uri parentUri(info[1].uri); + auto [uri_dir, uri_dirSub1, uri_dirSub2, renameDirUri1] = ReadyRegisterNotify05(parentUri, myObserver1); + if (g_notifyEvent != MOVED_TO) { + if (g_notifyEvent != MOVED_SELF) { + EXPECT_EQ(g_notifyEvent, MOVED_FROM); + EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); } else { - EXPECT_EQ(g_notifyEvent, MOVED_TO); - EXPECT_EQ(g_notifyUri, renameDirUri1.ToString()); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); } - result = g_fah->Delete(uri_dirSub1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, uri_dirSub1.ToString()); - - sleep(2); - result = g_fah->UnregisterNotify(uri_dir, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(renameDirUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(uri_dir); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } else { + EXPECT_EQ(g_notifyEvent, MOVED_TO); + EXPECT_EQ(g_notifyUri, renameDirUri1.ToString()); } + result = g_fah->Delete(uri_dirSub1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, uri_dirSub1.ToString()); + + sleep(2); + result = g_fah->UnregisterNotify(uri_dir, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(renameDirUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(uri_dir); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sleep(1); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0005 occurs an exception."; } @@ -590,24 +599,22 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0006, testing::ext EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); bool notifyForDescendants = true; sptr myObserver1 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - sleep(1); - result = g_fah->UnregisterNotify(newFileUri1, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserver1); - EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - } + Uri parentUri(info[1].uri); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "uri_file", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + sleep(1); + result = g_fah->UnregisterNotify(newFileUri1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, myObserver1); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0006 occurs an exception."; } @@ -632,18 +639,16 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0007, testing::ext EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); sptr myObserver1 = nullptr; bool notifyForDescendants = true; - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file007", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); - EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserver1); - EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - } + Uri parentUri(info[1].uri); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "uri_file007", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, myObserver1); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0007 occurs an exception."; } @@ -697,22 +702,20 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0009, testing::ext EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); bool notifyForDescendants = true; sptr myObserver1 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "测试文件", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileUri1); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - sleep(1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - } + Uri parentUri(info[1].uri); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "测试文件", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileUri1); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + sleep(1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0009 occurs an exception."; } @@ -738,36 +741,57 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0010, testing::ext bool notifyForDescendants = true; sptr myObserver1 = new (std::nothrow) MyObserver(); sptr myObserver2 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileUri1(""); - result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri2(""); - result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserver2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[1].uri); + Uri newFileUri1(""); + result = g_fah->CreateFile(parentUri, "uri_file1", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri2(""); + result = g_fah->CreateFile(parentUri, "uri_file2", newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri2, notifyForDescendants, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserver2); - EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri2, myObserver2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileUri2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - } + result = g_fah->UnregisterNotify(newFileUri1, myObserver2); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri2, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileUri2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0010 occurs an exception."; } GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0010"; } +static tuple ReadyRegisterNotify11(Uri& parentUri, Uri newFileDir1, sptr& myObserver1, + sptr& myObserver2) +{ + const int tm = SLEEP_TIME * 2; + bool notifyForDescendants1 = true; + int result = g_fah->Mkdir(parentUri, "uri_dir11", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri newFileUri1(""); + result = g_fah->CreateFile(newFileDir1, "uri_file11", newFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sleep(1); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants1, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri renameFileUri1(""); + result = g_fah->Rename(newFileUri1, "renamefile1", renameFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(tm); + + return {newFileUri1, renameFileUri1}; +} + /** * @tc.number: user_file_service_external_file_access_notify_0011 * @tc.name: external_file_access_notify_0011 @@ -785,57 +809,42 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0011, testing::ext vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - bool notifyForDescendants1 = true; bool notifyForDescendants2 = false; sptr myObserver1 = new (std::nothrow) TestObserver(); sptr myObserver2 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileDir1(""); - result = g_fah->Mkdir(parentUri, "uri_dir11", newFileDir1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri newFileUri1(""); - result = g_fah->CreateFile(newFileDir1, "uri_file11", newFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - sleep(1); - result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants1, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileUri1, notifyForDescendants1, myObserver2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - Uri renameFileUri1(""); - result = g_fah->Rename(newFileUri1, "renamefile1", renameFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME * 2); - if (g_notifyEvent != MOVED_TO) { - if (g_notifyEvent != MOVED_SELF) { - EXPECT_EQ(g_notifyEvent, MOVED_FROM); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - } else { - EXPECT_EQ(g_notifyEvent, MOVED_SELF); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - } + Uri parentUri(info[1].uri); + Uri newFileDir1(""); + auto [newFileUri1, renameFileUri1] = + ReadyRegisterNotify11(parentUri, newFileDir1, myObserver1, myObserver2); + if (g_notifyEvent != MOVED_TO) { + if (g_notifyEvent != MOVED_SELF) { + EXPECT_EQ(g_notifyEvent, MOVED_FROM); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); } else { - EXPECT_EQ(g_notifyEvent, MOVED_TO); - EXPECT_EQ(g_notifyUri, renameFileUri1.ToString()); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); } - result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants2, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - sleep(2); - result = g_fah->Delete(renameFileUri1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - usleep(SLEEP_TIME); - EXPECT_EQ(g_notifyEvent, DELETE_EVENT); - EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); - EXPECT_NE(g_notifyFlag, DELETE_EVENT); - - sleep(1); - result = g_fah->UnregisterNotify(newFileDir1, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileUri1, myObserver2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileDir1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } else { + EXPECT_EQ(g_notifyEvent, MOVED_TO); + EXPECT_EQ(g_notifyUri, renameFileUri1.ToString()); } + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants2, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sleep(2); + result = g_fah->Delete(renameFileUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, DELETE_EVENT); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + EXPECT_NE(g_notifyFlag, DELETE_EVENT); + + sleep(1); + result = g_fah->UnregisterNotify(newFileDir1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_notify_0011 occurs an exception."; } @@ -1011,29 +1020,156 @@ HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0016, testing::ext sptr myObserver1 = new (std::nothrow) MyObserver(); sptr myObserver2 = new (std::nothrow) MyObserver(); sptr myObserver3 = new (std::nothrow) MyObserver(); - for (size_t i = 0; i < info.size(); i++) { - Uri parentUri(info[i].uri); - Uri newFileDir1(""); - result = g_fah->Mkdir(parentUri, "uri_dir0016", newFileDir1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver1); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver2); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver3); - EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[1].uri); + Uri newFileDir1(""); + result = g_fah->Mkdir(parentUri, "uri_dir0016", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver3); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + result = g_fah->UnregisterNotify(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileDir1, myObserver1); + EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileDir1); + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0016 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0016"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0017 + * @tc.name: external_file_access_notify_0017 + * @tc.desc: Test event changes exceeding 500ms trigger callback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0017, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0017"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = new (std::nothrow) MyObserver(); + Uri parentUri(info[1].uri); + Uri newFileDir1(""); + result = g_fah->Mkdir(parentUri, "uri_dir", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri fileUri(""); + result = g_fah->CreateFile(newFileDir1, "uri_file", fileUri); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME / 10); + EXPECT_NE(g_notifyEvent, ADD_EVENT); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, ADD_EVENT); + + result = g_fah->UnregisterNotify(newFileDir1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0017 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0017"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0018 + * @tc.name: external_file_access_notify_0018 + * @tc.desc: Test event changes More than 32 notifications callback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0018, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0018"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = new (std::nothrow) TestObserver(); + Uri parentUri(info[1].uri); + Uri newFileDir1(""); + result = g_fah->Mkdir(parentUri, "uri_dir", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri fileUri(""); + for (int i = 0; i < 64; i++) { + result = g_fah->CreateFile(newFileDir1, "uri_file" + to_string(i), fileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->UnregisterNotify(newFileDir1, myObserver1); - EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); + } + sleep(1); + EXPECT_LE(g_notifyUris.size(), 32); + g_notifyUris.clear(); + result = g_fah->UnregisterNotify(newFileDir1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - result = g_fah->Delete(newFileDir1); + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0018 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0018"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0019 + * @tc.name: external_file_access_notify_0019 + * @tc.desc: Test event changes More than one notifications callback + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0019, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0019"; + try { + vector info; + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = new (std::nothrow) TestObserver(); + Uri parentUri(info[1].uri); + Uri newFileDir1(""); + result = g_fah->Mkdir(parentUri, "uri_dir", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri fileUri(""); + for (int i = 0; i < 10; i++) { + result = g_fah->CreateFile(newFileDir1, "uri_file" + to_string(i), fileUri); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } + usleep(SLEEP_TIME); + EXPECT_GT(g_notifyUris.size(), 1); + g_notifyUris.clear(); + result = g_fah->UnregisterNotify(newFileDir1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } catch (...) { - GTEST_LOG_(ERROR) << "external_file_access_notify_0016 occurs an exception."; + GTEST_LOG_(ERROR) << "external_file_access_notify_0019 occurs an exception."; } - GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0016"; + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0019"; } -} // namespace +} // namespace \ No newline at end of file diff --git a/test/unittest/file_access_service_proxy_test.cpp b/test/unittest/file_access_service_proxy_test.cpp index ba767902d0afb69996763f9fcd9c069e1276a4d6..79bcf57a32f32bcce5b4c1c8991db6ff996c0eb8 100644 --- a/test/unittest/file_access_service_proxy_test.cpp +++ b/test/unittest/file_access_service_proxy_test.cpp @@ -37,8 +37,6 @@ using namespace std; using namespace testing; using namespace testing::ext; -std::shared_ptr Assistant::ins_ = nullptr; - FileAccessServiceStub::FileAccessServiceStub() {} FileAccessServiceStub::~FileAccessServiceStub() {} @@ -57,19 +55,25 @@ public: class FileAccessServiceProxyTest : public testing::Test { public: - static void SetUpTestCase(void) {} - static void TearDownTestCase() {} - void SetUp() + static void SetUpTestCase(void) { Assistant::ins_ = insMoc; SystemAbilityManagerClient::GetInstance().systemAbilityManager_ = sptr(samgr); } + static void TearDownTestCase() + { + insMoc = nullptr; + samgr = nullptr; + impl = nullptr; + Assistant::ins_ = nullptr; + SystemAbilityManagerClient::GetInstance().systemAbilityManager_ = nullptr; + } + void SetUp() {} void TearDown() {} public: - shared_ptr insMoc = make_shared(); - sptr impl = sptr(new FileAccessServiceMock()); -public: - ISystemAbilityManagerMock* samgr = new ISystemAbilityManagerMock(); + static inline shared_ptr insMoc = make_shared(); + static inline sptr impl = sptr(new FileAccessServiceMock()); + static inline ISystemAbilityManagerMock* samgr = new ISystemAbilityManagerMock(); }; /** @@ -86,9 +90,10 @@ HWTEST_F(FileAccessServiceProxyTest, file_access_service_proxy_GetInstance_0000, GTEST_LOG_(INFO) << "FileAccessServiceProxyTest-begin file_access_service_proxy_GetInstance_0000"; try { shared_ptr proxy = make_shared(impl); - proxy->serviceProxy_ = sptr(new FileAccessServiceProxy(impl)); + proxy->serviceProxy_ = iface_cast(impl); + auto result = proxy->GetInstance(); - EXPECT_FALSE(static_cast(result.GetRefPtr()) == impl.GetRefPtr()); + EXPECT_TRUE(static_cast(result.GetRefPtr()) == impl.GetRefPtr()); } catch (...) { GTEST_LOG_(ERROR) << "FileAccessServiceProxyTest occurs an exception."; } diff --git a/test/unittest/js_file_access_ext_ability_test.cpp b/test/unittest/js_file_access_ext_ability_test.cpp index 575424ec7c5fb33c0532fd6a590605808e0563e4..a49204ddb0a8548960253c6f1a2404d0020e4a86 100644 --- a/test/unittest/js_file_access_ext_ability_test.cpp +++ b/test/unittest/js_file_access_ext_ability_test.cpp @@ -13,470 +13,461 @@ * limitations under the License. */ -#include -#include +#include #include -#include "ability_info.h" -#include "accesstoken_kit.h" -#include "context_impl.h" -#include "extension_base.h" +#include "assistant.h" #include "extension_context.h" -#include "file_access_ext_ability.h" -#include "file_access_ext_stub_impl.h" -#include "file_access_observer_common.h" -#include "file_access_extension_info.h" -#include "file_access_framework_errno.h" -#include "hilog_wrapper.h" -#include "hitrace_meter.h" -#include "runtime.h" -#include "js_runtime.h" -#include "js_runtime_utils.h" +#include "file_access_ext_stub.h" +#include "file_access_service_mock.h" +#include "file_access_service_proxy.h" #include "js_file_access_ext_ability.h" +#include "js_native_api_types.h" +#include "native_reference_mock.h" -namespace { +namespace OHOS::FileAccessFwk { using namespace std; -using namespace OHOS::FileAccessFwk; +using namespace testing; +using namespace testing::ext; -using namespace OHOS::AbilityRuntime; -FileAccessExtAbility* g_ability = nullptr ; -Uri g_newDirUri(""); +FileAccessServiceStub::FileAccessServiceStub() {} -class JsFileAccessExtAbilityTest : public testing::Test { -public: - static void SetUpTestCase(void) - { - cout << "JsFileAccessExtAbilityTest code test" < runtime = JsRuntime::Create(options_); - g_ability = FileAccessExtAbility::Create(runtime); - } - static void TearDownTestCase() - { - delete g_ability; - g_ability = nullptr; - }; - void SetUp(){}; - void TearDown(){}; -}; +FileAccessServiceStub::~FileAccessServiceStub() {} -/** - * @tc.number: user_file_service_js_file_access_ext_ability_OpenFile_0000 - * @tc.name: js_file_access_ext_ability_OpenFile_0000 - * @tc.desc: Test function of OpenFile for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0000, testing::ext::TestSize.Level1) +int32_t FileAccessServiceStub::OnRemoteRequest(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, + OHOS::MessageOption&) { - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0000"; - try{ - Uri uri(""); - int flags = WRITE_READ; - int fd; - int result = g_ability -> OpenFile(uri, flags, fd); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_OpenFile_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0000"; + return 0; } -/** - * @tc.number: user_file_service_js_file_access_OpenFile_0001 - * @tc.name: js_file_access_OpenFile_0001 - * @tc.desc: Test function of OpenFile interface for failed which openfile's fd is failed. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: SR000H0386 - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0001, testing::ext::TestSize.Level1) +int32_t FileAccessServiceProxy::OnChange(Uri uri, NotifyType notifyType) { - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0001"; - try{ - Uri uri(""); - int flags = WRITE_READ; - int fd; - g_ability -> OpenFile(uri, flags, fd); - EXPECT_LE(fd, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_OpenFile_0001 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0001"; + return ERR_OK; } -/** - * @tc.number: user_file_service_js_file_access_OpenFile_0002 - * @tc.name: js_file_access_OpenFile_0002 - * @tc.desc: Test function of OpenFile interface for failed which openfile's uri is null. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: SR000H0386 - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0002, testing::ext::TestSize.Level1) +int32_t FileAccessServiceProxy::GetExensionProxy(const std::shared_ptr &, + sptr &) { - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0002"; - try{ - Uri uri(""); - int flags = WRITE_READ; - int fd; - int result = g_ability -> OpenFile(uri, flags, fd); - EXPECT_NE(result, E_URIS); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_OpenFile_0002 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0002"; + return 0; } -/** - * @tc.number: user_file_service_js_file_access_OpenFile_0003 - * @tc.name: js_file_access_OpenFile_0002 - * @tc.desc: Test function of OpenFile interface success. - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: SR000H0386 - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0003, testing::ext::TestSize.Level1) +int32_t FileAccessServiceProxy::RegisterNotify(Uri, bool, const sptr &, + const std::shared_ptr &) { - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0003"; - try{ - Uri uri(""); - int flags = WRITE_READ; - int fd; - std::string displayName = "test1.txt"; - int result = g_ability->CreateFile(g_newDirUri, displayName, uri); - EXPECT_GT(result, ERR_OK); - result = g_ability -> OpenFile(uri, flags, fd); - EXPECT_GT(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_OpenFile_0003 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0003"; -} -/** - * @tc.number: user_file_service_js_file_access_ext_ability_CreateFile_0000 - * @tc.name: js_file_access_ext_ability_CreateFile_0000 - * @tc.desc: Test function of CreateFile for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CreateFile_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_CreateFile_0000"; - try { - Uri parent(""); - std::string displayName("testFile"); - Uri newFile(""); - int result = g_ability->CreateFile(parent, displayName, newFile); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_CreateFile_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CreateFile_0000"; + return 0; } -/** - * @tc.number: user_file_service_js_file_access_ext_ability_Mkdir_0000 - * @tc.name: js_file_access_ext_ability_Mkdir_0000 - * @tc.desc: Test function of Mkdir for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Mkdir_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_Mkdir_0000"; - try { - Uri parent(""); - std::string displayName("testFile"); - Uri newFile(""); - int result = g_ability->Mkdir(parent, displayName, newFile); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_Mkdir_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Mkdir_0000"; +int32_t FileAccessServiceProxy::UnregisterNotify(Uri, const sptr &, + const std::shared_ptr &) +{ + return 0; } -/** - * @tc.number: user_file_service_js_file_access_ext_ability_Delete_0000 - * @tc.name: js_file_access_ext_ability_Delete_0000 - * @tc.desc: Test function of Delete for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Delete_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_Delete_0000"; - try { - Uri sourcefile(""); - int result = g_ability->Delete(sourcefile); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_Delete_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Delete_0000"; +void FileAccessExtAbility::Init(const std::shared_ptr &record, + const std::shared_ptr &application, + std::shared_ptr &handler, + const sptr &token) +{ + ExtensionBase<>::Init(record, application, handler, token); } -/** - * @tc.number: user_file_service_js_file_access_ext_ability_Move_0000 - * @tc.name: js_file_access_ext_ability_Move_0000 - * @tc.desc: Test function of Move for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Move_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_Move_0000"; - try { - Uri sourcefile(""); - Uri targetParent(""); - Uri newFile(""); - int result = g_ability->Move(sourcefile, targetParent, newFile); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_Move_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Move_0000"; -} +FileAccessExtStub::FileAccessExtStub() {} -/** - * @tc.number: user_file_service_js_file_access_ext_ability_Rename_0000 - * @tc.name: js_file_access_ext_ability_Rename_0000 - * @tc.desc: Test function of Rename for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Rename_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_Rename_0000"; - try { - Uri sourcefile(""); - std::string displayName("testFile"); - Uri newFile(""); - int result = g_ability->Rename(sourcefile, displayName, newFile); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_Rename_0000 occurs an exception."; - } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Rename_0000"; +FileAccessExtStub::~FileAccessExtStub() {} + +int32_t FileAccessExtStub::OnRemoteRequest(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, + OHOS::MessageOption&) +{ + return 0; } -/** - * @tc.number: user_file_service_js_file_access_ext_ability_ListFile_0000 - * @tc.name: js_file_access_ext_ability_ListFile_0000 - * @tc.desc: Test function of ListFile for error which CallJsMethod error - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX - */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ListFile_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_ListFile_0000"; - try { - FileInfo fileInfo; - int64_t offset = 0; - int64_t maxCount = 0; - FileFilter filter; - std::vector fileInfoVec; - int result = g_ability->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_ListFile_0000 occurs an exception."; +class JsFileAccessExtAbilityTest : public testing::Test { +public: + static void SetUpTestCase(void) + { + Assistant::ins_ = insMoc; + } + static void TearDownTestCase() + { + impl = nullptr; + insMoc = nullptr; + ability = nullptr; + jsRuntime = nullptr; + Assistant::ins_ = nullptr; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ListFile_0000"; + void SetUp() {} + void TearDown() {} +public: + static inline shared_ptr insMoc = make_shared(); + static inline unique_ptr jsRuntime = make_unique(); + static inline shared_ptr ability = make_shared(*jsRuntime); + static inline sptr impl = sptr(new FileAccessServiceMock()); + static inline napi_env env = reinterpret_cast(&(jsRuntime->GetNativeEngine())); +}; + +sptr FileAccessServiceProxy::GetInstance() +{ + return iface_cast(JsFileAccessExtAbilityTest::impl); } /** - * @tc.number: user_file_service_js_file_access_ext_ability_ScanFile_0000 - * @tc.name: js_file_access_ext_ability_ScanFile_0000 - * @tc.desc: Test function of ScanFile for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_CallObjectMethod_0000 + * @tc.name: js_file_access_ext_ability_CallObjectMethod_0000 + * @tc.desc: Test function of CallObjectMethod interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_ScanFile_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_ScanFile_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CallObjectMethod_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CallObjectMethod_0000"; try { - FileInfo fileInfo; - int64_t offset = 0; - int64_t maxCount = 0; - FileFilter filter; - std::vector fileInfoVec; - int result = g_ability->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_ScanFile_0000 occurs an exception."; + auto result = ability->CallObjectMethod(nullptr, nullptr, 0); + EXPECT_TRUE(result == nullptr); + + auto ref = make_shared(); + ability->jsObj_ = ref; + EXPECT_CALL(*ref, GetNapiValue()).WillOnce(Return(nullptr)); + result = ability->CallObjectMethod(nullptr, nullptr, 0); + EXPECT_TRUE(result == nullptr); + + napi_value rslt; + EXPECT_CALL(*ref, GetNapiValue()).WillOnce(Return(reinterpret_cast(&rslt))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + result = ability->CallObjectMethod(nullptr, nullptr, 0); + EXPECT_TRUE(result == nullptr); + + EXPECT_CALL(*ref, GetNapiValue()).WillOnce(Return(reinterpret_cast(&rslt))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + result = ability->CallObjectMethod(nullptr, nullptr, 0); + EXPECT_TRUE(result == nullptr); + + EXPECT_CALL(*ref, GetNapiValue()).WillOnce(Return(reinterpret_cast(&rslt))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)).WillOnce(Return(napi_ok)); + result = ability->CallObjectMethod(nullptr, nullptr, 0); + EXPECT_TRUE(result == nullptr); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ScanFile_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CallObjectMethod_0000"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_GetRoots_0000 - * @tc.name: js_file_access_ext_ability_GetRoots_0000 - * @tc.desc: Test function of GetRoots for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_CallJsMethod_0000 + * @tc.name: js_file_access_ext_ability_CallJsMethod_0000 + * @tc.desc: Test function of CallJsMethod interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetRoots_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_GetRoots_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CallJsMethod_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CallJsMethod_0000"; try { - std::vector rootInfoVec; - int result = g_ability->GetRoots(rootInfoVec); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_ScanFile_0000 occurs an exception."; + string funcNameIn; + NativeReference *jsObj = nullptr; + InputArgsParser argParser = [](napi_env &env, napi_value *argv, size_t &argc) -> bool { + return false; + }; + ResultValueParser retParser = nullptr; + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_ScanFile_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CallJsMethod_0000"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_Access_0000 - * @tc.name: js_file_access_ext_ability_Access_0000 - * @tc.desc: Test function of Access for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_DoCallJsMethod_0000 + * @tc.name: js_file_access_ext_ability_DoCallJsMethod_0000 + * @tc.desc: Test function of DoCallJsMethod interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Access_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_Access_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_DoCallJsMethod_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_DoCallJsMethod_0000"; try { - Uri uri("someUriString"); - bool isExist = true; - int result = g_ability->Access(uri, isExist); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_Access_0000 occurs an exception."; + string funcNameIn; + napi_value rslt; + NativeReference *jsObj = nullptr; + InputArgsParser argParser = [](napi_env &env, napi_value *argv, size_t &argc) -> bool { + return false; + }; + ResultValueParser retParser = nullptr; + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + auto result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + + argParser = nullptr; + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)).WillOnce(Return(napi_ok)); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Access_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_DoCallJsMethod_0000"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_Query_0000 - * @tc.name: js_file_access_ext_ability_Query_0000 - * @tc.desc: Test function of Query for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_DoCallJsMethod_0001 + * @tc.name: js_file_access_ext_ability_DoCallJsMethod_0001 + * @tc.desc: Test function of DoCallJsMethod interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Query_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_Query_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_DoCallJsMethod_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_DoCallJsMethod_0001"; try { - Uri uri("someUriString"); - std::vector columns; - std::vector results; - int result = g_ability->Query(uri, columns, results); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_Query_0000 occurs an exception."; + string funcNameIn; + napi_value rslt; + NativeReference *jsObj = nullptr; + InputArgsParser argParser = nullptr; + ResultValueParser retParser = [](napi_env&, napi_value) -> bool { + return false; + }; + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(-1)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee<5>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)).WillOnce(Return(napi_ok)); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Query_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_DoCallJsMethod_0001"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_GetFileInfoFromUri_0000 - * @tc.name: js_file_access_ext_ability_GetFileInfoFromUri_0000 - * @tc.desc: Test function of GetFileInfoFromUri for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_OpenFile_0000 + * @tc.name: js_file_access_ext_ability_OpenFile_0000 + * @tc.desc: Test function of OpenFile interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetFileInfoFromUri_0000, - testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_GetFileInfoFromUri_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0000"; try { - Uri uri("someUriString"); - FileInfo fileInfo; - int result = g_ability->GetFileInfoFromUri(uri, fileInfo); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_GetFileInfoFromUri_0000 occurs an exception."; + const Uri uri(""); + int fd = -1; + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, EINVAL); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetFileInfoFromUri_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0000"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_GetFileInfoFromRelativePath_0000 - * @tc.name: js_file_access_ext_ability_GetFileInfoFromRelativePath_0000 - * @tc.desc: Test function of GetFileInfoFromRelativePath for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_OpenFile_0001 + * @tc.name: js_file_access_ext_ability_OpenFile_0001 + * @tc.desc: Test function of OpenFile interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_GetFileInfoFromRelativePath_0000, - testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_GetFileInfoFromRelativePath_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0001"; try { - std::string selectFileRealtivePath; - FileInfo fileInfo; - int result = g_ability->GetFileInfoFromRelativePath(selectFileRealtivePath, fileInfo); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_GetFileInfoFromRelativePath_0000 occurs an exception."; + napi_value rslt; + const Uri uri(""); + int fd = -1; + ability->jsObj_ = make_shared(); + + // 模拟获取nativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, ERR_OK); + + // 模拟获取nativeFlags为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_GetFileInfoFromRelativePath_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0001"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_StartWatcher_0000 - * @tc.name: js_file_access_ext_ability_StartWatcher_0000 - * @tc.desc: Test function of StartWatcher for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_OpenFile_0002 + * @tc.name: js_file_access_ext_ability_OpenFile_0002 + * @tc.desc: Test function of OpenFile interface for ERROR. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StartWatcher_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_StartWatcher_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0002"; try { - Uri uri("someUriString"); - int result = g_ability->StartWatcher(uri); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_StartWatcher_0000 occurs an exception."; + napi_value rslt; + const Uri uri(""); + int fd = -1; + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee<5>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee<2>(E_IPCS), Return(napi_ok))); + auto result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee<5>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(fd), Return(napi_ok))).WillOnce(Return(napi_ok)); + result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StartWatcher_0000"; + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0002"; } /** - * @tc.number: user_file_service_js_file_access_ext_ability_StopWatcher_0000 - * @tc.name: js_file_access_ext_ability_StopWatcher_0000 - * @tc.desc: Test function of StopWatcher for error which CallJsMethod error + * @tc.number: user_file_service_js_file_access_ext_ability_OpenFile_0003 + * @tc.name: js_file_access_ext_ability_OpenFile_0003 + * @tc.desc: Test function of OpenFile interface for SUCCESS. * @tc.size: MEDIUM * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I7U2SX + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T */ -HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_StopWatcher_0000, testing::ext::TestSize.Level1) { - GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin js_file_access_ext_ability_StopWatcher_0000"; +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_OpenFile_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_OpenFile_0003"; try { - Uri uri("someUriString"); - int result = g_ability->StopWatcher(uri); - EXPECT_NE(result, ERR_OK); - } catch(...) { - GTEST_LOG_(ERROR) << "js_file_access_ext_ability_StopWatcher_0000 occurs an exception."; + napi_value rslt; + const Uri uri(""); + int fd = -1; + ability->jsObj_ = make_shared(); + + // 模拟OpenFile调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee<5>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee<3>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee<2>(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; } - GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_StopWatcher_0000"; -} + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0003"; } +} \ No newline at end of file diff --git a/test/unittest/mock/assistant.h b/test/unittest/mock/assistant.h index 7ce086dc64985ab36a2a900d0a85c1259ac45c5f..a859eb7c8f66cca3a29c8579a65ec23226ae09b9 100644 --- a/test/unittest/mock/assistant.h +++ b/test/unittest/mock/assistant.h @@ -18,6 +18,14 @@ #include +#ifdef FILE_SUBSYSTEM_DEBUG_LOCAL +#include +#else +#include "napi/native_api.h" +#include "napi/native_node_api.h" +#endif +#include "uv.h" + namespace OHOS { namespace FileAccessFwk { class Assistant { @@ -26,15 +34,47 @@ public: virtual bool Bool() = 0; virtual int Int() = 0; public: - static std::shared_ptr ins_; + virtual napi_status napi_get_uv_event_loop(napi_env, struct uv_loop_s**) = 0; + virtual napi_status napi_call_function(napi_env, napi_value, napi_value, size_t, const napi_value*, napi_value*) + = 0; + virtual napi_status napi_get_reference_value(napi_env, napi_ref, napi_value*) = 0; + virtual napi_status napi_get_named_property(napi_env, napi_value, const char*, napi_value*) = 0; + virtual int uv_queue_work(uv_loop_t*, uv_work_t*, uv_work_cb, uv_after_work_cb) = 0; + virtual napi_status napi_get_value_int32(napi_env, napi_value, int32_t*) = 0; + virtual napi_status napi_create_string_utf8(napi_env, const char*, size_t, napi_value*) = 0; + virtual napi_status napi_create_int32(napi_env, int32_t, napi_value*) = 0; + virtual napi_status napi_get_value_string_utf8(napi_env, napi_value, char*, size_t, size_t*) = 0; + virtual napi_status napi_get_boolean(napi_env, bool, napi_value*) = 0; + virtual napi_status napi_create_array(napi_env, napi_value*) = 0; + virtual napi_status napi_get_array_length(napi_env, napi_value, uint32_t*) = 0; + virtual napi_status napi_get_element(napi_env, napi_value, uint32_t, napi_value*) = 0; + virtual napi_status napi_escape_handle(napi_env, napi_escapable_handle_scope, napi_value, napi_value*) = 0; +public: + static inline std::shared_ptr ins_ = nullptr; }; class AssistantMock : public Assistant { public: MOCK_METHOD0(Bool, bool()); MOCK_METHOD0(Int, int()); +public: + MOCK_METHOD2(napi_get_uv_event_loop, napi_status(napi_env, struct uv_loop_s**)); + MOCK_METHOD6(napi_call_function, napi_status(napi_env, napi_value, napi_value, size_t, const napi_value*, + napi_value*)); + MOCK_METHOD3(napi_get_reference_value, napi_status(napi_env, napi_ref, napi_value*)); + MOCK_METHOD4(napi_get_named_property, napi_status(napi_env, napi_value, const char*, napi_value*)); + MOCK_METHOD4(uv_queue_work, int(uv_loop_t*, uv_work_t*, uv_work_cb, uv_after_work_cb)); + MOCK_METHOD3(napi_get_value_int32, napi_status(napi_env, napi_value, int32_t*)); + MOCK_METHOD4(napi_create_string_utf8, napi_status(napi_env, const char*, size_t, napi_value*)); + MOCK_METHOD3(napi_create_int32, napi_status(napi_env, int32_t, napi_value*)); + MOCK_METHOD5(napi_get_value_string_utf8, napi_status(napi_env, napi_value, char*, size_t, size_t*)); + MOCK_METHOD3(napi_get_boolean, napi_status(napi_env, bool, napi_value*)); + MOCK_METHOD2(napi_create_array, napi_status(napi_env, napi_value*)); + MOCK_METHOD3(napi_get_array_length, napi_status(napi_env, napi_value, uint32_t*)); + MOCK_METHOD4(napi_get_element, napi_status(napi_env, napi_value, uint32_t, napi_value*)); + MOCK_METHOD4(napi_escape_handle, napi_status(napi_env, napi_escapable_handle_scope, napi_value, napi_value*)); }; -} // End of namespace NativePreferences +} // End of namespace FileAccessFwk } // End of namespace OHOS #endif // TEST_UNITTEST_MOCK_FILE_ASSISTANT_H \ No newline at end of file diff --git a/test/unittest/mock/file_access_ext_ability_mock.h b/test/unittest/mock/file_access_ext_ability_mock.h index 3e06bbae21dc15b57f7faf745a2ec38e5b02d213..ca448c3f7bebc622c2f73561e8b1190a9009d693 100644 --- a/test/unittest/mock/file_access_ext_ability_mock.h +++ b/test/unittest/mock/file_access_ext_ability_mock.h @@ -55,6 +55,6 @@ public: MOCK_METHOD4(GetFileInfoNum, int(const std::string &sourceFileUri, const FileFilter &filter, bool recursion, uint32_t &counts)); }; -} // End of namespace NativePreferences +} // End of namespace FileAccessFwk } // End of namespace OHOS #endif // TEST_UNITTEST_MOCK_FILE_ACCESS_EXT_ABILITY_MOCK_H \ No newline at end of file diff --git a/test/unittest/mock/js_native_api_mock.cpp b/test/unittest/mock/js_native_api_mock.cpp new file mode 100644 index 0000000000000000000000000000000000000000..366f1b0d6125a58842db6d6b474ffb6ce44052a1 --- /dev/null +++ b/test/unittest/mock/js_native_api_mock.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "assistant.h" +#include "uv.h" + +int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb) +{ + if (work_cb) { + work_cb(req); + } + if (after_work_cb) { + after_work_cb(req, 0); + } + return OHOS::FileAccessFwk::Assistant::ins_->uv_queue_work(loop, req, work_cb, after_work_cb); +} + +napi_status napi_get_uv_event_loop(napi_env env, struct uv_loop_s** loop) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_uv_event_loop(env, loop); +} + +napi_status napi_call_function(napi_env env, napi_value recv, napi_value func, size_t argc, const napi_value* argv, + napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_call_function(env, recv, func, argc, argv, result); +} + +napi_status napi_get_reference_value(napi_env env, napi_ref ref, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_reference_value(env, ref, result); +} + +napi_status napi_get_named_property(napi_env env, napi_value object, const char* utf8name, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_named_property(env, object, utf8name, result); +} + +napi_status napi_get_value_int32(napi_env env, napi_value value, int32_t* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_value_int32(env, value, result); +} + +napi_status napi_create_string_utf8(napi_env env, const char* str, size_t length, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_create_string_utf8(env, str, length, result); +} + +napi_status napi_create_int32(napi_env env, int32_t value, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_create_int32(env, value, result); +} + +napi_status napi_get_value_string_utf8(napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_value_string_utf8(env, value, buf, bufsize, result); +} + +napi_status napi_get_boolean(napi_env env, bool value, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_boolean(env, value, result); +} + +napi_status napi_create_array(napi_env env, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_create_array(env, result); +} + +napi_status napi_get_array_length(napi_env env, napi_value value, uint32_t* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_array_length(env, value, result); +} + +napi_status napi_get_element(napi_env env, napi_value object, uint32_t index, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_get_element(env, object, index, result); +} + +napi_status napi_escape_handle(napi_env env, napi_escapable_handle_scope scope, napi_value escapee, napi_value* result) +{ + return OHOS::FileAccessFwk::Assistant::ins_->napi_escape_handle(env, scope, escapee, result); +} \ No newline at end of file diff --git a/test/unittest/mock/native_reference_mock.h b/test/unittest/mock/native_reference_mock.h new file mode 100644 index 0000000000000000000000000000000000000000..2b2bad1e2bffc73fc3e95266e657a17f6a11579b --- /dev/null +++ b/test/unittest/mock/native_reference_mock.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TEST_UNITTEST_MOCK_NATIVE_REFERENCE_MOCK_H +#define TEST_UNITTEST_MOCK_NATIVE_REFERENCE_MOCK_H + +#include + +#include "native_engine/native_reference.h" + +namespace OHOS { +namespace FileAccessFwk { +class NativeReferenceMock : public NativeReference { +public: + NativeReferenceMock() = default; + virtual ~NativeReferenceMock() = default; + MOCK_METHOD0(Ref, uint32_t()); + MOCK_METHOD0(Unref, uint32_t()); + MOCK_METHOD0(Get, napi_value()); + MOCK_METHOD0(GetData, void*()); + virtual operator napi_value() override + { + return reinterpret_cast(this); + } + MOCK_METHOD0(SetDeleteSelf, void()); + MOCK_METHOD0(GetRefCount, uint32_t()); + MOCK_METHOD0(GetFinalRun, bool()); + MOCK_METHOD0(GetNapiValue, napi_value()); +}; +} // End of namespace FileAccessFwk +} // End of namespace OHOS +#endif // TEST_UNITTEST_MOCK_NATIVE_REFERENCE_MOCK_H \ No newline at end of file