From d40887fdbd82b219feab16876977f5bf8b87b9b3 Mon Sep 17 00:00:00 2001 From: reminder2352 Date: Wed, 20 Aug 2025 20:35:59 +0800 Subject: [PATCH] change version conflict path. Signed-off-by: reminder2352 --- .../src/cloud_disk/file_operations_cloud.cpp | 3 +- test/unittests/cloud_disk/BUILD.gn | 5 + .../cloud_disk/file_operations_base_test.cpp | 2 + .../cloud_disk/file_operations_cloud_test.cpp | 56 ++++++ .../file_operations_helper_test.cpp | 2 + .../cloud_disk/file_range_lock_test.cpp | 2 + .../cloud_disk/meta_file_clouddisk_test.cpp | 2 + test/unittests/cloud_disk/mock/assistant.cpp | 179 ++++++++++++++++++ test/unittests/cloud_disk/mock/assistant.h | 5 + .../cloud_disk/mock/system_function_mock.cpp | 33 ---- 10 files changed, 255 insertions(+), 34 deletions(-) create mode 100644 test/unittests/cloud_disk/mock/assistant.cpp diff --git a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp index 7440e3851..44e1feb83 100644 --- a/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp +++ b/services/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp @@ -64,6 +64,7 @@ namespace { static const string FILE_LOCAL = "1"; static const string ROOT_CLOUD_ID = "rootId"; static const string RECYCLE_NAME = ".trash"; + static const string CONFLICT_PATH = ".cloudFileVersionConflict"; static const uint64_t UNKNOWN_INODE_ID = 0; static const std::string FILEMANAGER_KEY = "persist.kernel.bundle_name.filemanager"; static const string LOCAL_PATH_DATA_STORAGE = "/data/storage/el2/cloud/"; @@ -1420,7 +1421,7 @@ void FileOperationsCloud::MkDir(fuse_req_t req, fuse_ino_t parent, const char *n } string fileName = name; bool noNeedUpload; - if ((fileName == ".cloudthumbnails" || fileName == ".conflict") && parentInode->cloudId == ROOT_CLOUD_ID) { + if ((fileName == ".cloudthumbnails" || fileName == CONFLICT_PATH) && parentInode->cloudId == ROOT_CLOUD_ID) { noNeedUpload = true; } else if (parentInode->cloudId != ROOT_CLOUD_ID) { int32_t err = GetParentUpload(parentInode, data, noNeedUpload); diff --git a/test/unittests/cloud_disk/BUILD.gn b/test/unittests/cloud_disk/BUILD.gn index ebdd6f8a7..d2b051cfb 100644 --- a/test/unittests/cloud_disk/BUILD.gn +++ b/test/unittests/cloud_disk/BUILD.gn @@ -103,6 +103,7 @@ ohos_unittest("file_operations_cloud_test") { "${services_path}/cloudfiledaemon/src/cloud_disk/file_operations_base.cpp", "${services_path}/cloudfiledaemon/src/cloud_disk/file_operations_cloud.cpp", "file_operations_cloud_test.cpp", + "mock/assistant.cpp", "mock/clouddisk_rdbstore_mock.cpp", "mock/libfuse_mock.cpp", "mock/system_function_mock.cpp", @@ -285,6 +286,7 @@ ohos_unittest("file_operations_base_test") { "${services_path}/cloudfiledaemon/src/cloud_disk/file_operations_base.cpp", "${services_path}/cloudfiledaemon/src/cloud_disk/file_operations_helper.cpp", "file_operations_base_test.cpp", + "mock/assistant.cpp", "mock/clouddisk_rdbstore_mock.cpp", "mock/libfuse_mock.cpp", "mock/system_function_mock.cpp", @@ -470,6 +472,7 @@ ohos_unittest("file_operations_helper_test") { "${services_path}/cloudfiledaemon/src/cloud_disk/file_operations_helper.cpp", "${services_path}/cloudfiledaemon/src/cloud_disk/file_operations_local.cpp", "file_operations_helper_test.cpp", + "mock/assistant.cpp", "mock/clouddisk_rdbstore_mock.cpp", "mock/libfuse_mock.cpp", "mock/system_function_mock.cpp", @@ -530,6 +533,7 @@ ohos_unittest("file_range_lock_test") { sources = [ "${distributedfile_path}/utils/dentry/src/file_utils.cpp", "${distributedfile_path}/utils/log/src/utils_log.cpp", + "mock/assistant.cpp", "mock/system_function_mock.cpp", "file_range_lock_test.cpp", ] @@ -576,6 +580,7 @@ ohos_unittest("meta_file_clouddisk_test") { "${distributedfile_path}/utils/log/src/utils_log.cpp", "${distributedfile_path}/utils/system/src/utils_directory.cpp", "${distributedfile_path}/test/unittests/cloudsync_sa/mock/cloud_file_utils_mock.cpp", + "mock/assistant.cpp", "mock/file_utils_mock.cpp", "mock/system_function_mock.cpp", "meta_file_clouddisk_test.cpp", diff --git a/test/unittests/cloud_disk/file_operations_base_test.cpp b/test/unittests/cloud_disk/file_operations_base_test.cpp index 4083e9ccb..72913f979 100644 --- a/test/unittests/cloud_disk/file_operations_base_test.cpp +++ b/test/unittests/cloud_disk/file_operations_base_test.cpp @@ -50,6 +50,7 @@ void FileOperationBaseTest::TearDownTestCase(void) void FileOperationBaseTest::SetUp(void) { GTEST_LOG_(INFO) << "SetUp"; + AssistantMock::EnableMock(); insMock = std::make_shared(); Assistant::ins = insMock; } @@ -57,6 +58,7 @@ void FileOperationBaseTest::SetUp(void) void FileOperationBaseTest::TearDown(void) { GTEST_LOG_(INFO) << "TearDown"; + AssistantMock::DisableMock(); Assistant::ins = nullptr; insMock = nullptr; } diff --git a/test/unittests/cloud_disk/file_operations_cloud_test.cpp b/test/unittests/cloud_disk/file_operations_cloud_test.cpp index ac3ba97cc..e69345c75 100644 --- a/test/unittests/cloud_disk/file_operations_cloud_test.cpp +++ b/test/unittests/cloud_disk/file_operations_cloud_test.cpp @@ -60,6 +60,7 @@ public: void FileOperationsCloudTest::SetUpTestCase(void) { fileOperationsCloud_ = make_shared(); + AssistantMock::EnableMock(); insMock = make_shared(); Assistant::ins = insMock; GTEST_LOG_(INFO) << "SetUpTestCase"; @@ -67,6 +68,7 @@ void FileOperationsCloudTest::SetUpTestCase(void) void FileOperationsCloudTest::TearDownTestCase(void) { + AssistantMock::DisableMock(); Assistant::ins = nullptr; insMock = nullptr; fileOperationsCloud_ = nullptr; @@ -1731,6 +1733,60 @@ HWTEST_F(FileOperationsCloudTest, MkDirTest005, TestSize.Level1) GTEST_LOG_(INFO) << "MkDirTest005 End"; } +/** + * @tc.name: MkDirTest006 + * @tc.desc: Verify the MkDir function, name is conflict. + * @tc.type: FUNC + * @tc.require: ICTXJ9 + */ +HWTEST_F(FileOperationsCloudTest, MkDirTest006, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "MkDirTest006 Start"; + try { + CloudDiskFuseData data; + fuse_req_t req = nullptr; + fuse_ino_t parent = 0; + const char *name = ".cloudFileVersionConflict"; + mode_t mode = 0; + + EXPECT_CALL(*insMock, fuse_req_userdata(_)).WillOnce(Return(reinterpret_cast(&data))); + EXPECT_CALL(*insMock, fuse_reply_err(_, _)).WillOnce(Return(E_OK)); + fileOperationsCloud_->MkDir(req, parent, name, mode); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "MkDirTest006 ERROR"; + } + GTEST_LOG_(INFO) << "MkDirTest006 End"; +} + +/** + * @tc.name: MkDirTest007 + * @tc.desc: Verify the MkDir function, name is conflict. + * @tc.type: FUNC + * @tc.require: ICTXJ9 + */ +HWTEST_F(FileOperationsCloudTest, MkDirTest007, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "MkDirTest007 Start"; + try { + CloudDiskFuseData data; + fuse_req_t req = nullptr; + fuse_ino_t parent = 0; + const char *name = "testDirName"; + mode_t mode = 0; + + EXPECT_CALL(*insMock, fuse_req_userdata(_)).WillOnce(Return(reinterpret_cast(&data))); + EXPECT_CALL(*insMock, fuse_reply_err(_, _)).WillOnce(Return(E_OK)); + fileOperationsCloud_->MkDir(req, parent, name, mode); + EXPECT_TRUE(true); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "MkDirTest007 ERROR"; + } + GTEST_LOG_(INFO) << "MkDirTest007 End"; +} + /** * @tc.name: RmDirTest001 * @tc.desc: Verify the RmDir function diff --git a/test/unittests/cloud_disk/file_operations_helper_test.cpp b/test/unittests/cloud_disk/file_operations_helper_test.cpp index 8811478f6..6d37f28ef 100644 --- a/test/unittests/cloud_disk/file_operations_helper_test.cpp +++ b/test/unittests/cloud_disk/file_operations_helper_test.cpp @@ -45,6 +45,7 @@ void FuseOperationsHelperTest::SetUpTestCase(void) { GTEST_LOG_(INFO) << "SetUpTestCase"; fuseoperationshelper_ = make_shared(); + AssistantMock::EnableMock(); insMock = make_shared(); Assistant::ins = insMock; } @@ -52,6 +53,7 @@ void FuseOperationsHelperTest::SetUpTestCase(void) void FuseOperationsHelperTest::TearDownTestCase(void) { GTEST_LOG_(INFO) << "TearDownTestCase"; + AssistantMock::DisableMock(); fuseoperationshelper_ = nullptr; Assistant::ins = nullptr; insMock = nullptr; diff --git a/test/unittests/cloud_disk/file_range_lock_test.cpp b/test/unittests/cloud_disk/file_range_lock_test.cpp index 7ff712d2c..b512076ea 100644 --- a/test/unittests/cloud_disk/file_range_lock_test.cpp +++ b/test/unittests/cloud_disk/file_range_lock_test.cpp @@ -46,12 +46,14 @@ void FileRangeLockTest::SetUp(void) { GTEST_LOG_(INFO) << "SetUp"; insMock = std::make_shared(); + CloudDisk::AssistantMock::EnableMock(); CloudDisk::Assistant::ins = insMock; } void FileRangeLockTest::TearDown(void) { GTEST_LOG_(INFO) << "TearDown"; + CloudDisk::AssistantMock::DisableMock(); CloudDisk::Assistant::ins = nullptr; insMock = nullptr; } diff --git a/test/unittests/cloud_disk/meta_file_clouddisk_test.cpp b/test/unittests/cloud_disk/meta_file_clouddisk_test.cpp index a1921e3ca..1930b0a30 100644 --- a/test/unittests/cloud_disk/meta_file_clouddisk_test.cpp +++ b/test/unittests/cloud_disk/meta_file_clouddisk_test.cpp @@ -49,12 +49,14 @@ void MetaFileCloudDiskTest::SetUp(void) { GTEST_LOG_(INFO) << "SetUp"; insMock = std::make_shared(); + CloudDisk::AssistantMock::EnableMock(); CloudDisk::Assistant::ins = insMock; } void MetaFileCloudDiskTest::TearDown(void) { GTEST_LOG_(INFO) << "TearDown"; + CloudDisk::AssistantMock::DisableMock(); CloudDisk::Assistant::ins = nullptr; insMock = nullptr; } diff --git a/test/unittests/cloud_disk/mock/assistant.cpp b/test/unittests/cloud_disk/mock/assistant.cpp new file mode 100644 index 000000000..3f41b7f73 --- /dev/null +++ b/test/unittests/cloud_disk/mock/assistant.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "assistant.h" + +#include +#include + +namespace OHOS { +namespace FileManagement { +namespace CloudDisk { + +void AssistantMock::EnableMock() +{ + Assistant::mockable = true; +} + +void AssistantMock::DisableMock() +{ + ins = nullptr; + Assistant::mockable = false; +} + +bool AssistantMock::IsMockable() +{ + return Assistant::mockable; +} + +} // namespace CloudDisk +} // namespace FileManagement +} // namespace OHOS + +#ifdef __cplusplus +extern "C" { +using namespace OHOS::FileManagement::CloudDisk; + +constexpr int32_t TEST_ERR = 2; + +off_t lseek(int fd, off_t offset, int whence) +{ + if (AssistantMock::IsMockable()) { + return Assistant::ins->lseek(fd, offset, whence); + } + + static off_t (*realLseek)() = []() { + auto func = (off_t (*)())dlsym(RTLD_NEXT, "lseek"); + if (!func) { + GTEST_LOG_(ERROR) << "Failed to resolve real lseek: " << dlerror(); + } + return func; + }(); + + if (!realLseek) { + return -1; + } + + return realLseek(); +} + +int access(const char *name, int type) +{ + if (AssistantMock::IsMockable()) { + return Assistant::ins->access(name, type); + } + + static int (*realAccess)() = []() { + auto func = (int (*)())dlsym(RTLD_NEXT, "access"); + if (!func) { + GTEST_LOG_(ERROR) << "Failed to resolve real access: " << dlerror(); + } + return func; + }(); + + if (!realAccess) { + return -1; + } + + return realAccess(); +} + +int close(int fd) +{ + if (AssistantMock::IsMockable()) { + return Assistant::ins->close(fd); + } + + static int (*realClose)() = []() { + auto func = (int (*)())dlsym(RTLD_NEXT, "close"); + if (!func) { + GTEST_LOG_(ERROR) << "Failed to resolve real close: " << dlerror(); + } + return func; + }(); + + if (!realClose) { + return -1; + } + + return realClose(); +} + +int fstat(int fd, struct stat *buf) +{ + if (AssistantMock::IsMockable()) { + errno = TEST_ERR; + return Assistant::ins->fstat(fd, buf); + } + + static int (*realFstat)() = []() { + auto func = (int (*)())dlsym(RTLD_NEXT, "fstat"); + if (!func) { + GTEST_LOG_(ERROR) << "Failed to resolve real fstat: " << dlerror(); + } + return func; + }(); + + if (!realFstat) { + return -1; + } + + return realFstat(); +} + +int fcntl(int fd, int op, ...) +{ + if (AssistantMock::IsMockable()) { + errno = TEST_ERR; + return Assistant::ins->fcntl(fd, op); + } + + static int (*realFcntl)() = []() { + auto func = (int (*)())dlsym(RTLD_NEXT, "fcntl"); + if (!func) { + GTEST_LOG_(ERROR) << "Failed to resolve real fcntl: " << dlerror(); + } + return func; + }(); + + if (!realFcntl) { + return -1; + } + + return realFcntl(); +} + +int ftruncate(int fd, off_t length) +{ + if (AssistantMock::IsMockable()) { + return Assistant::ins->ftruncate(fd, length); + } + + static int (*realFtruncate)() = []() { + auto func = (int (*)())dlsym(RTLD_NEXT, "ftruncate"); + if (!func) { + GTEST_LOG_(ERROR) << "Failed to resolve real ftruncate: " << dlerror(); + } + return func; + }(); + + if (!realFtruncate) { + return -1; + } + + return realFtruncate(); +} +} // extern "C" +#endif \ No newline at end of file diff --git a/test/unittests/cloud_disk/mock/assistant.h b/test/unittests/cloud_disk/mock/assistant.h index 693fb2901..78ca81703 100644 --- a/test/unittests/cloud_disk/mock/assistant.h +++ b/test/unittests/cloud_disk/mock/assistant.h @@ -76,6 +76,7 @@ public: virtual int64_t ReadFile(int fd, off_t offset, size_t size, void *data) = 0; virtual int64_t WriteFile(int fd, const void *data, off_t offset, size_t size) = 0; virtual int FilePosLock(int fd, off_t offset, size_t size, int type) = 0; + static inline bool mockable = false; }; class AssistantMock : public Assistant { @@ -110,6 +111,10 @@ public: MOCK_METHOD4(ReadFile, int64_t(int fd, off_t offset, size_t size, void *data)); MOCK_METHOD4(WriteFile, int64_t(int fd, const void *data, off_t offset, size_t size)); MOCK_METHOD4(FilePosLock, int(int fd, off_t offset, size_t size, int type)); + + static void EnableMock(); + static void DisableMock(); + static bool IsMockable(); }; } // namespace OHOS::FileManagement::CloudDisk #endif // TEST_UNITTESTS_CLOUD_DISK_ASSISTANT_H \ No newline at end of file diff --git a/test/unittests/cloud_disk/mock/system_function_mock.cpp b/test/unittests/cloud_disk/mock/system_function_mock.cpp index de91964cb..33e85ef6f 100644 --- a/test/unittests/cloud_disk/mock/system_function_mock.cpp +++ b/test/unittests/cloud_disk/mock/system_function_mock.cpp @@ -21,42 +21,9 @@ #include "assistant.h" -constexpr int32_t TEST_ERR = 2; - using namespace OHOS::FileManagement::CloudDisk; -int access(const char *name, int type) -{ - return Assistant::ins->access(name, type); -} int open(const char *file, int oflag) { return Assistant::ins->open(file, oflag); -} - -int close(int fd) -{ - return Assistant::ins->close(fd); -} - -off_t lseek(int fd, off_t offset, int whence) -{ - return Assistant::ins->lseek(fd, offset, whence); -} - -int fstat(int fd, struct stat *buf) -{ - errno = TEST_ERR; - return Assistant::ins->fstat(fd, buf); -} - -int fcntl(int fd, int op, ...) -{ - errno = TEST_ERR; - return Assistant::ins->fcntl(fd, op); -} - -int ftruncate(int fd, off_t length) -{ - return Assistant::ins->ftruncate(fd, length); } \ No newline at end of file -- Gitee