#!/usr/bin/env vpython3
# Copyright 2013 The Chromium Authors. All rights reserved.
# 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
from testing_support import coverage_utils


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'
  ))
