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