- 创建基本项目结构和目录 - 添加CMake构建系统 - 实现基础的配置解析功能 - 添加YOLO推理框架支持 - 集成RTSP和视频流处理功能 - 添加性能监控和日志系统
153 lines
4.0 KiB
C++
153 lines
4.0 KiB
C++
#include <gtest/gtest.h>
|
||
#include <filesystem>
|
||
#include "../pipeline/output/rtsp_writer.hpp"
|
||
#include "../pipeline/common/config_parser.hpp"
|
||
|
||
namespace pipeline {
|
||
namespace test {
|
||
|
||
class RtspWriterTest : public ::testing::Test {
|
||
protected:
|
||
void SetUp() override {
|
||
// 创建测试帧
|
||
test_frame_ = cv::Mat(480, 640, CV_8UC3, cv::Scalar(0, 255, 0));
|
||
cv::putText(test_frame_, "Test Frame", cv::Point(50, 50),
|
||
cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 255, 255), 2);
|
||
}
|
||
|
||
// 创建基本配置
|
||
OutputTargetConfig createConfig(const std::string& name,
|
||
const std::string& codec = "h264") {
|
||
OutputTargetConfig config;
|
||
config.type = "rtsp";
|
||
config.name = name;
|
||
config.path = "mock://test/" + name; // 使用mock URL
|
||
config.fps = 30;
|
||
config.codec = codec;
|
||
config.bitrate = 4000000;
|
||
return config;
|
||
}
|
||
|
||
cv::Mat test_frame_;
|
||
};
|
||
|
||
// 基本功能测试
|
||
TEST_F(RtspWriterTest, BasicFunctionality) {
|
||
RtspWriter writer;
|
||
auto config = createConfig("test_basic");
|
||
|
||
// 测试初始化
|
||
EXPECT_TRUE(writer.init(config));
|
||
EXPECT_FALSE(writer.isOpened());
|
||
EXPECT_EQ(writer.getName(), "test_basic");
|
||
|
||
// 测试重复初始化
|
||
EXPECT_TRUE(writer.init(config));
|
||
}
|
||
|
||
// 配置验证测试
|
||
TEST_F(RtspWriterTest, ConfigValidation) {
|
||
RtspWriter writer;
|
||
|
||
// 测试空名称
|
||
{
|
||
auto config = createConfig("");
|
||
EXPECT_FALSE(writer.init(config));
|
||
}
|
||
|
||
// 测试空路径
|
||
{
|
||
auto config = createConfig("test_empty_path");
|
||
config.path = "";
|
||
EXPECT_FALSE(writer.init(config));
|
||
}
|
||
|
||
// 测试无效帧率
|
||
{
|
||
auto config = createConfig("test_invalid_fps");
|
||
config.fps = 0;
|
||
EXPECT_FALSE(writer.init(config));
|
||
}
|
||
}
|
||
|
||
// 编码器测试
|
||
TEST_F(RtspWriterTest, CodecValidation) {
|
||
// 测试有效编码器
|
||
{
|
||
RtspWriter writer;
|
||
auto config = createConfig("test_h264", "h264");
|
||
EXPECT_TRUE(writer.init(config));
|
||
}
|
||
|
||
// 测试无效编码器
|
||
{
|
||
RtspWriter writer;
|
||
auto config = createConfig("test_invalid", "invalid_codec");
|
||
EXPECT_FALSE(writer.init(config));
|
||
std::string error_msg;
|
||
EXPECT_FALSE(writer.getStatus(error_msg));
|
||
EXPECT_TRUE(error_msg.find("Unsupported codec") != std::string::npos);
|
||
}
|
||
}
|
||
|
||
// 错误处理测试
|
||
TEST_F(RtspWriterTest, ErrorHandling) {
|
||
RtspWriter writer;
|
||
|
||
// 测试未初始化写入
|
||
EXPECT_FALSE(writer.write(test_frame_));
|
||
|
||
// 测试写入空帧
|
||
auto config = createConfig("test_error");
|
||
EXPECT_TRUE(writer.init(config));
|
||
cv::Mat empty_frame;
|
||
EXPECT_FALSE(writer.write(empty_frame));
|
||
|
||
// 测试状态获取
|
||
std::string error_msg;
|
||
EXPECT_FALSE(writer.getStatus(error_msg));
|
||
EXPECT_FALSE(error_msg.empty());
|
||
}
|
||
|
||
// 资源管理测试
|
||
TEST_F(RtspWriterTest, ResourceManagement) {
|
||
// 测试自动释放
|
||
{
|
||
RtspWriter writer;
|
||
auto config = createConfig("test_auto_cleanup");
|
||
EXPECT_TRUE(writer.init(config));
|
||
// writer在这里会自动释放
|
||
}
|
||
|
||
// 测试手动释放
|
||
{
|
||
RtspWriter writer;
|
||
auto config = createConfig("test_manual_cleanup");
|
||
EXPECT_TRUE(writer.init(config));
|
||
writer.release();
|
||
EXPECT_FALSE(writer.isOpened());
|
||
}
|
||
}
|
||
|
||
// 集成测试(需要实际RTSP服务器)
|
||
TEST_F(RtspWriterTest, DISABLED_Integration) {
|
||
RtspWriter writer;
|
||
auto config = createConfig("test_integration");
|
||
config.path = "rtsp://localhost:8554/test"; // 使用实际RTSP服务器
|
||
|
||
ASSERT_TRUE(writer.init(config));
|
||
EXPECT_FALSE(writer.isOpened());
|
||
|
||
EXPECT_TRUE(writer.write(test_frame_));
|
||
EXPECT_TRUE(writer.isOpened());
|
||
|
||
for (int i = 0; i < 10; ++i) {
|
||
EXPECT_TRUE(writer.write(test_frame_));
|
||
}
|
||
|
||
writer.release();
|
||
EXPECT_FALSE(writer.isOpened());
|
||
}
|
||
|
||
} // namespace test
|
||
} // namespace pipeline
|