From f02d2b4a6d2683850acec269c4445fda4ddaef6a Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Sun, 28 Apr 2024 17:46:54 +0800 Subject: [PATCH] Improve:HalTestTool --- hal/CMakeLists.txt | 4 +- hal/build/hal.cmake | 2 + hal/src/HalMakePtr.cpp | 2 +- hal/src/SdCardHal.cpp | 20 ++++----- test/CMakeLists.txt | 9 +--- .../src_mock/HunttingCameraTest.cpp | 1 + test/hal/tool/CMakeLists.txt | 2 + test/hal/tool/include/HalTestTool.h | 4 ++ test/hal/tool/src/HalMakePtrTest.cpp | 12 ++++-- test/hal/tool/src/HalMakePtrTest.h | 5 ++- test/hal/tool/src/HalTestTool.cpp | 17 +++++++- test/hal/tool/src/SdCardHalMock.cpp | 20 ++++++++- test/hal/tool/src/SdCardHalMock.h | 8 +++- test/middleware/AppManager/CMakeLists.txt | 1 + test/middleware/DeviceManager/CMakeLists.txt | 1 + test/middleware/MediaManager/CMakeLists.txt | 1 + .../utils/LinuxApiMock/include/LinuxApiMock.h | 41 ++++--------------- test/utils/LinuxApiMock/src/LinuxApiMock.cpp | 23 +++++++++++ test/utils/LinuxApiMock/src/LinuxTestImpl.cpp | 12 ++++++ test/utils/LinuxApiMock/src/WrapApi.cpp | 5 +++ test/utils/LinuxApiMock/src/WrapApi.h | 1 + utils/LinuxApi/include/LinuxApi.h | 2 + utils/LinuxApi/src/LinuxApi.c | 4 ++ 23 files changed, 135 insertions(+), 62 deletions(-) create mode 100644 hal/build/hal.cmake diff --git a/hal/CMakeLists.txt b/hal/CMakeLists.txt index 22fc61f6..54717885 100644 --- a/hal/CMakeLists.txt +++ b/hal/CMakeLists.txt @@ -1,5 +1,6 @@ include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/build/hal.cmake) set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) @@ -16,9 +17,6 @@ include_directories( # ${EXTERNAL_SOURCE_PATH}/curl/curl-8.1.2/build/lib # ) -add_definitions(-DSD_CARD_DEV=\"${SD_CARD_DEV}\") -add_definitions(-DSD_CARD_MOUNT_PATH=\"${SD_CARD_MOUNT_PATH}\") - aux_source_directory(./abstract ABSTRACT_SRC_FILES) aux_source_directory(./src IMPL_SRC_FILES) diff --git a/hal/build/hal.cmake b/hal/build/hal.cmake new file mode 100644 index 00000000..e4095002 --- /dev/null +++ b/hal/build/hal.cmake @@ -0,0 +1,2 @@ +add_definitions(-DSD_CARD_DEV=\"${SD_CARD_DEV}\") +add_definitions(-DSD_CARD_MOUNT_PATH=\"${SD_CARD_MOUNT_PATH}\") \ No newline at end of file diff --git a/hal/src/HalMakePtr.cpp b/hal/src/HalMakePtr.cpp index 42b6e93a..5e4346cd 100644 --- a/hal/src/HalMakePtr.cpp +++ b/hal/src/HalMakePtr.cpp @@ -78,7 +78,7 @@ StatusCode HalMakePtr::CreateHalSharePtr(std::shared_ptr &impl) } StatusCode HalMakePtr::CreateWifiHal(std::shared_ptr &impl) { - LogWarning("CreateWifiHal.\n"); + LogInfo("CreateWifiHal.\n"); impl = std::make_shared(); return CreateStatusCode(STATUS_CODE_OK); } diff --git a/hal/src/SdCardHal.cpp b/hal/src/SdCardHal.cpp index 349b4971..5dbd01b6 100644 --- a/hal/src/SdCardHal.cpp +++ b/hal/src/SdCardHal.cpp @@ -23,6 +23,7 @@ #include #include #include +const char *SD_CARD_DEVICE = SD_CARD_DEV; SdCardHal::SdCardHal() { mThreadRuning = false; @@ -48,16 +49,15 @@ void SdCardHal::UnInit(void) } void SdCardHal::DevDetectingThread(void) { - constexpr int SLEEP_TIME_MS = 100; + constexpr int SLEEP_TIME_MS = 1000; SdCardHalStatus status = SdCardHalStatus::END; int fd = -1; - // const char *dev = "/dev/mmcblk1p1"; - const char *dev = SD_CARD_DEV; + // const char *SD_CARD_DEVICE = "/SD_CARD_DEVICE/mmcblk1p1"; mThreadRuning = true; while (mThreadRuning) { - fd = fx_open(dev, O_RDONLY); + fd = fx_open(SD_CARD_DEVICE, O_RDONLY); if (fd < 0) { - LogInfo("sdCardHal: %s open failed.\n", dev); + LogInfo("sdCardHal: %s open failed.\n", SD_CARD_DEVICE); if (SdCardHalStatus::PULL_OUT != status) { status = SdCardHalStatus::PULL_OUT; ReportDetecedChangedResult(status); @@ -65,8 +65,8 @@ void SdCardHal::DevDetectingThread(void) goto CONTINUE; } struct stat sdStat; - if (fstat(fd, &sdStat) < 0) { - LogInfo("sdCardHal: %s fstat failed.\n", dev); + if (fx_fstat(fd, &sdStat) < 0) { + LogInfo("sdCardHal: %s fstat failed.\n", SD_CARD_DEVICE); if (SdCardHalStatus::ERROR != status) { status = SdCardHalStatus::ERROR; ReportDetecedChangedResult(status); @@ -74,14 +74,14 @@ void SdCardHal::DevDetectingThread(void) goto CONTINUE; } if (!S_ISBLK(sdStat.st_mode)) { - LogInfo("sdCardHal: %s is not block device.\n", dev); + LogInfo("sdCardHal: %s is not block device.\n", SD_CARD_DEVICE); if (SdCardHalStatus::PULL_OUT != status) { status = SdCardHalStatus::PULL_OUT; ReportDetecedChangedResult(status); } } else { - LogInfo("sdCardHal: %s is inserted.\n", dev); + LogInfo("sdCardHal: %s is inserted.\n", SD_CARD_DEVICE); if (SdCardHalStatus::INSERTED != status) { status = SdCardHalStatus::INSERTED; ReportDetecedChangedResult(status); @@ -100,7 +100,7 @@ void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status) } monitor->ReportEvent(status); if (SdCardHalStatus::INSERTED == status) { - LogInfo("mount sd dev %s.\n", SD_CARD_MOUNT_PATH); + LogInfo("mount sd SD_CARD_DEVICE %s.\n", SD_CARD_MOUNT_PATH); constexpr int BUF_LENGTH = 128; char cmd[BUF_LENGTH] = {0}; snprintf(cmd, BUF_LENGTH, "mount %s %s", SD_CARD_DEV, SD_CARD_MOUNT_PATH); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index abd7caab..070b2d96 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -20,19 +20,12 @@ endif() if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX}) message("linux mock api will be set.") set(TEST_LINUX_MOCK "-Wl,--wrap=fx_open" CACHE STRING INTERNAL FORCE) + set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=fx_fstat" CACHE STRING INTERNAL FORCE) set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=fx_tcgetattr" CACHE STRING INTERNAL FORCE) set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=fx_tcsetattr" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=gethostbyname" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=connect" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=socket" CACHE STRING INTERNAL FORCE) set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=fx_select" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=linux_open" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=linux_read" CACHE STRING INTERNAL FORCE) set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=fx_write" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=linux_close" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=linux_fclose" CACHE STRING INTERNAL FORCE) set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=fx_read" CACHE STRING INTERNAL FORCE) - # set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=linux_fcntl" CACHE STRING INTERNAL FORCE) endif() # Mock Linux api. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TEST_LINUX_MOCK}") diff --git a/test/application/HunttingCamera/src_mock/HunttingCameraTest.cpp b/test/application/HunttingCamera/src_mock/HunttingCameraTest.cpp index b16495a1..395eb080 100644 --- a/test/application/HunttingCamera/src_mock/HunttingCameraTest.cpp +++ b/test/application/HunttingCamera/src_mock/HunttingCameraTest.cpp @@ -49,6 +49,7 @@ void HunttingCameraTest::SetUp() LinuxApiMock::GetInstance(&test); LinuxApiMock::GetInstance()->Init(); McuManagerTestTool::Init(mLinuxTest); + HalTestTool::InitSdCardHal(mLinuxTest); TestManager::Init(); } void HunttingCameraTest::TearDown() diff --git a/test/hal/tool/CMakeLists.txt b/test/hal/tool/CMakeLists.txt index 46a6cde1..88566d5c 100644 --- a/test/hal/tool/CMakeLists.txt +++ b/test/hal/tool/CMakeLists.txt @@ -1,4 +1,5 @@ include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +include(${HAL_SOURCE_PATH}/build/hal.cmake) set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) @@ -11,6 +12,7 @@ include_directories( ${UTILS_SOURCE_PATH}/LedControl/include ${HAL_SOURCE_PATH}/src ${TEST_SOURCE_PATH} + ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include ) # link_directories( # ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs diff --git a/test/hal/tool/include/HalTestTool.h b/test/hal/tool/include/HalTestTool.h index 24b9750c..feca78a3 100644 --- a/test/hal/tool/include/HalTestTool.h +++ b/test/hal/tool/include/HalTestTool.h @@ -17,12 +17,14 @@ #include "GtestUsing.h" #include "IHalCpp.h" #include "LedControl.h" +#include "LinuxApiMock.h" class HalTestTool { public: HalTestTool() = default; virtual ~HalTestTool() = default; void Init(void); + void InitSdCardHal(std::shared_ptr &mock); void UnInit(void); /** * @brief Set the All Keys Result object @@ -67,6 +69,7 @@ private: // About camera hal void InitAllCamerasMock(std::map> &allCameras); void InitCamerasMock(std::shared_ptr &vMock); +private: // About sd card hal public: static std::shared_ptr MakeKeyHalTest(const std::string &keyName); static std::shared_ptr MakeLedHalTest(const std::string &ledName); @@ -77,5 +80,6 @@ private: std::map> mAllKeys; std::map> mAllLeds; std::map> mAllCameras; + std::shared_ptr mSdCardHal; }; #endif \ No newline at end of file diff --git a/test/hal/tool/src/HalMakePtrTest.cpp b/test/hal/tool/src/HalMakePtrTest.cpp index 04ff2b9c..ca38a6d2 100644 --- a/test/hal/tool/src/HalMakePtrTest.cpp +++ b/test/hal/tool/src/HalMakePtrTest.cpp @@ -14,12 +14,13 @@ */ #include "HalMakePtrTest.h" #include "ILog.h" -void OverrideHalMakePtrObject(std::shared_ptr &halMock) +void OverrideHalMakePtrObject(std::shared_ptr &halMock, std::shared_ptr &sdCardHalMock) { std::shared_ptr impl = std::make_shared(); std::shared_ptr test = std::dynamic_pointer_cast(impl); if (test) { test->mHalCppMock = halMock; + test->mSdCardHalMock = sdCardHalMock; } HalMakePtr::GetInstance(&impl); } @@ -29,18 +30,18 @@ void CancelOverrideHalMakePtrObject(void) std::shared_ptr test = std::dynamic_pointer_cast(tmp); if (test) { test->mHalCppMock.reset(); + test->mSdCardHalMock.reset(); } std::shared_ptr impl = std::make_shared(); HalMakePtr::GetInstance(&impl); } HalMakePtrTest::HalMakePtrTest() { - // } HalMakePtrTest::~HalMakePtrTest() { - // mHalCppMock.reset(); + mSdCardHalMock.reset(); } StatusCode HalMakePtrTest::CreateHalSharePtr(std::shared_ptr &impl) { @@ -52,4 +53,9 @@ StatusCode HalMakePtrTest::CreateHalSharePtr(std::shared_ptr &impl) LogWarning("CreateMcuManager failed:mHalCppMock is nullptr.\n"); } return CreateStatusCode(STATUS_CODE_OK); +} +StatusCode HalMakePtrTest::CreateSdCardHal(std::shared_ptr &impl) +{ + impl = mSdCardHalMock; + return CreateStatusCode(STATUS_CODE_OK); } \ No newline at end of file diff --git a/test/hal/tool/src/HalMakePtrTest.h b/test/hal/tool/src/HalMakePtrTest.h index 681320a0..93cf6c1d 100644 --- a/test/hal/tool/src/HalMakePtrTest.h +++ b/test/hal/tool/src/HalMakePtrTest.h @@ -18,7 +18,8 @@ #include "HalMakePtr.h" #include "HalTestTool.h" #include "KeyControlMock.h" -void OverrideHalMakePtrObject(std::shared_ptr &halMock); +#include "SdCardHalMock.h" +void OverrideHalMakePtrObject(std::shared_ptr &halMock, std::shared_ptr &sdCardHalMock); void CancelOverrideHalMakePtrObject(void); class HalMakePtrTest : public HalMakePtr { @@ -26,8 +27,10 @@ public: HalMakePtrTest(); virtual ~HalMakePtrTest(); StatusCode CreateHalSharePtr(std::shared_ptr &impl) override; + StatusCode CreateSdCardHal(std::shared_ptr &impl) override; public: std::shared_ptr mHalCppMock; + std::shared_ptr mSdCardHalMock; }; #endif \ No newline at end of file diff --git a/test/hal/tool/src/HalTestTool.cpp b/test/hal/tool/src/HalTestTool.cpp index d20bf2ce..97971ce6 100644 --- a/test/hal/tool/src/HalTestTool.cpp +++ b/test/hal/tool/src/HalTestTool.cpp @@ -20,14 +20,27 @@ #include "KeyControl.h" #include "KeyControlMock.h" #include "LedControlMock.h" +#include "SdCardHalMock.h" #include "WifiHalMock.h" #include void HalTestTool::Init(void) { mHalMock = std::make_shared(); + mSdCardHal = std::make_shared(); HalMockInit(mHalMock); - std::shared_ptr mock = std::dynamic_pointer_cast(mHalMock); - OverrideHalMakePtrObject(mock); + // TODO: 初始化mSdCardHal + std::shared_ptr halMock = std::dynamic_pointer_cast(mHalMock); + std::shared_ptr sdCardHalMock = std::dynamic_pointer_cast(mSdCardHal); + OverrideHalMakePtrObject(halMock, sdCardHalMock); +} +void HalTestTool::InitSdCardHal(std::shared_ptr &mock) +{ + std::shared_ptr sdCardHal = std::dynamic_pointer_cast(mSdCardHal); + if (nullptr == sdCardHal) { + LogError("SdCardHalMock is null.\n"); + return; + } + sdCardHal->SetLinuxTest(mock); } void HalTestTool::UnInit(void) { diff --git a/test/hal/tool/src/SdCardHalMock.cpp b/test/hal/tool/src/SdCardHalMock.cpp index 2574bc3c..c1979512 100644 --- a/test/hal/tool/src/SdCardHalMock.cpp +++ b/test/hal/tool/src/SdCardHalMock.cpp @@ -12,4 +12,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "SdCardHalMock.h" \ No newline at end of file +#include "SdCardHalMock.h" +#include "ILog.h" +extern const char *SD_CARD_DEVICE; +SdCardHalMock::SdCardHalMock() +{ + mDevFd = -1; +} +void SdCardHalMock::SetLinuxTest(std::shared_ptr &mock) +{ + constexpr int FSTAT_SUCCESS = 0; + mLinuxTest = mock; + mDevFd = mLinuxTest->GetHandleForMock(); + EXPECT_CALL(*mock.get(), fx_open(SD_CARD_DEVICE, _)).WillRepeatedly(DoAll((Return(mDevFd)))); + auto fstatFunc = [=, &mock](int fd, struct stat *statbuf) { + statbuf->st_mode = S_IFBLK | 0600; + }; + EXPECT_CALL(*mock.get(), fx_fstat(mDevFd, _)) + .WillRepeatedly(DoAll(WithArgs<0, 1>(Invoke(fstatFunc)), Return(FSTAT_SUCCESS))); +} \ No newline at end of file diff --git a/test/hal/tool/src/SdCardHalMock.h b/test/hal/tool/src/SdCardHalMock.h index ab97d630..72fb110e 100644 --- a/test/hal/tool/src/SdCardHalMock.h +++ b/test/hal/tool/src/SdCardHalMock.h @@ -15,11 +15,17 @@ #ifndef SD_CARD_HAL_MOCK_H #define SD_CARD_HAL_MOCK_H #include "IHalCpp.h" +#include "LinuxApiMock.h" #include "SdCardHal.h" class SdCardHalMock : public SdCardHal { public: - SdCardHalMock() = default; + SdCardHalMock(); virtual ~SdCardHalMock() = default; + void SetLinuxTest(std::shared_ptr &mock); + +private: + std::shared_ptr mLinuxTest; + int mDevFd; }; #endif \ No newline at end of file diff --git a/test/middleware/AppManager/CMakeLists.txt b/test/middleware/AppManager/CMakeLists.txt index 878917d8..95db319b 100644 --- a/test/middleware/AppManager/CMakeLists.txt +++ b/test/middleware/AppManager/CMakeLists.txt @@ -17,6 +17,7 @@ include_directories( ${MIDDLEWARE_SOURCE_PATH}/AppManager/src ${TEST_SOURCE_PATH} ${TEST_SOURCE_PATH}/hal/tool/include + ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/include ) diff --git a/test/middleware/DeviceManager/CMakeLists.txt b/test/middleware/DeviceManager/CMakeLists.txt index afe34319..c7950fc6 100644 --- a/test/middleware/DeviceManager/CMakeLists.txt +++ b/test/middleware/DeviceManager/CMakeLists.txt @@ -15,6 +15,7 @@ include_directories( ${MIDDLEWARE_SOURCE_PATH}/DeviceManager/src ${TEST_SOURCE_PATH} ${TEST_SOURCE_PATH}/hal/tool/include + ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/include ) diff --git a/test/middleware/MediaManager/CMakeLists.txt b/test/middleware/MediaManager/CMakeLists.txt index fa189660..443a29d7 100644 --- a/test/middleware/MediaManager/CMakeLists.txt +++ b/test/middleware/MediaManager/CMakeLists.txt @@ -16,6 +16,7 @@ include_directories( ${MIDDLEWARE_SOURCE_PATH}/MediaManager/include ${TEST_SOURCE_PATH} ${TEST_SOURCE_PATH}/hal/tool/include + ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/include ) diff --git a/test/utils/LinuxApiMock/include/LinuxApiMock.h b/test/utils/LinuxApiMock/include/LinuxApiMock.h index 25596af1..4b1106f8 100644 --- a/test/utils/LinuxApiMock/include/LinuxApiMock.h +++ b/test/utils/LinuxApiMock/include/LinuxApiMock.h @@ -23,39 +23,16 @@ class LinuxApiMock public: LinuxApiMock() = default; virtual ~LinuxApiMock() = default; - static std::shared_ptr &GetInstance(std::shared_ptr *impl = nullptr) - { - static auto instance = std::make_shared(); - if (impl) { - // The non-thread-safe changing is only for gtest. - instance = *impl; - } - return instance; - } - virtual void Init() - { - } - virtual void UnInit() - { - } + static std::shared_ptr &GetInstance(std::shared_ptr *impl = nullptr); + virtual void Init(); + virtual void UnInit(); virtual int fx_open(const char *pathname, int flags); virtual int fx_tcgetattr(int fd, struct termios *termios_p); virtual int fx_tcsetattr(int fd, int optional_actions, const struct termios *termios_p); virtual ssize_t fx_write(int fd, const void *buf, size_t count); virtual ssize_t fx_read(int fd, void *buf, size_t count); virtual int fx_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); - -public: - /** - * @brief - * - */ - // virtual void ApiLock(void) {} - /** - * @brief - * - */ - // virtual void ApiUnlock(void) {} + virtual int fx_fstat(int fd, struct stat *statbuf); }; /** * A simulation interface class used for automated testing in Ubuntu systems, implementing the function of piling on @@ -72,17 +49,17 @@ public: MOCK_METHOD3(fx_write, ssize_t(int, const void *, size_t)); MOCK_METHOD3(fx_read, ssize_t(int, void *, size_t)); MOCK_METHOD5(fx_select, int(int, fd_set *, fd_set *, fd_set *, struct timeval *)); + MOCK_METHOD2(fx_fstat, int(int, struct stat *)); public: /** * @brief Get the Handle For Mock object - * + * Obtain a globally unique test handle throughout the entire testing cycle, and the handle generated through this + * interface can avoid handle conflicts between different testing modules. Attention needs to be paid to whether it + * conflicts with non test handles generated by the system. * @return int */ - virtual int GetHandleForMock(void) - { - return INVALID_HANDLE; - } + virtual int GetHandleForMock(void); public: static std::shared_ptr CreateLinuxTest(void); diff --git a/test/utils/LinuxApiMock/src/LinuxApiMock.cpp b/test/utils/LinuxApiMock/src/LinuxApiMock.cpp index 5d1a812d..13871bc2 100644 --- a/test/utils/LinuxApiMock/src/LinuxApiMock.cpp +++ b/test/utils/LinuxApiMock/src/LinuxApiMock.cpp @@ -16,6 +16,21 @@ #include "ILog.h" #include "LinuxTestImpl.h" #include "WrapApi.h" +std::shared_ptr &LinuxApiMock::GetInstance(std::shared_ptr *impl) +{ + static auto instance = std::make_shared(); + if (impl) { + // The non-thread-safe changing is only for gtest. + instance = *impl; + } + return instance; +} +void LinuxApiMock::Init() +{ +} +void LinuxApiMock::UnInit() +{ +} int LinuxApiMock::fx_open(const char *pathname, int flags) { // LogInfo("Call the real api.\n"); @@ -45,9 +60,17 @@ int LinuxApiMock::fx_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set // LogInfo("Call the real api.\n"); return __real_fx_select(nfds, readfds, writefds, exceptfds, timeout); } +int LinuxApiMock::fx_fstat(int fd, struct stat *statbuf) +{ + return __real_fx_fstat(fd, statbuf); +} std::shared_ptr LinuxTest::CreateLinuxTest(void) { std::shared_ptr test = std::make_shared(); LinuxTestImpl::ApiInit(test); return test; +} +int LinuxTest::GetHandleForMock(void) +{ + return INVALID_HANDLE; } \ No newline at end of file diff --git a/test/utils/LinuxApiMock/src/LinuxTestImpl.cpp b/test/utils/LinuxApiMock/src/LinuxTestImpl.cpp index e50892d1..e22304d1 100644 --- a/test/utils/LinuxApiMock/src/LinuxTestImpl.cpp +++ b/test/utils/LinuxApiMock/src/LinuxTestImpl.cpp @@ -91,6 +91,18 @@ void LinuxTestImpl::ApiInit(std::shared_ptr &mock) WithArgs<0, 1, 2, 3, 4>(Invoke(api_select)), Invoke((std::dynamic_pointer_cast(mock)).get(), &LinuxTestImpl::ApiUnlockThread), ReturnPointee(&selectResult))); + static int fstatResult = -1; + auto api_fstat = [=](int fd, struct stat *statbuf) { + LogInfo("Call __real_fx_fstat, fd = %d.\n", fd); + fstatResult = __real_fx_fstat(fd, statbuf); + LogInfo("fstatResult = %d\n", fstatResult); + }; + EXPECT_CALL(*mock.get(), fx_fstat(_, _)) + .WillRepeatedly( + DoAll(Invoke((std::dynamic_pointer_cast(mock)).get(), &LinuxTestImpl::ApiLock), + WithArgs<0, 1>(Invoke(api_fstat)), + Invoke((std::dynamic_pointer_cast(mock)).get(), &LinuxTestImpl::ApiUnlockThread), + ReturnPointee(&fstatResult))); } void LinuxTestImpl::Init() { diff --git a/test/utils/LinuxApiMock/src/WrapApi.cpp b/test/utils/LinuxApiMock/src/WrapApi.cpp index 7c67a468..5ce08179 100644 --- a/test/utils/LinuxApiMock/src/WrapApi.cpp +++ b/test/utils/LinuxApiMock/src/WrapApi.cpp @@ -41,6 +41,11 @@ int __wrap_fx_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *except { return LinuxApiMock::GetInstance()->fx_select(nfds, readfds, writefds, exceptfds, timeout); } +int __wrap_fx_fstat(int fd, struct stat *statbuf) +{ + // TODO: 在此处加锁,优化打桩时,接口需要调用真实接口并返回真实接口的返回值返回全局变量的多线程安全问题。 + return LinuxApiMock::GetInstance()->fx_fstat(fd, statbuf); +} #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/test/utils/LinuxApiMock/src/WrapApi.h b/test/utils/LinuxApiMock/src/WrapApi.h index ced75c54..d371a5a4 100644 --- a/test/utils/LinuxApiMock/src/WrapApi.h +++ b/test/utils/LinuxApiMock/src/WrapApi.h @@ -28,6 +28,7 @@ int __real_fx_tcsetattr(int fd, int optional_actions, const struct termios *term ssize_t __real_fx_write(int fd, const void *buf, size_t count); ssize_t __real_fx_read(int fd, void *buf, size_t count); int __real_fx_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +int __real_fx_fstat(int fd, struct stat *statbuf); #ifdef __cplusplus } #endif diff --git a/utils/LinuxApi/include/LinuxApi.h b/utils/LinuxApi/include/LinuxApi.h index b0168e8a..d7b8a042 100644 --- a/utils/LinuxApi/include/LinuxApi.h +++ b/utils/LinuxApi/include/LinuxApi.h @@ -16,6 +16,7 @@ #define LINUX_API_H #include #include +#include #include #include #include @@ -30,6 +31,7 @@ int fx_tcsetattr(int fd, int optional_actions, const struct termios *termios_p); ssize_t fx_write(int fd, const void *buf, size_t count); ssize_t fx_read(int fd, void *buf, size_t count); int fx_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +int fx_fstat(int fd, struct stat *statbuf); #ifdef __cplusplus } #endif diff --git a/utils/LinuxApi/src/LinuxApi.c b/utils/LinuxApi/src/LinuxApi.c index 337e6c3e..381785fa 100644 --- a/utils/LinuxApi/src/LinuxApi.c +++ b/utils/LinuxApi/src/LinuxApi.c @@ -49,4 +49,8 @@ ssize_t fx_read(int fd, void *buf, size_t count) int fx_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) { return select(nfds, readfds, writefds, exceptfds, timeout); +} +int fx_fstat(int fd, struct stat *statbuf) +{ + return fstat(fd, statbuf); } \ No newline at end of file