#include #include #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