190 lines
6.6 KiB
C++
190 lines
6.6 KiB
C++
#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");
|
||
}
|