#!/usr/bin/python

"""
Copyright 2014 Google Inc.

Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.

Test git_utils.py.
"""

# System-level imports
import os
import tempfile
import unittest

# Imports from within Skia
import git_utils


# A git repo we can use for tests.
REPO = 'https://skia.googlesource.com/common'

# A file in some subdirectory within REPO.
REPO_FILE = os.path.join('py', 'utils', 'git_utils.py')


class NewGitCheckoutTest(unittest.TestCase):

  def test_defaults(self):
    """Test NewGitCheckout created using default parameters."""
    with git_utils.NewGitCheckout(repository=REPO) as checkout:
      filepath = os.path.join(checkout.root, REPO_FILE)
      self.assertTrue(
          os.path.exists(filepath),
          'file %s should exist' % filepath)
    # Confirm that NewGitCheckout cleaned up after itself.
    self.assertFalse(
        os.path.exists(filepath),
        'file %s should not exist' % filepath)

  def test_subdir(self):
    """Create NewGitCheckout with a specific subdirectory."""
    subdir = os.path.dirname(REPO_FILE)
    file_within_subdir = os.path.basename(REPO_FILE)

    containing_dir = tempfile.mkdtemp()
    try:
      with git_utils.NewGitCheckout(repository=REPO, subdir=subdir,
                                    containing_dir=containing_dir) as checkout:
        self.assertTrue(
            checkout.root.startswith(containing_dir),
            'checkout.root %s should be within %s' % (
                checkout.root, containing_dir))
        filepath = os.path.join(checkout.root, file_within_subdir)
        self.assertTrue(
            os.path.exists(filepath),
            'file %s should exist' % filepath)
    finally:
      os.rmdir(containing_dir)

  def test_refspec(self):
    """Create NewGitCheckout with a specific refspec.

    This test depends on the fact that the whitespace.txt file was added to the
    repo in a particular commit.
    See https://skia.googlesource.com/common/+/c2200447734f13070fb3b2808dea58847241ab0e
    ('Initial commit of whitespace.txt')
    """
    filename = 'whitespace.txt'
    hash_without_file = 'f63e1cfff23615157e28942af5f5e8298351cb10'
    hash_with_file = 'c2200447734f13070fb3b2808dea58847241ab0e'

    with git_utils.NewGitCheckout(
        repository=REPO, refspec=hash_without_file) as checkout:
      filepath = os.path.join(checkout.root, filename)
      self.assertEquals(
          hash_without_file, checkout.commithash(),
          '"%s" != "%s"' % (hash_without_file, checkout.commithash()))
      self.assertFalse(
          os.path.exists(filepath),
          'file %s should not exist' % filepath)

    with git_utils.NewGitCheckout(
        repository=REPO, refspec=hash_with_file) as checkout:
      filepath = os.path.join(checkout.root, filename)
      self.assertEquals(
          hash_with_file, checkout.commithash(),
          '"%s" != "%s"' % (hash_with_file, checkout.commithash()))
      self.assertTrue(
          os.path.exists(filepath),
          'file %s should exist' % filepath)


def main(test_case_class):
  """Run the unit tests within this class."""
  suite = unittest.TestLoader().loadTestsFromTestCase(NewGitCheckoutTest)
  results = unittest.TextTestRunner(verbosity=2).run(suite)
  if not results.wasSuccessful():
    raise Exception('failed unittest %s' % test_case_class)

if __name__ == '__main__':
  main(NewGitCheckoutTest)
