xref: /llvm-project/lldb/test/API/macosx/rosetta/TestRosetta.py (revision baffaf000fd4667f33b3756d0d3b645b1d926b44)
1import re
2import lldb
3import lldbsuite.test.lldbutil as lldbutil
4from lldbsuite.test.lldbtest import *
5from lldbsuite.test.decorators import *
6from os.path import exists
7
8
9def get_os_version():
10    try:
11        os_version_str = subprocess.check_output(["sysctl", "kern.osversion"]).decode(
12            "utf-8"
13        )
14    except subprocess.CalledProcessError:
15        return None
16    m = re.match(r"kern\.osversion: (\w+)", os_version_str)
17    if m:
18        return m.group(1)
19    return None
20
21
22def rosetta_debugserver_installed():
23    return exists("/Library/Apple/usr/libexec/oah/debugserver")
24
25
26def has_rosetta_shared_cache(os_version):
27    if not os_version:
28        return False
29    macos_device_support = os.path.join(
30        os.path.expanduser("~"), "Library", "Developer", "Xcode", "macOS DeviceSupport"
31    )
32    for _, subdirs, _ in os.walk(macos_device_support):
33        for subdir in subdirs:
34            if os_version in subdir:
35                return True
36    return False
37
38
39class TestRosetta(TestBase):
40    NO_DEBUG_INFO_TESTCASE = True
41
42    @skipUnlessAppleSilicon
43    @skipIfLLVMTargetMissing("X86")
44    @skipIfDarwinEmbedded
45    def test_rosetta(self):
46        """There can be many tests in a test case - describe this test here."""
47        self.build()
48        self.main_source_file = lldb.SBFileSpec("main.c")
49
50        if rosetta_debugserver_installed():
51            broadcaster = self.dbg.GetBroadcaster()
52            listener = lldbutil.start_listening_from(
53                broadcaster, lldb.SBDebugger.eBroadcastBitWarning
54            )
55
56            target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(
57                self, "Set a breakpoint here", self.main_source_file
58            )
59
60            event = lldb.SBEvent()
61            os_version = get_os_version()
62            if not has_rosetta_shared_cache(os_version):
63                self.assertTrue(listener.GetNextEvent(event))
64            else:
65                self.assertFalse(listener.GetNextEvent(event))
66