comparison tests/test_push_command.py @ 336:c0b943cef0c3

Use try/finally in an attempt to stop leaking svnserve processes.
author Augie Fackler <durin42@gmail.com>
date Wed, 13 May 2009 10:22:18 -0500
parents 75f082b5897e
children 46e69be8e2c8
comparison
equal deleted inserted replaced
335:9ef720a611e0 336:c0b943cef0c3
15 15
16 import test_util 16 import test_util
17 import time 17 import time
18 18
19 19
20 class PushOverSvnserveTests(test_util.TestBase): 20 class PushTests(test_util.TestBase):
21 def setUp(self): 21 def setUp(self):
22 test_util.TestBase.setUp(self) 22 test_util.TestBase.setUp(self)
23 test_util.load_fixture_and_fetch('simple_branch.svndump',
24 self.repo_path,
25 self.wc_path)
26
27 def test_cant_push_empty_ctx(self):
28 repo = self.repo
29 def file_callback(repo, memctx, path):
30 if path == 'adding_file':
31 return context.memfilectx(path=path,
32 data='foo',
33 islink=False,
34 isexec=False,
35 copied=False)
36 raise IOError()
37 ctx = context.memctx(repo,
38 (repo['default'].node(), node.nullid),
39 'automated test',
40 [],
41 file_callback,
42 'an_author',
43 '2008-10-07 20:59:48 -0500',
44 {'branch': 'default',})
45 new_hash = repo.commitctx(ctx)
46 hg.update(repo, repo['tip'].node())
47 old_tip = repo['tip'].node()
48 self.pushrevisions()
49 tip = self.repo['tip']
50 self.assertEqual(tip.node(), old_tip)
51
52 def test_push_over_svnserve(self, commit=True):
23 test_util.load_svndump_fixture(self.repo_path, 'simple_branch.svndump') 53 test_util.load_svndump_fixture(self.repo_path, 'simple_branch.svndump')
24 open(os.path.join(self.repo_path, 'conf', 'svnserve.conf'), 54 open(os.path.join(self.repo_path, 'conf', 'svnserve.conf'),
25 'w').write('[general]\nanon-access=write\n[sasl]\n') 55 'w').write('[general]\nanon-access=write\n[sasl]\n')
26 self.port = random.randint(socket.IPPORT_USERRESERVED, 65535) 56 self.port = random.randint(socket.IPPORT_USERRESERVED, 65535)
27 self.host = 'localhost' 57 self.host = 'localhost'
28 args = ['svnserve', '--daemon', '--foreground', 58 args = ['svnserve', '--daemon', '--foreground',
29 '--listen-port=%d' % self.port, 59 '--listen-port=%d' % self.port,
30 '--listen-host=%s' % self.host, 60 '--listen-host=%s' % self.host,
31 '--root=%s' % self.repo_path] 61 '--root=%s' % self.repo_path]
32 svnserve = subprocess.Popen(args, stdout=subprocess.PIPE, 62
33 stderr=subprocess.STDOUT) 63 self.svnserve_pid = subprocess.Popen(args).pid
34 self.svnserve_pid = svnserve.pid 64 try:
35 time.sleep(2) 65 time.sleep(2)
36 commands.clone(ui.ui(), 'svn://%s:%d/' % (self.host, self.port), 66 commands.clone(ui.ui(), 'svn://%s:%d/' % (self.host, self.port),
37 self.wc_path, noupdate=True) 67 self.wc_path, noupdate=True)
38 68
39 def tearDown(self): 69 repo = self.repo
40 os.kill(self.svnserve_pid, 9) 70 old_tip = repo['tip'].node()
41 test_util.TestBase.tearDown(self) 71 expected_parent = repo['default'].node()
42 72 def file_callback(repo, memctx, path):
43 def test_push_to_default(self, commit=True): 73 if path == 'adding_file':
44 repo = self.repo 74 return context.memfilectx(path=path,
45 old_tip = repo['tip'].node() 75 data='foo',
46 expected_parent = repo['default'].node() 76 islink=False,
47 def file_callback(repo, memctx, path): 77 isexec=False,
48 if path == 'adding_file': 78 copied=False)
49 return context.memfilectx(path=path, 79 raise IOError()
50 data='foo', 80 ctx = context.memctx(repo,
51 islink=False, 81 (repo['default'].node(), node.nullid),
52 isexec=False, 82 'automated test',
53 copied=False) 83 ['adding_file'],
54 raise IOError() 84 file_callback,
55 ctx = context.memctx(repo, 85 'an_author',
56 (repo['default'].node(), node.nullid), 86 '2008-10-07 20:59:48 -0500',
57 'automated test', 87 {'branch': 'default',})
58 ['adding_file'], 88 new_hash = repo.commitctx(ctx)
59 file_callback, 89 if not commit:
60 'an_author', 90 return # some tests use this test as an extended setup.
61 '2008-10-07 20:59:48 -0500', 91 hg.update(repo, repo['tip'].node())
62 {'branch': 'default',}) 92 oldauthor = repo['tip'].user()
63 new_hash = repo.commitctx(ctx) 93 commands.push(repo.ui, repo)
64 if not commit: 94 tip = self.repo['tip']
65 return # some tests use this test as an extended setup. 95 self.assertNotEqual(oldauthor, tip.user())
66 hg.update(repo, repo['tip'].node()) 96 self.assertNotEqual(tip.node(), old_tip)
67 oldauthor = repo['tip'].user() 97 self.assertEqual(tip.parents()[0].node(), expected_parent)
68 commands.push(repo.ui, repo) 98 self.assertEqual(tip['adding_file'].data(), 'foo')
69 tip = self.repo['tip'] 99 self.assertEqual(tip.branch(), 'default')
70 self.assertNotEqual(oldauthor, tip.user()) 100 finally:
71 self.assertNotEqual(tip.node(), old_tip) 101 os.kill(self.svnserve_pid, 9)
72 self.assertEqual(tip.parents()[0].node(), expected_parent)
73 self.assertEqual(tip['adding_file'].data(), 'foo')
74 self.assertEqual(tip.branch(), 'default')
75
76
77 class PushTests(test_util.TestBase):
78 def setUp(self):
79 test_util.TestBase.setUp(self)
80 test_util.load_fixture_and_fetch('simple_branch.svndump',
81 self.repo_path,
82 self.wc_path)
83
84 def test_cant_push_empty_ctx(self):
85 repo = self.repo
86 def file_callback(repo, memctx, path):
87 if path == 'adding_file':
88 return context.memfilectx(path=path,
89 data='foo',
90 islink=False,
91 isexec=False,
92 copied=False)
93 raise IOError()
94 ctx = context.memctx(repo,
95 (repo['default'].node(), node.nullid),
96 'automated test',
97 [],
98 file_callback,
99 'an_author',
100 '2008-10-07 20:59:48 -0500',
101 {'branch': 'default',})
102 new_hash = repo.commitctx(ctx)
103 hg.update(repo, repo['tip'].node())
104 old_tip = repo['tip'].node()
105 self.pushrevisions()
106 tip = self.repo['tip']
107 self.assertEqual(tip.node(), old_tip)
108
109 102
110 def test_push_to_default(self, commit=True): 103 def test_push_to_default(self, commit=True):
111 repo = self.repo 104 repo = self.repo
112 old_tip = repo['tip'].node() 105 old_tip = repo['tip'].node()
113 expected_parent = repo['default'].node() 106 expected_parent = repo['default'].node()
417 self.assertEqual(e.args[0], 410 self.assertEqual(e.args[0],
418 'Base text was out of date, maybe rebase?') 411 'Base text was out of date, maybe rebase?')
419 412
420 413
421 def suite(): 414 def suite():
422 test_classes = [PushTests, PushOverSvnserveTests] 415 test_classes = [PushTests, ]
423 tests = [] 416 tests = []
424 # This is the quickest hack I could come up with to load all the tests from 417 # This is the quickest hack I could come up with to load all the tests from
425 # both classes. Would love a patch that simplifies this without adding 418 # both classes. Would love a patch that simplifies this without adding
426 # dependencies. 419 # dependencies.
427 for tc in test_classes: 420 for tc in test_classes: