| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- # -*- coding:utf-8 -*-
- #
- # Copyright (C) 2019 The Android Open Source Project
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- """Unittests for the project.py module."""
- from __future__ import print_function
- import contextlib
- import os
- import shutil
- import subprocess
- import tempfile
- import unittest
- import git_config
- import project
- @contextlib.contextmanager
- def TempGitTree():
- """Create a new empty git checkout for testing."""
- # TODO(vapier): Convert this to tempfile.TemporaryDirectory once we drop
- # Python 2 support entirely.
- try:
- tempdir = tempfile.mkdtemp(prefix='repo-tests')
- subprocess.check_call(['git', 'init'], cwd=tempdir)
- yield tempdir
- finally:
- shutil.rmtree(tempdir)
- class RepoHookShebang(unittest.TestCase):
- """Check shebang parsing in RepoHook."""
- def test_no_shebang(self):
- """Lines w/out shebangs should be rejected."""
- DATA = (
- '',
- '# -*- coding:utf-8 -*-\n',
- '#\n# foo\n',
- '# Bad shebang in script\n#!/foo\n'
- )
- for data in DATA:
- self.assertIsNone(project.RepoHook._ExtractInterpFromShebang(data))
- def test_direct_interp(self):
- """Lines whose shebang points directly to the interpreter."""
- DATA = (
- ('#!/foo', '/foo'),
- ('#! /foo', '/foo'),
- ('#!/bin/foo ', '/bin/foo'),
- ('#! /usr/foo ', '/usr/foo'),
- ('#! /usr/foo -args', '/usr/foo'),
- )
- for shebang, interp in DATA:
- self.assertEqual(project.RepoHook._ExtractInterpFromShebang(shebang),
- interp)
- def test_env_interp(self):
- """Lines whose shebang launches through `env`."""
- DATA = (
- ('#!/usr/bin/env foo', 'foo'),
- ('#!/bin/env foo', 'foo'),
- ('#! /bin/env /bin/foo ', '/bin/foo'),
- )
- for shebang, interp in DATA:
- self.assertEqual(project.RepoHook._ExtractInterpFromShebang(shebang),
- interp)
- class FakeProject(object):
- """A fake for Project for basic functionality."""
- def __init__(self, worktree):
- self.worktree = worktree
- self.gitdir = os.path.join(worktree, '.git')
- self.name = 'fakeproject'
- self.work_git = project.Project._GitGetByExec(
- self, bare=False, gitdir=self.gitdir)
- self.bare_git = project.Project._GitGetByExec(
- self, bare=True, gitdir=self.gitdir)
- self.config = git_config.GitConfig.ForRepository(gitdir=self.gitdir)
- class ReviewableBranchTests(unittest.TestCase):
- """Check ReviewableBranch behavior."""
- def test_smoke(self):
- """A quick run through everything."""
- with TempGitTree() as tempdir:
- fakeproj = FakeProject(tempdir)
- # Generate some commits.
- with open(os.path.join(tempdir, 'readme'), 'w') as fp:
- fp.write('txt')
- fakeproj.work_git.add('readme')
- fakeproj.work_git.commit('-mAdd file')
- fakeproj.work_git.checkout('-b', 'work')
- fakeproj.work_git.rm('-f', 'readme')
- fakeproj.work_git.commit('-mDel file')
- # Start off with the normal details.
- rb = project.ReviewableBranch(
- fakeproj, fakeproj.config.GetBranch('work'), 'master')
- self.assertEqual('work', rb.name)
- self.assertEqual(1, len(rb.commits))
- self.assertIn('Del file', rb.commits[0])
- d = rb.unabbrev_commits
- self.assertEqual(1, len(d))
- short, long = next(iter(d.items()))
- self.assertTrue(long.startswith(short))
- self.assertTrue(rb.base_exists)
- # Hard to assert anything useful about this.
- self.assertTrue(rb.date)
- # Now delete the tracking branch!
- fakeproj.work_git.branch('-D', 'master')
- rb = project.ReviewableBranch(
- fakeproj, fakeproj.config.GetBranch('work'), 'master')
- self.assertEqual(0, len(rb.commits))
- self.assertFalse(rb.base_exists)
- # Hard to assert anything useful about this.
- self.assertTrue(rb.date)
|