source: valtobtest/subversion-1.6.2/subversion/bindings/swig/python/tests/repository.py @ 3

Last change on this file since 3 was 3, checked in by valtob, 15 years ago

subversion source 1.6.2 as test

File size: 6.0 KB
Line 
1import unittest, os, setup_path, tempfile
2from sys import version_info # For Python version check
3if version_info[0] >= 3:
4  # Python >=3.0
5  from io import StringIO
6else:
7  # Python <3.0
8  from StringIO import StringIO
9from svn import core, repos, fs, delta
10from svn.core import SubversionException
11
12from trac.versioncontrol.tests.svn_fs import SubversionRepositoryTestSetup, \
13  REPOS_PATH
14
15class ChangeReceiver(delta.Editor):
16  """A delta editor which saves textdeltas for later use"""
17
18  def __init__(self, src_root, tgt_root):
19    self.src_root = src_root
20    self.tgt_root = tgt_root
21    self.textdeltas = []
22
23  def apply_textdelta(self, file_baton, base_checksum):
24    def textdelta_handler(textdelta):
25      if textdelta is not None:
26        self.textdeltas.append(textdelta)
27    return textdelta_handler
28
29def _authz_callback(root, path, pool):
30  "A dummy authz callback which always returns success."
31  return 1
32
33class SubversionRepositoryTestCase(unittest.TestCase):
34  """Test cases for the Subversion repository layer"""
35
36  def setUp(self):
37    """Load a Subversion repository"""
38    self.repos = repos.open(REPOS_PATH)
39    self.fs = repos.fs(self.repos)
40    self.rev = fs.youngest_rev(self.fs)
41
42  def test_create(self):
43    """Make sure that repos.create doesn't segfault when we set fs-type
44       using a config hash"""
45    fs_config = { "fs-type": "fsfs" }
46    for i in range(5):
47      path = tempfile.mkdtemp("-test" + str(i))
48      repos.create(path, "", "", None, fs_config)
49      repos.delete(path)
50
51  def test_dump_fs2(self):
52    """Test the dump_fs2 function"""
53
54    self.callback_calls = 0
55
56    def is_cancelled():
57      self.callback_calls += 1
58      return None
59
60    dumpstream = StringIO()
61    feedbackstream = StringIO()
62    repos.dump_fs2(self.repos, dumpstream, feedbackstream, 0, self.rev, 0, 0,
63                   is_cancelled)
64
65    # Check that we can dump stuff
66    dump = dumpstream.getvalue()
67    feedback = feedbackstream.getvalue()
68    expected_feedback = "* Dumped revision " + str(self.rev)
69    self.assertEquals(dump.count("Node-path: trunk/README.txt"), 2)
70    self.assertEquals(feedback.count(expected_feedback), 1)
71    self.assertEquals(self.callback_calls, 13)
72
73    # Check that the dump can be cancelled
74    self.assertRaises(SubversionException, repos.dump_fs2,
75      self.repos, dumpstream, feedbackstream, 0, self.rev, 0, 0, lambda: 1)
76
77    dumpstream.close()
78    feedbackstream.close()
79
80    # Check that the dump fails when the dumpstream is closed
81    self.assertRaises(ValueError, repos.dump_fs2,
82      self.repos, dumpstream, feedbackstream, 0, self.rev, 0, 0, None)
83
84    dumpstream = StringIO()
85    feedbackstream = StringIO()
86
87    # Check that we can grab the feedback stream, but not the dumpstream
88    repos.dump_fs2(self.repos, None, feedbackstream, 0, self.rev, 0, 0, None)
89    feedback = feedbackstream.getvalue()
90    self.assertEquals(feedback.count(expected_feedback), 1)
91
92    # Check that we can grab the dumpstream, but not the feedbackstream
93    repos.dump_fs2(self.repos, dumpstream, None, 0, self.rev, 0, 0, None)
94    dump = dumpstream.getvalue()
95    self.assertEquals(dump.count("Node-path: trunk/README.txt"), 2)
96
97    # Check that we can ignore both the dumpstream and the feedbackstream
98    repos.dump_fs2(self.repos, dumpstream, None, 0, self.rev, 0, 0, None)
99    self.assertEquals(feedback.count(expected_feedback), 1)
100
101    # FIXME: The Python bindings don't check for 'NULL' values for
102    #        svn_repos_t objects, so the following call segfaults
103    #repos.dump_fs2(None, None, None, 0, self.rev, 0, 0, None)
104
105  def test_get_logs(self):
106    """Test scope of get_logs callbacks"""
107    logs = []
108    def addLog(paths, revision, author, date, message, pool):
109      if paths is not None:
110        logs.append(paths)
111
112    # Run get_logs
113    repos.get_logs(self.repos, ['/'], self.rev, 0, True, 0, addLog)
114
115    # Count and verify changes
116    change_count = 0
117    for log in logs:
118      for path_changed in log.values():
119        change_count += 1
120        path_changed.assert_valid()
121    self.assertEqual(logs[2]["/tags/v1.1"].action, "A")
122    self.assertEqual(logs[2]["/tags/v1.1"].copyfrom_path, "/branches/v1x")
123    self.assertEqual(len(logs), 12)
124    self.assertEqual(change_count, 19)
125
126  def test_dir_delta(self):
127    """Test scope of dir_delta callbacks"""
128    # Run dir_delta
129    this_root = fs.revision_root(self.fs, self.rev)
130    prev_root = fs.revision_root(self.fs, self.rev-1)
131    editor = ChangeReceiver(this_root, prev_root)
132    e_ptr, e_baton = delta.make_editor(editor)
133    repos.dir_delta(prev_root, '', '', this_root, '', e_ptr, e_baton,
134                    _authz_callback, 1, 1, 0, 0)
135
136    # Check results
137    self.assertEqual(editor.textdeltas[0].new_data, "This is a test.\n")
138    self.assertEqual(editor.textdeltas[1].new_data, "A test.\n")
139    self.assertEqual(len(editor.textdeltas),2)
140
141  def test_retrieve_and_change_rev_prop(self):
142    """Test playing with revprops"""
143    self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, "svn:log",
144                                            _authz_callback),
145                     "''(a few years later)'' Argh... v1.1 was buggy, "
146                     "after all")
147
148    # We expect this to complain because we have no pre-revprop-change
149    # hook script for the repository.
150    self.assertRaises(SubversionException, repos.fs_change_rev_prop3,
151                      self.repos, self.rev, "jrandom", "svn:log",
152                      "Youngest revision", True, True, _authz_callback)
153
154    repos.fs_change_rev_prop3(self.repos, self.rev, "jrandom", "svn:log",
155                              "Youngest revision", False, False,
156                              _authz_callback)
157
158    self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, "svn:log",
159                                            _authz_callback),
160                     "Youngest revision")
161
162def suite():
163    return unittest.makeSuite(SubversionRepositoryTestCase, 'test',
164                              suiteClass=SubversionRepositoryTestSetup)
165
166if __name__ == '__main__':
167    runner = unittest.TextTestRunner()
168    runner.run(suite())
Note: See TracBrowser for help on using the repository browser.