================ @@ -150,3 +150,84 @@ TEST(ListenerTest, StartStopListeningForEventSpec) { ASSERT_EQ(event_sp->GetBroadcaster(), &broadcaster1); ASSERT_FALSE(listener_sp->GetEvent(event_sp, std::chrono::seconds(0))); } + +TEST(ListenerTest, MoveEventsOnHijackAndRestore) { + Broadcaster broadcaster(nullptr, "test-broadcaster"); + const uint32_t event_mask = 1; + EventSP event_sp; + + // Create the original listener and start listening. + ListenerSP original_listener = Listener::MakeListener("original-listener"); + ASSERT_EQ(event_mask, original_listener->StartListeningForEvents(&broadcaster, + event_mask)); + broadcaster.SetPrimaryListener(original_listener); + + // Queue two events to original listener, but do not consume them yet. + broadcaster.BroadcastEvent(event_mask, nullptr); + broadcaster.BroadcastEvent(event_mask, nullptr); + + // Hijack. + ListenerSP hijack_listener = Listener::MakeListener("hijack-listener"); + broadcaster.HijackBroadcaster(hijack_listener, event_mask); + + // The events should have been moved to the hijack listener. + EXPECT_FALSE(original_listener->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(hijack_listener->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(hijack_listener->GetEvent(event_sp, std::chrono::seconds(0))); + + // Queue two events while hijacked, but do not consume them yet. + broadcaster.BroadcastEvent(event_mask, nullptr); + broadcaster.BroadcastEvent(event_mask, nullptr); + + // Restore the original listener. + broadcaster.RestoreBroadcaster(); + + // The events queued while hijacked should have been moved back to the + // original listener. + EXPECT_FALSE(hijack_listener->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(original_listener->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(original_listener->GetEvent(event_sp, std::chrono::seconds(0))); +} + +TEST(ListenerTest, MoveEventsBetweenHijackers) { + Broadcaster broadcaster(nullptr, "test-broadcaster"); + const uint32_t event_mask = 1; + EventSP event_sp; + + // Create the original listener and start listening. + ListenerSP original_listener = Listener::MakeListener("original-listener"); + ASSERT_EQ(event_mask, original_listener->StartListeningForEvents(&broadcaster, + event_mask)); + broadcaster.SetPrimaryListener(original_listener); + + // First hijack. + ListenerSP hijack_listener1 = Listener::MakeListener("hijack-listener1"); + broadcaster.HijackBroadcaster(hijack_listener1, event_mask); + + // Queue two events while hijacked, but do not consume + // them yet. + broadcaster.BroadcastEvent(event_mask, nullptr); + broadcaster.BroadcastEvent(event_mask, nullptr); + + // Second hijack. + ListenerSP hijack_listener2 = Listener::MakeListener("hijack-listener2"); + broadcaster.HijackBroadcaster(hijack_listener2, event_mask); + + // The second hijacker should have the events now. + EXPECT_FALSE(hijack_listener1->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(hijack_listener2->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(hijack_listener2->GetEvent(event_sp, std::chrono::seconds(0))); + + // Queue two events while hijacked with second hijacker, but do not consume + // them yet. + broadcaster.BroadcastEvent(event_mask, nullptr); + broadcaster.BroadcastEvent(event_mask, nullptr); + + // Restore the previous hijacker. + broadcaster.RestoreBroadcaster(); + + // The first hijacker should now have the events. + EXPECT_FALSE(hijack_listener2->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(hijack_listener1->GetEvent(event_sp, std::chrono::seconds(0))); + EXPECT_TRUE(hijack_listener1->GetEvent(event_sp, std::chrono::seconds(0))); +} ---------------- labath wrote:
add a newline here https://github.com/llvm/llvm-project/pull/144919 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits