# __init__.py -- The tests for dulwich # Copyright (C) 2007 James Westby # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2 # of the License or (at your option) any later version of # the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301, USA. """Tests for Dulwich.""" import doctest import os import shutil import subprocess import sys import tempfile if sys.version_info >= (2, 7): # If Python itself provides an exception, use that import unittest from unittest import SkipTest, TestCase as _TestCase else: import unittest2 as unittest from unittest2 import SkipTest, TestCase as _TestCase def get_safe_env(env=None): """Returns the environment "env" (or a copy of "os.environ" by default) modified to avoid side-effects caused by user's ~/.gitconfig""" if env is None: env = os.environ.copy() # On Windows it's not enough to set "HOME" to a non-existing # directory. Git.cmd takes the first existing directory out of # "%HOME%", "%HOMEDRIVE%%HOMEPATH%" and "%USERPROFILE%". for e in 'HOME', 'HOMEPATH', 'USERPROFILE': env[e] = '/nosuchdir' return env class TestCase(_TestCase): def makeSafeEnv(self): """Create environment with homedirectory-related variables stripped. Modifies os.environ for the duration of a test case to avoid side-effects caused by the user's ~/.gitconfig and other files in their home directory. """ old_env = os.environ def restore(): os.environ = old_env self.addCleanup(restore) new_env = dict(os.environ) for e in ['HOME', 'HOMEPATH', 'USERPROFILE']: new_env[e] = '/nosuchdir' os.environ = new_env def setUp(self): super(TestCase, self).setUp() self.makeSafeEnv() class BlackboxTestCase(TestCase): """Blackbox testing.""" bin_directory = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "bin")) def bin_path(self, name): """Determine the full path of a binary. :param name: Name of the script :return: Full path """ return os.path.join(self.bin_directory, name) def run_command(self, name, args): """Run a Dulwich command. :param name: Name of the command, as it exists in bin/ :param args: Arguments to the command """ env = dict(os.environ) env["PYTHONPATH"] = os.pathsep.join(sys.path) # Since they don't have any extensions, Windows can't recognize # executablility of the Python files in /bin. Even then, we'd have to # expect the user to set up file associations for .py files. # # Save us from all that headache and call python with the bin script. argv = [sys.executable, self.bin_path(name)] + args return subprocess.Popen(argv, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, env=env) def self_test_suite(): names = [ 'blackbox', 'client', 'config', 'diff_tree', 'fastexport', 'file', 'hooks', 'index', 'lru_cache', 'objects', 'object_store', 'missing_obj_finder', 'pack', 'patch', 'protocol', 'repository', 'server', 'walk', 'web', ] module_names = ['dulwich.tests.test_' + name for name in names] loader = unittest.TestLoader() return loader.loadTestsFromNames(module_names) def tutorial_test_suite(): tutorial = [ 'introduction', 'repo', 'object-store', 'remote', 'conclusion', ] tutorial_files = ["../../docs/tutorial/%s.txt" % name for name in tutorial] def setup(test): test.__old_cwd = os.getcwd() test.__dulwich_tempdir = tempfile.mkdtemp() os.chdir(test.__dulwich_tempdir) def teardown(test): os.chdir(test.__old_cwd) shutil.rmtree(test.__dulwich_tempdir) return doctest.DocFileSuite(setUp=setup, tearDown=teardown, *tutorial_files) def nocompat_test_suite(): result = unittest.TestSuite() result.addTests(self_test_suite()) result.addTests(tutorial_test_suite()) return result def compat_test_suite(): result = unittest.TestSuite() from dulwich.tests.compat import test_suite as compat_test_suite result.addTests(compat_test_suite()) return result def test_suite(): result = unittest.TestSuite() result.addTests(self_test_suite()) result.addTests(tutorial_test_suite()) from dulwich.tests.compat import test_suite as compat_test_suite result.addTests(compat_test_suite()) return result