| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # Copyright 2020 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. |
| |
| """Unit tests for git helper functions.""" |
| |
| from __future__ import print_function |
| |
| import os |
| import subprocess |
| import tempfile |
| import unittest |
| import unittest.mock as mock |
| |
| import git |
| |
| # These are unittests; protected access is OK to a point. |
| # pylint: disable=protected-access |
| |
| |
| class HelperFunctionsTest(unittest.TestCase): |
| """Test class for updating LLVM hashes of packages.""" |
| |
| @mock.patch.object(os.path, 'isdir', return_value=False) |
| def testFailedToCreateBranchForInvalidDirectoryPath(self, mock_isdir): |
| path_to_repo = '/invalid/path/to/repo' |
| branch = 'branch-name' |
| |
| # Verify the exception is raised when provided an invalid directory path. |
| with self.assertRaises(ValueError) as err: |
| git.CreateBranch(path_to_repo, branch) |
| |
| self.assertEqual( |
| str(err.exception), |
| 'Invalid directory path provided: %s' % path_to_repo) |
| |
| mock_isdir.assert_called_once() |
| |
| @mock.patch.object(os.path, 'isdir', return_value=True) |
| @mock.patch.object(subprocess, 'check_output', return_value=None) |
| def testSuccessfullyCreatedBranch(self, mock_command_output, mock_isdir): |
| path_to_repo = '/path/to/repo' |
| branch = 'branch-name' |
| |
| git.CreateBranch(path_to_repo, branch) |
| |
| mock_isdir.assert_called_once_with(path_to_repo) |
| |
| self.assertEqual(mock_command_output.call_count, 2) |
| |
| @mock.patch.object(os.path, 'isdir', return_value=False) |
| def testFailedToDeleteBranchForInvalidDirectoryPath(self, mock_isdir): |
| path_to_repo = '/invalid/path/to/repo' |
| branch = 'branch-name' |
| |
| # Verify the exception is raised on an invalid repo path. |
| with self.assertRaises(ValueError) as err: |
| git.DeleteBranch(path_to_repo, branch) |
| |
| self.assertEqual( |
| str(err.exception), |
| 'Invalid directory path provided: %s' % path_to_repo) |
| |
| mock_isdir.assert_called_once() |
| |
| @mock.patch.object(os.path, 'isdir', return_value=True) |
| @mock.patch.object(subprocess, 'check_output', return_value=None) |
| def testSuccessfullyDeletedBranch(self, mock_command_output, mock_isdir): |
| path_to_repo = '/valid/path/to/repo' |
| branch = 'branch-name' |
| |
| git.DeleteBranch(path_to_repo, branch) |
| |
| mock_isdir.assert_called_once_with(path_to_repo) |
| |
| self.assertEqual(mock_command_output.call_count, 3) |
| |
| @mock.patch.object(os.path, 'isdir', return_value=False) |
| def testFailedToUploadChangesForInvalidDirectoryPath(self, mock_isdir): |
| path_to_repo = '/some/path/to/repo' |
| branch = 'update-LLVM_NEXT_HASH-a123testhash3' |
| commit_messages = ['Test message'] |
| |
| # Verify exception is raised when on an invalid repo path. |
| with self.assertRaises(ValueError) as err: |
| git.UploadChanges(path_to_repo, branch, commit_messages) |
| |
| self.assertEqual( |
| str(err.exception), 'Invalid path provided: %s' % path_to_repo) |
| |
| mock_isdir.assert_called_once() |
| |
| @mock.patch.object(os.path, 'isdir', return_value=True) |
| @mock.patch.object(subprocess, 'check_output') |
| @mock.patch.object(tempfile, 'NamedTemporaryFile') |
| def testSuccessfullyUploadedChangesForReview(self, mock_tempfile, |
| mock_commands, mock_isdir): |
| |
| path_to_repo = '/some/path/to/repo' |
| branch = 'branch-name' |
| commit_messages = ['Test message'] |
| mock_tempfile.return_value.__enter__.return_value.name = 'tmp' |
| |
| # A test CL generated by `repo upload`. |
| mock_commands.side_effect = [ |
| None, |
| ('remote: https://chromium-review.googlesource.' |
| 'com/c/chromiumos/overlays/chromiumos-overlay/' |
| '+/193147 Fix stdout') |
| ] |
| change_list = git.UploadChanges(path_to_repo, branch, commit_messages) |
| |
| self.assertEqual(change_list.cl_number, 193147) |
| |
| mock_isdir.assert_called_once_with(path_to_repo) |
| |
| expected_command = [ |
| 'git', 'commit', '-F', |
| mock_tempfile.return_value.__enter__.return_value.name |
| ] |
| self.assertEqual(mock_commands.call_args_list[0], |
| mock.call(expected_command, cwd=path_to_repo)) |
| |
| expected_cmd = [ |
| 'repo', 'upload', '--yes', '--ne', '--no-verify', |
| '--br=%s' % branch |
| ] |
| self.assertEqual( |
| mock_commands.call_args_list[1], |
| mock.call( |
| expected_cmd, |
| stderr=subprocess.STDOUT, |
| cwd=path_to_repo, |
| encoding='utf-8')) |
| |
| self.assertEqual( |
| change_list.url, |
| 'https://chromium-review.googlesource.com/c/chromiumos/overlays/' |
| 'chromiumos-overlay/+/193147') |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |