xref: /aosp_15_r20/external/toolchain-utils/cros_utils/buildbot_utils_unittest.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1#!/usr/bin/env python3
2# Copyright 2018 The ChromiumOS Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Unittest for buildbot_utils.py."""
7
8
9import time
10import unittest
11from unittest.mock import patch
12
13from cros_utils import buildbot_utils
14from cros_utils import command_executer
15
16
17class TrybotTest(unittest.TestCase):
18    """Test for CommandExecuter class."""
19
20    tryjob_out = (
21        '[{"buildbucket_id": "8952721143823688176", "build_config": '
22        '"cave-llvm-toolchain-tryjob", "url": '
23        # pylint: disable=line-too-long
24        '"http://cros-goldeneye/chromeos/healthmonitoring/buildDetails?buildbucketId=8952721143823688176"}]'
25    )
26
27    GSUTILS_LS = "\n".join(
28        [
29            "gs://chromeos-image-archive/{0}/R78-12421.0.0/",
30            "gs://chromeos-image-archive/{0}/R78-12422.0.0/",
31            "gs://chromeos-image-archive/{0}/R78-12423.0.0/",
32        ]
33    )
34
35    GSUTILS_LS_RECIPE = "\n".join(
36        [
37            "gs://chromeos-image-archive/{0}/R83-12995.0.0-30031-8885075268947031/",
38            "gs://chromeos-image-archive/{0}/R83-13003.0.0-30196-8884755532184725/",
39            "gs://chromeos-image-archive/{0}/R83-13003.0.0-30218-8884712858556419/",
40        ]
41    )
42
43    buildresult_out = (
44        '{"8952721143823688176": {"status": "pass", "artifacts_url":'
45        '"gs://chromeos-image-archive/trybot-elm-release-tryjob/R67-10468.0.0-'
46        'b20789"}}'
47    )
48
49    buildbucket_id = "8952721143823688176"
50    counter_1 = 10
51
52    def testGetTrybotImage(self):
53        with patch.object(buildbot_utils, "SubmitTryjob") as mock_submit:
54            with patch.object(buildbot_utils, "PeekTrybotImage") as mock_peek:
55                with patch.object(time, "sleep", return_value=None):
56
57                    def peek(_chromeos_root, _buildbucket_id):
58                        self.counter_1 -= 1
59                        if self.counter_1 >= 0:
60                            return ("running", "")
61                        return (
62                            "pass",
63                            "gs://chromeos-image-archive/trybot-elm-release-tryjob/"
64                            "R67-10468.0.0-b20789",
65                        )
66
67                    mock_peek.side_effect = peek
68                    mock_submit.return_value = self.buildbucket_id
69
70                    # sync
71                    buildbucket_id, image = buildbot_utils.GetTrybotImage(
72                        "/tmp", "falco-release-tryjob", []
73                    )
74                    self.assertEqual(buildbucket_id, self.buildbucket_id)
75                    self.assertEqual(
76                        "trybot-elm-release-tryjob/" "R67-10468.0.0-b20789",
77                        image,
78                    )
79
80                    # async
81                    buildbucket_id, image = buildbot_utils.GetTrybotImage(
82                        "/tmp", "falco-release-tryjob", [], asynchronous=True
83                    )
84                    self.assertEqual(buildbucket_id, self.buildbucket_id)
85                    self.assertEqual(" ", image)
86
87    def testSubmitTryjob(self):
88        with patch.object(
89            command_executer.CommandExecuter, "RunCommandWOutput"
90        ) as mocked_run:
91            mocked_run.return_value = (0, self.tryjob_out, "")
92            buildbucket_id = buildbot_utils.SubmitTryjob(
93                "/", "falco-release-tryjob", [], []
94            )
95            self.assertEqual(buildbucket_id, self.buildbucket_id)
96
97    def testPeekTrybotImage(self):
98        with patch.object(
99            command_executer.CommandExecuter, "RunCommandWOutput"
100        ) as mocked_run:
101            # pass
102            mocked_run.return_value = (0, self.buildresult_out, "")
103            status, image = buildbot_utils.PeekTrybotImage(
104                "/", self.buildbucket_id
105            )
106            self.assertEqual("pass", status)
107            self.assertEqual(
108                "gs://chromeos-image-archive/trybot-elm-release-tryjob/"
109                "R67-10468.0.0-b20789",
110                image,
111            )
112
113            # running
114            mocked_run.return_value = (1, "", "")
115            status, image = buildbot_utils.PeekTrybotImage(
116                "/", self.buildbucket_id
117            )
118            self.assertEqual("running", status)
119            self.assertEqual(None, image)
120
121            # fail
122            buildresult_fail = self.buildresult_out.replace('"pass"', '"fail"')
123            mocked_run.return_value = (0, buildresult_fail, "")
124            status, image = buildbot_utils.PeekTrybotImage(
125                "/", self.buildbucket_id
126            )
127            self.assertEqual("fail", status)
128            self.assertEqual(
129                "gs://chromeos-image-archive/trybot-elm-release-tryjob/"
130                "R67-10468.0.0-b20789",
131                image,
132            )
133
134    def testParseTryjobBuildbucketId(self):
135        buildbucket_id = buildbot_utils.ParseTryjobBuildbucketId(
136            self.tryjob_out
137        )
138        self.assertEqual(buildbucket_id, self.buildbucket_id)
139
140    def testGetLatestImageValid(self):
141        with patch.object(
142            command_executer.CommandExecuter, "ChrootRunCommandWOutput"
143        ) as mocked_run:
144            with patch.object(
145                buildbot_utils, "DoesImageExist"
146            ) as mocked_imageexist:
147                IMAGE_DIR = "lulu-release"
148                mocked_run.return_value = (
149                    0,
150                    self.GSUTILS_LS.format(IMAGE_DIR),
151                    "",
152                )
153                mocked_imageexist.return_value = True
154                image = buildbot_utils.GetLatestImage("", IMAGE_DIR)
155                self.assertEqual(image, f"{IMAGE_DIR}/R78-12423.0.0")
156
157    def testGetLatestImageInvalid(self):
158        with patch.object(
159            command_executer.CommandExecuter, "ChrootRunCommandWOutput"
160        ) as mocked_run:
161            with patch.object(
162                buildbot_utils, "DoesImageExist"
163            ) as mocked_imageexist:
164                IMAGE_DIR = "kefka-release"
165                mocked_run.return_value = (
166                    0,
167                    self.GSUTILS_LS.format(IMAGE_DIR),
168                    "",
169                )
170                mocked_imageexist.return_value = False
171                image = buildbot_utils.GetLatestImage("", IMAGE_DIR)
172                self.assertIsNone(image)
173
174    def testGetLatestRecipeImageValid(self):
175        with patch.object(
176            command_executer.CommandExecuter, "ChrootRunCommandWOutput"
177        ) as mocked_run:
178            with patch.object(
179                buildbot_utils, "DoesImageExist"
180            ) as mocked_imageexist:
181                IMAGE_DIR = "lulu-llvm-next-nightly"
182                mocked_run.return_value = (
183                    0,
184                    self.GSUTILS_LS_RECIPE.format(IMAGE_DIR),
185                    "",
186                )
187                mocked_imageexist.return_value = True
188                image = buildbot_utils.GetLatestRecipeImage("", IMAGE_DIR)
189                self.assertEqual(
190                    image,
191                    f"{IMAGE_DIR}/R83-13003.0.0-30218-8884712858556419",
192                )
193
194    def testGetLatestRecipeImageInvalid(self):
195        with patch.object(
196            command_executer.CommandExecuter, "ChrootRunCommandWOutput"
197        ) as mocked_run:
198            with patch.object(
199                buildbot_utils, "DoesImageExist"
200            ) as mocked_imageexist:
201                IMAGE_DIR = "kefka-llvm-next-nightly"
202                mocked_run.return_value = (
203                    0,
204                    self.GSUTILS_LS_RECIPE.format(IMAGE_DIR),
205                    "",
206                )
207                mocked_imageexist.return_value = False
208                image = buildbot_utils.GetLatestRecipeImage("", IMAGE_DIR)
209                self.assertIsNone(image)
210
211    def testGetLatestRecipeImageTwodays(self):
212        with patch.object(
213            command_executer.CommandExecuter, "ChrootRunCommandWOutput"
214        ) as mocked_run:
215            with patch.object(
216                buildbot_utils, "DoesImageExist"
217            ) as mocked_imageexist:
218                IMAGE_DIR = "lulu-llvm-next-nightly"
219                mocked_run.return_value = (
220                    0,
221                    self.GSUTILS_LS_RECIPE.format(IMAGE_DIR),
222                    "",
223                )
224                mocked_imageexist.side_effect = [False, False, True]
225                image = buildbot_utils.GetLatestRecipeImage("", IMAGE_DIR)
226                self.assertIsNone(image)
227                mocked_imageexist.side_effect = [False, True, True]
228                image = buildbot_utils.GetLatestRecipeImage("", IMAGE_DIR)
229                self.assertEqual(
230                    image,
231                    f"{IMAGE_DIR}/R83-13003.0.0-30196-8884755532184725",
232                )
233
234
235if __name__ == "__main__":
236    unittest.main()
237