1# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4"""The label of benchamrks.""" 5 6from __future__ import print_function 7 8import hashlib 9import os 10 11from image_checksummer import ImageChecksummer 12from cros_utils.file_utils import FileUtils 13from cros_utils import misc 14 15 16class Label(object): 17 """The label class.""" 18 19 def __init__(self, 20 name, 21 chromeos_image, 22 autotest_path, 23 chromeos_root, 24 board, 25 remote, 26 image_args, 27 cache_dir, 28 cache_only, 29 log_level, 30 compiler, 31 chrome_src=None): 32 33 self.image_type = self._GetImageType(chromeos_image) 34 35 # Expand ~ 36 chromeos_root = os.path.expanduser(chromeos_root) 37 if self.image_type == 'local': 38 chromeos_image = os.path.expanduser(chromeos_image) 39 40 self.name = name 41 self.chromeos_image = chromeos_image 42 self.autotest_path = autotest_path 43 self.board = board 44 self.remote = remote 45 self.image_args = image_args 46 self.cache_dir = cache_dir 47 self.cache_only = cache_only 48 self.log_level = log_level 49 self.chrome_version = '' 50 self.compiler = compiler 51 52 if not chromeos_root: 53 if self.image_type == 'local': 54 chromeos_root = FileUtils().ChromeOSRootFromImage(chromeos_image) 55 if not chromeos_root: 56 raise RuntimeError("No ChromeOS root given for label '%s' and could " 57 "not determine one from image path: '%s'." % 58 (name, chromeos_image)) 59 else: 60 chromeos_root = FileUtils().CanonicalizeChromeOSRoot(chromeos_root) 61 if not chromeos_root: 62 raise RuntimeError("Invalid ChromeOS root given for label '%s': '%s'." % 63 (name, chromeos_root)) 64 65 self.chromeos_root = chromeos_root 66 if not chrome_src: 67 self.chrome_src = os.path.join( 68 self.chromeos_root, '.cache/distfiles/target/chrome-src-internal') 69 if not os.path.exists(self.chrome_src): 70 self.chrome_src = os.path.join(self.chromeos_root, 71 '.cache/distfiles/target/chrome-src') 72 else: 73 chromeos_src = misc.CanonicalizePath(chrome_src) 74 if not chromeos_src: 75 raise RuntimeError("Invalid Chrome src given for label '%s': '%s'." % 76 (name, chrome_src)) 77 self.chrome_src = chromeos_src 78 79 self._SetupChecksum() 80 81 def _SetupChecksum(self): 82 """Compute label checksum only once.""" 83 84 self.checksum = None 85 if self.image_type == 'local': 86 self.checksum = ImageChecksummer().Checksum(self, self.log_level) 87 elif self.image_type == 'trybot': 88 self.checksum = hashlib.md5(self.chromeos_image).hexdigest() 89 90 def _GetImageType(self, chromeos_image): 91 image_type = None 92 if chromeos_image.find('xbuddy://') < 0: 93 image_type = 'local' 94 elif chromeos_image.find('trybot') >= 0: 95 image_type = 'trybot' 96 else: 97 image_type = 'official' 98 return image_type 99 100 def __hash__(self): 101 """Label objects are used in a map, so provide "hash" and "equal".""" 102 103 return hash(self.name) 104 105 def __eq__(self, other): 106 """Label objects are used in a map, so provide "hash" and "equal".""" 107 108 return isinstance(other, Label) and other.name == self.name 109 110 def __str__(self): 111 """For better debugging.""" 112 113 return 'label[name="{}"]'.format(self.name) 114 115 116class MockLabel(object): 117 """The mock label class.""" 118 119 def __init__(self, 120 name, 121 chromeos_image, 122 autotest_path, 123 chromeos_root, 124 board, 125 remote, 126 image_args, 127 cache_dir, 128 cache_only, 129 log_level, 130 compiler, 131 chrome_src=None): 132 self.name = name 133 self.chromeos_image = chromeos_image 134 self.autotest_path = autotest_path 135 self.board = board 136 self.remote = remote 137 self.cache_dir = cache_dir 138 self.cache_only = cache_only 139 if not chromeos_root: 140 self.chromeos_root = '/tmp/chromeos_root' 141 else: 142 self.chromeos_root = chromeos_root 143 self.image_args = image_args 144 self.chrome_src = chrome_src 145 self.image_type = self._GetImageType(chromeos_image) 146 self.checksum = '' 147 self.log_level = log_level 148 self.compiler = compiler 149 self.chrome_version = 'Fake Chrome Version 50' 150 151 def _GetImageType(self, chromeos_image): 152 image_type = None 153 if chromeos_image.find('xbuddy://') < 0: 154 image_type = 'local' 155 elif chromeos_image.find('trybot') >= 0: 156 image_type = 'trybot' 157 else: 158 image_type = 'official' 159 return image_type 160