| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Generate fake repositories for testing.""" | 6 """Generate fake repositories for testing.""" |
| 7 | 7 |
| 8 import atexit | 8 import atexit |
| 9 import datetime | 9 import datetime |
| 10 import errno |
| 10 import logging | 11 import logging |
| 11 import os | 12 import os |
| 12 import pprint | 13 import pprint |
| 13 import re | 14 import re |
| 14 import socket | 15 import socket |
| 15 import subprocess | 16 import subprocess |
| 16 import sys | 17 import sys |
| 17 import tempfile | 18 import tempfile |
| 19 import time |
| 18 | 20 |
| 19 # trial_dir must be first for non-system libraries. | 21 # trial_dir must be first for non-system libraries. |
| 20 from tests import trial_dir | 22 from tests import trial_dir |
| 21 import gclient_utils | 23 import gclient_utils |
| 22 import scm | 24 import scm |
| 23 | 25 |
| 24 ## Utility functions | 26 ## Utility functions |
| 25 | 27 |
| 26 | 28 |
| 27 def kill_pid(pid): | 29 def kill_pid(pid): |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 """Kills the servers and delete the directories.""" | 232 """Kills the servers and delete the directories.""" |
| 231 self.tear_down_svn() | 233 self.tear_down_svn() |
| 232 self.tear_down_git() | 234 self.tear_down_git() |
| 233 # This deletes the directories. | 235 # This deletes the directories. |
| 234 self.trial.tear_down() | 236 self.trial.tear_down() |
| 235 self.trial = None | 237 self.trial = None |
| 236 | 238 |
| 237 def tear_down_svn(self): | 239 def tear_down_svn(self): |
| 238 if self.svnserve: | 240 if self.svnserve: |
| 239 logging.debug('Killing svnserve pid %s' % self.svnserve.pid) | 241 logging.debug('Killing svnserve pid %s' % self.svnserve.pid) |
| 240 self.svnserve.kill() | 242 try: |
| 243 self.svnserve.kill() |
| 244 except OSError, e: |
| 245 if e.errno != errno.ESRCH: # no such process |
| 246 raise |
| 241 self.wait_for_port_to_free(self.svn_port) | 247 self.wait_for_port_to_free(self.svn_port) |
| 242 self.svnserve = None | 248 self.svnserve = None |
| 243 if not self.trial.SHOULD_LEAK: | 249 if not self.trial.SHOULD_LEAK: |
| 244 logging.debug('Removing %s' % self.svn_repo) | 250 logging.debug('Removing %s' % self.svn_repo) |
| 245 gclient_utils.rmtree(self.svn_repo) | 251 gclient_utils.rmtree(self.svn_repo) |
| 246 logging.debug('Removing %s' % self.svn_checkout) | 252 logging.debug('Removing %s' % self.svn_checkout) |
| 247 gclient_utils.rmtree(self.svn_checkout) | 253 gclient_utils.rmtree(self.svn_checkout) |
| 248 else: | 254 else: |
| 249 return False | 255 return False |
| 250 return True | 256 return True |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 return False | 302 return False |
| 297 write(join(self.svn_repo, 'conf', 'svnserve.conf'), | 303 write(join(self.svn_repo, 'conf', 'svnserve.conf'), |
| 298 '[general]\n' | 304 '[general]\n' |
| 299 'anon-access = read\n' | 305 'anon-access = read\n' |
| 300 'auth-access = write\n' | 306 'auth-access = write\n' |
| 301 'password-db = passwd\n') | 307 'password-db = passwd\n') |
| 302 text = '[users]\n' | 308 text = '[users]\n' |
| 303 text += ''.join('%s = %s\n' % (usr, pwd) for usr, pwd in self.USERS) | 309 text += ''.join('%s = %s\n' % (usr, pwd) for usr, pwd in self.USERS) |
| 304 write(join(self.svn_repo, 'conf', 'passwd'), text) | 310 write(join(self.svn_repo, 'conf', 'passwd'), text) |
| 305 | 311 |
| 312 # Mac 10.6 ships with a buggy subversion build and we need this line |
| 313 # to work around the bug. |
| 314 write(join(self.svn_repo, 'db', 'fsfs.conf'), |
| 315 '[rep-sharing]\n' |
| 316 'enable-rep-sharing = false\n') |
| 317 |
| 306 # Start the daemon. | 318 # Start the daemon. |
| 307 cmd = ['svnserve', '-d', '--foreground', '-r', self.root_dir] | 319 cmd = ['svnserve', '-d', '--foreground', '-r', self.root_dir] |
| 308 if self.host == '127.0.0.1': | 320 if self.host == '127.0.0.1': |
| 309 cmd.append('--listen-host=' + self.host) | 321 cmd.append('--listen-host=' + self.host) |
| 310 self.check_port_is_free(self.svn_port) | 322 self.check_port_is_free(self.svn_port) |
| 311 self.svnserve = Popen(cmd, cwd=self.svn_repo) | 323 self.svnserve = Popen(cmd, cwd=self.svn_repo) |
| 312 self.wait_for_port_to_bind(self.svn_port, self.svnserve) | 324 self.wait_for_port_to_bind(self.svn_port, self.svnserve) |
| 313 self.populateSvn() | 325 self.populateSvn() |
| 314 self.svn_dirty = False | 326 self.svn_dirty = False |
| 315 return True | 327 return True |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 sock.connect((self.host, port)) | 381 sock.connect((self.host, port)) |
| 370 # It worked, throw. | 382 # It worked, throw. |
| 371 assert False, '%d shouldn\'t be bound' % port | 383 assert False, '%d shouldn\'t be bound' % port |
| 372 except EnvironmentError: | 384 except EnvironmentError: |
| 373 pass | 385 pass |
| 374 finally: | 386 finally: |
| 375 sock.close() | 387 sock.close() |
| 376 | 388 |
| 377 def wait_for_port_to_bind(self, port, process): | 389 def wait_for_port_to_bind(self, port, process): |
| 378 sock = socket.socket() | 390 sock = socket.socket() |
| 391 |
| 392 if sys.platform == 'darwin': |
| 393 # On Mac SnowLeopard, if we attempt to connect to the socket |
| 394 # immediately, it fails with EINVAL and never gets a chance to |
| 395 # connect (putting us into a hard spin and then failing). |
| 396 # Linux doesn't need this. |
| 397 time.sleep(0.1) |
| 398 |
| 379 try: | 399 try: |
| 380 start = datetime.datetime.utcnow() | 400 start = datetime.datetime.utcnow() |
| 381 maxdelay = datetime.timedelta(seconds=30) | 401 maxdelay = datetime.timedelta(seconds=30) |
| 382 while (datetime.datetime.utcnow() - start) < maxdelay: | 402 while (datetime.datetime.utcnow() - start) < maxdelay: |
| 383 try: | 403 try: |
| 384 sock.connect((self.host, port)) | 404 sock.connect((self.host, port)) |
| 385 logging.debug('%d is now bound' % port) | 405 logging.debug('%d is now bound' % port) |
| 386 return | 406 return |
| 387 except EnvironmentError: | 407 except EnvironmentError: |
| 388 pass | 408 pass |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 fake.set_up_git() | 747 fake.set_up_git() |
| 728 print('Fake setup, press enter to quit or Ctrl-C to keep the checkouts.') | 748 print('Fake setup, press enter to quit or Ctrl-C to keep the checkouts.') |
| 729 sys.stdin.readline() | 749 sys.stdin.readline() |
| 730 except KeyboardInterrupt: | 750 except KeyboardInterrupt: |
| 731 trial_dir.TrialDir.SHOULD_LEAK.leak = True | 751 trial_dir.TrialDir.SHOULD_LEAK.leak = True |
| 732 return 0 | 752 return 0 |
| 733 | 753 |
| 734 | 754 |
| 735 if __name__ == '__main__': | 755 if __name__ == '__main__': |
| 736 sys.exit(main(sys.argv)) | 756 sys.exit(main(sys.argv)) |
| OLD | NEW |