xref: /llvm-project/lldb/test/API/macosx/simulator/TestSimulatorPlatform.py (revision 44fc987ed174e32544a577387ab0df6886495e82)
17e825abdSAdrian Prantlimport lldb
27e825abdSAdrian Prantlfrom lldbsuite.test.lldbtest import *
37e825abdSAdrian Prantlfrom lldbsuite.test.decorators import *
47e825abdSAdrian Prantlimport lldbsuite.test.lldbutil as lldbutil
57e825abdSAdrian Prantlimport json
67e825abdSAdrian Prantl
77e825abdSAdrian Prantl
87e825abdSAdrian Prantlclass TestSimulatorPlatformLaunching(TestBase):
97e825abdSAdrian Prantl    NO_DEBUG_INFO_TESTCASE = True
107e825abdSAdrian Prantl
11116b1033SAdrian Prantl    def check_load_commands(self, expected_load_command):
12116b1033SAdrian Prantl        """sanity check the built binary for the expected number of load commands"""
13116b1033SAdrian Prantl        load_cmds = subprocess.check_output(
142238dcc3SJonas Devlieghere            ["otool", "-l", self.getBuildArtifact()]
15116b1033SAdrian Prantl        ).decode("utf-8")
16116b1033SAdrian Prantl        found = 0
172238dcc3SJonas Devlieghere        for line in load_cmds.split("\n"):
18116b1033SAdrian Prantl            if expected_load_command in line:
19116b1033SAdrian Prantl                found += 1
2080fcecb1SJonas Devlieghere        self.assertEqual(
212238dcc3SJonas Devlieghere            found,
222238dcc3SJonas Devlieghere            1,
232238dcc3SJonas Devlieghere            "wrong number of load commands for {}".format(expected_load_command),
242238dcc3SJonas Devlieghere        )
25116b1033SAdrian Prantl
2615149e40SAdrian Prantl    def check_debugserver(self, log, expected_platform, expected_version):
2715149e40SAdrian Prantl        """scan the debugserver packet log"""
287e9bab6aSAdrian Prantl        process_info = lldbutil.packetlog_get_process_info(log)
292238dcc3SJonas Devlieghere        self.assertIn("ostype", process_info)
3080fcecb1SJonas Devlieghere        self.assertEqual(process_info["ostype"], expected_platform)
317e9bab6aSAdrian Prantl        dylib_info = lldbutil.packetlog_get_dylib_info(log)
3215149e40SAdrian Prantl        self.assertTrue(dylib_info)
3315149e40SAdrian Prantl        aout_info = None
342238dcc3SJonas Devlieghere        for image in dylib_info["images"]:
352238dcc3SJonas Devlieghere            if image["pathname"].endswith("a.out"):
3615149e40SAdrian Prantl                aout_info = image
3715149e40SAdrian Prantl        self.assertTrue(aout_info)
3880fcecb1SJonas Devlieghere        self.assertEqual(aout_info["min_version_os_name"], expected_platform)
3915149e40SAdrian Prantl        if expected_version:
4080fcecb1SJonas Devlieghere            self.assertEqual(aout_info["min_version_os_sdk"], expected_version)
4115149e40SAdrian Prantl
4239ea3cedSJonas Devlieghere    @skipIf(bugnumber="rdar://76995109")
4315149e40SAdrian Prantl    def run_with(self, arch, os, vers, env, expected_load_command):
4405df9cc7SAdrian Prantl        env_list = [env] if env else []
452238dcc3SJonas Devlieghere        triple = "-".join([arch, "apple", os + vers] + env_list)
4652e758f3SJonas Devlieghere        sdk = lldbutil.get_xcode_sdk(os, env)
4709ca3f41SJonas Devlieghere
482238dcc3SJonas Devlieghere        version_min = ""
4952e758f3SJonas Devlieghere        if not vers:
5052e758f3SJonas Devlieghere            vers = lldbutil.get_xcode_sdk_version(sdk)
512238dcc3SJonas Devlieghere        if env == "simulator":
522238dcc3SJonas Devlieghere            version_min = "-m{}-simulator-version-min={}".format(os, vers)
532238dcc3SJonas Devlieghere        elif os == "macosx":
542238dcc3SJonas Devlieghere            version_min = "-m{}-version-min={}".format(os, vers)
5509ca3f41SJonas Devlieghere
5609ca3f41SJonas Devlieghere        sdk_root = lldbutil.get_xcode_sdk_root(sdk)
575d1c43f3SJonas Devlieghere        clang = lldbutil.get_xcode_clang(sdk)
5809ca3f41SJonas Devlieghere
5909ca3f41SJonas Devlieghere        self.build(
6009ca3f41SJonas Devlieghere            dictionary={
612238dcc3SJonas Devlieghere                "ARCH": arch,
622238dcc3SJonas Devlieghere                "ARCH_CFLAGS": "-target {} {}".format(triple, version_min),
632238dcc3SJonas Devlieghere                "SDKROOT": sdk_root,
64*44fc987eSVladislav Dzhidzhoev            },
65*44fc987eSVladislav Dzhidzhoev            compiler=clang,
662238dcc3SJonas Devlieghere        )
6709ca3f41SJonas Devlieghere
6815149e40SAdrian Prantl        self.check_load_commands(expected_load_command)
692238dcc3SJonas Devlieghere        log = self.getBuildArtifact("packets.log")
7015149e40SAdrian Prantl        self.expect("log enable gdb-remote packets -f " + log)
712238dcc3SJonas Devlieghere        lldbutil.run_to_source_breakpoint(
722238dcc3SJonas Devlieghere            self, "break here", lldb.SBFileSpec("hello.c")
732238dcc3SJonas Devlieghere        )
742238dcc3SJonas Devlieghere        triple_re = "-".join([arch, "apple", os + vers + ".*"] + env_list)
752238dcc3SJonas Devlieghere        self.expect("image list -b -t", patterns=["a\.out " + triple_re])
7615149e40SAdrian Prantl        self.check_debugserver(log, os + env, vers)
777e825abdSAdrian Prantl
78f5f22f04SRaphael Isemann    @skipIfAsan
797e825abdSAdrian Prantl    @skipUnlessDarwin
807e825abdSAdrian Prantl    @skipIfDarwinEmbedded
812238dcc3SJonas Devlieghere    @apple_simulator_test("iphone")
823162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
837e825abdSAdrian Prantl    def test_ios(self):
847e825abdSAdrian Prantl        """Test running an iOS simulator binary"""
852238dcc3SJonas Devlieghere        self.run_with(
862238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
872238dcc3SJonas Devlieghere            os="ios",
882238dcc3SJonas Devlieghere            vers="",
892238dcc3SJonas Devlieghere            env="simulator",
902238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
912238dcc3SJonas Devlieghere        )
927e825abdSAdrian Prantl
93f5f22f04SRaphael Isemann    @skipIfAsan
947e825abdSAdrian Prantl    @skipUnlessDarwin
957e825abdSAdrian Prantl    @skipIfDarwinEmbedded
962238dcc3SJonas Devlieghere    @apple_simulator_test("appletv")
973162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
987e825abdSAdrian Prantl    def test_tvos(self):
997e825abdSAdrian Prantl        """Test running an tvOS simulator binary"""
1002238dcc3SJonas Devlieghere        self.run_with(
1012238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
1022238dcc3SJonas Devlieghere            os="tvos",
1032238dcc3SJonas Devlieghere            vers="",
1042238dcc3SJonas Devlieghere            env="simulator",
1052238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
1062238dcc3SJonas Devlieghere        )
1077e825abdSAdrian Prantl
108f5f22f04SRaphael Isemann    @skipIfAsan
1097e825abdSAdrian Prantl    @skipUnlessDarwin
1107e825abdSAdrian Prantl    @skipIfDarwinEmbedded
1112238dcc3SJonas Devlieghere    @apple_simulator_test("watch")
112116b1033SAdrian Prantl    @skipIfDarwin  # rdar://problem/64552748
1132238dcc3SJonas Devlieghere    @skipIf(archs=["arm64", "arm64e"])
1143162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
115116b1033SAdrian Prantl    def test_watchos_i386(self):
1167e825abdSAdrian Prantl        """Test running a 32-bit watchOS simulator binary"""
1172238dcc3SJonas Devlieghere        self.run_with(
1182238dcc3SJonas Devlieghere            arch="i386",
1192238dcc3SJonas Devlieghere            os="watchos",
1202238dcc3SJonas Devlieghere            vers="",
1212238dcc3SJonas Devlieghere            env="simulator",
1222238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
1232238dcc3SJonas Devlieghere        )
124116b1033SAdrian Prantl
125f5f22f04SRaphael Isemann    @skipIfAsan
126116b1033SAdrian Prantl    @skipUnlessDarwin
127116b1033SAdrian Prantl    @skipIfDarwinEmbedded
1282238dcc3SJonas Devlieghere    @apple_simulator_test("watch")
129116b1033SAdrian Prantl    @skipIfDarwin  # rdar://problem/64552748
1302238dcc3SJonas Devlieghere    @skipIf(archs=["i386", "x86_64"])
1313162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
132116b1033SAdrian Prantl    def test_watchos_armv7k(self):
133116b1033SAdrian Prantl        """Test running a 32-bit watchOS simulator binary"""
1342238dcc3SJonas Devlieghere        self.run_with(
1352238dcc3SJonas Devlieghere            arch="armv7k",
1362238dcc3SJonas Devlieghere            os="watchos",
1372238dcc3SJonas Devlieghere            vers="",
1382238dcc3SJonas Devlieghere            env="simulator",
1392238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
1402238dcc3SJonas Devlieghere        )
141116b1033SAdrian Prantl
142116b1033SAdrian Prantl    #
143116b1033SAdrian Prantl    # Back-deployment tests.
144116b1033SAdrian Prantl    #
145116b1033SAdrian Prantl    # Older Mach-O versions used less expressive load commands, such
146116b1033SAdrian Prantl    # as LC_VERSION_MIN_IPHONEOS that wouldn't distinguish between ios
147116b1033SAdrian Prantl    # and ios-simulator.  When targeting a simulator on Apple Silicon
148116b1033SAdrian Prantl    # macOS, however, these legacy load commands are never generated.
149116b1033SAdrian Prantl    #
150116b1033SAdrian Prantl
151116b1033SAdrian Prantl    @skipUnlessDarwin
152116b1033SAdrian Prantl    @skipIfDarwinEmbedded
1533162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
15405df9cc7SAdrian Prantl    def test_lc_version_min_macosx(self):
15505df9cc7SAdrian Prantl        """Test running a back-deploying non-simulator MacOS X binary"""
1562238dcc3SJonas Devlieghere        self.run_with(
1572238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
1582238dcc3SJonas Devlieghere            os="macosx",
1592238dcc3SJonas Devlieghere            vers="10.9",
1602238dcc3SJonas Devlieghere            env="",
1612238dcc3SJonas Devlieghere            expected_load_command="LC_VERSION_MIN_MACOSX",
1622238dcc3SJonas Devlieghere        )
1632238dcc3SJonas Devlieghere
164f5f22f04SRaphael Isemann    @skipIfAsan
16505df9cc7SAdrian Prantl    @skipUnlessDarwin
16605df9cc7SAdrian Prantl    @skipIfDarwinEmbedded
1672238dcc3SJonas Devlieghere    @apple_simulator_test("iphone")
1682238dcc3SJonas Devlieghere    @skipIf(archs=["arm64", "arm64e"])
1693162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
170116b1033SAdrian Prantl    def test_lc_version_min_iphoneos(self):
171116b1033SAdrian Prantl        """Test running a back-deploying iOS simulator binary
172116b1033SAdrian Prantl        with a legacy iOS load command"""
1732238dcc3SJonas Devlieghere        self.run_with(
1742238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
1752238dcc3SJonas Devlieghere            os="ios",
1762238dcc3SJonas Devlieghere            vers="11.0",
1772238dcc3SJonas Devlieghere            env="simulator",
1782238dcc3SJonas Devlieghere            expected_load_command="LC_VERSION_MIN_IPHONEOS",
1792238dcc3SJonas Devlieghere        )
180116b1033SAdrian Prantl
181f5f22f04SRaphael Isemann    @skipIfAsan
182116b1033SAdrian Prantl    @skipUnlessDarwin
183116b1033SAdrian Prantl    @skipIfDarwinEmbedded
1842238dcc3SJonas Devlieghere    @apple_simulator_test("iphone")
1852238dcc3SJonas Devlieghere    @skipIf(archs=["arm64", "arm64e"])
1863162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
18715149e40SAdrian Prantl    def test_ios_backdeploy_x86(self):
18815149e40SAdrian Prantl        """Test running a back-deploying iOS simulator binary
18915149e40SAdrian Prantl        with a legacy iOS load command"""
1902238dcc3SJonas Devlieghere        self.run_with(
1912238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
1922238dcc3SJonas Devlieghere            os="ios",
1932238dcc3SJonas Devlieghere            vers="13.0",
1942238dcc3SJonas Devlieghere            env="simulator",
1952238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
1962238dcc3SJonas Devlieghere        )
19715149e40SAdrian Prantl
198f5f22f04SRaphael Isemann    @skipIfAsan
19915149e40SAdrian Prantl    @skipUnlessDarwin
20015149e40SAdrian Prantl    @skipIfDarwinEmbedded
2012238dcc3SJonas Devlieghere    @apple_simulator_test("iphone")
2022238dcc3SJonas Devlieghere    @skipIf(archs=["i386", "x86_64"])
2033162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
204116b1033SAdrian Prantl    def test_ios_backdeploy_apple_silicon(self):
205116b1033SAdrian Prantl        """Test running a back-deploying iOS simulator binary"""
2062238dcc3SJonas Devlieghere        self.run_with(
2072238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
2082238dcc3SJonas Devlieghere            os="ios",
2092238dcc3SJonas Devlieghere            vers="11.0",
2102238dcc3SJonas Devlieghere            env="simulator",
2112238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
2122238dcc3SJonas Devlieghere        )
213116b1033SAdrian Prantl
214f5f22f04SRaphael Isemann    @skipIfAsan
215116b1033SAdrian Prantl    @skipUnlessDarwin
216116b1033SAdrian Prantl    @skipIfDarwinEmbedded
2172238dcc3SJonas Devlieghere    @apple_simulator_test("appletv")
2182238dcc3SJonas Devlieghere    @skipIf(archs=["arm64", "arm64e"])
2193162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
220116b1033SAdrian Prantl    def test_lc_version_min_tvos(self):
221116b1033SAdrian Prantl        """Test running a back-deploying tvOS simulator binary
222116b1033SAdrian Prantl        with a legacy tvOS load command"""
2232238dcc3SJonas Devlieghere        self.run_with(
2242238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
2252238dcc3SJonas Devlieghere            os="tvos",
2262238dcc3SJonas Devlieghere            vers="11.0",
2272238dcc3SJonas Devlieghere            env="simulator",
2282238dcc3SJonas Devlieghere            expected_load_command="LC_VERSION_MIN_TVOS",
2292238dcc3SJonas Devlieghere        )
230116b1033SAdrian Prantl
231f5f22f04SRaphael Isemann    @skipIfAsan
232116b1033SAdrian Prantl    @skipUnlessDarwin
233116b1033SAdrian Prantl    @skipIfDarwinEmbedded
2342238dcc3SJonas Devlieghere    @apple_simulator_test("appletv")
2352238dcc3SJonas Devlieghere    @skipIf(archs=["i386", "x86_64"])
2363162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
237116b1033SAdrian Prantl    def test_tvos_backdeploy_apple_silicon(self):
238116b1033SAdrian Prantl        """Test running a back-deploying tvOS simulator binary"""
2392238dcc3SJonas Devlieghere        self.run_with(
2402238dcc3SJonas Devlieghere            arch=self.getArchitecture(),
2412238dcc3SJonas Devlieghere            os="tvos",
2422238dcc3SJonas Devlieghere            vers="11.0",
2432238dcc3SJonas Devlieghere            env="simulator",
2442238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
2452238dcc3SJonas Devlieghere        )
246116b1033SAdrian Prantl
247f5f22f04SRaphael Isemann    @skipIfAsan
248116b1033SAdrian Prantl    @skipUnlessDarwin
249116b1033SAdrian Prantl    @skipIfDarwinEmbedded
2502238dcc3SJonas Devlieghere    @apple_simulator_test("watch")
2512238dcc3SJonas Devlieghere    @skipIf(archs=["arm64", "arm64e"])
252116b1033SAdrian Prantl    @skipIfDarwin  # rdar://problem/64552748
2533162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
254116b1033SAdrian Prantl    def test_lc_version_min_watchos(self):
255116b1033SAdrian Prantl        """Test running a back-deploying watchOS simulator binary
256116b1033SAdrian Prantl        with a legacy watchOS load command"""
2572238dcc3SJonas Devlieghere        self.run_with(
2582238dcc3SJonas Devlieghere            arch="i386",
2592238dcc3SJonas Devlieghere            os="watchos",
2602238dcc3SJonas Devlieghere            vers="4.0",
2612238dcc3SJonas Devlieghere            env="simulator",
2622238dcc3SJonas Devlieghere            expected_load_command="LC_VERSION_MIN_WATCHOS",
2632238dcc3SJonas Devlieghere        )
264116b1033SAdrian Prantl
265f5f22f04SRaphael Isemann    @skipIfAsan
266116b1033SAdrian Prantl    @skipUnlessDarwin
267116b1033SAdrian Prantl    @skipIfDarwinEmbedded
2682238dcc3SJonas Devlieghere    @apple_simulator_test("watch")
2692238dcc3SJonas Devlieghere    @skipIf(archs=["arm64", "arm64e"])
270116b1033SAdrian Prantl    @skipIfDarwin  # rdar://problem/64552748
2713162c6aaSJonas Devlieghere    @skipIfOutOfTreeDebugserver
272116b1033SAdrian Prantl    def test_watchos_backdeploy_apple_silicon(self):
273116b1033SAdrian Prantl        """Test running a back-deploying watchOS simulator binary"""
2742238dcc3SJonas Devlieghere        self.run_with(
2752238dcc3SJonas Devlieghere            arch="armv7k",
2762238dcc3SJonas Devlieghere            os="watchos",
2772238dcc3SJonas Devlieghere            vers="4.0",
2782238dcc3SJonas Devlieghere            env="simulator",
2792238dcc3SJonas Devlieghere            expected_load_command="LC_BUILD_VERSION",
2802238dcc3SJonas Devlieghere        )
281