134 lines
5 KiB
Python
134 lines
5 KiB
Python
#!/usr/bin/python
|
|
# Copyright (c) 2016 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.
|
|
|
|
"""Unittests for automated_deploy.py."""
|
|
|
|
from __future__ import print_function
|
|
|
|
import mock
|
|
import unittest
|
|
|
|
import common
|
|
from autotest_lib.site_utils import automated_deploy as ad
|
|
from autotest_lib.site_utils.lib import infra
|
|
|
|
|
|
class AutomatedDeployTest(unittest.TestCase):
|
|
"""Test automated_deploy with commands mocked out."""
|
|
|
|
GIT_LOG_FOR_COMMITS = '''123 foo
|
|
456 bar'''
|
|
|
|
PUSH_LOG = '''Total 0 (delta 0), reused 0 (delta 0)
|
|
remote: Processing changes: done
|
|
To https:TEST_URL
|
|
123..456 prod -> prod'''
|
|
|
|
def setUp(self):
|
|
infra.chdir = mock.MagicMock()
|
|
|
|
|
|
@mock.patch.object(infra, 'local_runner')
|
|
def testUpdateProdBranchWithNoNewChanges(self, run_cmd):
|
|
"""Test update_prod_branch when there exist no new changes.
|
|
|
|
@param run_cmd: Mock of infra.local_runner call used.
|
|
"""
|
|
run_cmd.return_value = None
|
|
self.assertEqual(ad.update_prod_branch('test', 'test_dir', '123'), None)
|
|
expect_cmds = [
|
|
mock.call('git log prod..123 --oneline', stream_output=True)]
|
|
run_cmd.assert_has_calls(expect_cmds)
|
|
|
|
|
|
@mock.patch.object(infra, 'local_runner')
|
|
def testUpdateProdBranchRebaseToCorrectHash(self, run_cmd):
|
|
"""Test whether update_prod_branch can rebase to the correct hash.
|
|
|
|
@param run_cmd: Mock of infra.local_runner call used.
|
|
"""
|
|
run_cmd.side_effect = [self.GIT_LOG_FOR_COMMITS, None, self.PUSH_LOG]
|
|
ad.update_prod_branch('test', 'test_dir', '123')
|
|
expect_cmds = [
|
|
mock.call('git log prod..123 --oneline', stream_output=True),
|
|
mock.call('git rebase 123 prod', stream_output=True),
|
|
mock.call('git push origin prod', stream_output=True)]
|
|
run_cmd.assert_has_calls(expect_cmds)
|
|
|
|
|
|
@mock.patch.object(infra, 'local_runner')
|
|
def testUpdateProdBranchRebaseToProdNext(self, run_cmd):
|
|
"""Test whether rebase to prod-next branch when the hash is not given.
|
|
|
|
@param run_cmd: Mock of infra.local_runner call used.
|
|
"""
|
|
run_cmd.side_effect = [self.GIT_LOG_FOR_COMMITS, None, self.PUSH_LOG]
|
|
ad.update_prod_branch('test', 'test_dir', None)
|
|
expect_cmds = [
|
|
mock.call('git log prod..origin/prod-next --oneline',
|
|
stream_output=True),
|
|
mock.call('git rebase origin/prod-next prod',
|
|
stream_output=True),
|
|
mock.call('git push origin prod', stream_output=True)]
|
|
run_cmd.assert_has_calls(expect_cmds)
|
|
|
|
|
|
@mock.patch.object(infra, 'local_runner')
|
|
def testUpdateProdBranchParseCommitRange(self, run_cmd):
|
|
"""Test to grep the pushed commit range from the normal push log.
|
|
|
|
@param run_cmd: Mock of infra.local_runner call used.
|
|
"""
|
|
run_cmd.side_effect = [self.GIT_LOG_FOR_COMMITS, None, self.PUSH_LOG]
|
|
self.assertEqual(ad.update_prod_branch('test', 'test_dir', None),
|
|
'123..456')
|
|
|
|
|
|
@mock.patch.object(infra, 'local_runner')
|
|
def testUpdateProdBranchFailToParseCommitRange(self, run_cmd):
|
|
"""Test to grep the pushed commit range from the failed push log.
|
|
|
|
@param run_cmd: Mock of infra.local_runner call used.
|
|
"""
|
|
run_cmd.side_effect = [self.GIT_LOG_FOR_COMMITS, None,
|
|
'Fail to push prod branch']
|
|
with self.assertRaises(ad.AutoDeployException):
|
|
ad.update_prod_branch('test', 'test_dir', None)
|
|
|
|
|
|
@mock.patch.object(infra, 'local_runner')
|
|
def testGetPushedCommits(self, run_cmd):
|
|
"""Test automated_deploy.get_pushed_commits.
|
|
|
|
@param run_cmd: Mock of infra.local_runner call used.
|
|
"""
|
|
autotest_commits_logs = '123: autotest: cl_1\n456: autotest: cl_2\n'
|
|
chromite_commits_logs = '789: test_cl_1\n'
|
|
fake_commits_logs = autotest_commits_logs + chromite_commits_logs
|
|
run_cmd.return_value = fake_commits_logs
|
|
|
|
#Test to get pushed commits for autotest repo.
|
|
repo = 'autotest'
|
|
expect_git_log_cmd = 'git log --oneline 123..789'
|
|
expect_return = ('\n%s:\n%s\n%s\n' %
|
|
(repo, expect_git_log_cmd, autotest_commits_logs))
|
|
actual_return = ad.get_pushed_commits(repo, 'test', '123..789')
|
|
|
|
run_cmd.assert_called_with(expect_git_log_cmd, stream_output=True)
|
|
self.assertEqual(expect_return, actual_return)
|
|
|
|
#Test to get pushed commits for chromite repo.
|
|
repo = 'chromite'
|
|
expect_git_log_cmd = 'git log --oneline 123..789'
|
|
expect_return = ('\n%s:\n%s\n%s\n' %
|
|
(repo, expect_git_log_cmd, fake_commits_logs))
|
|
actual_return = ad.get_pushed_commits(repo, 'test', '123..789')
|
|
|
|
run_cmd.assert_called_with(expect_git_log_cmd, stream_output=True)
|
|
self.assertEqual(expect_return, actual_return)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|