// ================================================================================================ // Audio Backend - 音频引擎代理测试 // ================================================================================================ #include #include #include "frontend/proxy/engine_proxy.h" #include "tests/common/test_fixtures.h" #include #include #include #include #include using namespace audio_backend; using namespace audio_backend::frontend; using namespace std::chrono_literals; // 创建模拟引擎通信层 class MockEngineCommLayer { public: explicit MockEngineCommLayer() = default; ~MockEngineCommLayer() = default; // 模拟接收命令并返回响应 void expect_command(EngineCommand cmd, const std::string& params, common::ErrorCode response_code, const std::string& response_data) { expected_commands_.push_back({cmd, params, response_code, response_data}); } // 模拟状态更新 void send_status_update(const EngineStatus& status) { status_callback_(status); } // 模拟音频数据发送 void send_audio_data(const engine::AudioBuffer& buffer) { audio_data_callback_(buffer); } // 模拟错误消息 void send_error(common::ErrorCode error, const std::string& message) { error_callback_(error, message); } // 设置回调 void set_status_callback(std::function callback) { status_callback_ = std::move(callback); } void set_audio_data_callback(std::function callback) { audio_data_callback_ = std::move(callback); } void set_error_callback(std::function callback) { error_callback_ = std::move(callback); } // 处理命令 common::ErrorCode process_command(EngineCommand cmd, const std::string& params, std::string& response_data) { for (const auto& expected : expected_commands_) { if (expected.command == cmd && (expected.params.empty() || expected.params == params)) { response_data = expected.response_data; return expected.response_code; } } // 命令不匹配 response_data = "Unexpected command"; return common::ErrorCode::InvalidOperation; } private: struct ExpectedCommand { EngineCommand command; std::string params; common::ErrorCode response_code; std::string response_data; }; std::vector expected_commands_; std::function status_callback_; std::function audio_data_callback_; std::function error_callback_; }; // 创建模拟引擎事件监听器 class MockEngineProxyListener : public IEngineProxyListener { public: MOCK_METHOD(void, on_engine_connected, (), (override)); MOCK_METHOD(void, on_engine_disconnected, (), (override)); MOCK_METHOD(void, on_engine_state_changed, (EngineState, EngineState), (override)); MOCK_METHOD(void, on_engine_status_updated, (const EngineStatus&), (override)); MOCK_METHOD(void, on_audio_data_available, (const engine::AudioBuffer&), (override)); MOCK_METHOD(void, on_engine_error, (common::ErrorCode, const std::string&), (override)); }; // 创建可测试引擎代理实现 class TestableEngineProxy : public EngineProxy { public: explicit TestableEngineProxy(const EngineProxyConfig& config, MockEngineCommLayer* comm_layer) : EngineProxy(config), comm_layer_(comm_layer) { // 替换内部通信层为模拟实现 } // 模拟通信层函数 common::ErrorCode override_connect(bool success) { connected_ = success; return success ? common::ErrorCode::Success : common::ErrorCode::ConnectionFailed; } common::ErrorCode override_send_command(EngineCommand command, const std::string& params, std::string& response) { return comm_layer_->process_command(command, params, response); } void simulate_status_update(const EngineStatus& status) { // 设置当前状态 EngineState old_state = current_state_; current_state_ = status.state; // 通知状态变更 if (old_state != status.state) { notify_state_changed(old_state, status.state); } // 通知状态更新 notify_status_updated(status); } void simulate_audio_data(const engine::AudioBuffer& buffer) { notify_audio_data(buffer); } void simulate_error(common::ErrorCode error, const std::string& message) { notify_error(error, message); } void simulate_connection_lost() { bool was_connected = connected_.exchange(false); if (was_connected) { notify_disconnected(); } } void simulate_connection_restored() { bool was_disconnected = !connected_.exchange(true); if (was_disconnected) { notify_connected(); } } // 暴露内部函数和状态用于测试 using EngineProxy::notify_connected; using EngineProxy::notify_disconnected; using EngineProxy::notify_state_changed; using EngineProxy::notify_status_updated; using EngineProxy::notify_audio_data; using EngineProxy::notify_error; std::atomic connected_{false}; std::atomic current_state_{EngineState::Unknown}; private: MockEngineCommLayer* comm_layer_; }; // 引擎代理测试固定装置 class EngineProxyTest : public test::FrontendTest { protected: void SetUp() override { test::FrontendTest::SetUp(); // 创建模拟通信层 comm_layer_ = std::make_unique(); // 创建代理配置 EngineProxyConfig config; config.engine_endpoint = "tcp://localhost:5555"; config.connection_timeout = 1000ms; config.command_timeout = 500ms; config.status_poll_interval = 200ms; config.auto_reconnect = true; config.enable_heartbeat = true; // 创建可测试引擎代理 proxy_ = std::make_unique(config, comm_layer_.get()); // 创建模拟事件监听器 listener_ = std::make_shared<::testing::NiceMock>(); // 添加事件监听器 proxy_->add_listener(listener_); // 设置通信层回调 comm_layer_->set_status_callback([this](const EngineStatus& status) { proxy_->simulate_status_update(status); }); comm_layer_->set_audio_data_callback([this](const engine::AudioBuffer& buffer) { proxy_->simulate_audio_data(buffer); }); comm_layer_->set_error_callback([this](common::ErrorCode error, const std::string& message) { proxy_->simulate_error(error, message); }); } void TearDown() override { // 移除事件监听器 if (listener_ && proxy_) { proxy_->remove_listener(listener_); } // 关闭代理 if (proxy_ && proxy_->is_initialized()) { proxy_->shutdown(); } proxy_.reset(); listener_.reset(); comm_layer_.reset(); test::FrontendTest::TearDown(); } // 创建测试引擎配置 EngineConfiguration create_test_config() { EngineConfiguration config; config.sample_rate = 48000; config.channels = 2; config.format = engine::AudioFormat::FLOAT32; config.buffer_size = 512; config.enable_simd = true; config.worker_threads = 4; return config; } // 创建测试引擎状态 EngineStatus create_test_status(EngineState state = EngineState::Running) { EngineStatus status; status.state = state; status.config = create_test_config(); status.cpu_usage = 10.0; status.memory_usage_mb = 128.0; status.frames_processed = 1000; status.active_plugins = 2; status.buffer_underruns = 0; status.current_latency_ms = 8.5; status.last_update = std::chrono::system_clock::now(); return status; } protected: std::unique_ptr comm_layer_; std::unique_ptr proxy_; std::shared_ptr listener_; }; // 测试初始化和关闭 TEST_F(EngineProxyTest, InitializeAndShutdown) { // 设置命令期望 comm_layer_->expect_command(EngineCommand::Initialize, "", common::ErrorCode::Success, "{}"); comm_layer_->expect_command(EngineCommand::Shutdown, "", common::ErrorCode::Success, "{}"); // 初始化代理 auto result = proxy_->initialize(); // 验证初始化成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_TRUE(proxy_->is_initialized()); // 关闭代理 result = proxy_->shutdown(); // 验证关闭成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_FALSE(proxy_->is_initialized()); } // 测试连接管理 TEST_F(EngineProxyTest, ConnectionManagement) { // 设置回调期望 EXPECT_CALL(*listener_, on_engine_connected()) .Times(1); EXPECT_CALL(*listener_, on_engine_disconnected()) .Times(1); // 模拟连接成功 auto result = proxy_->override_connect(true); // 验证连接成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_TRUE(proxy_->is_connected()); // 模拟断开连接 proxy_->simulate_connection_lost(); // 验证断开连接 EXPECT_FALSE(proxy_->is_connected()); } // 测试状态变更事件 TEST_F(EngineProxyTest, StateChangeEvents) { // 初始化状态 EngineState initial_state = EngineState::Stopped; EngineState new_state = EngineState::Running; // 设置事件期望 EXPECT_CALL(*listener_, on_engine_state_changed(initial_state, new_state)) .Times(1); // 创建状态并设置初始状态 proxy_->current_state_ = initial_state; // 创建新状态 EngineStatus status = create_test_status(new_state); // 模拟状态更新 proxy_->simulate_status_update(status); // 验证状态已更新 EXPECT_EQ(proxy_->get_current_state(), new_state); } // 测试状态更新事件 TEST_F(EngineProxyTest, StatusUpdateEvents) { // 创建测试状态 EngineStatus status = create_test_status(); // 设置事件期望 EXPECT_CALL(*listener_, on_engine_status_updated(::testing::_)) .Times(1) .WillOnce(::testing::Invoke([&status](const EngineStatus& updated_status) { EXPECT_EQ(updated_status.state, status.state); EXPECT_EQ(updated_status.config.sample_rate, status.config.sample_rate); EXPECT_EQ(updated_status.config.channels, status.config.channels); EXPECT_DOUBLE_EQ(updated_status.cpu_usage, status.cpu_usage); EXPECT_DOUBLE_EQ(updated_status.memory_usage_mb, status.memory_usage_mb); EXPECT_EQ(updated_status.frames_processed, status.frames_processed); })); // 模拟状态更新 proxy_->simulate_status_update(status); } // 测试音频数据事件 TEST_F(EngineProxyTest, AudioDataEvents) { // 创建测试音频缓冲区 engine::AudioBuffer buffer(512, 2, engine::AudioFormat::FLOAT32); // 填充测试数据 float* data = buffer.interleaved_data(); for (size_t i = 0; i < 512 * 2; ++i) { data[i] = 0.1f * std::sin(2.0f * M_PI * i / 100.0f); } // 设置事件期望 EXPECT_CALL(*listener_, on_audio_data_available(::testing::_)) .Times(1); // 模拟音频数据 proxy_->simulate_audio_data(buffer); } // 测试错误事件 TEST_F(EngineProxyTest, ErrorEvents) { // 定义测试错误 common::ErrorCode test_error = common::ErrorCode::CommandFailed; std::string error_message = "测试错误消息"; // 设置事件期望 EXPECT_CALL(*listener_, on_engine_error(test_error, error_message)) .Times(1); // 模拟错误 proxy_->simulate_error(test_error, error_message); } // 测试命令发送 TEST_F(EngineProxyTest, CommandSending) { // 设置命令期望 comm_layer_->expect_command(EngineCommand::Start, "", common::ErrorCode::Success, "{}"); // 设置状态期望 EXPECT_CALL(*listener_, on_engine_state_changed(EngineState::Stopped, EngineState::Starting)) .Times(::testing::AtLeast(0)); // 初始化状态 proxy_->current_state_ = EngineState::Stopped; // 发送命令 auto result = proxy_->send_command(EngineCommand::Start); // 验证命令成功 EXPECT_EQ(result, common::ErrorCode::Success); } // 测试异步命令发送 TEST_F(EngineProxyTest, AsyncCommandSending) { // 设置命令期望 comm_layer_->expect_command(EngineCommand::Start, "", common::ErrorCode::Success, "{}"); // 初始化状态 proxy_->current_state_ = EngineState::Stopped; // 创建异步命令完成标志 std::promise command_completed; std::future future = command_completed.get_future(); // 发送异步命令 proxy_->send_command_async(EngineCommand::Start, "", [&command_completed](common::ErrorCode result, const std::string&) { command_completed.set_value(result == common::ErrorCode::Success); }); // 等待异步命令完成(带超时) auto status = future.wait_for(1s); EXPECT_EQ(status, std::future_status::ready); // 验证命令结果 if (status == std::future_status::ready) { EXPECT_TRUE(future.get()); } } // 测试配置管理 TEST_F(EngineProxyTest, ConfigurationManagement) { // 创建测试配置 EngineConfiguration config = create_test_config(); // 设置命令期望 - 设置配置 std::string config_params = "{" "\"sample_rate\":48000," "\"channels\":2," "\"format\":\"FLOAT32\"," "\"buffer_size\":512," "\"enable_simd\":true," "\"worker_threads\":4," "\"processing_mode\":\"realtime\"" "}"; comm_layer_->expect_command(EngineCommand::SetConfig, config_params, common::ErrorCode::Success, "{}"); // 设置配置 auto result = proxy_->set_engine_config(config); // 验证设置成功 EXPECT_EQ(result, common::ErrorCode::Success); // 设置命令期望 - 获取配置 comm_layer_->expect_command(EngineCommand::GetConfig, "", common::ErrorCode::Success, config_params); // 获取配置 EngineConfiguration retrieved_config; result = proxy_->get_engine_config(retrieved_config); // 验证获取成功 EXPECT_EQ(result, common::ErrorCode::Success); // 验证配置内容 EXPECT_EQ(retrieved_config.sample_rate, config.sample_rate); EXPECT_EQ(retrieved_config.channels, config.channels); EXPECT_EQ(retrieved_config.format, config.format); EXPECT_EQ(retrieved_config.buffer_size, config.buffer_size); EXPECT_EQ(retrieved_config.enable_simd, config.enable_simd); EXPECT_EQ(retrieved_config.worker_threads, config.worker_threads); } // 测试状态查询 TEST_F(EngineProxyTest, StatusQuery) { // 创建测试状态 EngineStatus expected_status = create_test_status(); // 设置命令期望 std::string status_response = "{" "\"state\":\"Running\"," "\"cpu_usage\":10.0," "\"memory_usage_mb\":128.0," "\"frames_processed\":1000," "\"active_plugins\":2," "\"buffer_underruns\":0," "\"current_latency_ms\":8.5" "}"; comm_layer_->expect_command(EngineCommand::GetStatus, "", common::ErrorCode::Success, status_response); // 获取状态 EngineStatus status; auto result = proxy_->get_engine_status(status); // 验证获取成功 EXPECT_EQ(result, common::ErrorCode::Success); // 验证状态内容 EXPECT_EQ(status.state, expected_status.state); EXPECT_DOUBLE_EQ(status.cpu_usage, expected_status.cpu_usage); EXPECT_DOUBLE_EQ(status.memory_usage_mb, expected_status.memory_usage_mb); EXPECT_EQ(status.frames_processed, expected_status.frames_processed); EXPECT_EQ(status.active_plugins, expected_status.active_plugins); EXPECT_EQ(status.buffer_underruns, expected_status.buffer_underruns); EXPECT_DOUBLE_EQ(status.current_latency_ms, expected_status.current_latency_ms); } // 测试音频数据传输 TEST_F(EngineProxyTest, AudioDataTransfer) { // 创建测试音频缓冲区 engine::AudioBuffer buffer(512, 2, engine::AudioFormat::FLOAT32); // 填充测试数据 float* data = buffer.interleaved_data(); for (size_t i = 0; i < 512 * 2; ++i) { data[i] = 0.1f * std::sin(2.0f * M_PI * i / 100.0f); } // 设置命令期望 comm_layer_->expect_command(EngineCommand::Initialize, "", common::ErrorCode::Success, "{}"); // 初始化代理 ASSERT_EQ(proxy_->initialize(), common::ErrorCode::Success); // 模拟连接 ASSERT_EQ(proxy_->override_connect(true), common::ErrorCode::Success); // 发送音频数据 auto result = proxy_->send_audio_data(buffer); // 验证发送成功 EXPECT_EQ(result, common::ErrorCode::Success); } // 测试插件管理 TEST_F(EngineProxyTest, PluginManagement) { // 设置命令期望 - 加载插件 std::string load_params = "{\"path\":\"/plugins/test_plugin.dll\"}"; std::string load_response = "{\"plugin_id\":\"plugin-123\"}"; comm_layer_->expect_command(EngineCommand::LoadPlugin, load_params, common::ErrorCode::Success, load_response); // 加载插件 std::string plugin_id; auto result = proxy_->load_plugin("/plugins/test_plugin.dll", plugin_id); // 验证加载成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_EQ(plugin_id, "plugin-123"); // 设置命令期望 - 卸载插件 std::string unload_params = "{\"plugin_id\":\"plugin-123\"}"; comm_layer_->expect_command(EngineCommand::UnloadPlugin, unload_params, common::ErrorCode::Success, "{}"); // 卸载插件 result = proxy_->unload_plugin(plugin_id); // 验证卸载成功 EXPECT_EQ(result, common::ErrorCode::Success); } // 测试参数管理 TEST_F(EngineProxyTest, ParameterManagement) { // 设置命令期望 - 设置参数 std::string set_param_params = "{\"plugin_id\":\"plugin-123\",\"param_name\":\"gain\",\"param_value\":\"0.8\"}"; comm_layer_->expect_command(EngineCommand::SetParameter, set_param_params, common::ErrorCode::Success, "{}"); // 设置参数 auto result = proxy_->set_parameter("plugin-123", "gain", "0.8"); // 验证设置成功 EXPECT_EQ(result, common::ErrorCode::Success); // 设置命令期望 - 获取参数 std::string get_param_params = "{\"plugin_id\":\"plugin-123\",\"param_name\":\"gain\"}"; std::string get_param_response = "{\"param_value\":\"0.8\"}"; comm_layer_->expect_command(EngineCommand::GetParameter, get_param_params, common::ErrorCode::Success, get_param_response); // 获取参数 std::string param_value; result = proxy_->get_parameter("plugin-123", "gain", param_value); // 验证获取成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_EQ(param_value, "0.8"); } // 测试统计信息 TEST_F(EngineProxyTest, Statistics) { // 设置命令期望 comm_layer_->expect_command(EngineCommand::Initialize, "", common::ErrorCode::Success, "{}"); // 初始化代理 ASSERT_EQ(proxy_->initialize(), common::ErrorCode::Success); // 发送一些命令 comm_layer_->expect_command(EngineCommand::Start, "", common::ErrorCode::Success, "{}"); proxy_->send_command(EngineCommand::Start); comm_layer_->expect_command(EngineCommand::Stop, "", common::ErrorCode::Success, "{}"); proxy_->send_command(EngineCommand::Stop); // 获取统计信息 const auto& stats = proxy_->get_statistics(); // 验证命令计数 EXPECT_GE(stats.commands_sent.load(), 2); // 重置统计信息 proxy_->reset_statistics(); // 验证统计信息已重置 EXPECT_EQ(stats.commands_sent.load(), 0); EXPECT_EQ(stats.commands_received.load(), 0); EXPECT_EQ(stats.audio_buffers_sent.load(), 0); EXPECT_EQ(stats.audio_buffers_received.load(), 0); } int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }