// ================================================================================================ // Audio Backend - 会话管理器测试 // ================================================================================================ #include #include #include "frontend/network/session_manager.h" #include "tests/common/test_fixtures.h" #include #include #include #include using namespace audio_backend; using namespace audio_backend::frontend; using namespace std::chrono_literals; // 创建模拟会话事件监听器 class MockSessionEventListener : public ISessionEventListener { public: MOCK_METHOD(void, on_session_created, (const SessionInfo&), (override)); MOCK_METHOD(void, on_session_closed, (const std::string&), (override)); MOCK_METHOD(void, on_session_error, (const std::string&, SessionErrorType, const std::string&), (override)); MOCK_METHOD(void, on_session_status_changed, (const std::string&, SessionStatus, SessionStatus), (override)); MOCK_METHOD(void, on_client_joined, (const std::string&, const ClientInfo&), (override)); MOCK_METHOD(void, on_client_left, (const std::string&, const std::string&), (override)); MOCK_METHOD(void, on_session_config_changed, (const std::string&, const SessionConfig&), (override)); MOCK_METHOD(void, on_session_stats_updated, (const std::string&, const SessionStatistics&), (override)); }; // 创建模拟传输层 class MockTransportLayer { public: MOCK_METHOD(common::ErrorCode, initialize, ()); MOCK_METHOD(common::ErrorCode, shutdown, ()); MOCK_METHOD(bool, is_initialized, (), (const)); MOCK_METHOD(common::ErrorCode, connect, (const std::string&, uint16_t)); MOCK_METHOD(common::ErrorCode, disconnect, ()); MOCK_METHOD(bool, is_connected, (), (const)); MOCK_METHOD(common::ErrorCode, send_data, (const std::vector&)); MOCK_METHOD(common::ErrorCode, receive_data, (std::vector&, std::chrono::milliseconds)); MOCK_METHOD(common::ErrorCode, join_multicast_group, (const std::string&)); MOCK_METHOD(common::ErrorCode, leave_multicast_group, (const std::string&)); }; // 创建可测试会话管理器 class TestableSessionManager : public SessionManager { public: explicit TestableSessionManager(const SessionManagerConfig& config) : SessionManager(config) {} // 设置模拟传输层 void set_mock_transport_layer(std::shared_ptr transport) { mock_transport_ = transport; } // 重载内部方法以使用模拟对象 common::ErrorCode initialize_transport() override { if (mock_transport_) { return mock_transport_->initialize(); } return common::ErrorCode::InitializationFailed; } // 模拟会话操作 void simulate_session_created(const SessionInfo& session) { sessions_[session.id] = session; notify_session_created(session); } void simulate_session_closed(const std::string& session_id) { auto it = sessions_.find(session_id); if (it != sessions_.end()) { sessions_.erase(it); notify_session_closed(session_id); } } void simulate_session_status_changed(const std::string& session_id, SessionStatus new_status) { auto it = sessions_.find(session_id); if (it != sessions_.end()) { SessionStatus old_status = it->second.status; it->second.status = new_status; notify_session_status_changed(session_id, old_status, new_status); } } void simulate_client_joined(const std::string& session_id, const ClientInfo& client) { auto it = sessions_.find(session_id); if (it != sessions_.end()) { it->second.clients.push_back(client); notify_client_joined(session_id, client); } } void simulate_client_left(const std::string& session_id, const std::string& client_id) { auto it = sessions_.find(session_id); if (it != sessions_.end()) { auto& clients = it->second.clients; for (auto cit = clients.begin(); cit != clients.end(); ++cit) { if (cit->id == client_id) { clients.erase(cit); break; } } notify_client_left(session_id, client_id); } } void simulate_session_error(const std::string& session_id, SessionErrorType error, const std::string& message) { notify_session_error(session_id, error, message); } // 暴露内部函数和状态用于测试 using SessionManager::notify_session_created; using SessionManager::notify_session_closed; using SessionManager::notify_session_error; using SessionManager::notify_session_status_changed; using SessionManager::notify_client_joined; using SessionManager::notify_client_left; using SessionManager::notify_session_config_changed; using SessionManager::notify_session_stats_updated; std::map sessions_; private: std::shared_ptr mock_transport_; }; // 会话管理器测试固定装置 class SessionManagerTest : public test::FrontendTest { protected: void SetUp() override { test::FrontendTest::SetUp(); // 创建模拟传输层 mock_transport_ = std::make_shared(); // 创建会话管理器配置 SessionManagerConfig config; config.max_sessions = 10; config.enable_auto_reconnect = true; config.reconnect_interval_ms = 1000; config.session_timeout_ms = 30000; config.default_port = 8000; // 创建可测试会话管理器 session_manager_ = std::make_unique(config); // 设置模拟传输层 session_manager_->set_mock_transport_layer(mock_transport_); // 创建模拟事件监听器 listener_ = std::make_shared<::testing::NiceMock>(); // 添加事件监听器 session_manager_->add_listener(listener_); } void TearDown() override { // 移除事件监听器 if (listener_ && session_manager_) { session_manager_->remove_listener(listener_); } // 关闭会话管理器 if (session_manager_ && session_manager_->is_initialized()) { session_manager_->shutdown(); } session_manager_.reset(); listener_.reset(); mock_transport_.reset(); test::FrontendTest::TearDown(); } // 创建测试会话信息 SessionInfo create_test_session(const std::string& id = "session-1") { SessionInfo session; session.id = id; session.name = "测试会话 " + id; session.host = "192.168.1.100"; session.port = 8000; session.status = SessionStatus::Active; session.input_device_id = "input-device-1"; session.output_device_id = "output-device-1"; session.start_time = std::chrono::system_clock::now(); session.sample_rate = 48000; session.channels = 2; session.format = engine::AudioFormat::FLOAT32; // 添加两个客户端 ClientInfo client1; client1.id = "client-1"; client1.name = "客户端1"; client1.address = "192.168.1.101"; client1.join_time = std::chrono::system_clock::now(); client1.status = ClientStatus::Connected; session.clients.push_back(client1); ClientInfo client2; client2.id = "client-2"; client2.name = "客户端2"; client2.address = "192.168.1.102"; client2.join_time = std::chrono::system_clock::now(); client2.status = ClientStatus::Connected; session.clients.push_back(client2); return session; } // 创建测试客户端信息 ClientInfo create_test_client(const std::string& id = "client-3") { ClientInfo client; client.id = id; client.name = "客户端 " + id; client.address = "192.168.1.103"; client.join_time = std::chrono::system_clock::now(); client.status = ClientStatus::Connected; return client; } protected: std::shared_ptr mock_transport_; std::unique_ptr session_manager_; std::shared_ptr listener_; }; // 测试初始化和关闭 TEST_F(SessionManagerTest, InitializeAndShutdown) { // 设置模拟传输层期望 EXPECT_CALL(*mock_transport_, initialize()) .Times(1) .WillOnce(::testing::Return(common::ErrorCode::Success)); // 初始化会话管理器 auto result = session_manager_->initialize(); // 验证初始化成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_TRUE(session_manager_->is_initialized()); // 设置模拟传输层关闭期望 EXPECT_CALL(*mock_transport_, shutdown()) .Times(1) .WillOnce(::testing::Return(common::ErrorCode::Success)); // 关闭会话管理器 result = session_manager_->shutdown(); // 验证关闭成功 EXPECT_EQ(result, common::ErrorCode::Success); EXPECT_FALSE(session_manager_->is_initialized()); } // 测试会话创建事件 TEST_F(SessionManagerTest, SessionCreationEvent) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建测试会话 SessionInfo session = create_test_session(); // 设置事件期望 EXPECT_CALL(*listener_, on_session_created(::testing::_)) .Times(1) .WillOnce(::testing::Invoke([&session](const SessionInfo& info) { EXPECT_EQ(info.id, session.id); EXPECT_EQ(info.name, session.name); EXPECT_EQ(info.host, session.host); EXPECT_EQ(info.port, session.port); EXPECT_EQ(info.status, session.status); })); // 模拟会话创建 session_manager_->simulate_session_created(session); // 验证会话存在 EXPECT_EQ(session_manager_->sessions_.size(), 1); EXPECT_TRUE(session_manager_->sessions_.count(session.id) > 0); } // 测试会话关闭事件 TEST_F(SessionManagerTest, SessionCloseEvent) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建测试会话 SessionInfo session = create_test_session(); session_manager_->simulate_session_created(session); // 设置事件期望 EXPECT_CALL(*listener_, on_session_closed(session.id)) .Times(1); // 模拟会话关闭 session_manager_->simulate_session_closed(session.id); // 验证会话已关闭 EXPECT_EQ(session_manager_->sessions_.size(), 0); } // 测试会话状态变更事件 TEST_F(SessionManagerTest, SessionStatusChangeEvent) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建测试会话 SessionInfo session = create_test_session(); session_manager_->simulate_session_created(session); // 设置事件期望 SessionStatus old_status = session.status; SessionStatus new_status = SessionStatus::Paused; EXPECT_CALL(*listener_, on_session_status_changed(session.id, old_status, new_status)) .Times(1); // 模拟状态变更 session_manager_->simulate_session_status_changed(session.id, new_status); // 验证状态已变更 EXPECT_EQ(session_manager_->sessions_[session.id].status, new_status); } // 测试客户端加入事件 TEST_F(SessionManagerTest, ClientJoinEvent) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建测试会话 SessionInfo session = create_test_session(); session_manager_->simulate_session_created(session); // 创建新客户端 ClientInfo new_client = create_test_client(); // 设置事件期望 EXPECT_CALL(*listener_, on_client_joined(session.id, ::testing::_)) .Times(1) .WillOnce(::testing::Invoke([&new_client](const std::string& session_id, const ClientInfo& client) { EXPECT_EQ(client.id, new_client.id); EXPECT_EQ(client.name, new_client.name); EXPECT_EQ(client.address, new_client.address); EXPECT_EQ(client.status, new_client.status); })); // 模拟客户端加入 session_manager_->simulate_client_joined(session.id, new_client); // 验证客户端已加入 EXPECT_EQ(session_manager_->sessions_[session.id].clients.size(), 3); } // 测试客户端离开事件 TEST_F(SessionManagerTest, ClientLeaveEvent) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建测试会话 SessionInfo session = create_test_session(); session_manager_->simulate_session_created(session); // 要离开的客户端ID std::string client_id = session.clients[0].id; // 设置事件期望 EXPECT_CALL(*listener_, on_client_left(session.id, client_id)) .Times(1); // 模拟客户端离开 session_manager_->simulate_client_left(session.id, client_id); // 验证客户端已离开 EXPECT_EQ(session_manager_->sessions_[session.id].clients.size(), 1); } // 测试会话错误事件 TEST_F(SessionManagerTest, SessionErrorEvent) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建测试会话 SessionInfo session = create_test_session(); session_manager_->simulate_session_created(session); // 设置错误事件期望 SessionErrorType error_type = SessionErrorType::ConnectionError; std::string error_message = "会话连接中断"; EXPECT_CALL(*listener_, on_session_error(session.id, error_type, error_message)) .Times(1); // 模拟会话错误 session_manager_->simulate_session_error(session.id, error_type, error_message); } // 测试多个会话管理 TEST_F(SessionManagerTest, MultipleSessionManagement) { // 初始化会话管理器 EXPECT_CALL(*mock_transport_, initialize()) .WillOnce(::testing::Return(common::ErrorCode::Success)); ASSERT_EQ(session_manager_->initialize(), common::ErrorCode::Success); // 创建多个测试会话 SessionInfo session1 = create_test_session("session-1"); SessionInfo session2 = create_test_session("session-2"); SessionInfo session3 = create_test_session("session-3"); // 设置事件期望 EXPECT_CALL(*listener_, on_session_created(::testing::_)) .Times(3); // 模拟创建多个会话 session_manager_->simulate_session_created(session1); session_manager_->simulate_session_created(session2); session_manager_->simulate_session_created(session3); // 验证会话已创建 EXPECT_EQ(session_manager_->sessions_.size(), 3); // 设置会话关闭事件期望 EXPECT_CALL(*listener_, on_session_closed(::testing::_)) .Times(3); // 模拟关闭所有会话 session_manager_->simulate_session_closed(session1.id); session_manager_->simulate_session_closed(session2.id); session_manager_->simulate_session_closed(session3.id); // 验证会话已关闭 EXPECT_EQ(session_manager_->sessions_.size(), 0); } int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }