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