170 lines
4.9 KiB
C++
170 lines
4.9 KiB
C++
#include <gtest/gtest.h>
|
|
#include <gmock/gmock.h>
|
|
#include "collector/DataCollector.h"
|
|
#include "utils/Logger.h"
|
|
|
|
// 创建一个 Mock DataSource 类
|
|
class MockDataSource : public DataSource {
|
|
public:
|
|
MOCK_METHOD(bool, connect, (), (override));
|
|
MOCK_METHOD(void, disconnect, (), (override));
|
|
MOCK_METHOD(bool, isAvailable, (), (const, override));
|
|
MOCK_METHOD(bool, fetchAircraftData, (std::vector<Aircraft>&), (override));
|
|
MOCK_METHOD(bool, fetchVehicleData, (std::vector<Vehicle>&), (override));
|
|
};
|
|
|
|
class DataCollectorTest : public ::testing::Test {
|
|
protected:
|
|
void SetUp() override {
|
|
collector = std::make_unique<DataCollector>();
|
|
mockSource = std::make_shared<::testing::NiceMock<MockDataSource>>();
|
|
collector->setDataSource(mockSource);
|
|
}
|
|
|
|
void TearDown() override {
|
|
collector.reset();
|
|
}
|
|
|
|
// 创建测试数据
|
|
Aircraft createTestAircraft(const std::string& id, double lat, double lon) {
|
|
Aircraft a;
|
|
a.id = id;
|
|
a.flightNo = id;
|
|
a.trackNumber = "TN" + id;
|
|
a.geo.latitude = lat;
|
|
a.geo.longitude = lon;
|
|
a.altitude = 5.0;
|
|
a.timestamp = std::chrono::system_clock::now().time_since_epoch().count();
|
|
return a;
|
|
}
|
|
|
|
Vehicle createTestVehicle(const std::string& id, double lat, double lon) {
|
|
Vehicle v;
|
|
v.id = id;
|
|
v.vehicleNo = id;
|
|
v.geo.latitude = lat;
|
|
v.geo.longitude = lon;
|
|
v.timestamp = std::chrono::system_clock::now().time_since_epoch().count();
|
|
return v;
|
|
}
|
|
|
|
std::unique_ptr<DataCollector> collector;
|
|
std::shared_ptr<MockDataSource> mockSource;
|
|
};
|
|
|
|
// 测试初始化
|
|
TEST_F(DataCollectorTest, Initialization) {
|
|
DataSourceConfig dataSourceConfig;
|
|
dataSourceConfig.host = "localhost";
|
|
dataSourceConfig.port = 8080;
|
|
dataSourceConfig.aircraft_path = "/api/getCurrentFlightPositions";
|
|
|
|
WarnConfig warnConfig;
|
|
warnConfig.warning_interval_ms = 1000;
|
|
warnConfig.log_interval_ms = 2000;
|
|
|
|
EXPECT_TRUE(collector->initialize(dataSourceConfig, warnConfig));
|
|
}
|
|
|
|
// 测试刷新方法
|
|
TEST_F(DataCollectorTest, RefreshTest) {
|
|
std::vector<Aircraft> testAircraft = {
|
|
createTestAircraft("TEST1", 36.36, 120.08),
|
|
createTestAircraft("TEST2", 36.37, 120.09)
|
|
};
|
|
|
|
std::vector<Vehicle> testVehicles = {
|
|
createTestVehicle("VEH1", 36.36, 120.08),
|
|
createTestVehicle("VEH2", 36.37, 120.09)
|
|
};
|
|
|
|
// 设置 Mock 数据返回
|
|
EXPECT_CALL(*mockSource, fetchAircraftData)
|
|
.WillOnce(::testing::DoAll(
|
|
::testing::SetArgReferee<0>(testAircraft),
|
|
::testing::Return(true)
|
|
));
|
|
|
|
EXPECT_CALL(*mockSource, fetchVehicleData)
|
|
.WillOnce(::testing::DoAll(
|
|
::testing::SetArgReferee<0>(testVehicles),
|
|
::testing::Return(true)
|
|
));
|
|
|
|
// 执行刷新
|
|
collector->refresh();
|
|
|
|
// 验证数据
|
|
auto aircraft = collector->getAircraftData();
|
|
EXPECT_EQ(aircraft.size(), 2);
|
|
if (!aircraft.empty()) {
|
|
EXPECT_EQ(aircraft[0].flightNo, "TEST1");
|
|
EXPECT_EQ(aircraft[1].flightNo, "TEST2");
|
|
}
|
|
|
|
auto vehicles = collector->getVehicleData();
|
|
EXPECT_EQ(vehicles.size(), 2);
|
|
if (!vehicles.empty()) {
|
|
EXPECT_EQ(vehicles[0].vehicleNo, "VEH1");
|
|
EXPECT_EQ(vehicles[1].vehicleNo, "VEH2");
|
|
}
|
|
}
|
|
|
|
// 测试数据采集循环
|
|
TEST_F(DataCollectorTest, DataCollectionLoop) {
|
|
std::vector<Aircraft> testAircraft = {
|
|
createTestAircraft("TEST1", 36.36, 120.08)
|
|
};
|
|
|
|
std::vector<Vehicle> testVehicles = {
|
|
createTestVehicle("VEH1", 36.36, 120.08)
|
|
};
|
|
|
|
// 设置 Mock 数据返回
|
|
EXPECT_CALL(*mockSource, fetchAircraftData)
|
|
.WillRepeatedly(::testing::DoAll(
|
|
::testing::SetArgReferee<0>(testAircraft),
|
|
::testing::Return(true)
|
|
));
|
|
|
|
EXPECT_CALL(*mockSource, fetchVehicleData)
|
|
.WillRepeatedly(::testing::DoAll(
|
|
::testing::SetArgReferee<0>(testVehicles),
|
|
::testing::Return(true)
|
|
));
|
|
|
|
// 启动采集
|
|
collector->start();
|
|
|
|
// 等待数据采集
|
|
std::this_thread::sleep_for(std::chrono::seconds(2));
|
|
|
|
// 停止采集
|
|
collector->stop();
|
|
|
|
// 验证数据
|
|
auto aircraft = collector->getAircraftData();
|
|
EXPECT_EQ(aircraft.size(), 1);
|
|
|
|
auto vehicles = collector->getVehicleData();
|
|
EXPECT_EQ(vehicles.size(), 1);
|
|
}
|
|
|
|
// 测试错误处理
|
|
TEST_F(DataCollectorTest, ErrorHandling) {
|
|
// 设置 Mock 返回错误
|
|
EXPECT_CALL(*mockSource, fetchAircraftData)
|
|
.WillOnce(::testing::Return(false));
|
|
EXPECT_CALL(*mockSource, fetchVehicleData)
|
|
.WillOnce(::testing::Return(false));
|
|
|
|
// 执行刷新
|
|
collector->refresh();
|
|
|
|
// 验证数据为空
|
|
auto aircraft = collector->getAircraftData();
|
|
EXPECT_TRUE(aircraft.empty());
|
|
|
|
auto vehicles = collector->getVehicleData();
|
|
EXPECT_TRUE(vehicles.empty());
|
|
}
|