mirror of
https://gitee.com/jiuyilian/embedded-framework.git
synced 2025-01-06 10:16:51 -05:00
Improve:UartDevice test code.
This commit is contained in:
parent
9b12014f76
commit
b99d2c9461
|
@ -6,6 +6,8 @@ include_directories(
|
|||
./src
|
||||
./include
|
||||
${UTILS_SOURCE_PATH}/Log/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
|
||||
|
@ -18,7 +20,7 @@ aux_source_directory(./src SRC_FILES)
|
|||
|
||||
set(TARGET_NAME LinuxApiMock)
|
||||
add_library(${TARGET_NAME} STATIC ${SRC_FILES})
|
||||
target_link_libraries(${TARGET_NAME} Log)
|
||||
target_link_libraries(${TARGET_NAME} gtest gmock Log)
|
||||
|
||||
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
|
||||
add_custom_target(
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#ifndef LINUX_API_MOCK_H
|
||||
#define LINUX_API_MOCK_H
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <memory>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -9,6 +11,7 @@ int __real_fx_open(const char *pathname, int flags);
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
constexpr int INVALID_HANDLE = -1;
|
||||
class LinuxApiMock
|
||||
{
|
||||
public:
|
||||
|
@ -27,4 +30,26 @@ public:
|
|||
virtual void UnInit() {}
|
||||
virtual int fx_open(const char *pathname, int flags);
|
||||
};
|
||||
/**
|
||||
* A simulation interface class used for automated testing in Ubuntu systems, implementing the function of piling on
|
||||
* some Linux standard interfaces.
|
||||
*/
|
||||
class LinuxTest : public LinuxApiMock
|
||||
{
|
||||
public:
|
||||
LinuxTest() = default;
|
||||
virtual ~LinuxTest() = default;
|
||||
MOCK_METHOD2(fx_open, int(const char *, int));
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Get the Handle For Mock object
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
virtual int GetHandleForMock(void) { return INVALID_HANDLE; }
|
||||
|
||||
public:
|
||||
static std::shared_ptr<LinuxTest> CreateLinuxTest(void);
|
||||
};
|
||||
#endif
|
22
test/utils/LinuxApiMock/src/HandleManager.cpp
Normal file
22
test/utils/LinuxApiMock/src/HandleManager.cpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* 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 "HandleManager.h"
|
||||
HandleManager::HandleManager() { mFdMax = 1000; }
|
||||
int HandleManager::GetHandleForMock(void)
|
||||
{
|
||||
int value = mFdMax;
|
||||
mFdMax++;
|
||||
return value;
|
||||
}
|
37
test/utils/LinuxApiMock/src/HandleManager.h
Normal file
37
test/utils/LinuxApiMock/src/HandleManager.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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 HANDLE_MANAGER_H
|
||||
#define HANDLE_MANAGER_H
|
||||
#include "LinuxApiMock.h"
|
||||
/**
|
||||
* @brief Handle management class, which manages all handles in the test program to prevent unclear objects pointed to
|
||||
* by handles during simulation.
|
||||
*
|
||||
*/
|
||||
class HandleManager : virtual public LinuxTest
|
||||
{
|
||||
public:
|
||||
HandleManager();
|
||||
virtual ~HandleManager() = default;
|
||||
int GetHandleForMock(void) override;
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
int mFdMax;
|
||||
};
|
||||
#endif
|
|
@ -1,4 +1,6 @@
|
|||
#include "LinuxApiMock.h"
|
||||
#include "ILog.h"
|
||||
#include "LinuxTestImpl.h"
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -7,4 +9,11 @@ int __wrap_fx_open(const char *pathname, int flags) { return LinuxApiMock::GetIn
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
int LinuxApiMock::fx_open(const char *pathname, int flags) { return __real_fx_open(pathname, flags); }
|
||||
int LinuxApiMock::fx_open(const char *pathname, int flags) { return __real_fx_open(pathname, flags); }
|
||||
|
||||
std::shared_ptr<LinuxTest> LinuxTest::CreateLinuxTest(void)
|
||||
{
|
||||
std::shared_ptr<LinuxTest> test = std::make_shared<LinuxTestImpl>();
|
||||
LinuxTestImpl::ApiInit(test);
|
||||
return test;
|
||||
}
|
27
test/utils/LinuxApiMock/src/LinuxTestImpl.cpp
Normal file
27
test/utils/LinuxApiMock/src/LinuxTestImpl.cpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* 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 "LinuxTestImpl.h"
|
||||
#include "ILog.h"
|
||||
void LinuxTestImpl::ApiInit(std::shared_ptr<LinuxTest> &mock)
|
||||
{
|
||||
static int openFd = -1;
|
||||
auto api_open = [](const char *pathname, int flags) {
|
||||
LogInfo("Call __real_fx_open, pathname = %s.\n", pathname);
|
||||
openFd = __real_fx_open(pathname, flags);
|
||||
};
|
||||
EXPECT_CALL(*mock.get(), fx_open(::testing::_, ::testing::_))
|
||||
.WillRepeatedly(::testing::DoAll(::testing::WithArgs<0, 1>(::testing::Invoke(api_open)),
|
||||
::testing::ReturnPointee(&openFd)));
|
||||
}
|
28
test/utils/LinuxApiMock/src/LinuxTestImpl.h
Normal file
28
test/utils/LinuxApiMock/src/LinuxTestImpl.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* 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 LINUX_TEST_IMPL_H
|
||||
#define LINUX_TEST_IMPL_H
|
||||
#include "HandleManager.h"
|
||||
#include "LinuxApiMock.h"
|
||||
class LinuxTestImpl : public HandleManager
|
||||
{
|
||||
public:
|
||||
LinuxTestImpl() = default;
|
||||
virtual ~LinuxTestImpl() = default;
|
||||
|
||||
public:
|
||||
static void ApiInit(std::shared_ptr<LinuxTest> &mock);
|
||||
};
|
||||
#endif
|
|
@ -3,6 +3,7 @@ include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake)
|
|||
set(EXECUTABLE_OUTPUT_PATH ${TEST_OUTPUT_PATH}/bin)
|
||||
|
||||
include_directories(
|
||||
./tool/include
|
||||
${UTILS_SOURCE_PATH}/StatusCode/include
|
||||
${UTILS_SOURCE_PATH}/Log/include
|
||||
${UTILS_SOURCE_PATH}/UartDevice/include
|
||||
|
@ -30,7 +31,7 @@ endif()
|
|||
|
||||
set(TARGET_NAME UartDeviceTest)
|
||||
add_executable(${TARGET_NAME} ${SRC_FILES})
|
||||
target_link_libraries(${TARGET_NAME} UartDevice gtest gmock pthread Log)
|
||||
target_link_libraries(${TARGET_NAME} UartDevice UartDeviceTestTool gtest gmock pthread Log)
|
||||
if(${TEST_COVERAGE} MATCHES "true")
|
||||
target_link_libraries(${TARGET_NAME} gcov)
|
||||
endif()
|
||||
|
@ -68,4 +69,6 @@ add_custom_command(
|
|||
)
|
||||
endif()
|
||||
|
||||
define_file_name(${TARGET_NAME})
|
||||
define_file_name(${TARGET_NAME})
|
||||
|
||||
add_subdirectory(tool)
|
|
@ -15,18 +15,21 @@
|
|||
#include "ILog.h"
|
||||
#include "LinuxApiMock.h"
|
||||
#include "UartDevice.h"
|
||||
#include "UartDeviceTestTool.h"
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
namespace UartDeviceMockTest
|
||||
{
|
||||
class LinuxApiMockTest : public LinuxApiMock
|
||||
{
|
||||
public:
|
||||
LinuxApiMockTest() = default;
|
||||
virtual ~LinuxApiMockTest() = default;
|
||||
MOCK_METHOD2(fx_open, int(const char *, int));
|
||||
const char *gDeviceName = "dev/s1";
|
||||
static uart_info gUartDevice = {
|
||||
gDeviceName,
|
||||
1152000,
|
||||
'N',
|
||||
8,
|
||||
1,
|
||||
'N',
|
||||
};
|
||||
class UartDeviceMockTest : public testing::Test
|
||||
class UartDeviceMockTest : public testing::Test, public UartDeviceTestTool
|
||||
{
|
||||
public:
|
||||
UartDeviceMockTest() {}
|
||||
|
@ -37,27 +40,25 @@ public:
|
|||
ILogInit(LOG_INSTANCE_TYPE_END);
|
||||
}
|
||||
static void TearDownTestCase() { ILogUnInit(); }
|
||||
virtual void SetUp() {}
|
||||
virtual void SetUp()
|
||||
{
|
||||
mLinuxTest = LinuxTest::CreateLinuxTest();
|
||||
std::shared_ptr<LinuxApiMock> test = mLinuxTest;
|
||||
LinuxApiMock::GetInstance(&test);
|
||||
UartDeviceDefaultInit(mLinuxTest, gUartDevice);
|
||||
}
|
||||
virtual void TearDown() {}
|
||||
|
||||
public:
|
||||
std::shared_ptr<LinuxTest> mLinuxTest;
|
||||
// std::shared_ptr<LinuxApiMock> mLinuxApiMock;
|
||||
};
|
||||
// ../output_files/test/bin/UartDeviceTest --gtest_filter=UartDeviceMockTest.Demo
|
||||
TEST_F(UartDeviceMockTest, Demo)
|
||||
{
|
||||
const char *deviceName = "dev/s1";
|
||||
uart_info device = {
|
||||
deviceName,
|
||||
1152000,
|
||||
'N',
|
||||
8,
|
||||
1,
|
||||
'N',
|
||||
};
|
||||
std::shared_ptr<LinuxApiMockTest> tmp = std::make_shared<LinuxApiMockTest>();
|
||||
std::shared_ptr<LinuxApiMock> test = tmp;
|
||||
LinuxApiMock::GetInstance(&test);
|
||||
EXPECT_CALL(*tmp.get(), fx_open(deviceName, ::testing::_))
|
||||
.WillRepeatedly(::testing::DoAll((::testing::Return(1000000000))));
|
||||
void *object = CreateUartDevice(device);
|
||||
// EXPECT_CALL(*mLinuxTest.get(), fx_open(deviceName, ::testing::_))
|
||||
// .WillRepeatedly(::testing::DoAll((::testing::Return(1000000000))));
|
||||
void *object = CreateUartDevice(gUartDevice);
|
||||
IUartOpen(object);
|
||||
// IUartSend(object, nullptr, 0);
|
||||
// IUartRecv(object, nullptr, 0, 0);
|
||||
|
|
53
test/utils/UartDevice/tool/CMakeLists.txt
Normal file
53
test/utils/UartDevice/tool/CMakeLists.txt
Normal file
|
@ -0,0 +1,53 @@
|
|||
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
|
||||
${TEST_SOURCE_PATH}/utils/LinuxApiMock/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 UartDeviceTestTool)
|
||||
add_library(${TEST_TOOL_TARGET} STATIC ${TEST_TOOL_SRC_FILES})
|
||||
target_link_libraries(${TEST_TOOL_TARGET} Log)
|
||||
|
||||
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
|
||||
add_custom_target(
|
||||
UartDeviceTestTool_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}/utils/UartDevice/tool
|
||||
)
|
||||
file(GLOB_RECURSE HEADER_FILES *.h)
|
||||
add_custom_target(
|
||||
UartDeviceTestTool_code_format
|
||||
COMMAND ${CLANG_FORMAT_EXE}
|
||||
-style=file
|
||||
-i ${TEST_TOOL_SRC_FILES} ${HEADER_FILES}
|
||||
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/utils/UartDevice/tool
|
||||
)
|
||||
add_custom_command(
|
||||
TARGET ${TEST_TOOL_TARGET}
|
||||
PRE_BUILD
|
||||
COMMAND make UartDeviceTestTool_code_check
|
||||
COMMAND make UartDeviceTestTool_code_format
|
||||
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
|
||||
)
|
||||
endif()
|
||||
|
||||
define_file_name(${TEST_TOOL_TARGET})
|
3
test/utils/UartDevice/tool/README.md
Normal file
3
test/utils/UartDevice/tool/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# Tool目录
|
||||
|
||||
  基于模块独立的测试辅助工具,可被外界模块复用。
|
31
test/utils/UartDevice/tool/include/UartDeviceTestTool.h
Normal file
31
test/utils/UartDevice/tool/include/UartDeviceTestTool.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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 UART_DEVICE_TEST_TOOL_H
|
||||
#define UART_DEVICE_TEST_TOOL_H
|
||||
#include "LinuxApiMock.h"
|
||||
#include "UartDevice.h"
|
||||
class UartDeviceTestTool
|
||||
{
|
||||
public:
|
||||
UartDeviceTestTool() = default;
|
||||
virtual ~UartDeviceTestTool() = default;
|
||||
/**
|
||||
* @brief Enable the UartDevice module to run and debug on Ubuntu
|
||||
*
|
||||
* @param mock
|
||||
*/
|
||||
void UartDeviceDefaultInit(std::shared_ptr<LinuxTest> &mock, const uart_info &uart);
|
||||
};
|
||||
#endif
|
23
test/utils/UartDevice/tool/src/UartDeviceTestTool.cpp
Normal file
23
test/utils/UartDevice/tool/src/UartDeviceTestTool.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* 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 "UartDeviceTestTool.h"
|
||||
#include "ILog.h"
|
||||
void UartDeviceTestTool::UartDeviceDefaultInit(std::shared_ptr<LinuxTest> &mock, const uart_info &uart)
|
||||
{
|
||||
int uartFd = mock->GetHandleForMock();
|
||||
LogInfo("uartFd = %d\n", uartFd);
|
||||
EXPECT_CALL(*mock.get(), fx_open(uart.mDevice, ::testing::_))
|
||||
.WillRepeatedly(::testing::DoAll((::testing::Return(uartFd))));
|
||||
}
|
Loading…
Reference in New Issue
Block a user