#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2020 The ChromiumOS Authors # 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.""" 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()