#include #include #include "network/HTTPDataSource.h" #include "utils/Logger.h" class HTTPDataSourceTest : public ::testing::Test { protected: std::unique_ptr source; void SetUp() override { DataSourceConfig config; config.host = "localhost"; config.port = 8081; config.aircraft_path = "/api/getCurrentFlightPositions"; config.vehicle_path = "/api/getCurrentVehiclePositions"; config.traffic_light_path = "/api/getTrafficLightSignals"; source = std::make_unique(config); } void TearDown() override { source.reset(); } }; TEST_F(HTTPDataSourceTest, ConnectTest) { EXPECT_FALSE(source->isAvailable()); // 初始状态应该是未连接 EXPECT_TRUE(source->connect()); // 连接应该成功 EXPECT_TRUE(source->isAvailable()); // 连接后应该可用 } TEST_F(HTTPDataSourceTest, DisconnectTest) { source->connect(); EXPECT_TRUE(source->isAvailable()); source->disconnect(); EXPECT_FALSE(source->isAvailable()); } TEST_F(HTTPDataSourceTest, FetchAircraftDataTest) { std::vector aircraft; // 尝试连接 bool connected = source->connect(); Logger::info("Connection result: ", connected ? "success" : "failed"); EXPECT_TRUE(connected); // 检查连接状态 bool available = source->isAvailable(); Logger::info("Connection available: ", available ? "yes" : "no"); EXPECT_TRUE(available); // 获取数据 bool fetchResult = source->fetchAircraftData(aircraft); Logger::info("Fetch result: ", fetchResult ? "success" : "failed"); EXPECT_TRUE(fetchResult); // 检查数据 Logger::info("Aircraft data size: ", aircraft.size()); EXPECT_FALSE(aircraft.empty()); } TEST_F(HTTPDataSourceTest, FetchVehicleDataTest) { std::vector vehicles; EXPECT_TRUE(source->connect()); // 确保连接成功 EXPECT_TRUE(source->fetchVehicleData(vehicles)); EXPECT_FALSE(vehicles.empty()); } TEST_F(HTTPDataSourceTest, FetchTrafficLightSignalsTest) { std::vector signals; EXPECT_TRUE(source->connect()); // 确保连接成功 EXPECT_TRUE(source->fetchTrafficLightSignals(signals)); EXPECT_FALSE(signals.empty()); } TEST_F(HTTPDataSourceTest, CustomPathTest) { // 测试使用自定义路径创建数据源 DataSourceConfig config; config.host = "localhost"; config.port = 8081; config.aircraft_path = "/custom/path"; auto customSource = std::make_unique(config); EXPECT_TRUE(customSource->connect()); EXPECT_TRUE(customSource->isAvailable()); } TEST_F(HTTPDataSourceTest, ConnectionFailureTest) { // 测试连接到不存在的服务器 DataSourceConfig config; config.host = "localhost"; // 使用本地地址 config.port = 1; // 使用一个通常不会被使用的端口 auto invalidSource = std::make_unique(config); EXPECT_FALSE(invalidSource->connect()); EXPECT_FALSE(invalidSource->isAvailable()); } TEST_F(HTTPDataSourceTest, FetchDataWithoutConnectionTest) { // 测试在未连接状态下获取数据 std::vector aircraft; std::vector vehicles; std::vector signals; // 配置一个很短的刷新间隔,这样重连会快速失败 DataSourceConfig config; config.host = "localhost"; config.port = 1; // 使用一个通常不会被使用的端口 config.refresh_interval_ms = 1; // 设置很短的刷新间隔 source = std::make_unique(config); // 测试所有数据获取方法 EXPECT_FALSE(source->fetchAircraftData(aircraft)); EXPECT_FALSE(source->fetchVehicleData(vehicles)); EXPECT_FALSE(source->fetchTrafficLightSignals(signals)); // 验证数据集为空 EXPECT_TRUE(aircraft.empty()); EXPECT_TRUE(vehicles.empty()); EXPECT_TRUE(signals.empty()); } // 添加一个新的测试用例,专门测试重连机制 TEST_F(HTTPDataSourceTest, ReconnectionTest) { // 配置一个较短的刷新间隔 DataSourceConfig config; config.host = "localhost"; config.port = 1; // 使用一个通常不会被使用的端口 config.refresh_interval_ms = 100; // 100毫秒的刷新间隔 auto reconnectSource = std::make_unique(config); // 第一次连接应该失败 EXPECT_FALSE(reconnectSource->connect()); EXPECT_FALSE(reconnectSource->isAvailable()); // 尝试获取数据,这会触发重连 std::vector aircraft; EXPECT_FALSE(reconnectSource->fetchAircraftData(aircraft)); EXPECT_TRUE(aircraft.empty()); } // 如果你的环境支持模拟网络响应,可以添加更多测试 TEST_F(HTTPDataSourceTest, InvalidResponseTest) { // 这个测试需要模拟无效的服务器响应 // 你可能需要使用 mock 对象或者设置一个返回无效数据的测试服务器 source->connect(); std::vector aircraft; // 假设服务器返回无效的 JSON 数据 // EXPECT_FALSE(source->fetchAircraftData(aircraft)); } // 测试不同的超时配置 TEST_F(HTTPDataSourceTest, DifferentTimeoutConfigTest) { // 测试读取超时小于连接超时 { DataSourceConfig config; config.host = "localhost"; config.port = 8081; config.timeout_ms = 5000; // 连接超时 5 秒 config.read_timeout_ms = 2000; // 读取超时 2 秒 auto source = std::make_unique(config); EXPECT_FALSE(source->isAvailable()); // 只验证初始状态 std::vector aircraft; EXPECT_FALSE(source->fetchAircraftData(aircraft)); EXPECT_TRUE(aircraft.empty()); } // 测试读取超时等于连接超时 { DataSourceConfig config; config.host = "localhost"; config.port = 8081; config.timeout_ms = 5000; // 连接超时 5 秒 config.read_timeout_ms = 5000; // 读取超时 5 秒 auto source = std::make_unique(config); EXPECT_FALSE(source->isAvailable()); // 只验证初始状态 std::vector aircraft; EXPECT_FALSE(source->fetchAircraftData(aircraft)); EXPECT_TRUE(aircraft.empty()); } } // 修改读取超时测试 TEST_F(HTTPDataSourceTest, ReadTimeoutTest) { DataSourceConfig config; config.host = "localhost"; config.port = 8081; config.timeout_ms = 5000; // 连接超时 5 秒 config.read_timeout_ms = 2000; // 读取超时 2 秒 auto source = std::make_unique(config); EXPECT_FALSE(source->isAvailable()); // 验证初始状态 std::vector aircraft; EXPECT_FALSE(source->fetchAircraftData(aircraft)); EXPECT_TRUE(aircraft.empty()); } // 修改连接健康和超时测试 TEST_F(HTTPDataSourceTest, ConnectionHealthAndTimeout) { DataSourceConfig config; config.host = "localhost"; config.port = 8081; config.timeout_ms = 5000; // 连接超时 5 秒 config.read_timeout_ms = 2000; // 读取超时 2 秒 auto source = std::make_unique(config); EXPECT_FALSE(source->isAvailable()); // 验证初始状态 std::vector aircraft; EXPECT_FALSE(source->fetchAircraftData(aircraft)); EXPECT_TRUE(aircraft.empty()); }