"""
Test API logging.
"""

import re

import lldb
import lldbsuite.test.lldbutil as lldbutil
from lldbsuite.test.lldbtest import *


class APILogTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def test_api_log(self):
        """Test API logging"""
        logfile = self.getBuildArtifact("api-log.txt")

        self.expect("log enable lldb api -f {}".format(logfile))

        self.dbg.SetDefaultArchitecture(None)
        self.dbg.GetScriptingLanguage(None)
        target = self.dbg.CreateTarget(None)

        self.assertTrue(os.path.isfile(logfile))
        with open(logfile, "r") as f:
            log = f.read()

        # Find the SBDebugger's address.
        debugger_addr = re.findall(
            r"lldb::SBDebugger::GetScriptingLanguage\([^)]*\) \(0x([0-9a-fA-F]+),", log
        )

        # Make sure we've found a match.
        self.assertTrue(debugger_addr, log)

        # Make sure the GetScriptingLanguage matches.
        self.assertTrue(
            re.search(
                r'lldb::SBDebugger::GetScriptingLanguage\([^)]*\) \(0x{}, ""\)'.format(
                    debugger_addr[0]
                ),
                log,
            ),
            log,
        )

        # Make sure the address matches.
        self.assertTrue(
            re.search(
                r'lldb::SBDebugger::CreateTarget\([^)]*\) \(0x{}, ""\)'.format(
                    debugger_addr[0]
                ),
                log,
            ),
            log,
        )
