#!/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()
