Index: tests/fake_repos.py |
diff --git a/tests/fake_repos.py b/tests/fake_repos.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..307a3b790121a1bb5c6ef828c1d730d24e92b151 |
--- /dev/null |
+++ b/tests/fake_repos.py |
@@ -0,0 +1,203 @@ |
+#!/usr/bin/python |
+# Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Generate fake repositories for testing.""" |
+ |
+import os |
+import shutil |
+import subprocess |
+import sys |
+ |
+ |
+def addKill(): |
+ """Add kill() method to subprocess.Popen for python <2.6""" |
+ if getattr(subprocess.Popen, 'kill', None): |
+ return |
+ if sys.platform.startswith('win'): |
+ def kill_win(process): |
+ import win32process |
+ return win32process.TerminateProcess(process._handle, -1) |
+ subprocess.kill = kill_win |
+ else: |
+ def kill_nix(process): |
+ import signal |
+ return os.kill(process.pid, signal.SIGKILL) |
+ subprocess.kill = kill_nix |
+ |
+ |
+def rmtree(path): |
+ """Delete a directory.""" |
+ if os.path.exists(path): |
+ shutil.rmtree(path) |
+ |
+ |
+def write(path, content): |
+ f = open(path, 'wb') |
+ f.write(content) |
+ f.close() |
+ |
+ |
+class FakeRepos(object): |
+ def __init__(self, trial_dir, leak, local_only): |
+ self.trial_dir = trial_dir |
+ self.repos_dir = os.path.join(self.trial_dir, 'repos') |
+ self.leak = leak |
+ self.local_only = local_only |
+ self.svnserve = [] |
+ self.gitdaemon = [] |
+ addKill() |
+ rmtree(self.trial_dir) |
+ os.mkdir(self.trial_dir) |
+ os.mkdir(self.repos_dir) |
+ |
+ def setUp(self): |
+ self.setUpSVN() |
+ self.setUpGIT() |
+ |
+ def tearDown(self): |
+ for i in self.svnserve: |
+ i.kill() |
+ for i in self.gitdaemon: |
+ i.kill() |
+ if not self.leak: |
+ rmtree(self.trial_dir) |
+ |
+ def setUpSVN(self): |
+ """Creates subversion repositories and start the servers.""" |
+ assert not self.svnserve |
+ join = os.path.join |
+ root = join(self.repos_dir, 'svn') |
+ rmtree(root) |
+ subprocess.check_call(['svnadmin', 'create', root]) |
+ write(join(root, 'conf', 'svnserve.conf'), |
+ '[general]\n' |
+ 'anon-access = read\n' |
+ 'auth-access = write\n' |
+ 'password-db = passwd\n') |
+ write(join(root, 'conf', 'passwd'), |
+ '[users]\n' |
+ 'user1 = foo\n' |
+ 'user2 = bar\n') |
+ |
+ # Repos |
+ repo = join(self.repos_dir, 'svn_import') |
+ rmtree(repo) |
+ os.mkdir(repo) |
+ os.mkdir(join(repo, 'trunk')) |
+ os.mkdir(join(repo, 'trunk', 'src')) |
+ write(join(repo, 'trunk', 'src', 'DEPS'), """ |
+# Smoke test DEPS file. |
+# Many DEPS functionalities need to be tested: |
+# Var |
+# File |
+# From |
+# deps_os |
+# hooks |
+# use_relative_paths |
+# |
+# Types of dependencies: |
+# Relative urls |
+# Full urls |
+# svn |
+# git |
+ |
+deps = { |
+ 'src/other': 'svn://%(host)s/svn/trunk/other', |
+ 'src/third_party': '/trunk/third_party', |
+} |
+ |
+deps_os = { |
+ 'mac': 'repo_4' |
+} |
+""" % { |
+ 'host': 'localhost', |
+}) |
+ write(join(repo, 'trunk', 'src', 'origin'), "svn/trunk/src") |
+ os.mkdir(join(repo, 'trunk', 'other')) |
+ write(join(repo, 'trunk', 'other', 'origin'), "svn/trunk/other") |
+ os.mkdir(join(repo, 'trunk', 'third_party')) |
+ write(join(repo, 'trunk', 'third_party', 'origin'), "svn/trunk/third_party") |
+ |
+ # Start the daemon. |
+ cmd = ['svnserve', '-d', '--foreground', '-r', self.repos_dir] |
+ if self.local_only: |
+ cmd.append('--listen-host=127.0.0.1') |
+ self.svnserve.append(subprocess.Popen(cmd, cwd=root)) |
+ |
+ # Import the repo. |
+ subprocess.check_call(['svn', 'import', repo, |
+ 'svn://127.0.0.1/svn', '-m', 'foo', '-q', |
+ '--no-auto-props', '--non-interactive', '--no-auth-cache', |
+ '--username', 'user1', '--password', 'foo']) |
+ |
+ def setUpGIT(self): |
+ """Creates git repositories and start the servers.""" |
+ assert not self.gitdaemon |
+ join = os.path.join |
+ root = join(self.repos_dir, 'git') |
+ rmtree(root) |
+ os.mkdir(root) |
+ # Repo 1 |
+ repo = join(root, 'repo_1') |
+ subprocess.check_call(['git', 'init', '-q', repo]) |
+ write(join(repo, 'DEPS'), """ |
+# Smoke test DEPS file. |
+# Many DEPS functionalities need to be tested: |
+# Var |
+# File |
+# From |
+# deps_os |
+# hooks |
+# use_relative_paths |
+# |
+# Types of dependencies: |
+# Relative urls |
+# Full urls |
+# svn |
+# git |
+ |
+deps = { |
+ 'repo2': 'git://%(host)s/git/repo_2', |
+ 'repo2/repo3': '/repo_3', |
+} |
+ |
+deps_os = { |
+ 'mac': 'repo_4' |
+} |
+""" % { |
+ 'host': 'localhost', |
+}) |
+ write(join(repo, 'origin'), "git/repo_1") |
+ subprocess.check_call(['git', 'add', '-A', '-f'], cwd=repo) |
+ subprocess.check_call(['git', 'commit', '-q', '-m', 'foo'], cwd=repo) |
+ |
+ # Repo 2 |
+ repo = join(root, 'repo_2') |
+ subprocess.check_call(['git', 'init', '-q', repo]) |
+ write(join(repo, 'origin'), "git/repo_2") |
+ subprocess.check_call(['git', 'add', '-A', '-f'], cwd=repo) |
+ subprocess.check_call(['git', 'commit', '-q', '-m', 'foo'], cwd=repo) |
+ |
+ # Repo 3 |
+ repo = join(root, 'repo_3') |
+ subprocess.check_call(['git', 'init', '-q', repo]) |
+ write(join(repo, 'origin'), "git/repo_3") |
+ subprocess.check_call(['git', 'add', '-A', '-f'], cwd=repo) |
+ subprocess.check_call(['git', 'commit', '-q', '-m', 'foo'], cwd=repo) |
+ |
+ # Start the daemon. |
+ cmd = ['git', 'daemon', '--export-all', '--base-path=' + self.repos_dir] |
+ if self.local_only: |
+ cmd.append('--listen=127.0.0.1') |
+ self.gitdaemon.append(subprocess.Popen(cmd, cwd=self.repos_dir, |
+ stderr=subprocess.PIPE)) |
+ |
+if __name__ == '__main__': |
+ fake = FakeRepos(os.path.dirname(os.path.abspath(__file__)), False) |
+ try: |
+ fake.setUp() |
+ sys.stdin.readline() |
+ finally: |
+ fake.tearDown() |