#!/usr/bin/env vpython3
# Copyright 2013 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for git_number.py"""

import binascii
import os
import sys

DEPOT_TOOLS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, DEPOT_TOOLS_ROOT)

from testing_support import git_test_utils  # noqa: E402
from testing_support import coverage_utils  # noqa: E402


class Basic(git_test_utils.GitRepoReadWriteTestBase):
    REPO_SCHEMA = """
  A B C D E
    B   F E
  X Y     E
  """

    @classmethod
    def setUpClass(cls):
        super(Basic, cls).setUpClass()
        import git_number

        cls.gn = git_number
        cls.old_POOL_KIND = cls.gn.POOL_KIND
        cls.gn.POOL_KIND = "threads"

    @classmethod
    def tearDownClass(cls):
        cls.gn.POOL_KIND = cls.old_POOL_KIND
        super(Basic, cls).tearDownClass()

    def tearDown(self):
        self.gn.clear_caches()
        super(Basic, self).tearDown()

    def _git_number(self, refs, cache=False):
        refs = [binascii.unhexlify(ref) for ref in refs]
        self.repo.run(self.gn.load_generation_numbers, refs)
        if cache:
            self.repo.run(self.gn.finalize, refs)
        return [self.gn.get_num(ref) for ref in refs]

    def testBasic(self):
        self.assertEqual([0], self._git_number([self.repo["A"]]))
        self.assertEqual([2], self._git_number([self.repo["F"]]))
        self.assertEqual([0], self._git_number([self.repo["X"]]))
        self.assertEqual([4], self._git_number([self.repo["E"]]))

    def testInProcessCache(self):
        self.assertEqual(
            None,
            self.repo.run(self.gn.get_num, binascii.unhexlify(self.repo["A"])),
        )
        self.assertEqual([4], self._git_number([self.repo["E"]]))
        self.assertEqual(
            0,
            self.repo.run(self.gn.get_num, binascii.unhexlify(self.repo["A"])),
        )

    def testOnDiskCache(self):
        self.assertEqual(
            None,
            self.repo.run(self.gn.get_num, binascii.unhexlify(self.repo["A"])),
        )
        self.assertEqual([4], self._git_number([self.repo["E"]], cache=True))
        self.assertEqual([4], self._git_number([self.repo["E"]], cache=True))
        self.gn.clear_caches()
        self.assertEqual(
            0,
            self.repo.run(self.gn.get_num, binascii.unhexlify(self.repo["A"])),
        )
        self.gn.clear_caches()
        self.repo.run(self.gn.clear_caches, True)
        self.assertEqual(
            None,
            self.repo.run(self.gn.get_num, binascii.unhexlify(self.repo["A"])),
        )


if __name__ == "__main__":
    sys.exit(
        coverage_utils.covered_main(
            os.path.join(DEPOT_TOOLS_ROOT, "git_number.py"), "3.7"
        )
    )
