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