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