rtsp_tensorrt/tests/test_yaml_config.cpp

190 lines
6.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <gtest/gtest.h>
#include "pipeline/common/yaml_config_parser.hpp"
#include "test_base.hpp"
#include <fstream>
#include <filesystem>
using namespace pipeline;
class YamlConfigTest : public test::TestBase {
protected:
void SetUp() override {
test::TestBase::SetUp(); // 调用基类的SetUp
}
};
TEST_F(YamlConfigTest, LoadConfig) {
auto parser = createConfigParser();
ASSERT_TRUE(parser->parse(config_path));
const auto& config = parser->getConfig();
// 验证输入配置
ASSERT_EQ(config.input.sources.size(), 1);
EXPECT_EQ(config.input.sources[0].type, "video");
EXPECT_EQ(config.input.sources[0].name, "test_video");
EXPECT_EQ(config.input.sources[0].url, "/app/test_data/videos/raw.mp4");
EXPECT_EQ(config.input.sources[0].buffer_size, 30);
EXPECT_EQ(config.input.max_batch_size, 4);
// 验证输入源的输出目标映射
ASSERT_EQ(config.input.sources[0].outputs.size(), 1);
EXPECT_EQ(config.input.sources[0].outputs[0], "output_video");
// 验证推理配置
EXPECT_EQ(config.inference.engine_path, "/app/models/yolov8n.engine");
ASSERT_EQ(config.inference.input_shape.size(), 3);
EXPECT_EQ(config.inference.input_shape[0], 3);
EXPECT_EQ(config.inference.input_shape[1], 640);
EXPECT_EQ(config.inference.input_shape[2], 640);
EXPECT_EQ(config.inference.precision, "FP16");
EXPECT_FLOAT_EQ(config.inference.threshold.conf, 0.5f);
EXPECT_FLOAT_EQ(config.inference.threshold.nms, 0.45f);
EXPECT_EQ(config.inference.gpu_id, 0);
EXPECT_EQ(config.inference.version, "yolov8");
ASSERT_EQ(config.inference.labels.size(), 3);
EXPECT_EQ(config.inference.labels[0], "person");
EXPECT_EQ(config.inference.labels[1], "car");
EXPECT_EQ(config.inference.labels[2], "truck");
// 验证渲染配置
EXPECT_TRUE(config.render.enable);
EXPECT_EQ(config.render.window.name, "Detection Results");
EXPECT_EQ(config.render.window.width, 1280);
EXPECT_EQ(config.render.window.height, 720);
EXPECT_FALSE(config.render.window.fullscreen);
// 默认样式
EXPECT_EQ(config.render.default_style.box_color, cv::Scalar(0, 255, 0));
EXPECT_EQ(config.render.default_style.text_color, cv::Scalar(255, 255, 255));
EXPECT_FLOAT_EQ(config.render.default_style.transparency, 0.0f);
EXPECT_EQ(config.render.default_style.box_thickness, 2);
EXPECT_DOUBLE_EQ(config.render.default_style.font_scale, 0.5);
EXPECT_EQ(config.render.default_style.font_thickness, 1);
// 类别样式
ASSERT_EQ(config.render.class_styles.size(), 3);
const auto& person_style = config.render.class_styles.at("person");
EXPECT_EQ(person_style.box_color, cv::Scalar(255, 0, 0));
EXPECT_EQ(person_style.text_color, cv::Scalar(255, 255, 255));
EXPECT_FLOAT_EQ(person_style.transparency, 0.2f);
const auto& car_style = config.render.class_styles.at("car");
EXPECT_EQ(car_style.box_color, cv::Scalar(0, 255, 0));
EXPECT_EQ(car_style.text_color, cv::Scalar(255, 255, 255));
EXPECT_FLOAT_EQ(car_style.transparency, 0.2f);
const auto& truck_style = config.render.class_styles.at("truck");
EXPECT_EQ(truck_style.box_color, cv::Scalar(0, 0, 255));
EXPECT_EQ(truck_style.text_color, cv::Scalar(255, 255, 255));
EXPECT_FLOAT_EQ(truck_style.transparency, 0.2f);
// 性能指标配置
EXPECT_TRUE(config.render.metrics.show_fps);
EXPECT_TRUE(config.render.metrics.show_inference_time);
EXPECT_TRUE(config.render.metrics.show_gpu_usage);
EXPECT_EQ(config.render.metrics.update_interval_ms, 1000);
// 验证输出配置
ASSERT_EQ(config.output.targets.size(), 2);
EXPECT_EQ(config.output.targets[0].type, "video");
EXPECT_EQ(config.output.targets[0].name, "output_video");
EXPECT_EQ(config.output.targets[0].path, "/output/result.mp4");
EXPECT_EQ(config.output.targets[0].fps, 30);
EXPECT_EQ(config.output.targets[0].codec, "h264");
EXPECT_EQ(config.output.targets[0].bitrate, 4000000);
EXPECT_EQ(config.output.targets[1].type, "rtsp");
EXPECT_EQ(config.output.targets[1].name, "output_rtsp");
EXPECT_EQ(config.output.targets[1].path, "rtsp://localhost:8554/live");
EXPECT_EQ(config.output.targets[1].fps, 30);
EXPECT_EQ(config.output.targets[1].codec, "h264");
EXPECT_EQ(config.output.targets[1].bitrate, 4000000);
// 验证日志配置
EXPECT_EQ(config.log.level, "info");
EXPECT_EQ(config.log.save_path, "logs/");
}
TEST_F(YamlConfigTest, InvalidConfig) {
auto parser = createConfigParser();
// 测试不存在的文件
EXPECT_FALSE(parser->parse("non_existent.yaml"));
}
TEST_F(YamlConfigTest, InvalidConfigs) {
auto parser = createConfigParser();
// 创建一个临时的无效配置文件用于测试
std::ofstream invalid_config("invalid_config.yaml");
invalid_config << R"(
input:
sources: [] #
)";
invalid_config.close();
EXPECT_FALSE(parser->parse("invalid_config.yaml"));
std::filesystem::remove("invalid_config.yaml");
}
TEST_F(YamlConfigTest, ValidateThresholds) {
auto parser = createConfigParser();
// 创建一个临时的无效阈值配置文件用于测试
std::ofstream config_file("invalid_threshold.yaml");
config_file << R"(
input:
sources:
- type: rtsp
name: "camera1"
url: "rtsp://10.0.0.17:8554/camera_test/2"
inference:
model:
onnx_path: "/app/models/yolov8n.onnx"
engine_path: "/app/models/yolov8n.engine"
input_shape: [3, 640, 640]
precision: "FP16"
threshold:
conf: 1.5 #
nms: 0.45
)";
config_file.close();
EXPECT_FALSE(parser->parse("invalid_threshold.yaml"));
std::filesystem::remove("invalid_threshold.yaml");
}
TEST_F(YamlConfigTest, ValidateClassStyles) {
auto parser = createConfigParser();
// 创建一个临时的无效类别样式配置文件用于测试
std::ofstream config_file("invalid_class_style.yaml");
config_file << R"(
input:
sources:
- type: rtsp
name: "camera1"
url: "rtsp://10.0.0.17:8554/camera_test/2"
inference:
model:
onnx_path: "/app/models/yolov8n.onnx"
engine_path: "/app/models/yolov8n.engine"
input_shape: [3, 640, 640]
precision: "FP16"
render:
window:
name: "Detection Results"
width: 1280
height: 720
class_styles:
"": #
box_color: [255, 0, 0]
text_color: [255, 255, 255]
transparency: 0.2
)";
config_file.close();
EXPECT_FALSE(parser->parse("invalid_class_style.yaml"));
std::filesystem::remove("invalid_class_style.yaml");
}