xref: /llvm-project/lldb/unittests/Utility/BroadcasterTest.cpp (revision 808142876c10b52e7ee57cdc6dcf0acc5c97c1b7)
1*80814287SRaphael Isemann //===-- BroadcasterTest.cpp -----------------------------------------------===//
2181b823bSPavel Labath //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6181b823bSPavel Labath //
7181b823bSPavel Labath //===----------------------------------------------------------------------===//
8181b823bSPavel Labath 
9181b823bSPavel Labath #include "gtest/gtest.h"
10181b823bSPavel Labath 
11181b823bSPavel Labath #include "lldb/Utility/Broadcaster.h"
12181b823bSPavel Labath #include "lldb/Utility/Event.h"
13181b823bSPavel Labath #include "lldb/Utility/Listener.h"
14181b823bSPavel Labath #include "lldb/Utility/Predicate.h"
15181b823bSPavel Labath 
16181b823bSPavel Labath #include <thread>
17181b823bSPavel Labath 
18181b823bSPavel Labath using namespace lldb;
19181b823bSPavel Labath using namespace lldb_private;
20181b823bSPavel Labath 
TEST(BroadcasterTest,BroadcastEvent)21181b823bSPavel Labath TEST(BroadcasterTest, BroadcastEvent) {
22181b823bSPavel Labath   EventSP event_sp;
23181b823bSPavel Labath   Broadcaster broadcaster(nullptr, "test-broadcaster");
24181b823bSPavel Labath   std::chrono::seconds timeout(0);
25181b823bSPavel Labath 
26181b823bSPavel Labath   // Create a listener, sign it up, make sure it receives an event.
27181b823bSPavel Labath   ListenerSP listener1_sp = Listener::MakeListener("test-listener1");
28181b823bSPavel Labath   const uint32_t event_mask1 = 1;
29181b823bSPavel Labath   EXPECT_EQ(event_mask1,
30181b823bSPavel Labath             listener1_sp->StartListeningForEvents(&broadcaster, event_mask1));
31181b823bSPavel Labath   broadcaster.BroadcastEvent(event_mask1, nullptr);
32181b823bSPavel Labath   EXPECT_TRUE(listener1_sp->GetEvent(event_sp, timeout));
33181b823bSPavel Labath   EXPECT_EQ(event_mask1, event_sp->GetType());
34181b823bSPavel Labath 
35181b823bSPavel Labath   {
36181b823bSPavel Labath     // Add one more listener, make sure it works as well.
37181b823bSPavel Labath     ListenerSP listener2_sp = Listener::MakeListener("test-listener2");
38181b823bSPavel Labath     const uint32_t event_mask2 = 1;
39181b823bSPavel Labath     EXPECT_EQ(event_mask2, listener2_sp->StartListeningForEvents(
40181b823bSPavel Labath                                &broadcaster, event_mask1 | event_mask2));
41181b823bSPavel Labath     broadcaster.BroadcastEvent(event_mask2, nullptr);
42181b823bSPavel Labath     EXPECT_TRUE(listener2_sp->GetEvent(event_sp, timeout));
43181b823bSPavel Labath     EXPECT_EQ(event_mask2, event_sp->GetType());
44181b823bSPavel Labath 
45181b823bSPavel Labath     // Both listeners should get this event.
46181b823bSPavel Labath     broadcaster.BroadcastEvent(event_mask1, nullptr);
47181b823bSPavel Labath     EXPECT_TRUE(listener1_sp->GetEvent(event_sp, timeout));
48181b823bSPavel Labath     EXPECT_EQ(event_mask1, event_sp->GetType());
49181b823bSPavel Labath     EXPECT_TRUE(listener2_sp->GetEvent(event_sp, timeout));
50181b823bSPavel Labath     EXPECT_EQ(event_mask2, event_sp->GetType());
51181b823bSPavel Labath   }
52181b823bSPavel Labath 
53181b823bSPavel Labath   // Now again only one listener should be active.
54181b823bSPavel Labath   broadcaster.BroadcastEvent(event_mask1, nullptr);
55181b823bSPavel Labath   EXPECT_TRUE(listener1_sp->GetEvent(event_sp, timeout));
56181b823bSPavel Labath   EXPECT_EQ(event_mask1, event_sp->GetType());
57181b823bSPavel Labath }
58181b823bSPavel Labath 
TEST(BroadcasterTest,EventTypeHasListeners)59181b823bSPavel Labath TEST(BroadcasterTest, EventTypeHasListeners) {
60181b823bSPavel Labath   EventSP event_sp;
61181b823bSPavel Labath   Broadcaster broadcaster(nullptr, "test-broadcaster");
62181b823bSPavel Labath 
63181b823bSPavel Labath   const uint32_t event_mask = 1;
64181b823bSPavel Labath   EXPECT_FALSE(broadcaster.EventTypeHasListeners(event_mask));
65181b823bSPavel Labath 
66181b823bSPavel Labath   {
67181b823bSPavel Labath     ListenerSP listener_sp = Listener::MakeListener("test-listener");
68181b823bSPavel Labath     EXPECT_EQ(event_mask,
69181b823bSPavel Labath               listener_sp->StartListeningForEvents(&broadcaster, event_mask));
70181b823bSPavel Labath     EXPECT_TRUE(broadcaster.EventTypeHasListeners(event_mask));
71181b823bSPavel Labath   }
72181b823bSPavel Labath 
73181b823bSPavel Labath   EXPECT_FALSE(broadcaster.EventTypeHasListeners(event_mask));
74181b823bSPavel Labath }
75