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