label.py revision 9099a788cd7124024559c064e425ed9caef6e0ac
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 chromeos_root, 23 board, 24 remote, 25 image_args, 26 cache_dir, 27 cache_only, 28 log_level, 29 compiler, 30 chrome_src=None): 31 32 self.image_type = self._GetImageType(chromeos_image) 33 34 # Expand ~ 35 chromeos_root = os.path.expanduser(chromeos_root) 36 if self.image_type == 'local': 37 chromeos_image = os.path.expanduser(chromeos_image) 38 39 self.name = name 40 self.chromeos_image = chromeos_image 41 self.board = board 42 self.remote = remote 43 self.image_args = image_args 44 self.cache_dir = cache_dir 45 self.cache_only = cache_only 46 self.log_level = log_level 47 self.chrome_version = '' 48 self.compiler = compiler 49 50 if not chromeos_root: 51 if self.image_type == 'local': 52 chromeos_root = FileUtils().ChromeOSRootFromImage(chromeos_image) 53 if not chromeos_root: 54 raise RuntimeError("No ChromeOS root given for label '%s' and could " 55 "not determine one from image path: '%s'." % 56 (name, chromeos_image)) 57 else: 58 chromeos_root = FileUtils().CanonicalizeChromeOSRoot(chromeos_root) 59 if not chromeos_root: 60 raise RuntimeError("Invalid ChromeOS root given for label '%s': '%s'." % 61 (name, chromeos_root)) 62 63 self.chromeos_root = chromeos_root 64 if not chrome_src: 65 self.chrome_src = os.path.join( 66 self.chromeos_root, '.cache/distfiles/target/chrome-src-internal') 67 if not os.path.exists(self.chrome_src): 68 self.chrome_src = os.path.join(self.chromeos_root, 69 '.cache/distfiles/target/chrome-src') 70 else: 71 chromeos_src = misc.CanonicalizePath(chrome_src) 72 if not chromeos_src: 73 raise RuntimeError("Invalid Chrome src given for label '%s': '%s'." % 74 (name, chrome_src)) 75 self.chrome_src = chromeos_src 76 77 self._SetupChecksum() 78 79 def _SetupChecksum(self): 80 """Compute label checksum only once.""" 81 82 self.checksum = None 83 if self.image_type == 'local': 84 self.checksum = ImageChecksummer().Checksum(self, self.log_level) 85 elif self.image_type == 'trybot': 86 self.checksum = hashlib.md5(self.chromeos_image).hexdigest() 87 88 def _GetImageType(self, chromeos_image): 89 image_type = None 90 if chromeos_image.find('xbuddy://') < 0: 91 image_type = 'local' 92 elif chromeos_image.find('trybot') >= 0: 93 image_type = 'trybot' 94 else: 95 image_type = 'official' 96 return image_type 97 98 def __hash__(self): 99 """Label objects are used in a map, so provide "hash" and "equal".""" 100 101 return hash(self.name) 102 103 def __eq__(self, other): 104 """Label objects are used in a map, so provide "hash" and "equal".""" 105 106 return isinstance(other, Label) and other.name == self.name 107 108 def __str__(self): 109 """For better debugging.""" 110 111 return 'label[name="{}"]'.format(self.name) 112 113 114class MockLabel(object): 115 """The mock label class.""" 116 117 def __init__(self, 118 name, 119 chromeos_image, 120 chromeos_root, 121 board, 122 remote, 123 image_args, 124 cache_dir, 125 cache_only, 126 log_level, 127 compiler, 128 chrome_src=None): 129 self.name = name 130 self.chromeos_image = chromeos_image 131 self.board = board 132 self.remote = remote 133 self.cache_dir = cache_dir 134 self.cache_only = cache_only 135 if not chromeos_root: 136 self.chromeos_root = '/tmp/chromeos_root' 137 else: 138 self.chromeos_root = chromeos_root 139 self.image_args = image_args 140 self.chrome_src = chrome_src 141 self.image_type = self._GetImageType(chromeos_image) 142 self.checksum = '' 143 self.log_level = log_level 144 self.compiler = compiler 145 self.chrome_version = 'Fake Chrome Version 50' 146 147 def _GetImageType(self, chromeos_image): 148 image_type = None 149 if chromeos_image.find('xbuddy://') < 0: 150 image_type = 'local' 151 elif chromeos_image.find('trybot') >= 0: 152 image_type = 'trybot' 153 else: 154 image_type = 'official' 155 return image_type 156