12fc38b2bSJonas Devlieghere //===-- DiagnosticEventTest.cpp -------------------------------------------===//
22fc38b2bSJonas Devlieghere //
32fc38b2bSJonas Devlieghere // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42fc38b2bSJonas Devlieghere // See https://llvm.org/LICENSE.txt for license information.
52fc38b2bSJonas Devlieghere // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62fc38b2bSJonas Devlieghere //
72fc38b2bSJonas Devlieghere //===----------------------------------------------------------------------===//
82fc38b2bSJonas Devlieghere
92fc38b2bSJonas Devlieghere #include "gtest/gtest.h"
102fc38b2bSJonas Devlieghere
112fc38b2bSJonas Devlieghere #include "Plugins/Platform/MacOSX/PlatformMacOSX.h"
122fc38b2bSJonas Devlieghere #include "Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h"
132fc38b2bSJonas Devlieghere #include "TestingSupport/SubsystemRAII.h"
1456900278SChelsea Cassanova #include "TestingSupport/TestUtilities.h"
152fc38b2bSJonas Devlieghere #include "lldb/Core/Debugger.h"
162fc38b2bSJonas Devlieghere #include "lldb/Core/DebuggerEvents.h"
172fc38b2bSJonas Devlieghere #include "lldb/Host/FileSystem.h"
182fc38b2bSJonas Devlieghere #include "lldb/Host/HostInfo.h"
192fc38b2bSJonas Devlieghere #include "lldb/Utility/Broadcaster.h"
202fc38b2bSJonas Devlieghere #include "lldb/Utility/Event.h"
212fc38b2bSJonas Devlieghere #include "lldb/Utility/Listener.h"
222fc38b2bSJonas Devlieghere
232fc38b2bSJonas Devlieghere using namespace lldb;
242fc38b2bSJonas Devlieghere using namespace lldb_private;
252fc38b2bSJonas Devlieghere using namespace lldb_private::repro;
262fc38b2bSJonas Devlieghere
272fc38b2bSJonas Devlieghere static const constexpr std::chrono::seconds TIMEOUT(0);
282fc38b2bSJonas Devlieghere static const constexpr size_t DEBUGGERS = 3;
292fc38b2bSJonas Devlieghere
302fc38b2bSJonas Devlieghere namespace {
312fc38b2bSJonas Devlieghere class DiagnosticEventTest : public ::testing::Test {
322fc38b2bSJonas Devlieghere public:
SetUp()332fc38b2bSJonas Devlieghere void SetUp() override {
342fc38b2bSJonas Devlieghere FileSystem::Initialize();
352fc38b2bSJonas Devlieghere HostInfo::Initialize();
362fc38b2bSJonas Devlieghere PlatformMacOSX::Initialize();
3756900278SChelsea Cassanova std::call_once(TestUtilities::g_debugger_initialize_flag,
382fc38b2bSJonas Devlieghere []() { Debugger::Initialize(nullptr); });
392fc38b2bSJonas Devlieghere ArchSpec arch("x86_64-apple-macosx-");
402fc38b2bSJonas Devlieghere Platform::SetHostPlatform(
41d6678404SMed Ismail Bennani PlatformRemoteMacOSX::CreateInstance(true, &arch));
422fc38b2bSJonas Devlieghere }
TearDown()432fc38b2bSJonas Devlieghere void TearDown() override {
442fc38b2bSJonas Devlieghere PlatformMacOSX::Terminate();
452fc38b2bSJonas Devlieghere HostInfo::Terminate();
462fc38b2bSJonas Devlieghere FileSystem::Terminate();
472fc38b2bSJonas Devlieghere }
482fc38b2bSJonas Devlieghere };
492fc38b2bSJonas Devlieghere } // namespace
502fc38b2bSJonas Devlieghere
TEST_F(DiagnosticEventTest,Warning)512fc38b2bSJonas Devlieghere TEST_F(DiagnosticEventTest, Warning) {
522fc38b2bSJonas Devlieghere DebuggerSP debugger_sp = Debugger::CreateInstance();
532fc38b2bSJonas Devlieghere
542fc38b2bSJonas Devlieghere Broadcaster &broadcaster = debugger_sp->GetBroadcaster();
552fc38b2bSJonas Devlieghere ListenerSP listener_sp = Listener::MakeListener("test-listener");
562fc38b2bSJonas Devlieghere
572fc38b2bSJonas Devlieghere listener_sp->StartListeningForEvents(&broadcaster,
58*b9e3fa84SChelsea Cassanova lldb::eBroadcastBitWarning);
59*b9e3fa84SChelsea Cassanova EXPECT_TRUE(broadcaster.EventTypeHasListeners(lldb::eBroadcastBitWarning));
602fc38b2bSJonas Devlieghere
612fc38b2bSJonas Devlieghere Debugger::ReportWarning("foo", debugger_sp->GetID());
622fc38b2bSJonas Devlieghere
632fc38b2bSJonas Devlieghere EventSP event_sp;
642fc38b2bSJonas Devlieghere EXPECT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
652fc38b2bSJonas Devlieghere ASSERT_TRUE(event_sp);
662fc38b2bSJonas Devlieghere
672fc38b2bSJonas Devlieghere const DiagnosticEventData *data =
682fc38b2bSJonas Devlieghere DiagnosticEventData::GetEventDataFromEvent(event_sp.get());
692fc38b2bSJonas Devlieghere ASSERT_NE(data, nullptr);
702fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetPrefix(), "warning");
712fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetMessage(), "foo");
722fc38b2bSJonas Devlieghere
732fc38b2bSJonas Devlieghere Debugger::Destroy(debugger_sp);
742fc38b2bSJonas Devlieghere }
752fc38b2bSJonas Devlieghere
TEST_F(DiagnosticEventTest,Error)762fc38b2bSJonas Devlieghere TEST_F(DiagnosticEventTest, Error) {
772fc38b2bSJonas Devlieghere DebuggerSP debugger_sp = Debugger::CreateInstance();
782fc38b2bSJonas Devlieghere
792fc38b2bSJonas Devlieghere Broadcaster &broadcaster = debugger_sp->GetBroadcaster();
802fc38b2bSJonas Devlieghere ListenerSP listener_sp = Listener::MakeListener("test-listener");
812fc38b2bSJonas Devlieghere
82*b9e3fa84SChelsea Cassanova listener_sp->StartListeningForEvents(&broadcaster, lldb::eBroadcastBitError);
83*b9e3fa84SChelsea Cassanova EXPECT_TRUE(broadcaster.EventTypeHasListeners(lldb::eBroadcastBitError));
842fc38b2bSJonas Devlieghere
852fc38b2bSJonas Devlieghere Debugger::ReportError("bar", debugger_sp->GetID());
862fc38b2bSJonas Devlieghere
872fc38b2bSJonas Devlieghere EventSP event_sp;
882fc38b2bSJonas Devlieghere EXPECT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
892fc38b2bSJonas Devlieghere ASSERT_TRUE(event_sp);
902fc38b2bSJonas Devlieghere
912fc38b2bSJonas Devlieghere const DiagnosticEventData *data =
922fc38b2bSJonas Devlieghere DiagnosticEventData::GetEventDataFromEvent(event_sp.get());
932fc38b2bSJonas Devlieghere ASSERT_NE(data, nullptr);
942fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetPrefix(), "error");
952fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetMessage(), "bar");
962fc38b2bSJonas Devlieghere
972fc38b2bSJonas Devlieghere Debugger::Destroy(debugger_sp);
982fc38b2bSJonas Devlieghere }
992fc38b2bSJonas Devlieghere
TEST_F(DiagnosticEventTest,MultipleDebuggers)1002fc38b2bSJonas Devlieghere TEST_F(DiagnosticEventTest, MultipleDebuggers) {
1012fc38b2bSJonas Devlieghere std::vector<DebuggerSP> debuggers;
1022fc38b2bSJonas Devlieghere std::vector<ListenerSP> listeners;
1032fc38b2bSJonas Devlieghere
1042fc38b2bSJonas Devlieghere for (size_t i = 0; i < DEBUGGERS; ++i) {
1052fc38b2bSJonas Devlieghere DebuggerSP debugger = Debugger::CreateInstance();
1062fc38b2bSJonas Devlieghere ListenerSP listener = Listener::MakeListener("listener");
1072fc38b2bSJonas Devlieghere
1082fc38b2bSJonas Devlieghere debuggers.push_back(debugger);
1092fc38b2bSJonas Devlieghere listeners.push_back(listener);
1102fc38b2bSJonas Devlieghere
1112fc38b2bSJonas Devlieghere listener->StartListeningForEvents(&debugger->GetBroadcaster(),
112*b9e3fa84SChelsea Cassanova lldb::eBroadcastBitError);
1132fc38b2bSJonas Devlieghere }
1142fc38b2bSJonas Devlieghere
1152fc38b2bSJonas Devlieghere Debugger::ReportError("baz");
1162fc38b2bSJonas Devlieghere
1172fc38b2bSJonas Devlieghere for (size_t i = 0; i < DEBUGGERS; ++i) {
1182fc38b2bSJonas Devlieghere EventSP event_sp;
1192fc38b2bSJonas Devlieghere EXPECT_TRUE(listeners[i]->GetEvent(event_sp, TIMEOUT));
1202fc38b2bSJonas Devlieghere ASSERT_TRUE(event_sp);
1212fc38b2bSJonas Devlieghere
1222fc38b2bSJonas Devlieghere const DiagnosticEventData *data =
1232fc38b2bSJonas Devlieghere DiagnosticEventData::GetEventDataFromEvent(event_sp.get());
1242fc38b2bSJonas Devlieghere ASSERT_NE(data, nullptr);
1252fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetPrefix(), "error");
1262fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetMessage(), "baz");
1272fc38b2bSJonas Devlieghere }
1282fc38b2bSJonas Devlieghere
1292fc38b2bSJonas Devlieghere for (size_t i = 0; i < DEBUGGERS; ++i) {
1302fc38b2bSJonas Devlieghere Debugger::Destroy(debuggers[i]);
1312fc38b2bSJonas Devlieghere }
1322fc38b2bSJonas Devlieghere }
1332fc38b2bSJonas Devlieghere
TEST_F(DiagnosticEventTest,WarningOnce)1342fc38b2bSJonas Devlieghere TEST_F(DiagnosticEventTest, WarningOnce) {
1352fc38b2bSJonas Devlieghere DebuggerSP debugger_sp = Debugger::CreateInstance();
1362fc38b2bSJonas Devlieghere
1372fc38b2bSJonas Devlieghere Broadcaster &broadcaster = debugger_sp->GetBroadcaster();
1382fc38b2bSJonas Devlieghere ListenerSP listener_sp = Listener::MakeListener("test-listener");
1392fc38b2bSJonas Devlieghere
1402fc38b2bSJonas Devlieghere listener_sp->StartListeningForEvents(&broadcaster,
141*b9e3fa84SChelsea Cassanova lldb::eBroadcastBitWarning);
142*b9e3fa84SChelsea Cassanova EXPECT_TRUE(broadcaster.EventTypeHasListeners(lldb::eBroadcastBitWarning));
1432fc38b2bSJonas Devlieghere
1442fc38b2bSJonas Devlieghere std::once_flag once;
1452fc38b2bSJonas Devlieghere Debugger::ReportWarning("foo", debugger_sp->GetID(), &once);
1462fc38b2bSJonas Devlieghere
1472fc38b2bSJonas Devlieghere {
1482fc38b2bSJonas Devlieghere EventSP event_sp;
1492fc38b2bSJonas Devlieghere EXPECT_TRUE(listener_sp->GetEvent(event_sp, TIMEOUT));
1502fc38b2bSJonas Devlieghere ASSERT_TRUE(event_sp);
1512fc38b2bSJonas Devlieghere
1522fc38b2bSJonas Devlieghere const DiagnosticEventData *data =
1532fc38b2bSJonas Devlieghere DiagnosticEventData::GetEventDataFromEvent(event_sp.get());
1542fc38b2bSJonas Devlieghere ASSERT_NE(data, nullptr);
1552fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetPrefix(), "warning");
1562fc38b2bSJonas Devlieghere EXPECT_EQ(data->GetMessage(), "foo");
1572fc38b2bSJonas Devlieghere }
1582fc38b2bSJonas Devlieghere
1592fc38b2bSJonas Devlieghere EventSP second_event_sp;
1602fc38b2bSJonas Devlieghere EXPECT_FALSE(listener_sp->GetEvent(second_event_sp, TIMEOUT));
1612fc38b2bSJonas Devlieghere
1622fc38b2bSJonas Devlieghere Debugger::ReportWarning("foo", debugger_sp->GetID(), &once);
1632fc38b2bSJonas Devlieghere EXPECT_FALSE(listener_sp->GetEvent(second_event_sp, TIMEOUT));
1642fc38b2bSJonas Devlieghere
1652fc38b2bSJonas Devlieghere Debugger::ReportWarning("foo", debugger_sp->GetID());
1662fc38b2bSJonas Devlieghere EXPECT_TRUE(listener_sp->GetEvent(second_event_sp, TIMEOUT));
1672fc38b2bSJonas Devlieghere
1682fc38b2bSJonas Devlieghere Debugger::Destroy(debugger_sp);
1692fc38b2bSJonas Devlieghere }
170