1*760c253cSXin Li# -*- coding: utf-8 -*- 2*760c253cSXin Li# Copyright 2013 The ChromiumOS Authors 3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be 4*760c253cSXin Li# found in the LICENSE file. 5*760c253cSXin Li 6*760c253cSXin Li"""The label of benchamrks.""" 7*760c253cSXin Li 8*760c253cSXin Li 9*760c253cSXin Liimport hashlib 10*760c253cSXin Liimport os 11*760c253cSXin Li 12*760c253cSXin Lifrom cros_utils import misc 13*760c253cSXin Lifrom cros_utils.file_utils import FileUtils 14*760c253cSXin Lifrom image_checksummer import ImageChecksummer 15*760c253cSXin Li 16*760c253cSXin Li 17*760c253cSXin Liclass Label(object): 18*760c253cSXin Li """The label class.""" 19*760c253cSXin Li 20*760c253cSXin Li def __init__( 21*760c253cSXin Li self, 22*760c253cSXin Li name, 23*760c253cSXin Li build, 24*760c253cSXin Li chromeos_image, 25*760c253cSXin Li autotest_path, 26*760c253cSXin Li debug_path, 27*760c253cSXin Li chromeos_root, 28*760c253cSXin Li board, 29*760c253cSXin Li remote, 30*760c253cSXin Li image_args, 31*760c253cSXin Li cache_dir, 32*760c253cSXin Li cache_only, 33*760c253cSXin Li log_level, 34*760c253cSXin Li compiler, 35*760c253cSXin Li crosfleet=False, 36*760c253cSXin Li chrome_src=None, 37*760c253cSXin Li ): 38*760c253cSXin Li 39*760c253cSXin Li self.image_type = self._GetImageType(chromeos_image) 40*760c253cSXin Li 41*760c253cSXin Li # Expand ~ 42*760c253cSXin Li chromeos_root = os.path.expanduser(chromeos_root) 43*760c253cSXin Li if self.image_type == "local": 44*760c253cSXin Li chromeos_image = os.path.expanduser(chromeos_image) 45*760c253cSXin Li 46*760c253cSXin Li self.name = name 47*760c253cSXin Li self.build = build 48*760c253cSXin Li self.chromeos_image = chromeos_image 49*760c253cSXin Li self.autotest_path = autotest_path 50*760c253cSXin Li self.debug_path = debug_path 51*760c253cSXin Li self.board = board 52*760c253cSXin Li self.remote = remote 53*760c253cSXin Li self.image_args = image_args 54*760c253cSXin Li self.cache_dir = cache_dir 55*760c253cSXin Li self.cache_only = cache_only 56*760c253cSXin Li self.log_level = log_level 57*760c253cSXin Li self.chrome_version = "" 58*760c253cSXin Li self.compiler = compiler 59*760c253cSXin Li self.crosfleet = crosfleet 60*760c253cSXin Li 61*760c253cSXin Li if not chromeos_root: 62*760c253cSXin Li if self.image_type == "local": 63*760c253cSXin Li chromeos_root = FileUtils().ChromeOSRootFromImage( 64*760c253cSXin Li chromeos_image 65*760c253cSXin Li ) 66*760c253cSXin Li if not chromeos_root: 67*760c253cSXin Li raise RuntimeError( 68*760c253cSXin Li "No ChromeOS root given for label '%s' and could " 69*760c253cSXin Li "not determine one from image path: '%s'." 70*760c253cSXin Li % (name, chromeos_image) 71*760c253cSXin Li ) 72*760c253cSXin Li else: 73*760c253cSXin Li chromeos_root = FileUtils().CanonicalizeChromeOSRoot(chromeos_root) 74*760c253cSXin Li if not chromeos_root: 75*760c253cSXin Li raise RuntimeError( 76*760c253cSXin Li "Invalid ChromeOS root given for label '%s': '%s'." 77*760c253cSXin Li % (name, chromeos_root) 78*760c253cSXin Li ) 79*760c253cSXin Li 80*760c253cSXin Li self.chromeos_root = chromeos_root 81*760c253cSXin Li if not chrome_src: 82*760c253cSXin Li # Old and new chroots may have different chrome src locations. 83*760c253cSXin Li # The path also depends on the chrome build flags. 84*760c253cSXin Li # Give priority to chrome-src-internal. 85*760c253cSXin Li chrome_src_rel_paths = [ 86*760c253cSXin Li ".cache/distfiles/target/chrome-src-internal", 87*760c253cSXin Li ".cache/distfiles/chrome-src-internal", 88*760c253cSXin Li ".cache/distfiles/target/chrome-src", 89*760c253cSXin Li ".cache/distfiles/chrome-src", 90*760c253cSXin Li ] 91*760c253cSXin Li for chrome_src_rel_path in chrome_src_rel_paths: 92*760c253cSXin Li chrome_src_abs_path = os.path.join( 93*760c253cSXin Li self.chromeos_root, chrome_src_rel_path 94*760c253cSXin Li ) 95*760c253cSXin Li if os.path.exists(chrome_src_abs_path): 96*760c253cSXin Li chrome_src = chrome_src_abs_path 97*760c253cSXin Li break 98*760c253cSXin Li if not chrome_src: 99*760c253cSXin Li raise RuntimeError( 100*760c253cSXin Li "Can not find location of Chrome sources.\n" 101*760c253cSXin Li f"Checked paths: {chrome_src_rel_paths}" 102*760c253cSXin Li ) 103*760c253cSXin Li else: 104*760c253cSXin Li chrome_src = misc.CanonicalizePath(chrome_src) 105*760c253cSXin Li # Make sure the path exists. 106*760c253cSXin Li if not os.path.exists(chrome_src): 107*760c253cSXin Li raise RuntimeError( 108*760c253cSXin Li "Invalid Chrome src given for label '%s': '%s'." 109*760c253cSXin Li % (name, chrome_src) 110*760c253cSXin Li ) 111*760c253cSXin Li self.chrome_src = chrome_src 112*760c253cSXin Li 113*760c253cSXin Li self._SetupChecksum() 114*760c253cSXin Li 115*760c253cSXin Li def _SetupChecksum(self): 116*760c253cSXin Li """Compute label checksum only once.""" 117*760c253cSXin Li 118*760c253cSXin Li self.checksum = None 119*760c253cSXin Li if self.image_type == "local": 120*760c253cSXin Li self.checksum = ImageChecksummer().Checksum(self, self.log_level) 121*760c253cSXin Li elif self.image_type == "trybot": 122*760c253cSXin Li self.checksum = hashlib.md5( 123*760c253cSXin Li self.chromeos_image.encode("utf-8") 124*760c253cSXin Li ).hexdigest() 125*760c253cSXin Li 126*760c253cSXin Li def _GetImageType(self, chromeos_image): 127*760c253cSXin Li image_type = None 128*760c253cSXin Li if chromeos_image.find("xbuddy://") < 0: 129*760c253cSXin Li image_type = "local" 130*760c253cSXin Li elif chromeos_image.find("trybot") >= 0: 131*760c253cSXin Li image_type = "trybot" 132*760c253cSXin Li else: 133*760c253cSXin Li image_type = "official" 134*760c253cSXin Li return image_type 135*760c253cSXin Li 136*760c253cSXin Li def __hash__(self): 137*760c253cSXin Li """Label objects are used in a map, so provide "hash" and "equal".""" 138*760c253cSXin Li 139*760c253cSXin Li return hash(self.name) 140*760c253cSXin Li 141*760c253cSXin Li def __eq__(self, other): 142*760c253cSXin Li """Label objects are used in a map, so provide "hash" and "equal".""" 143*760c253cSXin Li 144*760c253cSXin Li return isinstance(other, Label) and other.name == self.name 145*760c253cSXin Li 146*760c253cSXin Li def __str__(self): 147*760c253cSXin Li """For better debugging.""" 148*760c253cSXin Li 149*760c253cSXin Li return 'label[name="{}"]'.format(self.name) 150*760c253cSXin Li 151*760c253cSXin Li 152*760c253cSXin Liclass MockLabel(object): 153*760c253cSXin Li """The mock label class.""" 154*760c253cSXin Li 155*760c253cSXin Li def __init__( 156*760c253cSXin Li self, 157*760c253cSXin Li name, 158*760c253cSXin Li build, 159*760c253cSXin Li chromeos_image, 160*760c253cSXin Li autotest_path, 161*760c253cSXin Li debug_path, 162*760c253cSXin Li chromeos_root, 163*760c253cSXin Li board, 164*760c253cSXin Li remote, 165*760c253cSXin Li image_args, 166*760c253cSXin Li cache_dir, 167*760c253cSXin Li cache_only, 168*760c253cSXin Li log_level, 169*760c253cSXin Li compiler, 170*760c253cSXin Li crosfleet=False, 171*760c253cSXin Li chrome_src=None, 172*760c253cSXin Li ): 173*760c253cSXin Li self.name = name 174*760c253cSXin Li self.build = build 175*760c253cSXin Li self.chromeos_image = chromeos_image 176*760c253cSXin Li self.autotest_path = autotest_path 177*760c253cSXin Li self.debug_path = debug_path 178*760c253cSXin Li self.board = board 179*760c253cSXin Li self.remote = remote 180*760c253cSXin Li self.cache_dir = cache_dir 181*760c253cSXin Li self.cache_only = cache_only 182*760c253cSXin Li if not chromeos_root: 183*760c253cSXin Li self.chromeos_root = "/tmp/chromeos_root" 184*760c253cSXin Li else: 185*760c253cSXin Li self.chromeos_root = chromeos_root 186*760c253cSXin Li self.image_args = image_args 187*760c253cSXin Li self.chrome_src = chrome_src 188*760c253cSXin Li self.image_type = self._GetImageType(chromeos_image) 189*760c253cSXin Li self.checksum = "" 190*760c253cSXin Li self.log_level = log_level 191*760c253cSXin Li self.compiler = compiler 192*760c253cSXin Li self.crosfleet = crosfleet 193*760c253cSXin Li self.chrome_version = "Fake Chrome Version 50" 194*760c253cSXin Li 195*760c253cSXin Li def _GetImageType(self, chromeos_image): 196*760c253cSXin Li image_type = None 197*760c253cSXin Li if chromeos_image.find("xbuddy://") < 0: 198*760c253cSXin Li image_type = "local" 199*760c253cSXin Li elif chromeos_image.find("trybot") >= 0: 200*760c253cSXin Li image_type = "trybot" 201*760c253cSXin Li else: 202*760c253cSXin Li image_type = "official" 203*760c253cSXin Li return image_type 204