Initial commit: Complete USB2CAN cross-platform framework
Features: - Cross-platform support (Windows/Linux/macOS) - CAN and CANFD protocol support - USB communication (WinUSB/libusb) - Device management and configuration - Message transmission and reception - Filter configuration - CMake build system - Comprehensive examples and tests
This commit is contained in:
54
tests/CMakeLists.txt
Normal file
54
tests/CMakeLists.txt
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* @file CMakeLists.txt
|
||||
* @brief 测试目录构建文件
|
||||
*/
|
||||
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
project(usb2can_tests)
|
||||
|
||||
# 设置C++标准
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# 添加USB2CAN库
|
||||
add_subdirectory(..)
|
||||
|
||||
# 查找需要的包
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# 添加测试源文件
|
||||
set(TEST_SOURCES
|
||||
main.cpp
|
||||
test_platform.cpp
|
||||
test_usb.cpp
|
||||
test_can.cpp
|
||||
test_device.cpp
|
||||
test_api.cpp
|
||||
)
|
||||
|
||||
# 创建测试可执行文件
|
||||
add_executable(usb2can_tests ${TEST_SOURCES})
|
||||
|
||||
# 链接USB2CAN库
|
||||
target_link_libraries(usb2can_tests
|
||||
PRIVATE
|
||||
usb2can
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
# 添加包含目录
|
||||
target_include_directories(usb2can_tests
|
||||
PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../include
|
||||
)
|
||||
|
||||
# 设置输出目录
|
||||
set_target_properties(usb2can_tests PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/tests
|
||||
)
|
||||
|
||||
# 启用测试
|
||||
enable_testing()
|
||||
|
||||
# 添加测试
|
||||
add_test(NAME usb2can_tests COMMAND usb2can_tests)
|
||||
62
tests/main.cpp
Normal file
62
tests/main.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* @file main.cpp
|
||||
* @brief 测试主程序
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <cassert>
|
||||
|
||||
// 测试函数声明
|
||||
bool test_platform();
|
||||
bool test_usb();
|
||||
bool test_can();
|
||||
bool test_device();
|
||||
bool test_api();
|
||||
|
||||
/**
|
||||
* @brief 主函数
|
||||
* @return 测试结果
|
||||
*/
|
||||
int main() {
|
||||
std::cout << "========================================" << std::endl;
|
||||
std::cout << " USB2CAN Framework Tests " << std::endl;
|
||||
std::cout << "========================================" << std::endl;
|
||||
|
||||
// 运行测试
|
||||
bool all_passed = true;
|
||||
|
||||
std::cout << "\n[TEST] Running platform tests..." << std::endl;
|
||||
bool platform_passed = test_platform();
|
||||
std::cout << "[TEST] Platform tests " << (platform_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
all_passed &= platform_passed;
|
||||
|
||||
std::cout << "\n[TEST] Running USB tests..." << std::endl;
|
||||
bool usb_passed = test_usb();
|
||||
std::cout << "[TEST] USB tests " << (usb_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
all_passed &= usb_passed;
|
||||
|
||||
std::cout << "\n[TEST] Running CAN tests..." << std::endl;
|
||||
bool can_passed = test_can();
|
||||
std::cout << "[TEST] CAN tests " << (can_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
all_passed &= can_passed;
|
||||
|
||||
std::cout << "\n[TEST] Running device tests..." << std::endl;
|
||||
bool device_passed = test_device();
|
||||
std::cout << "[TEST] Device tests " << (device_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
all_passed &= device_passed;
|
||||
|
||||
std::cout << "\n[TEST] Running API tests..." << std::endl;
|
||||
bool api_passed = test_api();
|
||||
std::cout << "[TEST] API tests " << (api_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
all_passed &= api_passed;
|
||||
|
||||
// 输出总结
|
||||
std::cout << "\n========================================" << std::endl;
|
||||
std::cout << " Test Summary " << std::endl;
|
||||
std::cout << "========================================" << std::endl;
|
||||
std::cout << "Overall result: " << (all_passed ? "ALL TESTS PASSED" : "SOME TESTS FAILED") << std::endl;
|
||||
std::cout << "========================================" << std::endl;
|
||||
|
||||
return all_passed ? 0 : 1;
|
||||
}
|
||||
278
tests/test_api.cpp
Normal file
278
tests/test_api.cpp
Normal file
@@ -0,0 +1,278 @@
|
||||
/**
|
||||
* @file test_api.cpp
|
||||
* @brief 应用接口层测试
|
||||
*/
|
||||
|
||||
#include "../include/api/Usb2Can.h"
|
||||
#include "../include/can/CanMessage.h"
|
||||
#include "../include/can/CanFdMessage.h"
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
|
||||
/**
|
||||
* @brief 测试USB2CAN API初始化功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb2can_initialization() {
|
||||
std::cout << " [TEST] Testing USB2CAN API initialization..." << std::endl;
|
||||
|
||||
// 创建USB2CAN实例
|
||||
usb2can::api::Usb2Can usb2can;
|
||||
|
||||
// 初始化
|
||||
if (!usb2can.initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN API" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] USB2CAN API initialized successfully" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试设备扫描功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_device_scanning() {
|
||||
std::cout << " [TEST] Testing device scanning..." << std::endl;
|
||||
|
||||
// 创建USB2CAN实例
|
||||
usb2can::api::Usb2Can usb2can;
|
||||
|
||||
// 初始化
|
||||
if (!usb2can.initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN API" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 扫描CAN设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> canDevices = usb2can.scanDevices(usb2can::device::DeviceType::CAN);
|
||||
std::cout << " [INFO] Found " << canDevices.size() << " CAN devices" << std::endl;
|
||||
|
||||
// 扫描CANFD设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> canFdDevices = usb2can.scanDevices(usb2can::device::DeviceType::CANFD);
|
||||
std::cout << " [INFO] Found " << canFdDevices.size() << " CANFD devices" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试设备打开和关闭功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_device_open_close() {
|
||||
std::cout << " [TEST] Testing device open/close..." << std::endl;
|
||||
|
||||
// 创建USB2CAN实例
|
||||
usb2can::api::Usb2Can usb2can;
|
||||
|
||||
// 初始化
|
||||
if (!usb2can.initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN API" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 扫描CAN设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> devices = usb2can.scanDevices(usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (devices.empty()) {
|
||||
std::cout << " [WARN] No CAN devices found, skipping open/close test" << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 打开第一个设备
|
||||
usb2can::device::Usb2CanDevice* device = usb2can.openDevice(devices[0].devicePath, usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (!device) {
|
||||
std::cout << " [FAIL] Failed to open device" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] Device opened successfully" << std::endl;
|
||||
|
||||
// 关闭设备
|
||||
usb2can.closeDevice(devices[0].devicePath);
|
||||
std::cout << " [PASS] Device closed successfully" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN消息发送和接收功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_message_send_receive() {
|
||||
std::cout << " [TEST] Testing CAN message send/receive..." << std::endl;
|
||||
|
||||
// 创建USB2CAN实例
|
||||
usb2can::api::Usb2Can usb2can;
|
||||
|
||||
// 初始化
|
||||
if (!usb2can.initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN API" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 扫描CAN设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> devices = usb2can.scanDevices(usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (devices.empty()) {
|
||||
std::cout << " [WARN] No CAN devices found, skipping send/receive test" << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 打开第一个设备
|
||||
usb2can::device::Usb2CanDevice* device = usb2can.openDevice(devices[0].devicePath, usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (!device) {
|
||||
std::cout << " [FAIL] Failed to open device" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建CAN消息
|
||||
usb2can::can::CanMessage message;
|
||||
message.id = 0x123;
|
||||
message.dlc = 8;
|
||||
message.extended = true;
|
||||
message.rtr = false;
|
||||
|
||||
// 设置数据
|
||||
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||
std::memcpy(message.data, data, sizeof(data));
|
||||
|
||||
// 发送消息
|
||||
bool sendResult = usb2can.sendCanMessage(devices[0].devicePath, message);
|
||||
std::cout << " [INFO] Send result: " << (sendResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
// 接收消息
|
||||
usb2can::can::CanMessage receivedMessage;
|
||||
bool receiveResult = usb2can.receiveCanMessage(devices[0].devicePath, receivedMessage, 1000);
|
||||
std::cout << " [INFO] Receive result: " << (receiveResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
if (receiveResult) {
|
||||
std::cout << " [INFO] Received message: " << receivedMessage.toString() << std::endl;
|
||||
}
|
||||
|
||||
// 关闭设备
|
||||
usb2can.closeDevice(devices[0].devicePath);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN配置设置和获取功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_config_set_get() {
|
||||
std::cout << " [TEST] Testing CAN config set/get..." << std::endl;
|
||||
|
||||
// 创建USB2CAN实例
|
||||
usb2can::api::Usb2Can usb2can;
|
||||
|
||||
// 初始化
|
||||
if (!usb2can.initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN API" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 扫描CAN设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> devices = usb2can.scanDevices(usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (devices.empty()) {
|
||||
std::cout << " [WARN] No CAN devices found, skipping config test" << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 打开第一个设备
|
||||
usb2can::device::Usb2CanDevice* device = usb2can.openDevice(devices[0].devicePath, usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (!device) {
|
||||
std::cout << " [FAIL] Failed to open device" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建CAN配置
|
||||
usb2can::can::CanConfig config;
|
||||
config.bitrate = 500000; // 500kbps
|
||||
config.mode = usb2can::can::CanMode::Normal;
|
||||
config.filterId = 0x123;
|
||||
config.filterMask = 0x7FF;
|
||||
|
||||
// 设置配置
|
||||
bool setResult = usb2can.setCanConfig(devices[0].devicePath, config);
|
||||
std::cout << " [INFO] Set config result: " << (setResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
// 获取配置
|
||||
usb2can::can::CanConfig retrievedConfig;
|
||||
bool getResult = usb2can.getCanConfig(devices[0].devicePath, retrievedConfig);
|
||||
std::cout << " [INFO] Get config result: " << (getResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
if (getResult) {
|
||||
std::cout << " [INFO] Retrieved config - Bitrate: " << retrievedConfig.bitrate
|
||||
<< ", Mode: " << static_cast<int>(retrievedConfig.mode)
|
||||
<< ", Filter ID: 0x" << std::hex << retrievedConfig.filterId
|
||||
<< ", Filter Mask: 0x" << retrievedConfig.filterMask << std::dec << std::endl;
|
||||
}
|
||||
|
||||
// 关闭设备
|
||||
usb2can.closeDevice(devices[0].devicePath);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试热插拔回调功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_hotplug_callback() {
|
||||
std::cout << " [TEST] Testing hotplug callback..." << std::endl;
|
||||
|
||||
// 创建USB2CAN实例
|
||||
usb2can::api::Usb2Can usb2can;
|
||||
|
||||
// 初始化
|
||||
if (!usb2can.initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN API" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 定义热插拔回调函数
|
||||
auto callback = [](usb2can::device::HotplugEvent event, const std::string& devicePath, void* userData) {
|
||||
std::cout << " [INFO] Hotplug event: " << static_cast<int>(event)
|
||||
<< ", Device: " << devicePath << std::endl;
|
||||
};
|
||||
|
||||
// 注册热插拔回调
|
||||
bool registerResult = usb2can.registerHotplugCallback(callback, nullptr);
|
||||
std::cout << " [INFO] Register hotplug callback result: " << (registerResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
// 注销热插拔回调
|
||||
bool unregisterResult = usb2can.unregisterHotplugCallback();
|
||||
std::cout << " [INFO] Unregister hotplug callback result: " << (unregisterResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试应用接口层
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_api() {
|
||||
std::cout << "\n[TEST] Starting API layer tests..." << std::endl;
|
||||
|
||||
bool all_passed = true;
|
||||
|
||||
// 运行测试
|
||||
all_passed &= test_usb2can_initialization();
|
||||
all_passed &= test_device_scanning();
|
||||
all_passed &= test_device_open_close();
|
||||
all_passed &= test_can_message_send_receive();
|
||||
all_passed &= test_can_config_set_get();
|
||||
all_passed &= test_hotplug_callback();
|
||||
|
||||
std::cout << "[TEST] API layer tests " << (all_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
|
||||
return all_passed;
|
||||
}
|
||||
240
tests/test_can.cpp
Normal file
240
tests/test_can.cpp
Normal file
@@ -0,0 +1,240 @@
|
||||
/**
|
||||
* @file test_can.cpp
|
||||
* @brief CAN协议层测试
|
||||
*/
|
||||
|
||||
#include "../include/can/CanMessage.h"
|
||||
#include "../include/can/CanController.h"
|
||||
#include "../include/can/CanFdController.h"
|
||||
#include "../include/platform/Platform.h"
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
|
||||
/**
|
||||
* @brief 测试CAN消息创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_message_creation() {
|
||||
std::cout << " [TEST] Testing CAN message creation..." << std::endl;
|
||||
|
||||
// 创建CAN消息
|
||||
usb2can::can::CanMessage message;
|
||||
|
||||
// 设置消息属性
|
||||
message.id = 0x123;
|
||||
message.dlc = 8;
|
||||
message.extended = true;
|
||||
message.rtr = false;
|
||||
|
||||
// 设置数据
|
||||
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||
std::memcpy(message.data, data, sizeof(data));
|
||||
|
||||
// 验证消息属性
|
||||
if (message.id != 0x123 || message.dlc != 8 || !message.extended || message.rtr) {
|
||||
std::cout << " [FAIL] CAN message properties not set correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数据
|
||||
if (std::memcmp(message.data, data, sizeof(data)) != 0) {
|
||||
std::cout << " [FAIL] CAN message data not set correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] CAN message created successfully" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN消息构造函数
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_message_constructor() {
|
||||
std::cout << " [TEST] Testing CAN message constructor..." << std::endl;
|
||||
|
||||
// 准备数据
|
||||
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||
|
||||
// 使用构造函数创建CAN消息
|
||||
usb2can::can::CanMessage message(0x456, data, 8, true, false);
|
||||
|
||||
// 验证消息属性
|
||||
if (message.id != 0x456 || message.dlc != 8 || !message.extended || message.rtr) {
|
||||
std::cout << " [FAIL] CAN message constructor not working correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数据
|
||||
if (std::memcmp(message.data, data, sizeof(data)) != 0) {
|
||||
std::cout << " [FAIL] CAN message data not set correctly by constructor" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] CAN message constructor working correctly" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN消息复制功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_message_copy() {
|
||||
std::cout << " [TEST] Testing CAN message copy..." << std::endl;
|
||||
|
||||
// 创建原始消息
|
||||
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||
usb2can::can::CanMessage original(0x789, data, 8, true, false);
|
||||
|
||||
// 使用复制构造函数
|
||||
usb2can::can::CanMessage copy(original);
|
||||
|
||||
// 验证复制
|
||||
if (!(copy == original)) {
|
||||
std::cout << " [FAIL] CAN message copy constructor not working correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 使用赋值操作符
|
||||
usb2can::can::CanMessage assigned;
|
||||
assigned = original;
|
||||
|
||||
// 验证赋值
|
||||
if (!(assigned == original)) {
|
||||
std::cout << " [FAIL] CAN message assignment operator not working correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] CAN message copy working correctly" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CANFD消息创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_canfd_message_creation() {
|
||||
std::cout << " [TEST] Testing CANFD message creation..." << std::endl;
|
||||
|
||||
// 创建CANFD消息
|
||||
usb2can::can::CanFdMessage message;
|
||||
|
||||
// 设置消息属性
|
||||
message.id = 0x123;
|
||||
message.dlc = 16;
|
||||
message.extended = true;
|
||||
message.rtr = false;
|
||||
message.fd = true;
|
||||
message.brs = true;
|
||||
message.esi = false;
|
||||
|
||||
// 设置数据
|
||||
uint8_t data[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
||||
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
|
||||
std::memcpy(message.data, data, sizeof(data));
|
||||
|
||||
// 验证消息属性
|
||||
if (message.id != 0x123 || message.dlc != 16 || !message.extended ||
|
||||
message.rtr || !message.fd || !message.brs || message.esi) {
|
||||
std::cout << " [FAIL] CANFD message properties not set correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数据
|
||||
if (std::memcmp(message.data, data, sizeof(data)) != 0) {
|
||||
std::cout << " [FAIL] CANFD message data not set correctly" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] CANFD message created successfully" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN控制器创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_controller_creation() {
|
||||
std::cout << " [TEST] Testing CAN controller creation..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建CAN控制器实例
|
||||
usb2can::can::CanController* controller = usb2can::can::CanController::createCanController(platform);
|
||||
|
||||
// 注意:这里可能返回nullptr,因为我们的实现还不完整
|
||||
if (controller) {
|
||||
std::cout << " [PASS] CAN controller created successfully" << std::endl;
|
||||
delete controller;
|
||||
} else {
|
||||
std::cout << " [WARN] CAN controller creation returned nullptr (implementation incomplete)" << std::endl;
|
||||
}
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CANFD控制器创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_canfd_controller_creation() {
|
||||
std::cout << " [TEST] Testing CANFD controller creation..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建CANFD控制器实例
|
||||
usb2can::can::CanFdController* controller = usb2can::can::CanFdController::createCanFdController(platform);
|
||||
|
||||
// 注意:这里可能返回nullptr,因为我们的实现还不完整
|
||||
if (controller) {
|
||||
std::cout << " [PASS] CANFD controller created successfully" << std::endl;
|
||||
delete controller;
|
||||
} else {
|
||||
std::cout << " [WARN] CANFD controller creation returned nullptr (implementation incomplete)" << std::endl;
|
||||
}
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN协议层
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can() {
|
||||
std::cout << "\n[TEST] Starting CAN protocol layer tests..." << std::endl;
|
||||
|
||||
bool all_passed = true;
|
||||
|
||||
// 运行测试
|
||||
all_passed &= test_can_message_creation();
|
||||
all_passed &= test_can_message_constructor();
|
||||
all_passed &= test_can_message_copy();
|
||||
all_passed &= test_canfd_message_creation();
|
||||
all_passed &= test_can_controller_creation();
|
||||
all_passed &= test_canfd_controller_creation();
|
||||
|
||||
std::cout << "[TEST] CAN protocol layer tests " << (all_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
|
||||
return all_passed;
|
||||
}
|
||||
164
tests/test_device.cpp
Normal file
164
tests/test_device.cpp
Normal file
@@ -0,0 +1,164 @@
|
||||
/**
|
||||
* @file test_device.cpp
|
||||
* @brief 设备管理层测试
|
||||
*/
|
||||
|
||||
#include "../include/device/Usb2CanDevice.h"
|
||||
#include "../include/device/DeviceManager.h"
|
||||
#include "../include/platform/Platform.h"
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
/**
|
||||
* @brief 测试USB2CAN设备创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb2can_device_creation() {
|
||||
std::cout << " [TEST] Testing USB2CAN device creation..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建USB2CAN设备实例
|
||||
usb2can::device::Usb2CanDevice* device = new usb2can::device::Usb2CanDevice(platform);
|
||||
|
||||
// 初始化设备
|
||||
if (!device->initialize(usb2can::device::DeviceType::CAN)) {
|
||||
std::cout << " [FAIL] Failed to initialize USB2CAN device" << std::endl;
|
||||
delete device;
|
||||
delete platform;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] USB2CAN device created and initialized successfully" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete device;
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试设备管理器创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_device_manager_creation() {
|
||||
std::cout << " [TEST] Testing device manager creation..." << std::endl;
|
||||
|
||||
// 创建设备管理器实例
|
||||
usb2can::device::DeviceManager* manager = new usb2can::device::DeviceManager();
|
||||
|
||||
if (!manager) {
|
||||
std::cout << " [FAIL] Failed to create device manager instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] Device manager created successfully" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete manager;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试设备扫描功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_device_scan() {
|
||||
std::cout << " [TEST] Testing device scanning..." << std::endl;
|
||||
|
||||
// 创建设备管理器实例
|
||||
usb2can::device::DeviceManager manager;
|
||||
|
||||
// 扫描设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> devices = manager.scanDevices(usb2can::device::DeviceType::CAN);
|
||||
std::cout << " [INFO] Found " << devices.size() << " CAN devices" << std::endl;
|
||||
|
||||
// 扫描CANFD设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> fdDevices = manager.scanDevices(usb2can::device::DeviceType::CANFD);
|
||||
std::cout << " [INFO] Found " << fdDevices.size() << " CANFD devices" << std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试CAN消息发送和接收功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_can_message_send_receive() {
|
||||
std::cout << " [TEST] Testing CAN message send/receive..." << std::endl;
|
||||
|
||||
// 创建设备管理器实例
|
||||
usb2can::device::DeviceManager manager;
|
||||
|
||||
// 扫描设备
|
||||
std::vector<usb2can::device::Usb2CanDeviceInfo> devices = manager.scanDevices(usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (devices.empty()) {
|
||||
std::cout << " [WARN] No CAN devices found, skipping send/receive test" << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 打开第一个设备
|
||||
usb2can::device::Usb2CanDevice* device = manager.openDevice(devices[0].devicePath, usb2can::device::DeviceType::CAN);
|
||||
|
||||
if (!device) {
|
||||
std::cout << " [FAIL] Failed to open device" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建CAN消息
|
||||
usb2can::can::CanMessage message;
|
||||
message.id = 0x123;
|
||||
message.dlc = 8;
|
||||
message.extended = true;
|
||||
message.rtr = false;
|
||||
|
||||
// 设置数据
|
||||
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
||||
std::memcpy(message.data, data, sizeof(data));
|
||||
|
||||
// 发送消息
|
||||
bool sendResult = device->sendCanMessage(message);
|
||||
std::cout << " [INFO] Send result: " << (sendResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
// 接收消息
|
||||
usb2can::can::CanMessage receivedMessage;
|
||||
bool receiveResult = device->receiveCanMessage(receivedMessage, 1000);
|
||||
std::cout << " [INFO] Receive result: " << (receiveResult ? "Success" : "Failed") << std::endl;
|
||||
|
||||
if (receiveResult) {
|
||||
std::cout << " [INFO] Received message: " << receivedMessage.toString() << std::endl;
|
||||
}
|
||||
|
||||
// 关闭设备
|
||||
manager.closeDevice(device);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试设备管理层
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_device() {
|
||||
std::cout << "\n[TEST] Starting device management layer tests..." << std::endl;
|
||||
|
||||
bool all_passed = true;
|
||||
|
||||
// 运行测试
|
||||
all_passed &= test_usb2can_device_creation();
|
||||
all_passed &= test_device_manager_creation();
|
||||
all_passed &= test_device_scan();
|
||||
all_passed &= test_can_message_send_receive();
|
||||
|
||||
std::cout << "[TEST] Device management layer tests " << (all_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
|
||||
return all_passed;
|
||||
}
|
||||
119
tests/test_platform.cpp
Normal file
119
tests/test_platform.cpp
Normal file
@@ -0,0 +1,119 @@
|
||||
/**
|
||||
* @file test_platform.cpp
|
||||
* @brief 平台抽象层测试
|
||||
*/
|
||||
|
||||
#include "../include/platform/Platform.h"
|
||||
#include "../include/platform/WindowsPlatform.h"
|
||||
#include "../include/platform/LinuxPlatform.h"
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
/**
|
||||
* @brief 测试平台创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_platform_creation() {
|
||||
std::cout << " [TEST] Testing platform creation..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查平台类型
|
||||
usb2can::platform::PlatformType type = platform->getPlatformType();
|
||||
if (type == usb2can::platform::PlatformType::Unknown) {
|
||||
std::cout << " [FAIL] Unknown platform type" << std::endl;
|
||||
delete platform;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] Platform type: " << static_cast<int>(type) << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试平台初始化功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_platform_initialization() {
|
||||
std::cout << " [TEST] Testing platform initialization..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 初始化平台
|
||||
if (!platform->initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize platform" << std::endl;
|
||||
delete platform;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] Platform initialized successfully" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试USB设备扫描功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb_device_scan() {
|
||||
std::cout << " [TEST] Testing USB device scanning..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 初始化平台
|
||||
if (!platform->initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize platform" << std::endl;
|
||||
delete platform;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 扫描USB设备
|
||||
std::vector<std::string> devices = platform->scanUsbDevices();
|
||||
std::cout << " [INFO] Found " << devices.size() << " USB devices" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试平台抽象层
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_platform() {
|
||||
std::cout << "\n[TEST] Starting platform abstraction layer tests..." << std::endl;
|
||||
|
||||
bool all_passed = true;
|
||||
|
||||
// 运行测试
|
||||
all_passed &= test_platform_creation();
|
||||
all_passed &= test_platform_initialization();
|
||||
all_passed &= test_usb_device_scan();
|
||||
|
||||
std::cout << "[TEST] Platform abstraction layer tests " << (all_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
|
||||
return all_passed;
|
||||
}
|
||||
120
tests/test_usb.cpp
Normal file
120
tests/test_usb.cpp
Normal file
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* @file test_usb.cpp
|
||||
* @brief USB通信层测试
|
||||
*/
|
||||
|
||||
#include "../include/usb/UsbDevice.h"
|
||||
#include "../include/usb/WinUsbDevice.h"
|
||||
#include "../include/usb/LinuxUsbDevice.h"
|
||||
#include "../include/platform/Platform.h"
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
/**
|
||||
* @brief 测试USB设备创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb_device_creation() {
|
||||
std::cout << " [TEST] Testing USB device creation..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建USB设备实例
|
||||
usb2can::usb::UsbDevice* device = usb2can::usb::UsbDevice::createUsbDevice(platform);
|
||||
if (!device) {
|
||||
std::cout << " [FAIL] Failed to create USB device instance" << std::endl;
|
||||
delete platform;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << " [PASS] USB device created successfully" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete device;
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试USB设备管理器创建功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb_device_manager_creation() {
|
||||
std::cout << " [TEST] Testing USB device manager creation..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建USB设备管理器实例
|
||||
usb2can::usb::UsbDeviceManager manager(platform);
|
||||
|
||||
std::cout << " [PASS] USB device manager created successfully" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试USB设备扫描功能
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb_device_scan() {
|
||||
std::cout << " [TEST] Testing USB device scanning..." << std::endl;
|
||||
|
||||
// 创建平台实例
|
||||
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
||||
if (!platform) {
|
||||
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 初始化平台
|
||||
if (!platform->initialize()) {
|
||||
std::cout << " [FAIL] Failed to initialize platform" << std::endl;
|
||||
delete platform;
|
||||
return false;
|
||||
}
|
||||
|
||||
// 创建USB设备管理器实例
|
||||
usb2can::usb::UsbDeviceManager manager(platform);
|
||||
|
||||
// 扫描USB设备
|
||||
std::vector<usb2can::usb::UsbDeviceInfo> devices = manager.scanDevices();
|
||||
std::cout << " [INFO] Found " << devices.size() << " USB devices" << std::endl;
|
||||
|
||||
// 清理资源
|
||||
delete platform;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试USB通信层
|
||||
* @return 测试结果
|
||||
*/
|
||||
bool test_usb() {
|
||||
std::cout << "\n[TEST] Starting USB communication layer tests..." << std::endl;
|
||||
|
||||
bool all_passed = true;
|
||||
|
||||
// 运行测试
|
||||
all_passed &= test_usb_device_creation();
|
||||
all_passed &= test_usb_device_manager_creation();
|
||||
all_passed &= test_usb_device_scan();
|
||||
|
||||
std::cout << "[TEST] USB communication layer tests " << (all_passed ? "PASSED" : "FAILED") << std::endl;
|
||||
|
||||
return all_passed;
|
||||
}
|
||||
Reference in New Issue
Block a user