1061da546Spatrick""" This module contains functions used by the test cases to hide the 2061da546Spatrickarchitecture and/or the platform dependent nature of the tests. """ 3061da546Spatrick 4061da546Spatrickfrom __future__ import absolute_import 5061da546Spatrick 6061da546Spatrick# System modules 7061da546Spatrickimport itertools 8061da546Spatrickimport re 9061da546Spatrickimport subprocess 10061da546Spatrickimport sys 11*f6aab3d8Srobertimport os 12*f6aab3d8Srobertfrom urllib.parse import urlparse 13061da546Spatrick 14061da546Spatrick# LLDB modules 15061da546Spatrickfrom . import configuration 16061da546Spatrickimport lldb 17061da546Spatrickimport lldbsuite.test.lldbplatform as lldbplatform 18061da546Spatrick 19061da546Spatrick 20061da546Spatrickdef check_first_register_readable(test_case): 21061da546Spatrick arch = test_case.getArchitecture() 22061da546Spatrick 23061da546Spatrick if arch in ['x86_64', 'i386']: 24061da546Spatrick test_case.expect("register read eax", substrs=['eax = 0x']) 25061da546Spatrick elif arch in ['arm', 'armv7', 'armv7k', 'armv8l', 'armv7l']: 26061da546Spatrick test_case.expect("register read r0", substrs=['r0 = 0x']) 27061da546Spatrick elif arch in ['aarch64', 'arm64', 'arm64e', 'arm64_32']: 28061da546Spatrick test_case.expect("register read x0", substrs=['x0 = 0x']) 29061da546Spatrick elif re.match("mips", arch): 30061da546Spatrick test_case.expect("register read zero", substrs=['zero = 0x']) 31061da546Spatrick elif arch in ['s390x']: 32061da546Spatrick test_case.expect("register read r0", substrs=['r0 = 0x']) 33061da546Spatrick elif arch in ['powerpc64le']: 34061da546Spatrick test_case.expect("register read r0", substrs=['r0 = 0x']) 35061da546Spatrick else: 36061da546Spatrick # TODO: Add check for other architectures 37061da546Spatrick test_case.fail( 38061da546Spatrick "Unsupported architecture for test case (arch: %s)" % 39061da546Spatrick test_case.getArchitecture()) 40061da546Spatrick 41061da546Spatrick 42061da546Spatrickdef _run_adb_command(cmd, device_id): 43061da546Spatrick device_id_args = [] 44061da546Spatrick if device_id: 45061da546Spatrick device_id_args = ["-s", device_id] 46061da546Spatrick full_cmd = ["adb"] + device_id_args + cmd 47061da546Spatrick p = subprocess.Popen( 48061da546Spatrick full_cmd, 49061da546Spatrick stdout=subprocess.PIPE, 50061da546Spatrick stderr=subprocess.PIPE) 51061da546Spatrick stdout, stderr = p.communicate() 52061da546Spatrick return p.returncode, stdout, stderr 53061da546Spatrick 54061da546Spatrick 55061da546Spatrickdef target_is_android(): 56*f6aab3d8Srobert return configuration.lldb_platform_name == "remote-android" 57061da546Spatrick 58061da546Spatrickdef android_device_api(): 59061da546Spatrick if not hasattr(android_device_api, 'result'): 60061da546Spatrick assert configuration.lldb_platform_url is not None 61061da546Spatrick device_id = None 62*f6aab3d8Srobert parsed_url = urlparse(configuration.lldb_platform_url) 63061da546Spatrick host_name = parsed_url.netloc.split(":")[0] 64061da546Spatrick if host_name != 'localhost': 65061da546Spatrick device_id = host_name 66061da546Spatrick if device_id.startswith('[') and device_id.endswith(']'): 67061da546Spatrick device_id = device_id[1:-1] 68061da546Spatrick retcode, stdout, stderr = _run_adb_command( 69061da546Spatrick ["shell", "getprop", "ro.build.version.sdk"], device_id) 70061da546Spatrick if retcode == 0: 71061da546Spatrick android_device_api.result = int(stdout) 72061da546Spatrick else: 73061da546Spatrick raise LookupError( 74061da546Spatrick ">>> Unable to determine the API level of the Android device.\n" 75061da546Spatrick ">>> stdout:\n%s\n" 76061da546Spatrick ">>> stderr:\n%s\n" % 77061da546Spatrick (stdout, stderr)) 78061da546Spatrick return android_device_api.result 79061da546Spatrick 80061da546Spatrick 81061da546Spatrickdef match_android_device(device_arch, valid_archs=None, valid_api_levels=None): 82061da546Spatrick if not target_is_android(): 83061da546Spatrick return False 84061da546Spatrick if valid_archs is not None and device_arch not in valid_archs: 85061da546Spatrick return False 86061da546Spatrick if valid_api_levels is not None and android_device_api() not in valid_api_levels: 87061da546Spatrick return False 88061da546Spatrick 89061da546Spatrick return True 90061da546Spatrick 91061da546Spatrick 92061da546Spatrickdef finalize_build_dictionary(dictionary): 93061da546Spatrick if target_is_android(): 94061da546Spatrick if dictionary is None: 95061da546Spatrick dictionary = {} 96061da546Spatrick dictionary["OS"] = "Android" 97061da546Spatrick dictionary["PIE"] = 1 98061da546Spatrick return dictionary 99061da546Spatrick 100061da546Spatrick 101*f6aab3d8Srobertdef _get_platform_os(p): 102*f6aab3d8Srobert # Use the triple to determine the platform if set. 103*f6aab3d8Srobert triple = p.GetTriple() 104*f6aab3d8Srobert if triple: 105*f6aab3d8Srobert platform = triple.split('-')[2] 106*f6aab3d8Srobert if platform.startswith('freebsd'): 107*f6aab3d8Srobert platform = 'freebsd' 108*f6aab3d8Srobert elif platform.startswith('netbsd'): 109*f6aab3d8Srobert platform = 'netbsd' 110*f6aab3d8Srobert return platform 111*f6aab3d8Srobert 112*f6aab3d8Srobert return '' 113*f6aab3d8Srobert 114*f6aab3d8Srobert 115061da546Spatrickdef getHostPlatform(): 116061da546Spatrick """Returns the host platform running the test suite.""" 117*f6aab3d8Srobert return _get_platform_os(lldb.SBPlatform("host")) 118061da546Spatrick 119061da546Spatrick 120061da546Spatrickdef getDarwinOSTriples(): 121be691f3bSpatrick return lldbplatform.translate(lldbplatform.darwin_all) 122061da546Spatrick 123061da546Spatrickdef getPlatform(): 124061da546Spatrick """Returns the target platform which the tests are running on.""" 125be691f3bSpatrick # Use the Apple SDK to determine the platform if set. 126be691f3bSpatrick if configuration.apple_sdk: 127be691f3bSpatrick platform = configuration.apple_sdk 128be691f3bSpatrick dot = platform.find('.') 129be691f3bSpatrick if dot != -1: 130be691f3bSpatrick platform = platform[:dot] 131be691f3bSpatrick if platform == 'iphoneos': 132be691f3bSpatrick platform = 'ios' 133be691f3bSpatrick return platform 134061da546Spatrick 135*f6aab3d8Srobert return _get_platform_os(lldb.selected_platform) 136be691f3bSpatrick 137061da546Spatrick 138061da546Spatrickdef platformIsDarwin(): 139061da546Spatrick """Returns true if the OS triple for the selected platform is any valid apple OS""" 140061da546Spatrick return getPlatform() in getDarwinOSTriples() 141061da546Spatrick 142061da546Spatrick 143061da546Spatrickdef findMainThreadCheckerDylib(): 144061da546Spatrick if not platformIsDarwin(): 145061da546Spatrick return "" 146061da546Spatrick 147061da546Spatrick if getPlatform() in lldbplatform.translate(lldbplatform.darwin_embedded): 148061da546Spatrick return "/Developer/usr/lib/libMainThreadChecker.dylib" 149061da546Spatrick 150061da546Spatrick with os.popen('xcode-select -p') as output: 151061da546Spatrick xcode_developer_path = output.read().strip() 152061da546Spatrick mtc_dylib_path = '%s/usr/lib/libMainThreadChecker.dylib' % xcode_developer_path 153061da546Spatrick if os.path.isfile(mtc_dylib_path): 154061da546Spatrick return mtc_dylib_path 155061da546Spatrick 156061da546Spatrick return "" 157061da546Spatrick 158061da546Spatrick 159061da546Spatrickclass _PlatformContext(object): 160061da546Spatrick """Value object class which contains platform-specific options.""" 161061da546Spatrick 162dda28197Spatrick def __init__(self, shlib_environment_var, shlib_path_separator, shlib_prefix, shlib_extension): 163061da546Spatrick self.shlib_environment_var = shlib_environment_var 164dda28197Spatrick self.shlib_path_separator = shlib_path_separator 165061da546Spatrick self.shlib_prefix = shlib_prefix 166061da546Spatrick self.shlib_extension = shlib_extension 167061da546Spatrick 168061da546Spatrick 169061da546Spatrickdef createPlatformContext(): 170061da546Spatrick if platformIsDarwin(): 171dda28197Spatrick return _PlatformContext('DYLD_LIBRARY_PATH', ':', 'lib', 'dylib') 172061da546Spatrick elif getPlatform() in ("freebsd", "linux", "netbsd"): 173dda28197Spatrick return _PlatformContext('LD_LIBRARY_PATH', ':', 'lib', 'so') 174061da546Spatrick else: 175dda28197Spatrick return _PlatformContext('PATH', ';', '', 'dll') 176061da546Spatrick 177061da546Spatrick 178061da546Spatrickdef hasChattyStderr(test_case): 179061da546Spatrick """Some targets produce garbage on the standard error output. This utility function 180061da546Spatrick determines whether the tests can be strict about the expected stderr contents.""" 181061da546Spatrick if match_android_device(test_case.getArchitecture(), ['aarch64'], range(22, 25+1)): 182061da546Spatrick return True # The dynamic linker on the device will complain about unknown DT entries 183061da546Spatrick return False 184