普通文本  |  136行  |  5.04 KB

#!/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_display_cmd = expect_git_log_cmd + ' | grep autotest'
        expect_return = ('\n%s:\n%s\n%s\n' %
                         (repo, expect_display_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()