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

"""Tests for LLVM bisection."""

from __future__ import print_function

import json
import os
import subprocess
import unittest
import unittest.mock as mock

import chroot
import get_llvm_hash
import git_llvm_rev
import llvm_bisection
import modify_a_tryjob
import test_helpers


class LLVMBisectionTest(unittest.TestCase):
  """Unittests for LLVM bisection."""

  def testGetRemainingRangePassed(self):
    start = 100
    end = 150

    test_tryjobs = [{
        'rev': 110,
        'status': 'good',
        'link': 'https://some_tryjob_1_url.com'
    }, {
        'rev': 120,
        'status': 'good',
        'link': 'https://some_tryjob_2_url.com'
    }, {
        'rev': 130,
        'status': 'pending',
        'link': 'https://some_tryjob_3_url.com'
    }, {
        'rev': 135,
        'status': 'skip',
        'link': 'https://some_tryjob_4_url.com'
    }, {
        'rev': 140,
        'status': 'bad',
        'link': 'https://some_tryjob_5_url.com'
    }]

    # Tuple consists of the new good revision, the new bad revision, a set of
    # 'pending' revisions, and a set of 'skip' revisions.
    expected_revisions_tuple = 120, 140, {130}, {135}

    self.assertEqual(
        llvm_bisection.GetRemainingRange(start, end, test_tryjobs),
        expected_revisions_tuple)

  def testGetRemainingRangeFailedWithMissingStatus(self):
    start = 100
    end = 150

    test_tryjobs = [{
        'rev': 105,
        'status': 'good',
        'link': 'https://some_tryjob_1_url.com'
    }, {
        'rev': 120,
        'status': None,
        'link': 'https://some_tryjob_2_url.com'
    }, {
        'rev': 140,
        'status': 'bad',
        'link': 'https://some_tryjob_3_url.com'
    }]

    with self.assertRaises(ValueError) as err:
      llvm_bisection.GetRemainingRange(start, end, test_tryjobs)

    error_message = ('"status" is missing or has no value, please '
                     'go to %s and update it' % test_tryjobs[1]['link'])
    self.assertEqual(str(err.exception), error_message)

  def testGetRemainingRangeFailedWithInvalidRange(self):
    start = 100
    end = 150

    test_tryjobs = [{
        'rev': 110,
        'status': 'bad',
        'link': 'https://some_tryjob_1_url.com'
    }, {
        'rev': 125,
        'status': 'skip',
        'link': 'https://some_tryjob_2_url.com'
    }, {
        'rev': 140,
        'status': 'good',
        'link': 'https://some_tryjob_3_url.com'
    }]

    with self.assertRaises(AssertionError) as err:
      llvm_bisection.GetRemainingRange(start, end, test_tryjobs)

    expected_error_message = ('Bisection is broken because %d (good) is >= '
                              '%d (bad)' %
                              (test_tryjobs[2]['rev'], test_tryjobs[0]['rev']))

    self.assertEqual(str(err.exception), expected_error_message)

  @mock.patch.object(get_llvm_hash, 'GetGitHashFrom')
  def testGetCommitsBetweenPassed(self, mock_get_git_hash):
    start = git_llvm_rev.base_llvm_revision
    end = start + 10
    test_pending_revisions = {start + 7}
    test_skip_revisions = {
        start + 1, start + 2, start + 4, start + 8, start + 9
    }
    parallel = 3
    abs_path_to_src = '/abs/path/to/src'

    revs = ['a123testhash3', 'a123testhash5']
    mock_get_git_hash.side_effect = revs

    git_hashes = [
        git_llvm_rev.base_llvm_revision + 3, git_llvm_rev.base_llvm_revision + 5
    ]

    self.assertEqual(
        llvm_bisection.GetCommitsBetween(start, end, parallel, abs_path_to_src,
                                         test_pending_revisions,
                                         test_skip_revisions),
        (git_hashes, revs))

  def testLoadStatusFilePassedWithExistingFile(self):
    start = 100
    end = 150

    test_bisect_state = {'start': start, 'end': end, 'jobs': []}

    # Simulate that the status file exists.
    with test_helpers.CreateTemporaryJsonFile() as temp_json_file:
      with open(temp_json_file, 'w') as f:
        test_helpers.WritePrettyJsonFile(test_bisect_state, f)

      self.assertEqual(
          llvm_bisection.LoadStatusFile(temp_json_file, start, end),
          test_bisect_state)

  def testLoadStatusFilePassedWithoutExistingFile(self):
    start = 200
    end = 250

    expected_bisect_state = {'start': start, 'end': end, 'jobs': []}

    last_tested = '/abs/path/to/file_that_does_not_exist.json'

    self.assertEqual(
        llvm_bisection.LoadStatusFile(last_tested, start, end),
        expected_bisect_state)

  @mock.patch.object(modify_a_tryjob, 'AddTryjob')
  def testBisectPassed(self, mock_add_tryjob):

    git_hash_list = ['a123testhash1', 'a123testhash2', 'a123testhash3']
    revisions_list = [102, 104, 106]

    # Simulate behavior of `AddTryjob()` when successfully launched a tryjob for
    # the updated packages.
    @test_helpers.CallCountsToMockFunctions
    def MockAddTryjob(call_count, _packages, _git_hash, _revision, _chroot_path,
                      _patch_file, _extra_cls, _options, _builder, _verbose,
                      _svn_revision):

      if call_count < 2:
        return {'rev': revisions_list[call_count], 'status': 'pending'}

      # Simulate an exception happened along the way when updating the
      # packages' `LLVM_NEXT_HASH`.
      if call_count == 2:
        raise ValueError('Unable to launch tryjob')

      assert False, 'Called `AddTryjob()` more than expected.'

    # Use the test function to simulate `AddTryjob()`.
    mock_add_tryjob.side_effect = MockAddTryjob

    start = 100
    end = 110

    bisection_contents = {'start': start, 'end': end, 'jobs': []}

    args_output = test_helpers.ArgsOutputTest()

    packages = ['sys-devel/llvm']
    patch_file = '/abs/path/to/PATCHES.json'

    # Create a temporary .JSON file to simulate a status file for bisection.
    with test_helpers.CreateTemporaryJsonFile() as temp_json_file:
      with open(temp_json_file, 'w') as f:
        test_helpers.WritePrettyJsonFile(bisection_contents, f)

      # Verify that the status file is updated when an exception happened when
      # attempting to launch a revision (i.e. progress is not lost).
      with self.assertRaises(ValueError) as err:
        llvm_bisection.Bisect(revisions_list, git_hash_list, bisection_contents,
                              temp_json_file, packages, args_output.chroot_path,
                              patch_file, args_output.extra_change_lists,
                              args_output.options, args_output.builders,
                              args_output.verbose)

      expected_bisection_contents = {
          'start':
              start,
          'end':
              end,
          'jobs': [{
              'rev': revisions_list[0],
              'status': 'pending'
          }, {
              'rev': revisions_list[1],
              'status': 'pending'
          }]
      }

      # Verify that the launched tryjobs were added to the status file when
      # an exception happened.
      with open(temp_json_file) as f:
        json_contents = json.load(f)

        self.assertEqual(json_contents, expected_bisection_contents)

    self.assertEqual(str(err.exception), 'Unable to launch tryjob')

    self.assertEqual(mock_add_tryjob.call_count, 3)

  @mock.patch.object(subprocess, 'check_output', return_value=None)
  @mock.patch.object(
      get_llvm_hash.LLVMHash, 'GetLLVMHash', return_value='a123testhash4')
  @mock.patch.object(llvm_bisection, 'GetCommitsBetween')
  @mock.patch.object(llvm_bisection, 'GetRemainingRange')
  @mock.patch.object(llvm_bisection, 'LoadStatusFile')
  @mock.patch.object(chroot, 'VerifyOutsideChroot', return_value=True)
  def testMainPassed(self, mock_outside_chroot, mock_load_status_file,
                     mock_get_range, mock_get_revision_and_hash_list,
                     _mock_get_bad_llvm_hash, mock_abandon_cl):

    start = 500
    end = 502
    cl = 1

    bisect_state = {
        'start': start,
        'end': end,
        'jobs': [{
            'rev': 501,
            'status': 'bad',
            'cl': cl
        }]
    }

    skip_revisions = {501}
    pending_revisions = {}

    mock_load_status_file.return_value = bisect_state

    mock_get_range.return_value = (start, end, pending_revisions,
                                   skip_revisions)

    mock_get_revision_and_hash_list.return_value = [], []

    args_output = test_helpers.ArgsOutputTest()
    args_output.start_rev = start
    args_output.end_rev = end
    args_output.parallel = 3
    args_output.src_path = None
    args_output.chroot_path = 'somepath'
    args_output.cleanup = True

    self.assertEqual(
        llvm_bisection.main(args_output),
        llvm_bisection.BisectionExitStatus.BISECTION_COMPLETE.value)

    mock_outside_chroot.assert_called_once()

    mock_load_status_file.assert_called_once()

    mock_get_range.assert_called_once()

    mock_get_revision_and_hash_list.assert_called_once()

    mock_abandon_cl.assert_called_once()
    self.assertEqual(
        mock_abandon_cl.call_args,
        mock.call(
            [
                os.path.join(args_output.chroot_path, 'chromite/bin/gerrit'),
                'abandon',
                str(cl),
            ],
            stderr=subprocess.STDOUT,
            encoding='utf-8',
        ))

  @mock.patch.object(llvm_bisection, 'LoadStatusFile')
  @mock.patch.object(chroot, 'VerifyOutsideChroot', return_value=True)
  def testMainFailedWithInvalidRange(self, mock_outside_chroot,
                                     mock_load_status_file):

    start = 500
    end = 502

    bisect_state = {
        'start': start - 1,
        'end': end,
    }

    mock_load_status_file.return_value = bisect_state

    args_output = test_helpers.ArgsOutputTest()
    args_output.start_rev = start
    args_output.end_rev = end
    args_output.parallel = 3
    args_output.src_path = None

    with self.assertRaises(ValueError) as err:
      llvm_bisection.main(args_output)

    error_message = (f'The start {start} or the end {end} version provided is '
                     f'different than "start" {bisect_state["start"]} or "end" '
                     f'{bisect_state["end"]} in the .JSON file')

    self.assertEqual(str(err.exception), error_message)

    mock_outside_chroot.assert_called_once()

    mock_load_status_file.assert_called_once()

  @mock.patch.object(llvm_bisection, 'GetCommitsBetween')
  @mock.patch.object(llvm_bisection, 'GetRemainingRange')
  @mock.patch.object(llvm_bisection, 'LoadStatusFile')
  @mock.patch.object(chroot, 'VerifyOutsideChroot', return_value=True)
  def testMainFailedWithPendingBuilds(self, mock_outside_chroot,
                                      mock_load_status_file, mock_get_range,
                                      mock_get_revision_and_hash_list):

    start = 500
    end = 502
    rev = 501

    bisect_state = {
        'start': start,
        'end': end,
        'jobs': [{
            'rev': rev,
            'status': 'pending'
        }]
    }

    skip_revisions = {}
    pending_revisions = {rev}

    mock_load_status_file.return_value = bisect_state

    mock_get_range.return_value = (start, end, pending_revisions,
                                   skip_revisions)

    mock_get_revision_and_hash_list.return_value = [], []

    args_output = test_helpers.ArgsOutputTest()
    args_output.start_rev = start
    args_output.end_rev = end
    args_output.parallel = 3
    args_output.src_path = None

    with self.assertRaises(ValueError) as err:
      llvm_bisection.main(args_output)

    error_message = (f'No revisions between start {start} and end {end} to '
                     'create tryjobs\nThe following tryjobs are pending:\n'
                     f'{rev}\n')

    self.assertEqual(str(err.exception), error_message)

    mock_outside_chroot.assert_called_once()

    mock_load_status_file.assert_called_once()

    mock_get_range.assert_called_once()

    mock_get_revision_and_hash_list.assert_called_once()

  @mock.patch.object(llvm_bisection, 'GetCommitsBetween')
  @mock.patch.object(llvm_bisection, 'GetRemainingRange')
  @mock.patch.object(llvm_bisection, 'LoadStatusFile')
  @mock.patch.object(chroot, 'VerifyOutsideChroot', return_value=True)
  def testMainFailedWithDuplicateBuilds(self, mock_outside_chroot,
                                        mock_load_status_file, mock_get_range,
                                        mock_get_revision_and_hash_list):

    start = 500
    end = 502
    rev = 501
    git_hash = 'a123testhash1'

    bisect_state = {
        'start': start,
        'end': end,
        'jobs': [{
            'rev': rev,
            'status': 'pending'
        }]
    }

    skip_revisions = {}
    pending_revisions = {rev}

    mock_load_status_file.return_value = bisect_state

    mock_get_range.return_value = (start, end, pending_revisions,
                                   skip_revisions)

    mock_get_revision_and_hash_list.return_value = [rev], [git_hash]

    args_output = test_helpers.ArgsOutputTest()
    args_output.start_rev = start
    args_output.end_rev = end
    args_output.parallel = 3
    args_output.src_path = None

    with self.assertRaises(ValueError) as err:
      llvm_bisection.main(args_output)

    error_message = ('Revision %d exists already in "jobs"' % rev)
    self.assertEqual(str(err.exception), error_message)

    mock_outside_chroot.assert_called_once()

    mock_load_status_file.assert_called_once()

    mock_get_range.assert_called_once()

    mock_get_revision_and_hash_list.assert_called_once()

  @mock.patch.object(subprocess, 'check_output', return_value=None)
  @mock.patch.object(
      get_llvm_hash.LLVMHash, 'GetLLVMHash', return_value='a123testhash4')
  @mock.patch.object(llvm_bisection, 'GetCommitsBetween')
  @mock.patch.object(llvm_bisection, 'GetRemainingRange')
  @mock.patch.object(llvm_bisection, 'LoadStatusFile')
  @mock.patch.object(chroot, 'VerifyOutsideChroot', return_value=True)
  def testMainFailedToAbandonCL(self, mock_outside_chroot,
                                mock_load_status_file, mock_get_range,
                                mock_get_revision_and_hash_list,
                                _mock_get_bad_llvm_hash, mock_abandon_cl):

    start = 500
    end = 502

    bisect_state = {
        'start': start,
        'end': end,
        'jobs': [{
            'rev': 501,
            'status': 'bad',
            'cl': 0
        }]
    }

    skip_revisions = {501}
    pending_revisions = {}

    mock_load_status_file.return_value = bisect_state

    mock_get_range.return_value = (start, end, pending_revisions,
                                   skip_revisions)

    mock_get_revision_and_hash_list.return_value = ([], [])

    error_message = 'Error message.'
    mock_abandon_cl.side_effect = subprocess.CalledProcessError(
        returncode=1, cmd=[], output=error_message)

    args_output = test_helpers.ArgsOutputTest()
    args_output.start_rev = start
    args_output.end_rev = end
    args_output.parallel = 3
    args_output.src_path = None
    args_output.cleanup = True

    with self.assertRaises(subprocess.CalledProcessError) as err:
      llvm_bisection.main(args_output)

    self.assertEqual(err.exception.output, error_message)

    mock_outside_chroot.assert_called_once()

    mock_load_status_file.assert_called_once()

    mock_get_range.assert_called_once()


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