Index: tests/fake_repos.py |
diff --git a/tests/fake_repos.py b/tests/fake_repos.py |
index b9ef00b67dd4fd7b6225dd08227f949e4f5a4e78..4998575842e2323f7836619b9df0229d2d245f45 100755 |
--- a/tests/fake_repos.py |
+++ b/tests/fake_repos.py |
@@ -18,10 +18,9 @@ import subprocess |
import sys |
import tempfile |
import time |
-import unittest |
- |
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
+# trial_dir must be first for non-system libraries. |
+from tests import trial_dir |
import scm |
## Utility functions |
@@ -230,14 +229,6 @@ class FakeReposBase(object): |
populateSvn() and populateGit() need to be implemented by the subclass. |
""" |
- |
- # When SHOULD_LEAK is set to True, temporary directories created while the |
- # tests are running aren't deleted at the end of the tests. Expect failures |
- # when running more than one test due to inter-test side-effects. Helps with |
- # debugging. |
- SHOULD_LEAK = False |
- # Override if unhappy. |
- TRIAL_DIR = None |
# Hostname |
NB_GIT_REPOS = 1 |
USERS = [ |
@@ -245,20 +236,14 @@ class FakeReposBase(object): |
('user2@example.com', 'bar'), |
] |
- def __init__(self, trial_dir=None, leak=None, host=None): |
+ def __init__(self, host=None): |
global _FAKE_LOADED |
if _FAKE_LOADED: |
raise Exception('You can only start one FakeRepos at a time.') |
_FAKE_LOADED = True |
- # Quick hack. |
- if '-v' in sys.argv: |
- logging.basicConfig(level=logging.DEBUG) |
- elif leak is not None: |
- self.SHOULD_LEAK = leak |
- self.host = host or '127.0.0.1' |
- if trial_dir: |
- self.TRIAL_DIR = trial_dir |
+ self.trial = trial_dir.TrialDir('repos') |
+ self.host = host or '127.0.0.1' |
# Format is [ None, tree, tree, ...] |
# i.e. revisions are 1-based. |
self.svn_revs = [None] |
@@ -269,8 +254,6 @@ class FakeReposBase(object): |
self.git_hashes = {} |
self.svnserve = None |
self.gitdaemon = None |
- self.common_init = False |
- self.repos_dir = None |
self.git_pid_file = None |
self.git_root = None |
self.svn_checkout = None |
@@ -282,28 +265,24 @@ class FakeReposBase(object): |
self.svn_port = 3690 |
self.git_port = 9418 |
- def trial_dir(self): |
- if not self.TRIAL_DIR: |
- self.TRIAL_DIR = os.path.join( |
- os.path.dirname(os.path.abspath(__file__)), '_trial') |
- return self.TRIAL_DIR |
+ @property |
+ def root_dir(self): |
+ return self.trial.root_dir |
def set_up(self): |
- """All late initialization comes here. |
- |
- Note that it deletes all trial_dir() and not only repos_dir. |
- """ |
+ """All late initialization comes here.""" |
self.cleanup_dirt() |
- if not self.common_init: |
- self.common_init = True |
- self.repos_dir = os.path.join(self.trial_dir(), 'repos') |
- self.git_root = join(self.repos_dir, 'git') |
- self.svn_checkout = join(self.repos_dir, 'svn_checkout') |
- self.svn_repo = join(self.repos_dir, 'svn') |
- add_kill() |
- rmtree(self.trial_dir()) |
- os.makedirs(self.repos_dir) |
- atexit.register(self.tear_down) |
+ if not self.root_dir: |
+ try: |
+ add_kill() |
+ # self.root_dir is not set before this call. |
+ self.trial.set_up() |
+ self.git_root = join(self.root_dir, 'git') |
+ self.svn_checkout = join(self.root_dir, 'svn_checkout') |
+ self.svn_repo = join(self.root_dir, 'svn') |
+ finally: |
+ # Registers cleanup. |
+ atexit.register(self.tear_down) |
def cleanup_dirt(self): |
"""For each dirty repository, destroy it.""" |
@@ -318,9 +297,9 @@ class FakeReposBase(object): |
"""Kills the servers and delete the directories.""" |
self.tear_down_svn() |
self.tear_down_git() |
- if not self.SHOULD_LEAK: |
- logging.debug('Removing %s' % self.trial_dir()) |
- rmtree(self.trial_dir()) |
+ # This deletes the directories. |
+ self.trial.tear_down() |
+ self.trial = None |
def tear_down_svn(self): |
if self.svnserve: |
@@ -328,7 +307,7 @@ class FakeReposBase(object): |
self.svnserve.kill() |
self.wait_for_port_to_free(self.svn_port) |
self.svnserve = None |
- if not self.SHOULD_LEAK: |
+ if not self.trial.SHOULD_LEAK: |
logging.debug('Removing %s' % self.svn_repo) |
rmtree(self.svn_repo) |
logging.debug('Removing %s' % self.svn_checkout) |
@@ -349,7 +328,7 @@ class FakeReposBase(object): |
kill_pid(pid) |
self.git_pid_file = None |
self.wait_for_port_to_free(self.git_port) |
- if not self.SHOULD_LEAK: |
+ if not self.trial.SHOULD_LEAK: |
logging.debug('Removing %s' % self.git_root) |
rmtree(self.git_root) |
else: |
@@ -392,7 +371,7 @@ class FakeReposBase(object): |
write(join(self.svn_repo, 'conf', 'passwd'), text) |
# Start the daemon. |
- cmd = ['svnserve', '-d', '--foreground', '-r', self.repos_dir] |
+ cmd = ['svnserve', '-d', '--foreground', '-r', self.root_dir] |
if self.host == '127.0.0.1': |
cmd.append('--listen-host=' + self.host) |
self.check_port_is_free(self.svn_port) |
@@ -420,12 +399,12 @@ class FakeReposBase(object): |
cmd = ['git', 'daemon', |
'--export-all', |
'--reuseaddr', |
- '--base-path=' + self.repos_dir, |
+ '--base-path=' + self.root_dir, |
'--pid-file=' + self.git_pid_file.name] |
if self.host == '127.0.0.1': |
cmd.append('--listen=' + self.host) |
self.check_port_is_free(self.git_port) |
- self.gitdaemon = Popen(cmd, cwd=self.repos_dir) |
+ self.gitdaemon = Popen(cmd, cwd=self.root_dir) |
self.wait_for_port_to_bind(self.git_port, self.gitdaemon) |
self.git_dirty = False |
return True |
@@ -714,37 +693,22 @@ hooks = [ |
}) |
-class FakeReposTestBase(unittest.TestCase): |
+class FakeReposTestBase(trial_dir.TestCase): |
"""This is vaguely inspired by twisted.""" |
- |
- # Replace this in your subclass. |
- CLASS_ROOT_DIR = None |
- |
# static FakeRepos instance. Lazy loaded. |
FAKE_REPOS = None |
# Override if necessary. |
FAKE_REPOS_CLASS = FakeRepos |
- def __init__(self, *args, **kwargs): |
- unittest.TestCase.__init__(self, *args, **kwargs) |
+ def setUp(self): |
+ super(FakeReposTestBase, self).setUp() |
if not FakeReposTestBase.FAKE_REPOS: |
# Lazy create the global instance. |
FakeReposTestBase.FAKE_REPOS = self.FAKE_REPOS_CLASS() |
- |
- def setUp(self): |
- unittest.TestCase.setUp(self) |
- self.FAKE_REPOS.set_up() |
- |
- # Remove left overs and start fresh. |
- if not self.CLASS_ROOT_DIR: |
- self.CLASS_ROOT_DIR = join(self.FAKE_REPOS.trial_dir(), 'smoke') |
- self.root_dir = join(self.CLASS_ROOT_DIR, self.id()) |
- rmtree(self.root_dir) |
- os.makedirs(self.root_dir) |
- |
- def tearDown(self): |
- if not self.FAKE_REPOS.SHOULD_LEAK: |
- rmtree(self.root_dir) |
+ # No need to call self.FAKE_REPOS.setUp(), it will be called by the child |
+ # class. |
+ # Do not define tearDown(), since super's version does the right thing and |
+ # FAKE_REPOS is kept across tests. |
@property |
def svn_base(self): |
@@ -824,23 +788,16 @@ class FakeReposTestBase(unittest.TestCase): |
def main(argv): |
fake = FakeRepos() |
- print 'Using %s' % fake.trial_dir() |
+ print 'Using %s' % fake.root_dir |
try: |
fake.set_up_svn() |
fake.set_up_git() |
print('Fake setup, press enter to quit or Ctrl-C to keep the checkouts.') |
sys.stdin.readline() |
except KeyboardInterrupt: |
- fake.SHOULD_LEAK = True |
+ trial_dir.TrialDir.SHOULD_LEAK.leak = True |
return 0 |
-if '-l' in sys.argv: |
- # See SHOULD_LEAK definition in FakeReposBase for its purpose. |
- FakeReposBase.SHOULD_LEAK = True |
- print 'Leaking!' |
- sys.argv.remove('-l') |
- |
- |
if __name__ == '__main__': |
sys.exit(main(sys.argv)) |