#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for git_llvm_rev."""

import unittest

import git_llvm_rev
from git_llvm_rev import MAIN_BRANCH
import llvm_project


def get_llvm_config() -> git_llvm_rev.LLVMConfig:
    return git_llvm_rev.LLVMConfig(
        dir=llvm_project.get_location(), remote="origin"
    )


class Test(unittest.TestCase):
    """Test cases for git_llvm_rev."""

    def rev_to_sha_with_round_trip(self, rev: git_llvm_rev.Rev) -> str:
        config = get_llvm_config()
        sha = git_llvm_rev.translate_rev_to_sha(config, rev)
        roundtrip_rev = git_llvm_rev.translate_sha_to_rev(config, sha)
        self.assertEqual(roundtrip_rev, rev)
        return sha

    def test_sha_to_rev_on_base_sha_works(self) -> None:
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(
                branch=MAIN_BRANCH, number=git_llvm_rev.base_llvm_revision
            )
        )
        self.assertEqual(sha, git_llvm_rev.base_llvm_sha)

    def test_sha_to_rev_prior_to_base_rev_works(self) -> None:
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch=MAIN_BRANCH, number=375000)
        )
        self.assertEqual(sha, "2f6da767f13b8fd81f840c211d405fea32ac9db7")

    def test_sha_to_rev_after_base_rev_works(self) -> None:
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch=MAIN_BRANCH, number=375506)
        )
        self.assertEqual(sha, "3bf7fddeb05655d9baed4cc69e13535c677ed1dd")

    def test_llvm_svn_parsing_runs_ignore_reverts(self) -> None:
        # This commit has a revert that mentions the reverted llvm-svn in the
        # commit message.

        # Commit which performed the revert
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch=MAIN_BRANCH, number=374895)
        )
        self.assertEqual(sha, "1731fc88d1fa1fa55edd056db73a339b415dd5d6")

        # Commit that was reverted
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch=MAIN_BRANCH, number=374841)
        )
        self.assertEqual(sha, "2a1386c81de504b5bda44fbecf3f7b4cdfd748fc")

    def test_imaginary_revs_raise(self) -> None:
        with self.assertRaises(ValueError) as r:
            git_llvm_rev.translate_rev_to_sha(
                get_llvm_config(),
                git_llvm_rev.Rev(branch=MAIN_BRANCH, number=9999999),
            )

        self.assertIn("Try updating your tree?", str(r.exception))

    def test_merge_commits_count_as_one_commit_crbug1041079(self) -> None:
        # This CL merged _a lot_ of commits in. Verify a few hand-computed
        # properties about it.
        merge_sha_rev_number = 4496 + git_llvm_rev.base_llvm_revision
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch=MAIN_BRANCH, number=merge_sha_rev_number)
        )
        self.assertEqual(sha, "0f0d0ed1c78f1a80139a1f2133fad5284691a121")

        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(
                branch=MAIN_BRANCH, number=merge_sha_rev_number - 1
            )
        )
        self.assertEqual(sha, "6f635f90929da9545dd696071a829a1a42f84b30")

        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(
                branch=MAIN_BRANCH, number=merge_sha_rev_number + 1
            )
        )
        self.assertEqual(sha, "199700a5cfeedf227619f966aa3125cef18bc958")

    # NOTE: The below tests have _zz_ in their name as an optimization. Iterating
    # on a quick test is painful when these larger tests come before it and take
    # 7secs to run. Python's unittest module guarantees tests are run in
    # alphabetical order by their method name, so...
    #
    # If you're wondering, the slow part is `git branch -r --contains`. I imagine
    # it's going to be very cold code, so I'm not inclined to optimize it much.

    def test_zz_branch_revs_work_after_merge_points_and_svn_cutoff(
        self,
    ) -> None:
        # Arbitrary 9.x commit without an attached llvm-svn: value.
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch="upstream/release/9.x", number=366670)
        )
        self.assertEqual(sha, "4e858e4ac00b59f064da4e1f7e276916e7d296aa")

    def test_zz_branch_revs_work_at_merge_points(self) -> None:
        rev_number = 366426
        backing_sha = "c89a3d78f43d81b9cff7b9248772ddf14d21b749"

        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch=MAIN_BRANCH, number=rev_number)
        )
        self.assertEqual(sha, backing_sha)

        # Note that this won't round-trip: since this commit is on the main
        # branch, we'll pick main for this. That's fine.
        sha = git_llvm_rev.translate_rev_to_sha(
            get_llvm_config(),
            git_llvm_rev.Rev(branch="upstream/release/9.x", number=rev_number),
        )
        self.assertEqual(sha, backing_sha)

    def test_zz_branch_revs_work_after_merge_points(self) -> None:
        # Picking the commit on the 9.x branch after the merge-base for that +
        # main. Note that this is where llvm-svn numbers should diverge from
        # ours, and are therefore untrustworthy. The commit for this *does* have a
        # different `llvm-svn:` string than we should have.
        sha = self.rev_to_sha_with_round_trip(
            git_llvm_rev.Rev(branch="upstream/release/9.x", number=366427)
        )
        self.assertEqual(sha, "2cf681a11aea459b50d712abc7136f7129e4d57f")


# FIXME: When release/10.x happens, it may be nice to have a test-case
# generally covering that, since it's the first branch that we have to travel
# back to the base commit for.

if __name__ == "__main__":
    llvm_project.ensure_up_to_date()
    unittest.main()
