You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

179 lines
7.3 KiB

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittest for buildbot_utils.py."""
from __future__ import print_function
import time
import unittest
from unittest.mock import patch
from cros_utils import buildbot_utils
from cros_utils import command_executer
class TrybotTest(unittest.TestCase):
"""Test for CommandExecuter class."""
tryjob_out = (
'[{"buildbucket_id": "8952721143823688176", "build_config": '
'"cave-llvm-toolchain-tryjob", "url": '
# pylint: disable=line-too-long
'"http://cros-goldeneye/chromeos/healthmonitoring/buildDetails?buildbucketId=8952721143823688176"}]'
)
GSUTILS_LS = '\n'.join([
'gs://chromeos-image-archive/{0}/R78-12421.0.0/',
'gs://chromeos-image-archive/{0}/R78-12422.0.0/',
'gs://chromeos-image-archive/{0}/R78-12423.0.0/',
])
GSUTILS_LS_RECIPE = '\n'.join([
'gs://chromeos-image-archive/{0}/R83-12995.0.0-30031-8885075268947031/',
'gs://chromeos-image-archive/{0}/R83-13003.0.0-30196-8884755532184725/',
'gs://chromeos-image-archive/{0}/R83-13003.0.0-30218-8884712858556419/',
])
buildresult_out = (
'{"8952721143823688176": {"status": "pass", "artifacts_url":'
'"gs://chromeos-image-archive/trybot-elm-release-tryjob/R67-10468.0.0-'
'b20789"}}')
buildbucket_id = '8952721143823688176'
counter_1 = 10
def testGetTrybotImage(self):
with patch.object(buildbot_utils, 'SubmitTryjob') as mock_submit:
with patch.object(buildbot_utils, 'PeekTrybotImage') as mock_peek:
with patch.object(time, 'sleep', return_value=None):
def peek(_chromeos_root, _buildbucket_id):
self.counter_1 -= 1
if self.counter_1 >= 0:
return ('running', '')
return ('pass',
'gs://chromeos-image-archive/trybot-elm-release-tryjob/'
'R67-10468.0.0-b20789')
mock_peek.side_effect = peek
mock_submit.return_value = self.buildbucket_id
# sync
buildbucket_id, image = buildbot_utils.GetTrybotImage(
'/tmp', 'falco-release-tryjob', [])
self.assertEqual(buildbucket_id, self.buildbucket_id)
self.assertEqual('trybot-elm-release-tryjob/'
'R67-10468.0.0-b20789', image)
# async
buildbucket_id, image = buildbot_utils.GetTrybotImage(
'/tmp', 'falco-release-tryjob', [], asynchronous=True)
self.assertEqual(buildbucket_id, self.buildbucket_id)
self.assertEqual(' ', image)
def testSubmitTryjob(self):
with patch.object(command_executer.CommandExecuter,
'RunCommandWOutput') as mocked_run:
mocked_run.return_value = (0, self.tryjob_out, '')
buildbucket_id = buildbot_utils.SubmitTryjob('/', 'falco-release-tryjob',
[], [])
self.assertEqual(buildbucket_id, self.buildbucket_id)
def testPeekTrybotImage(self):
with patch.object(command_executer.CommandExecuter,
'RunCommandWOutput') as mocked_run:
# pass
mocked_run.return_value = (0, self.buildresult_out, '')
status, image = buildbot_utils.PeekTrybotImage('/', self.buildbucket_id)
self.assertEqual('pass', status)
self.assertEqual(
'gs://chromeos-image-archive/trybot-elm-release-tryjob/'
'R67-10468.0.0-b20789', image)
# running
mocked_run.return_value = (1, '', '')
status, image = buildbot_utils.PeekTrybotImage('/', self.buildbucket_id)
self.assertEqual('running', status)
self.assertEqual(None, image)
# fail
buildresult_fail = self.buildresult_out.replace('\"pass\"', '\"fail\"')
mocked_run.return_value = (0, buildresult_fail, '')
status, image = buildbot_utils.PeekTrybotImage('/', self.buildbucket_id)
self.assertEqual('fail', status)
self.assertEqual(
'gs://chromeos-image-archive/trybot-elm-release-tryjob/'
'R67-10468.0.0-b20789', image)
def testParseTryjobBuildbucketId(self):
buildbucket_id = buildbot_utils.ParseTryjobBuildbucketId(self.tryjob_out)
self.assertEqual(buildbucket_id, self.buildbucket_id)
def testGetLatestImageValid(self):
with patch.object(command_executer.CommandExecuter,
'ChrootRunCommandWOutput') as mocked_run:
with patch.object(buildbot_utils, 'DoesImageExist') as mocked_imageexist:
IMAGE_DIR = 'lulu-release'
mocked_run.return_value = (0, self.GSUTILS_LS.format(IMAGE_DIR), '')
mocked_imageexist.return_value = True
image = buildbot_utils.GetLatestImage('', IMAGE_DIR)
self.assertEqual(image, '{0}/R78-12423.0.0'.format(IMAGE_DIR))
def testGetLatestImageInvalid(self):
with patch.object(command_executer.CommandExecuter,
'ChrootRunCommandWOutput') as mocked_run:
with patch.object(buildbot_utils, 'DoesImageExist') as mocked_imageexist:
IMAGE_DIR = 'kefka-release'
mocked_run.return_value = (0, self.GSUTILS_LS.format(IMAGE_DIR), '')
mocked_imageexist.return_value = False
image = buildbot_utils.GetLatestImage('', IMAGE_DIR)
self.assertIsNone(image)
def testGetLatestRecipeImageValid(self):
with patch.object(command_executer.CommandExecuter,
'ChrootRunCommandWOutput') as mocked_run:
with patch.object(buildbot_utils, 'DoesImageExist') as mocked_imageexist:
IMAGE_DIR = 'lulu-llvm-next-nightly'
mocked_run.return_value = (0, self.GSUTILS_LS_RECIPE.format(IMAGE_DIR),
'')
mocked_imageexist.return_value = True
image = buildbot_utils.GetLatestRecipeImage('', IMAGE_DIR)
self.assertEqual(
image, '{0}/R83-13003.0.0-30218-8884712858556419'.format(IMAGE_DIR))
def testGetLatestRecipeImageInvalid(self):
with patch.object(command_executer.CommandExecuter,
'ChrootRunCommandWOutput') as mocked_run:
with patch.object(buildbot_utils, 'DoesImageExist') as mocked_imageexist:
IMAGE_DIR = 'kefka-llvm-next-nightly'
mocked_run.return_value = (0, self.GSUTILS_LS_RECIPE.format(IMAGE_DIR),
'')
mocked_imageexist.return_value = False
image = buildbot_utils.GetLatestRecipeImage('', IMAGE_DIR)
self.assertIsNone(image)
def testGetLatestRecipeImageTwodays(self):
with patch.object(command_executer.CommandExecuter,
'ChrootRunCommandWOutput') as mocked_run:
with patch.object(buildbot_utils, 'DoesImageExist') as mocked_imageexist:
IMAGE_DIR = 'lulu-llvm-next-nightly'
mocked_run.return_value = (0, self.GSUTILS_LS_RECIPE.format(IMAGE_DIR),
'')
mocked_imageexist.side_effect = [False, False, True]
image = buildbot_utils.GetLatestRecipeImage('', IMAGE_DIR)
self.assertIsNone(image)
mocked_imageexist.side_effect = [False, True, True]
image = buildbot_utils.GetLatestRecipeImage('', IMAGE_DIR)
self.assertEqual(
image, '{0}/R83-13003.0.0-30196-8884755532184725'.format(IMAGE_DIR))
if __name__ == '__main__':
unittest.main()