@@ -91,65 +91,6 @@ class UnitDisconnectTrackingDelegate : public RoomDelegate {
9191
9292} // namespace
9393
94- TEST_F (RoomTest, ServerDisconnectTearsDownRoomAndRemovesListener) {
95- Room room;
96- UnitDisconnectTrackingDelegate delegate;
97- std::atomic<int > listener_calls{0 };
98- room.setDelegate (&delegate);
99- RoomTestAccess::installConnectedListener (room, listener_calls);
100-
101- proto::FfiEvent event;
102- auto * room_event = event.mutable_room_event ();
103- room_event->set_room_handle (0 );
104- room_event->mutable_disconnected ()->set_reason (proto::ROOM_DELETED );
105-
106- emitFfiEvent (event);
107-
108- EXPECT_EQ (listener_calls.load (std::memory_order_relaxed), 1 );
109- EXPECT_EQ (room.connectionState (), ConnectionState::Disconnected);
110- EXPECT_FALSE (RoomTestAccess::hasRoomHandle (room));
111- EXPECT_EQ (RoomTestAccess::listenerId (room), 0 );
112- EXPECT_EQ (delegate.count , 1 );
113- EXPECT_EQ (delegate.reason , DisconnectReason::RoomDeleted);
114-
115- emitFfiEvent (event);
116- EXPECT_EQ (listener_calls.load (std::memory_order_relaxed), 1 ) << " server disconnect must unregister the Room listener" ;
117- EXPECT_EQ (delegate.count , 1 ) << " server disconnect must notify the delegate exactly once" ;
118- EXPECT_FALSE (room.disconnect ()) << " disconnect after server shutdown must be a no-op" ;
119- }
120-
121- TEST_F (RoomTest, ConnectAllowedAfterServerDisconnectShutdown) {
122- Room room;
123- UnitDisconnectTrackingDelegate delegate;
124- std::atomic<int > listener_calls{0 };
125- room.setDelegate (&delegate);
126- RoomTestAccess::installConnectedListener (room, listener_calls);
127-
128- proto::FfiEvent event;
129- auto * room_event = event.mutable_room_event ();
130- room_event->set_room_handle (0 );
131- room_event->mutable_disconnected ()->set_reason (proto::ROOM_DELETED );
132- emitFfiEvent (event);
133-
134- ASSERT_EQ (room.connectionState (), ConnectionState::Disconnected);
135- ASSERT_TRUE (RoomTestAccess::shutdownStarted (room));
136- ASSERT_EQ (delegate.count , 1 );
137-
138- // Room::connect() clears shutdown_started_ before FFI work; mirror that reset and run a
139- // second synthetic connection cycle to prove the Room is reusable after server shutdown.
140- RoomTestAccess::clearShutdownForReconnect (room);
141- EXPECT_FALSE (RoomTestAccess::shutdownStarted (room));
142-
143- listener_calls.store (0 , std::memory_order_relaxed);
144- RoomTestAccess::installConnectedListener (room, listener_calls);
145- emitFfiEvent (event);
146-
147- EXPECT_EQ (listener_calls.load (std::memory_order_relaxed), 1 );
148- EXPECT_EQ (delegate.count , 2 ) << " second connection cycle should notify onDisconnected again" ;
149- EXPECT_EQ (RoomTestAccess::listenerId (room), 0 );
150- EXPECT_TRUE (RoomTestAccess::shutdownStarted (room));
151- }
152-
15394TEST_F (RoomTest, ConnectWithoutInitialize) {
15495 // Test fixture initializes by default, do this to emulate lack of initialization
15596 livekit::shutdown ();
@@ -396,4 +337,31 @@ TEST_F(RoomTest, RemoteParticipantLookupBeforeConnect) {
396337 << " Looking up participant before connect should return an empty handle" ;
397338}
398339
340+ TEST_F (RoomTest, ServerDisconnectTearsDownRoomAndRemovesListener) {
341+ Room room;
342+ UnitDisconnectTrackingDelegate delegate;
343+ std::atomic<int > listener_calls{0 };
344+ room.setDelegate (&delegate);
345+ RoomTestAccess::installConnectedListener (room, listener_calls);
346+
347+ proto::FfiEvent event;
348+ auto * room_event = event.mutable_room_event ();
349+ room_event->set_room_handle (0 );
350+ room_event->mutable_disconnected ()->set_reason (proto::ROOM_DELETED );
351+
352+ emitFfiEvent (event);
353+
354+ EXPECT_EQ (listener_calls.load (std::memory_order_relaxed), 1 );
355+ EXPECT_EQ (room.connectionState (), ConnectionState::Disconnected);
356+ EXPECT_FALSE (RoomTestAccess::hasRoomHandle (room));
357+ EXPECT_EQ (RoomTestAccess::listenerId (room), 0 );
358+ EXPECT_EQ (delegate.count , 1 );
359+ EXPECT_EQ (delegate.reason , DisconnectReason::RoomDeleted);
360+
361+ emitFfiEvent (event);
362+ EXPECT_EQ (listener_calls.load (std::memory_order_relaxed), 1 ) << " server disconnect must unregister the Room listener" ;
363+ EXPECT_EQ (delegate.count , 1 ) << " server disconnect must notify the delegate exactly once" ;
364+ EXPECT_FALSE (room.disconnect ()) << " disconnect after server shutdown must be a no-op" ;
365+ }
366+
399367} // namespace livekit::test
0 commit comments