1*6777b538SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker# pylint: disable=R0201 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Workerimport logging 11*6777b538SAndroid Build Coastguard Workerimport sys 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Workerfrom devil.android import device_errors 14*6777b538SAndroid Build Coastguard Workerfrom devil.android.valgrind_tools import base_tool 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Workerdef SetChromeTimeoutScale(device, scale): 18*6777b538SAndroid Build Coastguard Worker """Sets the timeout scale in /data/local/tmp/chrome_timeout_scale to scale.""" 19*6777b538SAndroid Build Coastguard Worker path = '/data/local/tmp/chrome_timeout_scale' 20*6777b538SAndroid Build Coastguard Worker if not scale or scale == 1.0: 21*6777b538SAndroid Build Coastguard Worker # Delete if scale is None/0.0/1.0 since the default timeout scale is 1.0 22*6777b538SAndroid Build Coastguard Worker device.RemovePath(path, force=True, as_root=True) 23*6777b538SAndroid Build Coastguard Worker else: 24*6777b538SAndroid Build Coastguard Worker device.WriteFile(path, '%f' % scale, as_root=True) 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Workerclass AddressSanitizerTool(base_tool.BaseTool): 29*6777b538SAndroid Build Coastguard Worker """AddressSanitizer tool.""" 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker WRAPPER_NAME = '/system/bin/asanwrapper' 32*6777b538SAndroid Build Coastguard Worker # Disable memcmp overlap check.There are blobs (gl drivers) 33*6777b538SAndroid Build Coastguard Worker # on some android devices that use memcmp on overlapping regions, 34*6777b538SAndroid Build Coastguard Worker # nothing we can do about that. 35*6777b538SAndroid Build Coastguard Worker EXTRA_OPTIONS = 'strict_memcmp=0,use_sigaltstack=1' 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker def __init__(self, device): 38*6777b538SAndroid Build Coastguard Worker super().__init__() 39*6777b538SAndroid Build Coastguard Worker self._device = device 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker @classmethod 42*6777b538SAndroid Build Coastguard Worker def CopyFiles(cls, device): 43*6777b538SAndroid Build Coastguard Worker """Copies ASan tools to the device.""" 44*6777b538SAndroid Build Coastguard Worker del device 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker def GetTestWrapper(self): 47*6777b538SAndroid Build Coastguard Worker return AddressSanitizerTool.WRAPPER_NAME 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker def GetUtilWrapper(self): 50*6777b538SAndroid Build Coastguard Worker """Returns the wrapper for utilities, such as forwarder. 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker AddressSanitizer wrapper must be added to all instrumented binaries, 53*6777b538SAndroid Build Coastguard Worker including forwarder and the like. This can be removed if such binaries 54*6777b538SAndroid Build Coastguard Worker were built without instrumentation. """ 55*6777b538SAndroid Build Coastguard Worker return self.GetTestWrapper() 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker def SetupEnvironment(self): 58*6777b538SAndroid Build Coastguard Worker try: 59*6777b538SAndroid Build Coastguard Worker self._device.EnableRoot() 60*6777b538SAndroid Build Coastguard Worker except device_errors.CommandFailedError as e: 61*6777b538SAndroid Build Coastguard Worker # Try to set the timeout scale anyway. 62*6777b538SAndroid Build Coastguard Worker # TODO(jbudorick) Handle this exception appropriately after interface 63*6777b538SAndroid Build Coastguard Worker # conversions are finished. 64*6777b538SAndroid Build Coastguard Worker logging.error(str(e)) 65*6777b538SAndroid Build Coastguard Worker SetChromeTimeoutScale(self._device, self.GetTimeoutScale()) 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker def CleanUpEnvironment(self): 68*6777b538SAndroid Build Coastguard Worker SetChromeTimeoutScale(self._device, None) 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker def GetTimeoutScale(self): 71*6777b538SAndroid Build Coastguard Worker # Very slow startup. 72*6777b538SAndroid Build Coastguard Worker return 20.0 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard WorkerTOOL_REGISTRY = { 76*6777b538SAndroid Build Coastguard Worker 'asan': AddressSanitizerTool, 77*6777b538SAndroid Build Coastguard Worker} 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Workerdef CreateTool(tool_name, device): 81*6777b538SAndroid Build Coastguard Worker """Creates a tool with the specified tool name. 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker Args: 84*6777b538SAndroid Build Coastguard Worker tool_name: Name of the tool to create. 85*6777b538SAndroid Build Coastguard Worker device: A DeviceUtils instance. 86*6777b538SAndroid Build Coastguard Worker Returns: 87*6777b538SAndroid Build Coastguard Worker A tool for the specified tool_name. 88*6777b538SAndroid Build Coastguard Worker """ 89*6777b538SAndroid Build Coastguard Worker if not tool_name: 90*6777b538SAndroid Build Coastguard Worker return base_tool.BaseTool() 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker ctor = TOOL_REGISTRY.get(tool_name) 93*6777b538SAndroid Build Coastguard Worker if ctor: 94*6777b538SAndroid Build Coastguard Worker return ctor(device) 95*6777b538SAndroid Build Coastguard Worker print('Unknown tool %s, available tools: %s' % 96*6777b538SAndroid Build Coastguard Worker (tool_name, ', '.join(sorted(TOOL_REGISTRY.keys())))) 97*6777b538SAndroid Build Coastguard Worker sys.exit(1) 98*6777b538SAndroid Build Coastguard Worker 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Workerdef PushFilesForTool(tool_name, device): 101*6777b538SAndroid Build Coastguard Worker """Pushes the files required for |tool_name| to |device|. 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker Args: 104*6777b538SAndroid Build Coastguard Worker tool_name: Name of the tool to create. 105*6777b538SAndroid Build Coastguard Worker device: A DeviceUtils instance. 106*6777b538SAndroid Build Coastguard Worker """ 107*6777b538SAndroid Build Coastguard Worker if not tool_name: 108*6777b538SAndroid Build Coastguard Worker return 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker clazz = TOOL_REGISTRY.get(tool_name) 111*6777b538SAndroid Build Coastguard Worker if clazz: 112*6777b538SAndroid Build Coastguard Worker clazz.CopyFiles(device) 113*6777b538SAndroid Build Coastguard Worker else: 114*6777b538SAndroid Build Coastguard Worker print('Unknown tool %s, available tools: %s' % (tool_name, ', '.join( 115*6777b538SAndroid Build Coastguard Worker sorted(TOOL_REGISTRY.keys())))) 116*6777b538SAndroid Build Coastguard Worker sys.exit(1) 117