"""
Test that we are able to broadcast and receive diagnostic events from lldb
"""
import lldb

import lldbsuite.test.lldbutil as lldbutil

from lldbsuite.test.lldbtest import *


class TestDiagnosticReporting(TestBase):
    def setUp(self):
        TestBase.setUp(self)

        self.broadcaster = self.dbg.GetBroadcaster()
        self.listener = lldbutil.start_listening_from(
            self.broadcaster,
            lldb.eBroadcastBitWarning | lldb.eBroadcastBitError,
        )

    def test_dwarf_symbol_loading_diagnostic_report(self):
        """Test that we are able to fetch diagnostic events"""

        self.yaml2obj("minidump.yaml", self.getBuildArtifact("minidump.core"))

        self.dbg.CreateTarget(None)
        self.target = self.dbg.GetSelectedTarget()
        self.process = self.target.LoadCore(self.getBuildArtifact("minidump.core"))

        event = lldbutil.fetch_next_event(self, self.listener, self.broadcaster)
        diagnostic_data = lldb.SBDebugger.GetDiagnosticFromEvent(event)
        self.assertEqual(
            diagnostic_data.GetValueForKey("type").GetStringValue(100), "warning"
        )
        self.assertEqual(
            diagnostic_data.GetValueForKey("message").GetStringValue(100),
            "unable to retrieve process ID from minidump file, setting process ID to 1",
        )
