diff options
Diffstat (limited to 'git/test')
-rw-r--r-- | git/test/lib/helper.py | 5 | ||||
-rw-r--r-- | git/test/performance/lib.py | 11 | ||||
-rw-r--r-- | git/test/test_repo.py | 17 |
3 files changed, 33 insertions, 0 deletions
diff --git a/git/test/lib/helper.py b/git/test/lib/helper.py index bd679512..6c9f33c6 100644 --- a/git/test/lib/helper.py +++ b/git/test/lib/helper.py @@ -279,6 +279,11 @@ class TestBase(TestCase): """ cls.rorepo = Repo(GIT_REPO) + @classmethod + def tearDownClass(cls): + cls.rorepo.git.clear_cache() + cls.rorepo.git = None + def _make_file(self, rela_path, data, repo=None): """ Create a file at the given path relative to our repository, filled diff --git a/git/test/performance/lib.py b/git/test/performance/lib.py index 5c138f17..46a198d4 100644 --- a/git/test/performance/lib.py +++ b/git/test/performance/lib.py @@ -59,6 +59,12 @@ class TestBigRepoR(TestBase): self.gitrorepo = Repo(repo_path, odbt=GitCmdObjectDB) self.puregitrorepo = Repo(repo_path, odbt=GitDB) + def tearDown(self): + self.gitrorepo.git.clear_cache() + self.gitrorepo = None + self.puregitrorepo.git.clear_cache() + self.puregitrorepo = None + class TestBigRepoRW(TestBigRepoR): @@ -78,7 +84,12 @@ class TestBigRepoRW(TestBigRepoR): self.puregitrwrepo = Repo(dirname, odbt=GitDB) def tearDown(self): + super(TestBigRepoRW, self).tearDown() if self.gitrwrepo is not None: shutil.rmtree(self.gitrwrepo.working_dir) + self.gitrwrepo.git.clear_cache() + self.gitrwrepo = None + self.puregitrwrepo.git.clear_cache() + self.puregitrwrepo = None #} END base classes diff --git a/git/test/test_repo.py b/git/test/test_repo.py index eb831ce3..260f7d68 100644 --- a/git/test/test_repo.py +++ b/git/test/test_repo.py @@ -656,3 +656,20 @@ class TestRepo(TestBase): open(git_file_path, 'wb').write(('gitdir: %s\n' % real_path_abs).encode('ascii')) git_file_repo = Repo(rwrepo.working_tree_dir) assert os.path.abspath(git_file_repo.git_dir) == real_path_abs + + def test_file_handle_leaks(self): + def last_commit(repo, rev, path): + commit = next(repo.iter_commits(rev, path, max_count=1)) + commit.tree[path] + + # This is based on this comment + # https://github.com/gitpython-developers/GitPython/issues/60#issuecomment-23558741 + # And we expect to set max handles to a low value, like 64 + # You should set ulimit -n X, see .travis.yml + # The loops below would easily create 500 handles if these would leak (4 pipes + multiple mapped files) + for i in range(64): + for repo_type in (GitCmdObjectDB, GitDB): + repo = Repo(self.rorepo.working_tree_dir, odbt=repo_type) + last_commit(repo, 'master', 'git/test/test_base.py') + # end for each repository type + # end for each iteration |