Add UartDevice module test code.

This commit is contained in:
fancy 2024-01-24 08:20:47 -08:00
parent 9a6ca65cde
commit 20c2ad46aa
21 changed files with 548 additions and 42 deletions

View File

@ -138,6 +138,7 @@ loop 光敏检测
小核 ->> 小核:ircut切换-消耗0ms 小核 ->> 小核:ircut切换-消耗0ms
小核 ->> 小核:Sensor初始化 小核 ->> 小核:Sensor初始化
小核 --> 大核:Sensor初始化完成-100ms 小核 --> 大核:Sensor初始化完成-100ms
deactivate 小核
activate 大核 activate 大核
大核 ->> 大核:内核快启抓拍1P/3P-200ms 大核 ->> 大核:内核快启抓拍1P/3P-200ms
大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms 大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms
@ -156,7 +157,6 @@ loop 光敏检测
大核 ->> MCU:关机 大核 ->> MCU:关机
MCU ->> 大核:断电 MCU ->> 大核:断电
end end
deactivate 小核
deactivate 大核 deactivate 大核
end end
end end
@ -190,6 +190,7 @@ opt PIR信号触发
小核 ->> 小核:ircut切换-消耗0ms 小核 ->> 小核:ircut切换-消耗0ms
小核 ->> 小核:Sensor初始化 小核 ->> 小核:Sensor初始化
小核 --> 大核:Sensor初始化完成-100ms 小核 --> 大核:Sensor初始化完成-100ms
deactivate 小核
activate 大核 activate 大核
大核 ->> 大核:内核快启抓拍1P/3P-200ms 大核 ->> 大核:内核快启抓拍1P/3P-200ms
大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms 大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms
@ -223,7 +224,6 @@ opt PIR信号触发
MCU ->> 大核:断电 MCU ->> 大核:断电
end end
end end
deactivate 小核
deactivate 大核 deactivate 大核
else 主控已经开机 else 主控已经开机
MCU ->> +大核:发送抓拍指令 MCU ->> +大核:发送抓拍指令
@ -257,6 +257,7 @@ opt 根据定时参数上电
小核 ->> 小核:ircut切换-消耗0ms 小核 ->> 小核:ircut切换-消耗0ms
小核 ->> 小核:Sensor初始化 小核 ->> 小核:Sensor初始化
小核 --> 大核:Sensor初始化完成-100ms 小核 --> 大核:Sensor初始化完成-100ms
deactivate 小核
activate 大核 activate 大核
大核 ->> 大核:内核快启抓拍1P/3P-200ms 大核 ->> 大核:内核快启抓拍1P/3P-200ms
大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms 大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms
@ -283,7 +284,6 @@ opt 根据定时参数上电
大核 ->> MCU:关机 大核 ->> MCU:关机
MCU ->> 小核:断电 MCU ->> 小核:断电
MCU ->> 大核:断电 MCU ->> 大核:断电
deactivate 小核
deactivate 大核 deactivate 大核
end end
``` ```
@ -315,6 +315,7 @@ opt TEST拨键-ON
小核 ->> 小核:ircut切换-消耗0ms 小核 ->> 小核:ircut切换-消耗0ms
小核 ->> 小核:Sensor初始化 小核 ->> 小核:Sensor初始化
小核 --> 大核:Sensor初始化完成-100ms 小核 --> 大核:Sensor初始化完成-100ms
deactivate 小核
大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms 大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms
大核 ->> 大核:启动脚本启动APP-?ms 大核 ->> 大核:启动脚本启动APP-?ms
大核 ->> +MCU:获取启动模式 大核 ->> +MCU:获取启动模式
@ -339,7 +340,6 @@ opt TEST拨键-ON
end end
end end
end end
deactivate 小核
deactivate 大核 deactivate 大核
end end
``` ```
@ -362,6 +362,7 @@ MCU ->> 小核:上电
activate 大核 activate 大核
小核 ->> 小核:Sensor初始化 小核 ->> 小核:Sensor初始化
小核 --> 大核:Sensor初始化完成-100ms 小核 --> 大核:Sensor初始化完成-100ms
deactivate 小核
大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms 大核 ->> 大核:内核启动(文件系统/挂载sd卡-?ms
大核 ->> 大核:启动脚本启动APP-?ms 大核 ->> 大核:启动脚本启动APP-?ms
alt TEST拨键-ON alt TEST拨键-ON
@ -383,7 +384,6 @@ MCU ->> 小核:上电
MCU ->> 大核:断电 MCU ->> 大核:断电
end end
end end
deactivate 小核
deactivate 大核 deactivate 大核
``` ```
@ -528,9 +528,97 @@ end
###### 1.4.3.2.5.1. 协议格式 ###### 1.4.3.2.5.1. 协议格式
| 协议头 | 命令字 | 长度 | 数据段 | 校验位 | 协议尾 | | 协议头 | 命令字 | 长度 | 数据段 | 校验码 |
|----|----|----|----|----|----| |----|----|----|----|----|
| 2字节<br>0xFAC1 | 2字节 | 2字节 | - | - | 2字节<br>0xFAC9 | | 2字节<br>0xFAC1 | 2字节 | 2字节 | - | 2字节 |
**校验码算法**
&emsp;&emsp; 校验码算法使用ModBus CRC16方法计算。
**参考代码(查表法)**
```
/* Table of CRC values for highorder byte */
unsigned char chCRCHi[] ={
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
};
/* Table of CRC values for loworder byte */
unsigned char chCRCLo[] ={
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};
/**
* @brief 计算校验和
*
* @param pData 数据指针
* @param length 数据长度
* @return unsigned short
*/
unsigned short Calculate_Check_Sum(const unsigned char* pData, unsigned short length)
{
unsigned char CRCHi = 0xFF;
unsigned char CRCLo = 0xFF;
int uIndex;
while (length--)
{
uIndex = CRCHi ^ *pData++;
CRCHi = CRCLo ^ chCRCHi[uIndex];
CRCLo = chCRCLo[uIndex];
}
return (CRCHi << 8 | CRCLo);
}
```
###### 1.4.3.2.5.2. 协议内容 ###### 1.4.3.2.5.2. 协议内容
@ -556,7 +644,7 @@ end
| 0x8108 | ask | - | Data[0]:灵敏度<br>0-9 | 设置PIR灵敏度 | - | | 0x8108 | ask | - | Data[0]:灵敏度<br>0-9 | 设置PIR灵敏度 | - |
| 0x0108 | - | reply | Data[0]:结果<br>0x01:成功<br>0x02:失败 | 设置PIR灵敏度回复 | - | | 0x0108 | - | reply | Data[0]:结果<br>0x01:成功<br>0x02:失败 | 设置PIR灵敏度回复 | - |
| 0x8109 | ask | - | Data[0]:Hour<br>0-23<br>Data[1]:Min<br>0-59<br>Data[2]:Sec<br>0-59 | 设置连拍间隔 | - | | 0x8109 | ask | - | Data[0]:Hour<br>0-23<br>Data[1]:Min<br>0-59<br>Data[2]:Sec<br>0-59 | 设置连拍间隔 | - |
| 0x0108 | - | reply | Data[0]:结果<br>0x01:成功<br>0x02:失败 | 设置连拍间隔回复 | - | | 0x0109 | - | reply | Data[0]:结果<br>0x01:成功<br>0x02:失败 | 设置连拍间隔回复 | - |
##### 1.4.3.2.6. IPC配置库 ##### 1.4.3.2.6. IPC配置库

View File

@ -1,8 +1,5 @@
# cmake_minimum_required(VERSION 2.8.0) # cmake_minimum_required(VERSION 2.8.0)
# Mock Linux api.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TEST_LINUX_MOCK}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TEST_LINUX_MOCK}")
# Compile gtest for test code. # Compile gtest for test code.
execute_process(COMMAND sh build_gtest.sh ${TARGET_PLATFORM} ${PLATFORM_PATH} ${PLATFORM_PATH} WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/gtest/) execute_process(COMMAND sh build_gtest.sh ${TARGET_PLATFORM} ${PLATFORM_PATH} ${PLATFORM_PATH} WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/gtest/)
execute_process(COMMAND mv ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/lib/libgtest.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgtest.a execute_process(COMMAND mv ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/lib/libgtest.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgtest.a
@ -10,6 +7,26 @@ execute_process(COMMAND mv ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11
execute_process(COMMAND mv ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/lib/libgmock.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgmock.a execute_process(COMMAND mv ${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googlemock/lib/libgmock.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgmock.a
WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/gtest/) WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/gtest/)
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=tcgetattr" CACHE STRING INTERNAL FORCE)
# set(TEST_LINUX_MOCK "${TEST_LINUX_MOCK},--wrap=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=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=linux_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=linux_fread" 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}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TEST_LINUX_MOCK}")
# build gtest and gmock # build gtest and gmock
# add_custom_command( # add_custom_command(
# OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libgtest.a # OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libgtest.a

View File

@ -3,5 +3,7 @@ add_subdirectory(Config)
add_subdirectory(Log) add_subdirectory(Log)
add_subdirectory(SharedData) add_subdirectory(SharedData)
add_subdirectory(WebServer) add_subdirectory(WebServer)
add_subdirectory(UartDevice)
add_subdirectory(LinuxApiMock)

View File

@ -0,0 +1,52 @@
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}/Log/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 SRC_FILES)
set(TARGET_NAME LinuxApiMock)
add_library(${TARGET_NAME} STATIC ${SRC_FILES})
target_link_libraries(${TARGET_NAME} Log)
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
add_custom_target(
LinuxApiMock_code_check
COMMAND ${CLANG_TIDY_EXE}
-checks='${CLANG_TIDY_CHECKS}'
--header-filter=.*
--system-headers=false
${SRC_FILES}
${CLANG_TIDY_CONFIG}
-p ${PLATFORM_PATH}/cmake-shell
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/utils/LinuxApiMock
)
file(GLOB_RECURSE HEADER_FILES *.h)
add_custom_target(
LinuxApiMock_code_format
COMMAND ${CLANG_FORMAT_EXE}
-style=file
-i ${SRC_FILES} ${HEADER_FILES}
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/utils/LinuxApiMock
)
add_custom_command(
TARGET ${TARGET_NAME}
PRE_BUILD
COMMAND make LinuxApiMock_code_check
COMMAND make LinuxApiMock_code_format
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
)
endif()
define_file_name(${TARGET_NAME})

View File

@ -0,0 +1,3 @@
# 1. Linux 系统函数模拟接口
&emsp;&emsp; 为了方便在ubuntu系统进行代码的调试运行对Linux标准函数进行多态转换。

View File

@ -0,0 +1,30 @@
#ifndef LINUX_API_MOCK_H
#define LINUX_API_MOCK_H
#include <memory>
#ifdef __cplusplus
extern "C" {
#endif
// Modify all the real api.
int __real_fx_open(const char *pathname, int flags);
#ifdef __cplusplus
}
#endif
class LinuxApiMock
{
public:
LinuxApiMock() = default;
virtual ~LinuxApiMock() = default;
static std::shared_ptr<LinuxApiMock> &GetInstance(std::shared_ptr<LinuxApiMock> *impl = nullptr)
{
static auto instance = std::make_shared<LinuxApiMock>();
if (impl) {
// The non-thread-safe changing is only for gtest.
instance = *impl;
}
return instance;
}
virtual void Init() {}
virtual void UnInit() {}
virtual int fx_open(const char *pathname, int flags);
};
#endif

View File

@ -0,0 +1,10 @@
#include "LinuxApiMock.h"
#ifdef __cplusplus
extern "C" {
#endif
// Modify all the wrap api.
int __wrap_fx_open(const char *pathname, int flags) { return LinuxApiMock::GetInstance()->fx_open(pathname, flags); }
#ifdef __cplusplus
}
#endif
int LinuxApiMock::fx_open(const char *pathname, int flags) { return __real_fx_open(pathname, flags); }

View File

@ -1,3 +1,17 @@
/*
* 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 <gmock/gmock.h> #include <gmock/gmock.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <thread> #include <thread>

View File

@ -12,8 +12,8 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#include "SharedData.h"
#include "ILog.h" #include "ILog.h"
#include "SharedData.h"
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
namespace SharedDataTest namespace SharedDataTest

View File

@ -0,0 +1,71 @@
# include(${CMAKE_SOURCE_DIR}/build/independent_source.cmake)
include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake)
set(EXECUTABLE_OUTPUT_PATH ${TEST_OUTPUT_PATH}/bin)
include_directories(
${UTILS_SOURCE_PATH}/StatusCode/include
${UTILS_SOURCE_PATH}/Log/include
${UTILS_SOURCE_PATH}/UartDevice/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
)
link_directories(
${LIBS_OUTPUT_PATH}
${EXTERNAL_LIBS_OUTPUT_PATH}
)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
aux_source_directory(. SRC_FILES)
aux_source_directory(./src SRC_FILES)
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
aux_source_directory(./src_mock SRC_FILES)
endif()
set(TARGET_NAME UartDeviceTest)
add_executable(${TARGET_NAME} ${SRC_FILES})
target_link_libraries(${TARGET_NAME} UartDevice gtest gmock pthread Log)
if(${TEST_COVERAGE} MATCHES "true")
target_link_libraries(${TARGET_NAME} gcov)
endif()
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
target_link_libraries(${TARGET_NAME} LinuxApiMock)
endif()
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
add_custom_target(
UartDeviceTest_code_check
COMMAND ${CLANG_TIDY_EXE}
-checks='${CLANG_TIDY_CHECKS}'
--header-filter=.*
--system-headers=false
${SRC_FILES}
${CLANG_TIDY_CONFIG}
# --line-filter='[{\"name\":\"${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include/getest/gtest.h\"}]'
--line-filter='[{\"name\":\"${EXTERNAL_SOURCE_PATH}/gtest/googletest-release-1.11.0/googletest/include/getest/*.h\"}]'
-p ${PLATFORM_PATH}/cmake-shell
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/utils/UartDevice
)
file(GLOB_RECURSE HEADER_FILES *.h)
add_custom_target(
UartDeviceTest_code_format
COMMAND ${CLANG_FORMAT_EXE}
-style=file
-i ${SRC_FILES} ${HEADER_FILES}
WORKING_DIRECTORY ${TEST_SOURCE_PATH}/utils/UartDevice
)
add_custom_command(
TARGET ${TARGET_NAME}
PRE_BUILD
COMMAND make UartDeviceTest_code_check
COMMAND make UartDeviceTest_code_format
WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/
)
endif()
define_file_name(${TARGET_NAME})

View 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 <gmock/gmock.h>
#include <gtest/gtest.h>
#include <thread>
#include <unistd.h>
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

View File

@ -0,0 +1,59 @@
/*
* 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 "ILog.h"
#include "UartDevice.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace UartDeviceTest
{
// ../output_files/test/bin/UartDeviceTest --gtest_filter=UartDeviceTest.IllegalObject
/**
* UartDevice module api will not crash when object is illegal.
*/
TEST(UartDeviceTest, IllegalObject)
{
CreateLogModule();
ILogInit(LOG_INSTANCE_TYPE_END);
IUartOpen(nullptr);
IUartSend(nullptr, nullptr, 0);
IUartRecv(nullptr, nullptr, 0, 0);
IUartTcflush(nullptr);
IUartDeviceFree(nullptr);
int illegalObject = 0;
void *object = &illegalObject;
IUartOpen(object);
IUartSend(object, nullptr, 0);
IUartRecv(object, nullptr, 0, 0);
IUartTcflush(object);
IUartDeviceFree(object);
ILogUnInit();
}
// ../output_files/test/bin/UartDeviceTest --gtest_filter=UartDeviceTest.Demo
TEST(UartDeviceTest, Demo)
{
CreateLogModule();
ILogInit(LOG_INSTANCE_TYPE_END);
uart_info device = {
"dev/s1",
};
void *object = CreateUartDevice(device);
IUartOpen(object);
// IUartSend(object, nullptr, 0);
// IUartRecv(object, nullptr, 0, 0);
// IUartTcflush(object);
IUartDeviceFree(object);
ILogUnInit();
}
} // namespace UartDeviceTest

View File

@ -0,0 +1,67 @@
/*
* 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 "ILog.h"
#include "LinuxApiMock.h"
#include "UartDevice.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));
};
class UartDeviceMockTest : public testing::Test
{
public:
UartDeviceMockTest() {}
virtual ~UartDeviceMockTest() {}
static void SetUpTestCase()
{
CreateLogModule();
ILogInit(LOG_INSTANCE_TYPE_END);
}
static void TearDownTestCase() { ILogUnInit(); }
virtual void SetUp() {}
virtual void TearDown() {}
};
// ../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);
IUartOpen(object);
// IUartSend(object, nullptr, 0);
// IUartRecv(object, nullptr, 0, 0);
// IUartTcflush(object);
IUartDeviceFree(object);
}
} // namespace UartDeviceMockTest

View File

@ -17,7 +17,8 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int FX_system(const char *command); int fx_system(const char *command);
int fx_open(const char *pathname, int flags);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -13,5 +13,14 @@
* limitations under the License. * limitations under the License.
*/ */
#include "LinuxApi.h" #include "LinuxApi.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
int FX_system(const char *command) { return system(command); } #include <sys/stat.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
int fx_system(const char *command) { return system(command); }
int fx_open(const char *pathname, int flags) { return open(pathname, flags); }

View File

@ -33,7 +33,7 @@ StatusCode SharedMemory::MakeSharedMemory(const int &size)
char touchPath[128] = {0}; char touchPath[128] = {0};
if (access(mPath, F_OK) != 0) { if (access(mPath, F_OK) != 0) {
sprintf(touchPath, "%s %s", "touch", mPath); sprintf(touchPath, "%s %s", "touch", mPath);
FX_system(touchPath); fx_system(touchPath);
} }
key_t key = ftok(mPath, mProjectId); key_t key = ftok(mPath, mProjectId);
if (key < 0) { if (key < 0) {

View File

@ -5,6 +5,7 @@ set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH})
include_directories( include_directories(
./src ./src
./include ./include
${UTILS_SOURCE_PATH}/LinuxApi/include
${UTILS_SOURCE_PATH}/StatusCode/include ${UTILS_SOURCE_PATH}/StatusCode/include
${UTILS_SOURCE_PATH}/Log/include ${UTILS_SOURCE_PATH}/Log/include
) )
@ -19,7 +20,7 @@ aux_source_directory(./src SRC_FILES)
set(TARGET_NAME UartDevice) set(TARGET_NAME UartDevice)
add_library(${TARGET_NAME} STATIC ${SRC_FILES}) add_library(${TARGET_NAME} STATIC ${SRC_FILES})
target_link_libraries(${TARGET_NAME} StatusCode Log) target_link_libraries(${TARGET_NAME} LinuxApi StatusCode Log)
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true") if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
add_custom_target( add_custom_target(

View File

@ -28,28 +28,12 @@ typedef struct uart_info
const int mStopBits; const int mStopBits;
const int mParity; const int mParity;
} UartInfo; } UartInfo;
typedef struct uart_device UartDevice; void *CreateUartDevice(const UartInfo info);
typedef struct uart_device const StatusCode IUartOpen(void *object);
{ const size_t IUartSend(void *object, const char *buff, const size_t buffLength);
const StatusCode (*mOpen)(UartDevice *); const size_t IUartRecv(void *object, char *buff, const size_t buffLength, const unsigned int timeoutMs);
const size_t (*mSend)(UartDevice *, const char *, const size_t); void IUartTcflush(void *object);
const size_t (*mRecv)(UartDevice *, char *, const size_t, const unsigned int); void IUartDeviceFree(void *object);
void (*mTcflush)(UartDevice *);
void (*mFree)(void *);
} UartDevice;
UartDevice *CreateUartDevice(const UartInfo info);
static inline const StatusCode IUartOpen(UartDevice *object) { return object->mOpen(object); }
static inline const size_t IUartSend(UartDevice *object, const char *buff, const size_t buffLength)
{
return object->mSend(object, buff, buffLength);
}
static inline const size_t IUartRecv(UartDevice *object, char *buff, const size_t buffLength,
const unsigned int timeoutMs)
{
return object->mRecv(object, buff, buffLength, timeoutMs);
}
static inline void IUartTcflush(UartDevice *object) { return object->mTcflush(object); }
static inline void IUartDeviceFree(UartDevice *object) { object->mFree(object); }
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -13,5 +13,67 @@
* limitations under the License. * limitations under the License.
*/ */
#include "UartDevice.h" #include "UartDevice.h"
#include "ILog.h"
#include "StatusCode.h"
#include "UartDeviceImpl.h" #include "UartDeviceImpl.h"
UartDevice *CreateUartDevice(const UartInfo info) { return NewUartDeviceImpl(info); } void *CreateUartDevice(const UartInfo info) { return NewUartDeviceImpl(info); }
const StatusCode IUartOpen(void *object)
{
if (nullptr == object) {
LogError("nullptr object!\n");
return CreateStatusCode(STATUS_CODE_NOT_OK);
}
if (*((const char **)(((char *)object) - sizeof(UartDeviceHeader))) != GetUartDeviceModuleName()) {
LogError("Illegal object!\n");
return CreateStatusCode(STATUS_CODE_NOT_OK);
}
return ((UartDevice *)object)->mOpen((UartDevice *)object);
}
const size_t IUartSend(void *object, const char *buff, const size_t buffLength)
{
if (nullptr == object) {
LogError("nullptr object!\n");
return 0;
}
if (*((const char **)(((char *)object) - sizeof(UartDeviceHeader))) != GetUartDeviceModuleName()) {
LogError("Illegal object!\n");
return 0;
}
return ((UartDevice *)object)->mSend((UartDevice *)object, buff, buffLength);
}
const size_t IUartRecv(void *object, char *buff, const size_t buffLength, const unsigned int timeoutMs)
{
if (nullptr == object) {
LogError("nullptr object!\n");
return 0;
}
if (*((const char **)(((char *)object) - sizeof(UartDeviceHeader))) != GetUartDeviceModuleName()) {
LogError("Illegal object!\n");
return 0;
}
return ((UartDevice *)object)->mRecv((UartDevice *)object, buff, buffLength, timeoutMs);
}
void IUartTcflush(void *object)
{
if (nullptr == object) {
LogError("nullptr object!\n");
return;
}
if (*((const char **)(((char *)object) - sizeof(UartDeviceHeader))) != GetUartDeviceModuleName()) {
LogError("Illegal object!\n");
return;
}
((UartDevice *)object)->mTcflush((UartDevice *)object);
}
void IUartDeviceFree(void *object)
{
if (nullptr == object) {
LogError("nullptr object!\n");
return;
}
if (*((const char **)(((char *)object) - sizeof(UartDeviceHeader))) != GetUartDeviceModuleName()) {
LogError("Illegal object!\n");
return;
}
((UartDevice *)object)->mFree((UartDevice *)object);
}

View File

@ -14,6 +14,7 @@
*/ */
#include "UartDeviceImpl.h" #include "UartDeviceImpl.h"
#include "ILog.h" #include "ILog.h"
#include "LinuxApi.h"
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include <errno.h> #include <errno.h>
@ -24,10 +25,11 @@
#include <unistd.h> #include <unistd.h>
constexpr int INVALID_FD = -1; constexpr int INVALID_FD = -1;
static const char *UART_DEVICE_NAME = "uart_device"; static const char *UART_DEVICE_NAME = "uart_device";
const char *GetUartDeviceModuleName(void) { return UART_DEVICE_NAME; }
UartDeviceImpl::UartDeviceImpl(const UartInfo &uatrInfo) : mUatrInfo(uatrInfo) { mFd = -1; } UartDeviceImpl::UartDeviceImpl(const UartInfo &uatrInfo) : mUatrInfo(uatrInfo) { mFd = -1; }
const StatusCode UartDeviceImpl::UartOpen(void) const StatusCode UartDeviceImpl::UartOpen(void)
{ {
mFd = open(mUatrInfo.mDevice, O_RDWR | O_NOCTTY | O_NONBLOCK); mFd = fx_open(mUatrInfo.mDevice, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (INVALID_FD == mFd) { if (INVALID_FD == mFd) {
perror("Can't Open Serial Port"); perror("Can't Open Serial Port");
return CreateStatusCode(STATUS_CODE_NOT_OK); return CreateStatusCode(STATUS_CODE_NOT_OK);
@ -148,7 +150,7 @@ const StatusCode UartDeviceImpl::SetConfig(void)
options.c_cflag |= CS8; options.c_cflag |= CS8;
break; break;
default: default:
fprintf(stderr, "Unsupported data size\n"); LogError("Unsupported data size\n");
return CreateStatusCode(STATUS_CODE_NOT_OK); return CreateStatusCode(STATUS_CODE_NOT_OK);
} }
@ -242,6 +244,7 @@ static void UartImpllFree(void *ptr)
} }
UartDevice *NewUartDeviceImpl(const UartInfo &uartInfo) UartDevice *NewUartDeviceImpl(const UartInfo &uartInfo)
{ {
LogInfo("Create the uart device object.\n");
UartDeviceImpl_S *impl = (UartDeviceImpl_S *)malloc(sizeof(UartDeviceImpl_S)); UartDeviceImpl_S *impl = (UartDeviceImpl_S *)malloc(sizeof(UartDeviceImpl_S));
UartDeviceImpl_S tmp; UartDeviceImpl_S tmp;
memcpy((void *)impl, (void *)&tmp, sizeof(UartDeviceImpl_S)); memcpy((void *)impl, (void *)&tmp, sizeof(UartDeviceImpl_S));

View File

@ -41,6 +41,15 @@ private:
const UartInfo mUatrInfo; const UartInfo mUatrInfo;
int mFd; int mFd;
}; };
typedef struct uart_device UartDevice;
typedef struct uart_device
{
const StatusCode (*mOpen)(UartDevice *);
const size_t (*mSend)(UartDevice *, const char *, const size_t);
const size_t (*mRecv)(UartDevice *, char *, const size_t, const unsigned int);
void (*mTcflush)(UartDevice *);
void (*mFree)(void *);
} UartDevice;
typedef struct uart_device_impl UartDeviceImpl_S; typedef struct uart_device_impl UartDeviceImpl_S;
typedef struct uart_device_impl typedef struct uart_device_impl
{ {
@ -53,4 +62,5 @@ static inline UartDeviceImpl_S *UartDeviceImplConvert(UartDevice *object)
{ {
return ((UartDeviceImpl_S *)(((char *)object) - sizeof(UartDeviceHeader))); return ((UartDeviceImpl_S *)(((char *)object) - sizeof(UartDeviceHeader)));
} }
const char *GetUartDeviceModuleName(void);
#endif #endif