#!/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.
        """
        fake_commits_logs = '123 Test_change_1\n456 Test_change_2'
        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..456|grep autotest'
        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..456')

        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..456'
        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..456')

        run_cmd.assert_called_with(expect_git_log_cmd, stream_output=True)
        self.assertEqual(expect_return, actual_return)


if __name__ == '__main__':
    unittest.main()
