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