diff --git a/test/unittest/external_notify_external_test.cpp b/test/unittest/external_notify_external_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1579d2d04b5548739c6fb2d65e305ad7f89bb713 --- /dev/null +++ b/test/unittest/external_notify_external_test.cpp @@ -0,0 +1,1277 @@ +/* + * Copyright (c) 2023-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 +#include +#include + +#include +#include + +#include "accesstoken_kit.h" +#include "context_impl.h" +#include "file_access_framework_errno.h" +#include "file_access_observer_common.h" +#include "iservice_registry.h" +#include "iobserver_callback.h" +#include "nativetoken_kit.h" +#include "observer_callback_stub.h" +#include "token_setproc.h" + +#define private public +#include "file_access_helper.h" +#undef private + +namespace { +using namespace std; +using namespace OHOS; +using namespace FileAccessFwk; +using json = nlohmann::json; +const int ABILITY_ID = 5003; +const int INIT_THREADS_NUMBER = 4; +shared_ptr g_fah = nullptr; +int g_notifyEvent = -1; +int g_notifyFlag = -1; +string g_notifyUri = ""; +vector g_notifyUris; +const int SLEEP_TIME = 600 * 1000; +const int UID_TRANSFORM_TMP = 20000000; +const int UID_DEFAULT = 0; +const uint64_t SYSTEM_APP_MASK = (static_cast(1) << 32); // 1: Base number, 32: Left shifted bit numbers + +shared_ptr g_context = nullptr; + +void SetNativeToken() +{ + uint64_t tokenId; + const char *perms[] = { + "ohos.permission.FILE_ACCESS_MANAGER", + "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED", + "ohos.permission.CONNECT_FILE_ACCESS_EXTENSION" + }; + NativeTokenInfoParams infoInstance = { + .dcapsNum = 0, + .permsNum = 3, + .aclsNum = 0, + .dcaps = nullptr, + .perms = perms, + .acls = nullptr, + .aplStr = "system_core", + }; + + infoInstance.processName = "SetUpTestCase"; + tokenId = GetAccessTokenId(&infoInstance); + const uint64_t systemAppMask = (static_cast(1) << 32); + tokenId |= systemAppMask; + SetSelfTokenID(tokenId); + OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo(); +} + +void SetNativeToken(const char* processName, const char*perms[], int32_t permsNum) +{ + uint64_t tokenId; + NativeTokenInfoParams infoInstance = { + .dcapsNum = 0, + .permsNum = permsNum, + .aclsNum = 0, + .dcaps = nullptr, + .perms = perms, + .acls = nullptr, + .aplStr = "system_core", + }; + tokenId = GetAccessTokenId(&infoInstance); + const uint64_t systemAppMask = SYSTEM_APP_MASK; + tokenId |= systemAppMask; + SetSelfTokenID(tokenId); + OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo(); +} + +class FileExtensionNotifyTest : public testing::Test { +public: + static void SetUpTestCase(void) + { + cout << "FileExtensionNotifyTest code test" << endl; + SetNativeToken(); + auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (saManager == nullptr) { + return; + } + auto remoteObj = saManager->GetSystemAbility(ABILITY_ID); + g_context = make_shared(); + g_context->SetToken(remoteObj); + AAFwk::Want want; + vector wantVec; + setuid(UID_TRANSFORM_TMP); + int ret = FileAccessHelper::GetRegisteredFileAccessExtAbilityInfo(wantVec); + EXPECT_EQ(ret, OHOS::FileAccessFwk::ERR_OK); + bool sus = false; + for (size_t i = 0; i < wantVec.size(); i++) { + auto element = wantVec[i].GetElement(); + if (element.GetBundleName() == "com.ohos.UserFile.ExternalFileManager" && + element.GetAbilityName() == "FileExtensionAbility") { + want = wantVec[i]; + sus = true; + break; + } + } + EXPECT_TRUE(sus); + vector wants{want}; + g_fah = FileAccessHelper::Creator(remoteObj, wants); + if (g_fah == nullptr) { + GTEST_LOG_(ERROR) << "external_file_access_test g_fah is nullptr"; + exit(1); + } + setuid(UID_DEFAULT); + } + static void TearDownTestCase() + { + if (g_fah) { + g_fah->Release(); + } + g_fah = nullptr; + }; + void SetUp(){}; + void TearDown(){}; +}; + +class MyObserver : public ObserverCallbackStub { +public: + MyObserver() {}; + virtual ~MyObserver() = default; + void OnChange(NotifyMessage ¬ifyMessage) override; +}; + +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) +" uri size" + + std::to_string(notifyMessage.uris_.size()); +} + +class TestObserver : public ObserverCallbackStub { +public: + TestObserver() {}; + virtual ~TestObserver() = default; + void OnChange(NotifyMessage ¬ifyMessage) override; +}; + +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(""); + EXPECT_NE(g_fah, nullptr); + 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(""); + EXPECT_NE(g_fah, nullptr); + 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, MOVED_SELF); + 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, MOVED_SELF); + 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 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0000"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver3 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver4 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].uri); + auto [newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2] = + ReadyRegisterNotify00(parentUri, myObserver1, myObserver2, myObserver3, myObserver4); + + auto [renameDirUri1, renameUri1] = TriggerNotify00(newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2); + + sleep(1); + result = g_fah->UnregisterNotify(newDirUriTest1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newDirUriTest2, myObserver2); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri1, myObserver3); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->UnregisterNotify(newFileUri2, myObserver4); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(renameDirUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(renameUri1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0000 occurs an exception."; + } + 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(""); + EXPECT_NE(g_fah, nullptr); + 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 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0001"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver3 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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, MOVED_SELF); + 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, MOVED_SELF); + 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); + } 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(""); + EXPECT_NE(g_fah, nullptr); + 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(""); + EXPECT_NE(g_fah, nullptr); + int result = g_fah->CreateFile(newDirUriTest1, "test_file", testFile); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + 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, MOVED_SELF); + 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, MOVED_SELF); + 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 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0002"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + 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[0].uri); + auto [newDirUriTest1, newDirUriTest2, newFileUri1, newFileUri2] = ReadyRegisterNotify02(parentUri); + + 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); + } + + 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); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0002 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0002"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0003 + * @tc.name: external_file_access_notify_0003 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0003"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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); + } 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(""); + EXPECT_NE(g_fah, nullptr); + 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 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0005, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0005"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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_SELF); + EXPECT_EQ(g_notifyUri, uri_dirSub2.ToString()); + } + } 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_TRUE(g_notifyEvent == MOVED_FROM || g_notifyEvent == MOVED_SELF); + 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."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0005"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0006 + * @tc.name: external_file_access_notify_0006 + * @tc.desc: Duplicate UnregisterNotify failed. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0006, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0006"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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, MOVED_SELF); + 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."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0006"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0007 + * @tc.name: external_file_access_notify_0007 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify failed when callback is Invalid. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0007, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0007"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sptr myObserver1 = nullptr; + bool notifyForDescendants = true; + Uri parentUri(info[0].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."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0007"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0008 + * @tc.name: external_file_access_notify_0008 + * @tc.desc: Test function of UnregisterNotify failed when uri is Invalid. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0008, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0008"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + Uri newFileUri1("*/&%"); + bool notifyForDescendants = true; + 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); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0008 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0008"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0009 + * @tc.name: external_file_access_notify_0009 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS when the file is Chinese name. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0009, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0009"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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, MOVED_SELF); + 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."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0009"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0010 + * @tc.name: external_file_access_notify_0010 + * @tc.desc: Test function of UnregisterNotify interface for failed when the Uri and callback do not match. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0010, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0010"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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); + } 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; + EXPECT_NE(g_fah, nullptr); + 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 + * @tc.desc: Test function of RegisterNotify interface for SUCCESS when set the notifyForDescendants to true and + * @tc.desc: then set to false + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0011, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0011"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants2 = false; + sptr myObserver1 = sptr(new (std::nothrow) TestObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].uri); + Uri newFileDir1(""); + auto [newFileUri1, renameFileUri1] = + ReadyRegisterNotify11(parentUri, newFileDir1, myObserver1, myObserver2); + 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()); + } + } 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, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newFileUri1.ToString()); + EXPECT_NE(g_notifyFlag, MOVED_SELF); + + 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."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0011"; +} + +static void RegisterDirNotify(Uri parentUri, std::string dirName, IFileAccessObserver *observer) +{ + Uri newDirUriTest(""); + bool notifyForDescendants = true; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->Mkdir(parentUri, dirName, newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + sptr myObserver(observer); + result = g_fah->RegisterNotify(newDirUriTest, notifyForDescendants, myObserver); + EXPECT_GE(result, OHOS::FileAccessFwk::ERR_OK); + result = g_fah->Delete(newDirUriTest); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + usleep(SLEEP_TIME); + EXPECT_EQ(g_notifyEvent, MOVED_SELF); + EXPECT_EQ(g_notifyUri, newDirUriTest.ToString()); + sleep(2); + g_fah->UnregisterNotify(newDirUriTest, myObserver); +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0012 + * @tc.name: external_file_access_notify_0012 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS which Concurrent. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_00012, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_00012"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[0].uri); + Uri newFileUri1(""); + GTEST_LOG_(INFO) << parentUri.ToString(); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + for (int i = 0; i < INIT_THREADS_NUMBER; i++) { + std::thread execthread1(RegisterDirNotify, parentUri, "WatcherTest", myObserver1.GetRefPtr()); + execthread1.join(); + } + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_00012 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_00012"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0013 + * @tc.name: external_file_access_notify_0013 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS which Concurrent. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_00013, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_00013"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[0].uri); + GTEST_LOG_(INFO) << parentUri.ToString(); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + std::thread execthread1(RegisterDirNotify, parentUri, "WatcherTest1", myObserver1.GetRefPtr()); + execthread1.join(); + std::thread execthread2(RegisterDirNotify, parentUri, "WatcherTest2", myObserver1.GetRefPtr()); + execthread2.join(); + std::thread execthread3(RegisterDirNotify, parentUri, "WatcherTest3", myObserver1.GetRefPtr()); + execthread3.join(); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_00013 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_00013"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0014 + * @tc.name: external_file_access_notify_0014 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS which Concurrent. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_00014, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_00014"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[0].uri); + GTEST_LOG_(INFO) << parentUri.ToString(); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver3 = sptr(new (std::nothrow) MyObserver()); + + std::thread execthread1(RegisterDirNotify, parentUri, "WatcherTest", myObserver1.GetRefPtr()); + execthread1.join(); + sleep(1); + std::thread execthread2(RegisterDirNotify, parentUri, "WatcherTest", myObserver2.GetRefPtr()); + execthread2.join(); + sleep(1); + std::thread execthread3(RegisterDirNotify, parentUri, "WatcherTest", myObserver3.GetRefPtr()); + execthread3.join(); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_00014 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_00014"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0015 + * @tc.name: external_file_access_notify_0015 + * @tc.desc: Test function of RegisterNotify and UnregisterNotify interface for SUCCESS which Concurrent. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_00015, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_00015"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + Uri parentUri(info[0].uri); + GTEST_LOG_(INFO) << parentUri.ToString(); + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver3 = sptr(new (std::nothrow) MyObserver()); + + std::thread execthread1(RegisterDirNotify, parentUri, "WatcherTest1", myObserver1.GetRefPtr()); + execthread1.join(); + std::thread execthread2(RegisterDirNotify, parentUri, "WatcherTest2", myObserver2.GetRefPtr()); + execthread2.join(); + std::thread execthread3(RegisterDirNotify, parentUri, "WatcherTest3", myObserver3.GetRefPtr()); + execthread3.join(); + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_00015 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_00015"; +} + +/** + * @tc.number: user_file_service_external_file_access_notify_0016 + * @tc.name: external_file_access_notify_0016 + * @tc.desc: Test UnregisterNotify all callbacks related to the current uri + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: SR000H0386 + */ +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0016, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0016"; + try { + vector info; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver2 = sptr(new (std::nothrow) MyObserver()); + sptr myObserver3 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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->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; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].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); + 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; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) TestObserver()); + Uri parentUri(info[0].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); + } + 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); + 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; + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) TestObserver()); + Uri parentUri(info[0].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_0019 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0019"; +} + +HWTEST_F(FileExtensionNotifyTest, external_file_access_notify_0020, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-begin external_file_access_notify_0020"; + try { + g_notifyEvent = -1; + vector info; + const char* perms[] = { + "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED" + }; + SetNativeToken("SetUpTestCase", perms, sizeof(perms) / sizeof(perms[0])); + EXPECT_NE(g_fah, nullptr); + int result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::E_PERMISSION); + SetNativeToken(); + result = g_fah->GetRoots(info); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + bool notifyForDescendants = true; + sptr myObserver1 = sptr(new (std::nothrow) MyObserver()); + Uri parentUri(info[0].uri); + Uri newFileDir1(""); + SetNativeToken("SetUpTestCase", perms, sizeof(perms) / sizeof(perms[0])); + result = g_fah->Mkdir(parentUri, "uri_dir", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::E_PERMISSION); + SetNativeToken(); + result = g_fah->Mkdir(parentUri, "uri_dir", newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + SetNativeToken("SetUpTestCase", perms, sizeof(perms) / sizeof(perms[0])); + result = g_fah->RegisterNotify(newFileDir1, notifyForDescendants, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::E_PERMISSION); + + result = g_fah->UnregisterNotify(newFileDir1, myObserver1); + EXPECT_EQ(result, OHOS::FileAccessFwk::E_PERMISSION); + + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::E_PERMISSION); + + SetNativeToken(); + result = g_fah->Delete(newFileDir1); + EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + + } catch (...) { + GTEST_LOG_(ERROR) << "external_file_access_notify_0020 occurs an exception."; + } + GTEST_LOG_(INFO) << "FileExtensionNotifyTest-end external_file_access_notify_0020"; +} +} // namespace \ No newline at end of file diff --git a/test/unittest/js_file_access_ext_ability_external_test.cpp b/test/unittest/js_file_access_ext_ability_external_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b0550b9b438280859b9df5ad30fb09a8eea446ac --- /dev/null +++ b/test/unittest/js_file_access_ext_ability_external_test.cpp @@ -0,0 +1,1966 @@ +/* + * 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 +#include + +#include "assistant.h" +#include "extension_context.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" + +#include "js_file_access_ext_ability.cpp" + +namespace OHOS::FileAccessFwk { +using namespace std; +using namespace testing; +using namespace testing::ext; +const int ARG_INDEX_FIRST = 1; +const int ARG_INDEX_SECOND = 2; +const int ARG_INDEX_THIRD = 3; +const int ARG_INDEX_FOUR = 4; +const int ARG_INDEX_FIFTH = 5; + +FileAccessServiceStub::FileAccessServiceStub() {} + +FileAccessServiceStub::~FileAccessServiceStub() {} + +int32_t FileAccessServiceStub::OnRemoteRequest(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, + OHOS::MessageOption&) +{ + return 0; +} + +int32_t FileAccessServiceProxy::RegisterNotify(Uri, bool, const sptr &, + const std::shared_ptr &) +{ + return 0; +} + +int32_t FileAccessServiceProxy::OnChange(Uri uri, NotifyType notifyType) +{ + return ERR_OK; +} + +int32_t FileAccessServiceProxy::GetExtensionProxy(const std::shared_ptr &, + sptr &) +{ + return 0; +} + +int32_t FileAccessServiceProxy::UnregisterNotify(Uri, const sptr &, + const std::shared_ptr &) +{ + return 0; +} + +int32_t FileAccessServiceProxy::ConnectFileExtAbility(const AAFwk::Want &, + const sptr&) +{ + return 0; +} + +int32_t FileAccessServiceProxy::DisConnectFileExtAbility(const sptr&) +{ + return 0; +} + +void FileAccessExtAbility::Init(const std::shared_ptr &record, + const std::shared_ptr &application, + std::shared_ptr &handler, + const sptr &token) +{ + ExtensionBase<>::Init(record, application, handler, token); +} + +FileAccessExtStub::FileAccessExtStub() {} + +FileAccessExtStub::~FileAccessExtStub() {} + +int32_t FileAccessExtStub::OnRemoteRequest(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, + OHOS::MessageOption&) +{ + return 0; +} + +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; + } + 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_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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + 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 = nullptr; + 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(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(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 (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CallObjectMethod_0000"; +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + 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 (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CallJsMethod_0000"; +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + string funcNameIn; + napi_value rslt = nullptr; + 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(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(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_DoCallJsMethod_0000"; +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + string funcNameIn; + napi_value rslt = nullptr; + 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(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)).WillOnce(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(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)).WillOnce(Return(napi_ok)); + result = ability->CallJsMethod(funcNameIn, *jsRuntime, jsObj, argParser, retParser); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_DoCallJsMethod_0001"; +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + 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 (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0000"; +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + 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(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 (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0001"; +} + +static void MockNapiCalls(shared_ptr insMoc, napi_value rslt) +{ + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); +} + +static void MockNapiFunctionCalls(shared_ptr insMoc, const string& path, napi_value rslt) +{ + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(path.length()), Return(napi_ok))) + .WillOnce(DoAll(SetArrayArgument(path.begin(), path.end()), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); +} + +static void MockNapiFunctionCallsForCopy(shared_ptr insMoc, napi_value rslt) +{ + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); +} + +static void MockNapiFunctionCallsForCopyFile(shared_ptr insMoc, const string& path, napi_value rslt) +{ + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + const Uri uri(""); + int fd = -1; + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(fd), Return(napi_ok))).WillOnce(Return(napi_ok)); + result = ability->OpenFile(uri, 0, fd); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_OpenFile_0002"; +} + +/** + * @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 3 + * @tc.require: issuesI8ZE8T + */ +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 { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + const Uri uri(""); + int fd = -1; + ability->jsObj_ = make_shared(); + + // 模拟OpenFile调用成功 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(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 (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest 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 interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CreateFile_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CreateFile_0000"; + try { + Uri parent(""); + string displayName(""); + Uri newFile(""); + EXPECT_NE(ability, nullptr); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->CreateFile(parent, displayName, newFile); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CreateFile_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CreateFile_0001 + * @tc.name: js_file_access_ext_ability_CreateFile_0001 + * @tc.desc: Test function of CreateFile interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CreateFile_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CreateFile_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri parent(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取nativeParent为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->CreateFile(parent, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取nativeDisplayName为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + result = ability->CreateFile(parent, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CreateFile_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CreateFile_0002 + * @tc.name: js_file_access_ext_ability_CreateFile_0002 + * @tc.desc: Test function of CreateFile interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CreateFile_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CreateFile_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri parent(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->CreateFile(parent, displayName, newFile); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(Return(napi_ok)); + result = ability->CreateFile(parent, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CreateFile_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CreateFile_0003 + * @tc.name: js_file_access_ext_ability_CreateFile_0003 + * @tc.desc: Test function of CreateFile interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CreateFile_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CreateFile_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + string path = "test"; + Uri parent(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟CreateFile调用成功 + MockNapiFunctionCalls(insMoc, path, rslt); + auto result = ability->CreateFile(parent, displayName, newFile); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CreateFile_0003"; +} + +/** + * @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 interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Mkdir_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Mkdir_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri parent(""); + string displayName(""); + Uri newFile(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Mkdir(parent, displayName, newFile); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Mkdir_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Mkdir_0001 + * @tc.name: js_file_access_ext_ability_Mkdir_0001 + * @tc.desc: Test function of Mkdir interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Mkdir_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Mkdir_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri parent(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取nativeParent为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->Mkdir(parent, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取nativeDisplayName为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + result = ability->Mkdir(parent, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Mkdir_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Mkdir_0002 + * @tc.name: js_file_access_ext_ability_Mkdir_0002 + * @tc.desc: Test function of Mkdir interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Mkdir_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Mkdir_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri parent(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->Mkdir(parent, displayName, newFile); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->Mkdir(parent, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Mkdir_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Mkdir_0003 + * @tc.name: js_file_access_ext_ability_Mkdir_0003 + * @tc.desc: Test function of Mkdir interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Mkdir_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Mkdir_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + string path = "test"; + Uri parent(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟Mkdir调用成功 + MockNapiFunctionCalls(insMoc, path, rslt); + auto result = ability->Mkdir(parent, displayName, newFile); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Mkdir_0003"; +} + +/** + * @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 interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Delete_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Delete_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceFile(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Delete(sourceFile); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Delete_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Delete_0001 + * @tc.name: js_file_access_ext_ability_Delete_0001 + * @tc.desc: Test function of Delete interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Delete_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Delete_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取nativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->Delete(sourceFile); + EXPECT_EQ(result, ERR_OK); + + // 模拟获取nativeDisplayName为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_invalid_arg))); + result = ability->Delete(sourceFile); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Delete_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Delete_0002 + * @tc.name: js_file_access_ext_ability_Delete_0002 + * @tc.desc: Test function of Delete interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Delete_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Delete_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + ability->jsObj_ = make_shared(); + + // 模拟Delete调用成功 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + auto result = ability->Delete(sourceFile); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Delete_0002"; +} + +/** + * @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 interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Move_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Move_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceFile(""); + Uri targetParent(""); + Uri newFile(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Move(sourceFile, targetParent, newFile); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Move_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Move_0001 + * @tc.name: js_file_access_ext_ability_Move_0001 + * @tc.desc: Test function of Move interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Move_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Move_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取srcUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->Move(sourceFile, targetParent, newFile); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取dstUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + result = ability->Move(sourceFile, targetParent, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Move_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Move_0002 + * @tc.name: js_file_access_ext_ability_Move_0002 + * @tc.desc: Test function of Move interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Move_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Move_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + Uri targetParent(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->Move(sourceFile, targetParent, newFile); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(Return(napi_ok)); + result = ability->Move(sourceFile, targetParent, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Move_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Move_0003 + * @tc.name: js_file_access_ext_ability_Move_0003 + * @tc.desc: Test function of Move interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Move_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Move_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + string path = "test"; + Uri sourceFile(""); + Uri targetParent(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟Move调用成功 + MockNapiFunctionCalls(insMoc, path, rslt); + auto result = ability->Move(sourceFile, targetParent, newFile); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Move_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0000 + * @tc.name: js_file_access_ext_ability_Copy_0000 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, EXCEPTION); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0001 + * @tc.name: js_file_access_ext_ability_Copy_0001 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取srcNativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, EXCEPTION); + + // 模拟获取dstNativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, EXCEPTION); + + // 模拟获取forceCopy为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_boolean(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, EXCEPTION); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0002 + * @tc.name: js_file_access_ext_ability_Copy_0002 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取nativeValue失败 + MockNapiFunctionCallsForCopy(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, EXCEPTION); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0003 + * @tc.name: js_file_access_ext_ability_Copy_0003 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取copyRet失败 + MockNapiFunctionCallsForCopy(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, EXCEPTION); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0004 + * @tc.name: js_file_access_ext_ability_Copy_0004 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0004, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0004"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取copyRet等于ERR_OK + MockNapiFunctionCallsForCopy(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(ERR_OK), Return(napi_ok))); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0004"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0005 + * @tc.name: js_file_access_ext_ability_Copy_0005 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0005, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0005"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取nativeArray为空 + MockNapiFunctionCallsForCopy(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array(_, _)).WillOnce(Return(napi_ok)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0005"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0006 + * @tc.name: js_file_access_ext_ability_Copy_0006 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0006, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0006"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取length失败 + MockNapiFunctionCallsForCopy(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array(_, _)) + .WillRepeatedly(DoAll(SetArgPointee(reinterpret_cast(&rslt)), + Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0006"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Copy_0007 + * @tc.name: js_file_access_ext_ability_Copy_0007 + * @tc.desc: Test function of Copy interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Copy_0007, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Copy_0007"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + vector copyResult; + bool force = false; + ability->jsObj_ = make_shared(); + + // 模拟获取nativeResult失败 + MockNapiFunctionCallsForCopy(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_create_array(_, _)) + .WillRepeatedly(DoAll(SetArgPointee(reinterpret_cast(&rslt)), + Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_array_length(_, _, _)) + .WillOnce(DoAll(SetArgPointee(1), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_element(_, _, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->Copy(sourceUri, destUri, copyResult, force); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Copy_0007"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0000 + * @tc.name: js_file_access_ext_ability_CopyFile_0000 + * @tc.desc: Test function of CopyFile interface for CallJsMethod ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0001 + * @tc.name: js_file_access_ext_ability_CopyFile_0001 + * @tc.desc: Test function of CopyFile interface for ERROR, the reason is that one of srcNativeUri、dstNativeUri and + * fileNativeName is empty. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取srcNativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取dstNativeUri为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取fileNativeName为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0002 + * @tc.name: js_file_access_ext_ability_CopyFile_0002 + * @tc.desc: Test function of CopyFile interface for setting reserve size ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟为reserve获取的size失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0003 + * @tc.name: js_file_access_ext_ability_CopyFile_0003 + * @tc.desc: Test function of CopyFile interface for setting resize size ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0003"; + try { + EXPECT_NE(ability, nullptr); + string path = "test"; + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟为resize获取的size失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(path.length()), Return(napi_ok))) + .WillOnce(Return(napi_invalid_arg)); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0003"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0004 + * @tc.name: js_file_access_ext_ability_CopyFile_0004 + * @tc.desc: Test function of CopyFile interface for getting uri succeed but setting code error. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0004, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0004"; + try { + EXPECT_NE(ability, nullptr); + string path = "test"; + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取uri成功但value->code失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_reference_value(_, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_named_property(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)) + .WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_call_function(_, _, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_escape_handle(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(path.length()), Return(napi_ok))) + .WillOnce(DoAll(SetArrayArgument(path.begin(), path.end()), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_invalid_arg))); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0004"; +} + + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0005 + * @tc.name: js_file_access_ext_ability_CopyFile_0005 + * @tc.desc: Test function of CopyFile interface for GetUriAndCodeFromJs SUCCEED. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0005, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0005"; + try { + EXPECT_NE(ability, nullptr); + string path = "test"; + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟GetUriAndCodeFromJs成功 + MockNapiFunctionCallsForCopyFile(insMoc, path, rslt); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(path.length()), Return(napi_ok))) + .WillOnce(DoAll(SetArrayArgument(path.begin(), path.end()), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_IPCS); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0005"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0006 + * @tc.name: js_file_access_ext_ability_CopyFile_0006 + * @tc.desc: Test function of CopyFile interface for ERROR, the reason is that one of value->code and value->data fail. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0006, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0006"; + try { + EXPECT_NE(ability, nullptr); + string path = "test"; + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiFunctionCallsForCopyFile(insMoc, path, rslt); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiFunctionCallsForCopyFile(insMoc, path, rslt); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0006"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_CopyFile_0007 + * @tc.name: js_file_access_ext_ability_CopyFile_0007 + * @tc.desc: Test function of CopyFile interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_CopyFile_0007, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_CopyFile_0007"; + try { + EXPECT_NE(ability, nullptr); + string path = "test"; + napi_value rslt = nullptr; + Uri sourceUri(""); + Uri destUri(""); + string fileName; + Uri newFileUri(""); + ability->jsObj_ = make_shared(); + + // 模拟CopyFile调用成功 + MockNapiFunctionCallsForCopyFile(insMoc, path, rslt); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(DoAll(SetArgPointee(path.length()), Return(napi_ok))) + .WillOnce(DoAll(SetArrayArgument(path.begin(), path.end()), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + auto result = ability->CopyFile(sourceUri, destUri, fileName, newFileUri); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_CopyFile_0007"; +} + +/** + * @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 interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Rename_0000, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Rename_0000"; + try { + EXPECT_NE(ability, nullptr); + Uri sourceFile(""); + string displayName(""); + Uri newFile(""); + + // 模拟调用CallJsMethod失败 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_invalid_arg)); + auto result = ability->Rename(sourceFile, displayName, newFile); + EXPECT_EQ(result, EINVAL); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Rename_0000"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Rename_0001 + * @tc.name: js_file_access_ext_ability_Rename_0001 + * @tc.desc: Test function of Rename interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Rename_0001, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Rename_0001"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取nativeSourceFile为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + auto result = ability->Rename(sourceFile, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + + // 模拟获取nativeDisplayName为空 + EXPECT_CALL(*insMoc, napi_get_uv_event_loop(_, _)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, uv_queue_work(_, _, _, _)).WillOnce(Return(0)); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)) + .WillOnce(DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))) + .WillOnce(Return(napi_ok)); + result = ability->Rename(sourceFile, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Rename_0001"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Rename_0002 + * @tc.name: js_file_access_ext_ability_Rename_0002 + * @tc.desc: Test function of Rename interface for ERROR. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Rename_0002, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Rename_0002"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + Uri sourceFile(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟获取value->code失败 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)) + .WillOnce(DoAll(SetArgPointee(E_IPCS), Return(napi_ok))); + auto result = ability->Rename(sourceFile, displayName, newFile); + EXPECT_EQ(result, E_IPCS); + + // 模拟获取value->data为-1 + MockNapiCalls(insMoc, rslt); + EXPECT_CALL(*insMoc, napi_create_string_utf8(_, _, _, _)).WillRepeatedly( + DoAll(SetArgPointee(reinterpret_cast(&rslt)), Return(napi_ok))); + EXPECT_CALL(*insMoc, napi_get_value_string_utf8(_, _, _, _, _)) + .WillOnce(Return(napi_ok)).WillOnce(Return(napi_ok)); + EXPECT_CALL(*insMoc, napi_get_value_int32(_, _, _)).WillOnce(Return(napi_ok)); + result = ability->Rename(sourceFile, displayName, newFile); + EXPECT_EQ(result, E_GETRESULT); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Rename_0002"; +} + +/** + * @tc.number: user_file_service_js_file_access_ext_ability_Rename_0003 + * @tc.name: js_file_access_ext_ability_Rename_0003 + * @tc.desc: Test function of Rename interface for SUCCESS. + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 3 + * @tc.require: issuesI8ZE8T + */ +HWTEST_F(JsFileAccessExtAbilityTest, js_file_access_ext_ability_Rename_0003, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-begin js_file_access_ext_ability_Rename_0003"; + try { + EXPECT_NE(ability, nullptr); + napi_value rslt = nullptr; + string path = "test"; + Uri sourceFile(""); + string displayName(""); + Uri newFile(""); + ability->jsObj_ = make_shared(); + + // 模拟Rename调用成功 + MockNapiFunctionCalls(insMoc, path, rslt); + auto result = ability->Rename(sourceFile, displayName, newFile); + EXPECT_EQ(result, ERR_OK); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(ERROR) << "JsFileAccessExtAbilityTest occurs an exception."; + } + GTEST_LOG_(INFO) << "JsFileAccessExtAbilityTest-end js_file_access_ext_ability_Rename_0003"; +} + +#include "js_file_access_ext_ability_ex_test.cpp" +#include "js_file_access_ext_ability_other_test.cpp" +} \ No newline at end of file