diff --git a/test/middleware/CMakeLists.txt b/test/middleware/CMakeLists.txt index 66b159a9..2f0de7b8 100644 --- a/test/middleware/CMakeLists.txt +++ b/test/middleware/CMakeLists.txt @@ -1,4 +1,5 @@ # cmake_minimum_required(VERSION 2.8.0) add_subdirectory(IpcConfig) -add_subdirectory(McuManager) \ No newline at end of file +add_subdirectory(McuManager) +add_subdirectory(McuAskBase) \ No newline at end of file diff --git a/test/middleware/McuAskBase/CMakeLists.txt b/test/middleware/McuAskBase/CMakeLists.txt new file mode 100644 index 00000000..f4e8c70d --- /dev/null +++ b/test/middleware/McuAskBase/CMakeLists.txt @@ -0,0 +1,2 @@ + +add_subdirectory(tool) \ No newline at end of file diff --git a/test/middleware/McuAskBase/tool/CMakeLists.txt b/test/middleware/McuAskBase/tool/CMakeLists.txt new file mode 100644 index 00000000..b18d013f --- /dev/null +++ b/test/middleware/McuAskBase/tool/CMakeLists.txt @@ -0,0 +1,60 @@ +include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) +set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) + +include_directories( + ./src + ./include + ${UTILS_SOURCE_PATH}/StatusCode/include + ${UTILS_SOURCE_PATH}/Log/include + ${MIDDLEWARE_SOURCE_PATH}/McuAskBase/include + ${MIDDLEWARE_SOURCE_PATH}/McuManager/include + # ${UTILS_SOURCE_PATH}/UartDevice/include + # ${UTILS_SOURCE_PATH}/ModBusCRC16/include + # ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include + # ${TEST_SOURCE_PATH}/utils/UartDevice/tool/include + ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include + ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/include +) +# link_directories( +# ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs +# ) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +aux_source_directory(./src TEST_TOOL_SRC_FILES) +set(TEST_TOOL_TARGET McuAskBaseTestTool) +add_library(${TEST_TOOL_TARGET} STATIC ${TEST_TOOL_SRC_FILES}) +target_link_libraries(${TEST_TOOL_TARGET} UartDeviceTestTool Log) + +if ("${CLANG_TIDY_SUPPORT}" MATCHES "true") +add_custom_target( + McuAskBaseTestTool_code_check + COMMAND ${CLANG_TIDY_EXE} + -checks='${CLANG_TIDY_CHECKS}' + --header-filter=.* + --system-headers=false + ${TEST_TOOL_SRC_FILES} + ${CLANG_TIDY_CONFIG} + -p ${PLATFORM_PATH}/cmake-shell + WORKING_DIRECTORY ${TEST_SOURCE_PATH}/middleware/McuAskBase/tool +) +file(GLOB_RECURSE HEADER_FILES *.h) +add_custom_target( + McuAskBaseTestTool_code_format + COMMAND ${CLANG_FORMAT_EXE} + -style=file + -i ${TEST_TOOL_SRC_FILES} ${HEADER_FILES} + WORKING_DIRECTORY ${TEST_SOURCE_PATH}/middleware/McuAskBase/tool +) +add_custom_command( + TARGET ${TEST_TOOL_TARGET} + PRE_BUILD + COMMAND make McuAskBaseTestTool_code_check + COMMAND make McuAskBaseTestTool_code_format + WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ +) +endif() + +define_file_name(${TEST_TOOL_TARGET}) \ No newline at end of file diff --git a/test/middleware/McuAskBase/tool/include/McuAskBaseTestTool.h b/test/middleware/McuAskBase/tool/include/McuAskBaseTestTool.h new file mode 100644 index 00000000..c025c141 --- /dev/null +++ b/test/middleware/McuAskBase/tool/include/McuAskBaseTestTool.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2023 Fancy Code. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MCU_ASK_BASE_TEST_TOOL_H +#define MCU_ASK_BASE_TEST_TOOL_H +#include "McuAskBase.h" +#include +#include +using ::testing::_; +using ::testing::Action; +using ::testing::ActionInterface; +using ::testing::AnyNumber; +using ::testing::Assign; +using ::testing::AtLeast; +using ::testing::ByMove; +using ::testing::ByRef; +using ::testing::DefaultValue; +using ::testing::DoAll; +using ::testing::DoDefault; +using ::testing::IgnoreResult; +using ::testing::Invoke; +using ::testing::InvokeWithoutArgs; +using ::testing::MakePolymorphicAction; +using ::testing::PolymorphicAction; +using ::testing::Return; +using ::testing::ReturnNew; +using ::testing::ReturnNull; +using ::testing::ReturnPointee; +using ::testing::ReturnRef; +using ::testing::ReturnRefOfCopy; +using ::testing::ReturnRoundRobin; +using ::testing::SaveArg; +using ::testing::SetArgPointee; +using ::testing::SetArgumentPointee; +using ::testing::Unused; +using ::testing::WithArgs; +using ::testing::internal::BuiltInDefaultValue; +class McuAskBaseTest : public McuAskBase +{ +public: + McuAskBaseTest(const McuAskBlock isBlock, const McuAskReply needReply, + const unsigned int timeoutMs = DEFAULT_ASK_TIMEOUT) + : McuAskBase(isBlock, needReply, timeoutMs) + { + // + } + virtual ~McuAskBaseTest() = default; + ASK_RESULT Blocking(void) override; + bool NeedReply(void) override; + void ReplyFinished(const bool result) override; + bool IfTimeout(const unsigned int &integrationTimeMs) override; + +protected: + virtual void BlockingTrace(void) {} + virtual void NeedReplyTrace(void) {} + virtual void ReplyFinishedTrace(const bool result) {} + virtual void IfTimeoutTrace(const unsigned int &integrationTimeMs) {} +}; +class McuAskBaseTestTool : public McuAskBaseTest +{ +public: + McuAskBaseTestTool(const McuAskBlock isBlock, const McuAskReply needReply, + const unsigned int timeoutMs = DEFAULT_ASK_TIMEOUT) + : McuAskBaseTest(isBlock, needReply, timeoutMs) + { + // + } + virtual ~McuAskBaseTestTool() = default; + MOCK_METHOD0(BlockingTrace, void(void)); + MOCK_METHOD0(NeedReplyTrace, void(void)); + MOCK_METHOD1(ReplyFinishedTrace, void(const bool)); + MOCK_METHOD1(IfTimeoutTrace, void(const unsigned int &)); + +public: + static void McuAskDefaultFeatures(std::shared_ptr &mock); +}; +#endif \ No newline at end of file diff --git a/test/middleware/McuAskBase/tool/src/McuAskBaseTestTool.cpp b/test/middleware/McuAskBase/tool/src/McuAskBaseTestTool.cpp new file mode 100644 index 00000000..d3c20b5a --- /dev/null +++ b/test/middleware/McuAskBase/tool/src/McuAskBaseTestTool.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 Fancy Code. + * 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 "McuAskBaseTestTool.h" +ASK_RESULT McuAskBaseTest::Blocking(void) +{ + BlockingTrace(); + return McuAskBase::Blocking(); +} +bool McuAskBaseTest::NeedReply(void) +{ + NeedReplyTrace(); + return McuAskBase::NeedReply(); +} +void McuAskBaseTest::ReplyFinished(const bool result) +{ + ReplyFinishedTrace(result); + McuAskBase::ReplyFinished(result); +} +bool McuAskBaseTest::IfTimeout(const unsigned int &integrationTimeMs) +{ + IfTimeoutTrace(integrationTimeMs); + return McuAskBase::IfTimeout(integrationTimeMs); +} +void McuAskBaseTestTool::McuAskDefaultFeatures(std::shared_ptr &mock) +{ + constexpr int CALL_ONLY_ONCE = 1; + EXPECT_CALL(*mock.get(), BlockingTrace()).Times(CALL_ONLY_ONCE); + EXPECT_CALL(*mock.get(), NeedReplyTrace()).Times(AtLeast(1)); + EXPECT_CALL(*mock.get(), ReplyFinishedTrace(_)).Times(CALL_ONLY_ONCE); + EXPECT_CALL(*mock.get(), IfTimeoutTrace(_)).Times(AnyNumber()); +} \ No newline at end of file diff --git a/test/middleware/McuManager/CMakeLists.txt b/test/middleware/McuManager/CMakeLists.txt index cb5ad3d0..2c1a9cbf 100644 --- a/test/middleware/McuManager/CMakeLists.txt +++ b/test/middleware/McuManager/CMakeLists.txt @@ -14,6 +14,7 @@ include_directories( ${TEST_SOURCE_PATH}/utils/LinuxApiMock/include ${TEST_SOURCE_PATH}/utils/UartDevice/tool/include ${TEST_SOURCE_PATH}/utils/McuProtocol/tool/include + ${TEST_SOURCE_PATH}/middleware/McuAskBase/tool/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/include ) @@ -40,7 +41,7 @@ endif() set(TARGET_NAME McuManagerTest) add_executable(${TARGET_NAME} ${SRC_FILES_MAIN} ${SRC_FILES}) -target_link_libraries(${TARGET_NAME} McuAskBase McuManager McuManagerTestTool gtest gmock pthread) +target_link_libraries(${TARGET_NAME} McuAskBase McuManager McuManagerTestTool McuAskBaseTestTool gtest gmock pthread) if(${TEST_COVERAGE} MATCHES "true") target_link_libraries(${TARGET_NAME} gcov) endif() diff --git a/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp b/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp index 8f32116a..c38a49e3 100644 --- a/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp +++ b/test/middleware/McuManager/src_mock/McuManager_Mock_Test.cpp @@ -2,6 +2,7 @@ #include "IMcuManager.h" #include "LinuxApiMock.h" #include "McuAskBase.h" +#include "McuAskBaseTestTool.h" #include "McuManagerTestTool.h" #include #include @@ -44,17 +45,17 @@ public: // --gtest_filter=McuManagerMockTest.INTEGRATION_McuManager_EXAMPLE_GetIpcMissiony TEST_F(McuManagerMockTest, INTEGRATION_McuManager_EXAMPLE_GetIpcMissiony) { - class McuAskTest : public McuAsk, public McuAskBase + class McuAskTest : public McuAsk, public McuAskBaseTestTool { public: - McuAskTest() : McuAskBase(McuAskBlock::BLOCK, McuAskReply::NEED_REPLY) {} + McuAskTest() : McuAskBaseTestTool(McuAskBlock::BLOCK, McuAskReply::NEED_REPLY) {} virtual ~McuAskTest() = default; void ReplyFinished(const bool result) override { - // - McuAskBase::ReplyFinished(result); + McuAskBaseTestTool::ReplyFinished(result); if (result) { LogInfo("Ask data succeed, mDataReply = %d.\n", static_cast(mDataReply)); + // Do something here. } else { LogError("Ask data falied.\n"); @@ -63,6 +64,8 @@ TEST_F(McuManagerMockTest, INTEGRATION_McuManager_EXAMPLE_GetIpcMissiony) }; IMcuManager::GetInstance()->Init(); std::shared_ptr ask = std::make_shared(); + std::shared_ptr testTool = std::dynamic_pointer_cast(ask); + McuAskBaseTestTool::McuAskDefaultFeatures(testTool); IMcuManager::GetInstance()->GetIpcMission(ask); std::this_thread::sleep_for(std::chrono::milliseconds(2000)); IMcuManager::GetInstance()->UnInit(); diff --git a/test/test_develop.md b/test/test_develop.md index fadb9ed9..15415c0a 100644 --- a/test/test_develop.md +++ b/test/test_develop.md @@ -62,7 +62,11 @@ int main(int argc, char *argv[]) ``` 4. -## 1.2. 目录结构 +## 1.2. TestTool 测试工具 + +   每个独立模块(SDK内具有独立CMakeLists.txt的代码模块)都由对应的TestTool模块,主要用于对该模块的接口进行gmock处理,且对外暴露接口具备复用属性。一般类命名:模块名称+TestTool。 + +## 1.3. 目录结构   所有测试代码位于< test >目录下,< test >下的目录结构保持和< SDK >一致,表示对应sdk代码模块的测试代码; @@ -73,5 +77,5 @@ int main(int argc, char *argv[]) ├── mainTest.cpp ├── src // 芯片平台的测试代码; ├── src_mock // Linux x86测试代码 需要对板载接口打桩进行测试; - └── tool // 该模块需要对外复用的测试代码; + └── tool // TestTool:该模块需要对外复用的测试代码; ``` \ No newline at end of file