xref: /aosp_15_r20/external/toolchain-utils/crosperf/label.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
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