#!/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_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 = 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'
  ))
