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

    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'

    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.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()


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