diff options
Diffstat (limited to 'llvm_tools/llvm_patch_management_unittest.py')
-rwxr-xr-x | llvm_tools/llvm_patch_management_unittest.py | 307 |
1 files changed, 0 insertions, 307 deletions
diff --git a/llvm_tools/llvm_patch_management_unittest.py b/llvm_tools/llvm_patch_management_unittest.py deleted file mode 100755 index 968a816a..00000000 --- a/llvm_tools/llvm_patch_management_unittest.py +++ /dev/null @@ -1,307 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# Copyright 2019 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. - -# pylint: disable=protected-access - -"""Unit tests when creating the arguments for the patch manager.""" - -from __future__ import print_function -from collections import namedtuple -import os -import unittest -import unittest.mock as mock - -from failure_modes import FailureModes -import get_llvm_hash -import llvm_patch_management -import patch_manager -import subprocess_helpers - - -class LlvmPatchManagementTest(unittest.TestCase): - """Test class when constructing the arguments for the patch manager.""" - - # Simulate the behavior of `os.path.isdir()` when the chroot path does not - # exist or is not a directory. - @mock.patch.object(os.path, 'isdir', return_value=False) - def testInvalidChrootPathWhenGetPathToFilesDir(self, mock_isdir): - chroot_path = '/some/path/to/chroot' - package = 'sys-devel/llvm' - - # Verify the exception is raised when an invalid absolute path to the chroot - # is passed in. - with self.assertRaises(ValueError) as err: - llvm_patch_management.GetPathToFilesDirectory(chroot_path, package) - - self.assertEqual( - str(err.exception), 'Invalid chroot provided: %s' % chroot_path) - - mock_isdir.assert_called_once() - - # Simulate the behavior of 'os.path.isdir()' when a valid chroot path is - # passed in. - @mock.patch.object(os.path, 'isdir', return_value=True) - @mock.patch.object(subprocess_helpers, 'ChrootRunCommand') - @mock.patch.object(llvm_patch_management, '_GetRelativePathOfChrootPath') - def testSuccessfullyGetPathToFilesDir( - self, mock_get_relative_path_of_chroot_path, mock_chroot_cmd, mock_isdir): - - package_chroot_path = '/mnt/host/source/path/to/llvm/llvm.ebuild' - - # Simulate behavior of 'ChrootRunCommand()' when successfully - # retrieved the absolute chroot path to the package's ebuild. - mock_chroot_cmd.return_value = package_chroot_path - - # Simulate behavior of '_GetRelativePathOfChrootPath()' when successfully - # removed '/mnt/host/source' of the absolute chroot path to the package's - # ebuild. - # - # Returns relative path after '/mnt/host/source/'. - mock_get_relative_path_of_chroot_path.return_value = 'path/to/llvm' - - chroot_path = '/some/path/to/chroot' - - package = 'sys-devel/llvm' - - self.assertEqual( - llvm_patch_management.GetPathToFilesDirectory(chroot_path, package), - '/some/path/to/chroot/path/to/llvm/files/') - - mock_isdir.assert_called_once() - - mock_chroot_cmd.assert_called_once() - - mock_get_relative_path_of_chroot_path.assert_called_once_with( - '/mnt/host/source/path/to/llvm') - - def testInvalidPrefixForChrootPath(self): - package_chroot_path = '/path/to/llvm' - - # Verify the exception is raised when the chroot path does not start with - # '/mnt/host/source/'. - with self.assertRaises(ValueError) as err: - llvm_patch_management._GetRelativePathOfChrootPath(package_chroot_path) - - self.assertEqual( - str(err.exception), - 'Invalid prefix for the chroot path: %s' % package_chroot_path) - - def testValidPrefixForChrootPath(self): - package_chroot_path = '/mnt/host/source/path/to/llvm' - - package_rel_path = 'path/to/llvm' - - self.assertEqual( - llvm_patch_management._GetRelativePathOfChrootPath(package_chroot_path), - package_rel_path) - - # Simulate behavior of 'os.path.isfile()' when the patch metadata file does - # not exist. - @mock.patch.object(os.path, 'isfile', return_value=False) - def testInvalidFileForPatchMetadataPath(self, mock_isfile): - abs_path_to_patch_file = '/abs/path/to/files/test.json' - - # Verify the exception is raised when the absolute path to the patch - # metadata file does not exist. - with self.assertRaises(ValueError) as err: - llvm_patch_management._CheckPatchMetadataPath(abs_path_to_patch_file) - - self.assertEqual( - str(err.exception), - 'Invalid file provided: %s' % abs_path_to_patch_file) - - mock_isfile.assert_called_once() - - # Simulate behavior of 'os.path.isfile()' when the absolute path to the - # patch metadata file exists. - @mock.patch.object(os.path, 'isfile', return_value=True) - def testPatchMetadataFileDoesNotEndInJson(self, mock_isfile): - abs_path_to_patch_file = '/abs/path/to/files/PATCHES' - - # Verify the exception is raised when the patch metadata file does not end - # in '.json'. - with self.assertRaises(ValueError) as err: - llvm_patch_management._CheckPatchMetadataPath(abs_path_to_patch_file) - - self.assertEqual( - str(err.exception), - 'File does not end in ".json": %s' % abs_path_to_patch_file) - - mock_isfile.assert_called_once() - - @mock.patch.object(os.path, 'isfile') - def testValidPatchMetadataFile(self, mock_isfile): - abs_path_to_patch_file = '/abs/path/to/files/PATCHES.json' - - # Simulate behavior of 'os.path.isfile()' when the absolute path to the - # patch metadata file exists. - mock_isfile.return_value = True - - llvm_patch_management._CheckPatchMetadataPath(abs_path_to_patch_file) - - mock_isfile.assert_called_once() - - # Simulate `GetGitHashFrom()` when successfully retrieved the git hash - # of the version passed in. - @mock.patch.object( - get_llvm_hash, 'GetGitHashFrom', return_value='a123testhash1') - # Simulate `CreateTempLLVMRepo()` when successfully created a work tree from - # the LLVM repo copy in `llvm_tools` directory. - @mock.patch.object(get_llvm_hash, 'CreateTempLLVMRepo') - # Simulate behavior of `_MoveSrcTreeHEADToGitHash()` when successfully moved - # the head pointer to the git hash of the revision. - @mock.patch.object(llvm_patch_management, '_MoveSrcTreeHEADToGitHash') - @mock.patch.object(llvm_patch_management, 'GetPathToFilesDirectory') - @mock.patch.object(llvm_patch_management, '_CheckPatchMetadataPath') - def testExceptionIsRaisedWhenUpdatingAPackagesMetadataFile( - self, mock_check_patch_metadata_path, mock_get_filesdir_path, - mock_move_head_pointer, mock_create_temp_llvm_repo, mock_get_git_hash): - - abs_path_to_patch_file = \ - '/some/path/to/chroot/some/path/to/filesdir/PATCHES' - - # Simulate the behavior of '_CheckPatchMetadataPath()' when the patch - # metadata file in $FILESDIR does not exist or does not end in '.json'. - def InvalidPatchMetadataFile(patch_metadata_path): - self.assertEqual(patch_metadata_path, abs_path_to_patch_file) - - raise ValueError( - 'File does not end in ".json": %s' % abs_path_to_patch_file) - - # Use the test function to simulate behavior of '_CheckPatchMetadataPath()'. - mock_check_patch_metadata_path.side_effect = InvalidPatchMetadataFile - - abs_path_to_filesdir = '/some/path/to/chroot/some/path/to/filesdir' - - # Simulate the behavior of 'GetPathToFilesDirectory()' when successfully - # constructed the absolute path to $FILESDIR of a package. - mock_get_filesdir_path.return_value = abs_path_to_filesdir - - temp_work_tree = '/abs/path/to/tmpWorkTree' - - # Simulate the behavior of returning the absolute path to a worktree via - # `git worktree add`. - mock_create_temp_llvm_repo.return_value.__enter__.return_value.name = \ - temp_work_tree - - chroot_path = '/some/path/to/chroot' - revision = 1000 - patch_file_name = 'PATCHES' - package_name = 'test-package/package1' - - # Verify the exception is raised when a package is constructing the - # arguments for the patch manager to update its patch metadata file and an - # exception is raised in the process. - with self.assertRaises(ValueError) as err: - llvm_patch_management.UpdatePackagesPatchMetadataFile( - chroot_path, revision, patch_file_name, [package_name], - FailureModes.FAIL) - - self.assertEqual( - str(err.exception), - 'File does not end in ".json": %s' % abs_path_to_patch_file) - - mock_get_filesdir_path.assert_called_once_with(chroot_path, package_name) - - mock_get_git_hash.assert_called_once() - - mock_check_patch_metadata_path.assert_called_once() - - mock_move_head_pointer.assert_called_once() - - mock_create_temp_llvm_repo.assert_called_once() - - # Simulate `CleanSrcTree()` when successfully removed changes from the - # worktree. - @mock.patch.object(patch_manager, 'CleanSrcTree') - # Simulate `GetGitHashFrom()` when successfully retrieved the git hash - # of the version passed in. - @mock.patch.object( - get_llvm_hash, 'GetGitHashFrom', return_value='a123testhash1') - # Simulate `CreateTempLLVMRepo()` when successfully created a work tree from - # the LLVM repo copy in `llvm_tools` directory. - @mock.patch.object(get_llvm_hash, 'CreateTempLLVMRepo') - # Simulate behavior of `_MoveSrcTreeHEADToGitHash()` when successfully moved - # the head pointer to the git hash of the revision. - @mock.patch.object(llvm_patch_management, '_MoveSrcTreeHEADToGitHash') - @mock.patch.object(llvm_patch_management, 'GetPathToFilesDirectory') - @mock.patch.object(llvm_patch_management, '_CheckPatchMetadataPath') - @mock.patch.object(patch_manager, 'HandlePatches') - def testSuccessfullyRetrievedPatchResults( - self, mock_handle_patches, mock_check_patch_metadata_path, - mock_get_filesdir_path, mock_move_head_pointer, - mock_create_temp_llvm_repo, mock_get_git_hash, mock_clean_src_tree): - - abs_path_to_filesdir = '/some/path/to/chroot/some/path/to/filesdir' - - abs_path_to_patch_file = \ - '/some/path/to/chroot/some/path/to/filesdir/PATCHES.json' - - # Simulate the behavior of 'GetPathToFilesDirectory()' when successfully - # constructed the absolute path to $FILESDIR of a package. - mock_get_filesdir_path.return_value = abs_path_to_filesdir - - PatchInfo = namedtuple('PatchInfo', [ - 'applied_patches', 'failed_patches', 'non_applicable_patches', - 'disabled_patches', 'removed_patches', 'modified_metadata' - ]) - - # Simulate the behavior of 'HandlePatches()' when successfully iterated - # through every patch in the patch metadata file and a dictionary is - # returned that contains information about the patches' status. - mock_handle_patches.return_value = PatchInfo( - applied_patches=['fixes_something.patch'], - failed_patches=['disables_output.patch'], - non_applicable_patches=[], - disabled_patches=[], - removed_patches=[], - modified_metadata=None) - - temp_work_tree = '/abs/path/to/tmpWorkTree' - - # Simulate the behavior of returning the absolute path to a worktree via - # `git worktree add`. - mock_create_temp_llvm_repo.return_value.__enter__.return_value.name = \ - temp_work_tree - - expected_patch_results = { - 'applied_patches': ['fixes_something.patch'], - 'failed_patches': ['disables_output.patch'], - 'non_applicable_patches': [], - 'disabled_patches': [], - 'removed_patches': [], - 'modified_metadata': None - } - - chroot_path = '/some/path/to/chroot' - revision = 1000 - patch_file_name = 'PATCHES.json' - package_name = 'test-package/package2' - - patch_info = llvm_patch_management.UpdatePackagesPatchMetadataFile( - chroot_path, revision, patch_file_name, [package_name], - FailureModes.CONTINUE) - - self.assertDictEqual(patch_info, {package_name: expected_patch_results}) - - mock_get_filesdir_path.assert_called_once_with(chroot_path, package_name) - - mock_check_patch_metadata_path.assert_called_once_with( - abs_path_to_patch_file) - - mock_handle_patches.assert_called_once() - - mock_create_temp_llvm_repo.assert_called_once() - - mock_get_git_hash.assert_called_once() - - mock_move_head_pointer.assert_called_once() - - mock_clean_src_tree.assert_called_once() - - -if __name__ == '__main__': - unittest.main() |