#!/usr/bin/env python
# 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 = """
  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 = map(binascii.unhexlify, refs)
    self.repo.run(self.gn.load_generation_numbers, refs)
    if cache:
      self.repo.run(self.gn.finalize, refs)
    return map(self.gn.get_num, 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'
  ))