225
224
self.assertEqual(expected, request.execute('', 'False'))
227
class TestSmartServerBzrDirRequestCloningMetaDir(
228
tests.TestCaseWithMemoryTransport):
229
"""Tests for BzrDir.checkout_metadir."""
231
def test_checkout_metadir(self):
232
backing = self.get_transport()
233
request = smart_dir.SmartServerBzrDirRequestCheckoutMetaDir(
235
branch = self.make_branch('.', format='2a')
236
response = request.execute('')
238
smart_req.SmartServerResponse(
239
('Bazaar-NG meta directory, format 1\n',
240
'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
241
'Bazaar Branch Format 7 (needs bzr 1.6)\n')),
245
class TestSmartServerBzrDirRequestDestroyBranch(
246
tests.TestCaseWithMemoryTransport):
247
"""Tests for BzrDir.destroy_branch."""
249
def test_destroy_branch_default(self):
250
"""The default branch can be removed."""
251
backing = self.get_transport()
252
dir = self.make_branch('.').bzrdir
253
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
254
request = request_class(backing)
255
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
256
self.assertEqual(expected, request.execute('', None))
258
def test_destroy_branch_named(self):
259
"""A named branch can be removed."""
260
backing = self.get_transport()
261
dir = self.make_repository('.', format="development-colo").bzrdir
262
dir.create_branch(name="branchname")
263
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
264
request = request_class(backing)
265
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
266
self.assertEqual(expected, request.execute('', "branchname"))
268
def test_destroy_branch_missing(self):
269
"""An error is raised if the branch didn't exist."""
270
backing = self.get_transport()
271
dir = self.make_bzrdir('.', format="development-colo")
272
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
273
request = request_class(backing)
274
expected = smart_req.FailedSmartServerResponse(('nobranch',), None)
275
self.assertEqual(expected, request.execute('', "branchname"))
278
class TestSmartServerBzrDirRequestHasWorkingTree(
279
tests.TestCaseWithTransport):
280
"""Tests for BzrDir.has_workingtree."""
282
def test_has_workingtree_yes(self):
283
"""A working tree is present."""
284
backing = self.get_transport()
285
dir = self.make_branch_and_tree('.').bzrdir
286
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
287
request = request_class(backing)
288
expected = smart_req.SuccessfulSmartServerResponse(('yes',))
289
self.assertEqual(expected, request.execute(''))
291
def test_has_workingtree_no(self):
292
"""A working tree is missing."""
293
backing = self.get_transport()
294
dir = self.make_bzrdir('.')
295
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
296
request = request_class(backing)
297
expected = smart_req.SuccessfulSmartServerResponse(('no',))
298
self.assertEqual(expected, request.execute(''))
301
class TestSmartServerBzrDirRequestDestroyRepository(
302
tests.TestCaseWithMemoryTransport):
303
"""Tests for BzrDir.destroy_repository."""
305
def test_destroy_repository_default(self):
306
"""The repository can be removed."""
307
backing = self.get_transport()
308
dir = self.make_repository('.').bzrdir
309
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
310
request = request_class(backing)
311
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
312
self.assertEqual(expected, request.execute(''))
314
def test_destroy_repository_missing(self):
315
"""An error is raised if the repository didn't exist."""
316
backing = self.get_transport()
317
dir = self.make_bzrdir('.')
318
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
319
request = request_class(backing)
320
expected = smart_req.FailedSmartServerResponse(
321
('norepository',), None)
322
self.assertEqual(expected, request.execute(''))
228
325
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
229
326
"""Tests for BzrDir.create_repository."""
739
836
request.execute(''))
839
class TestSmartServerBranchRequestRevisionIdToRevno(
840
tests.TestCaseWithMemoryTransport):
843
backing = self.get_transport()
844
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
846
self.make_branch('.')
847
self.assertEqual(smart_req.SmartServerResponse(('ok', '0')),
848
request.execute('', 'null:'))
850
def test_simple(self):
851
backing = self.get_transport()
852
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
854
tree = self.make_branch_and_memory_tree('.')
857
r1 = tree.commit('1st commit')
860
smart_req.SmartServerResponse(('ok', '1')),
861
request.execute('', r1))
863
def test_not_found(self):
864
backing = self.get_transport()
865
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
867
branch = self.make_branch('.')
869
smart_req.FailedSmartServerResponse(
870
('NoSuchRevision', 'idontexist')),
871
request.execute('', 'idontexist'))
742
874
class TestSmartServerBranchRequestGetConfigFile(
743
875
tests.TestCaseWithMemoryTransport):
767
899
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
769
901
def get_lock_tokens(self, branch):
770
branch_token = branch.lock_write()
771
repo_token = branch.repository.lock_write()
902
branch_token = branch.lock_write().branch_token
903
repo_token = branch.repository.lock_write().repository_token
772
904
branch.repository.unlock()
773
905
return branch_token, repo_token
908
class TestSmartServerBranchRequestPutConfigFile(TestLockedBranch):
910
def test_with_content(self):
911
backing = self.get_transport()
912
request = smart_branch.SmartServerBranchPutConfigFile(backing)
913
branch = self.make_branch('.')
914
branch_token, repo_token = self.get_lock_tokens(branch)
915
self.assertIs(None, request.execute('', branch_token, repo_token))
917
smart_req.SmartServerResponse(('ok', )),
918
request.do_body('foo bar baz'))
920
branch.control_transport.get_bytes('branch.conf'),
776
925
class TestSmartServerBranchRequestSetConfigOption(TestLockedBranch):
778
927
def test_value_name(self):
954
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
957
TestLockedBranch.setUp(self)
958
# A dict with non-ascii keys and values to exercise unicode
960
self.encoded_value_dict = (
961
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
963
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
965
def test_value_name(self):
966
branch = self.make_branch('.')
967
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
968
branch.bzrdir.root_transport)
969
branch_token, repo_token = self.get_lock_tokens(branch)
970
config = branch._get_config()
971
result = request.execute('', branch_token, repo_token,
972
self.encoded_value_dict, 'foo', '')
973
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
974
self.assertEqual(self.value_dict, config.get_option('foo'))
978
def test_value_name_section(self):
979
branch = self.make_branch('.')
980
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
981
branch.bzrdir.root_transport)
982
branch_token, repo_token = self.get_lock_tokens(branch)
983
config = branch._get_config()
984
result = request.execute('', branch_token, repo_token,
985
self.encoded_value_dict, 'foo', 'gam')
986
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
987
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
805
992
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
806
993
# Only called when the branch format and tags match [yay factory
807
994
# methods] so only need to test straight forward cases.
1054
1241
self.assertEqual('child-1', self.tree.branch.last_revision())
1244
class TestSmartServerBranchBreakLock(tests.TestCaseWithMemoryTransport):
1246
def test_lock_to_break(self):
1247
base_branch = self.make_branch('base')
1248
request = smart_branch.SmartServerBranchBreakLock(
1249
self.get_transport())
1250
base_branch.lock_write()
1252
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1253
request.execute('base'))
1255
def test_nothing_to_break(self):
1256
base_branch = self.make_branch('base')
1257
request = smart_branch.SmartServerBranchBreakLock(
1258
self.get_transport())
1260
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1261
request.execute('base'))
1057
1264
class TestSmartServerBranchRequestGetParent(tests.TestCaseWithMemoryTransport):
1059
1266
def test_get_parent_none(self):
1249
1448
self.assertEqual('LockFailed', error_name)
1252
class TestSmartServerBranchRequestUnlock(tests.TestCaseWithMemoryTransport):
1451
class TestSmartServerBranchRequestGetPhysicalLockStatus(TestLockedBranch):
1454
tests.TestCaseWithMemoryTransport.setUp(self)
1456
def test_true(self):
1457
backing = self.get_transport()
1458
request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1460
branch = self.make_branch('.')
1461
branch_token, repo_token = self.get_lock_tokens(branch)
1462
self.assertEquals(True, branch.get_physical_lock_status())
1463
response = request.execute('')
1465
smart_req.SmartServerResponse(('yes',)), response)
1468
def test_false(self):
1469
backing = self.get_transport()
1470
request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1472
branch = self.make_branch('.')
1473
self.assertEquals(False, branch.get_physical_lock_status())
1474
response = request.execute('')
1476
smart_req.SmartServerResponse(('no',)), response)
1479
class TestSmartServerBranchRequestUnlock(TestLockedBranch):
1254
1481
def setUp(self):
1255
1482
tests.TestCaseWithMemoryTransport.setUp(self)
1322
1546
request.execute, 'subdir')
1549
class TestSmartServerRepositoryAddSignatureText(tests.TestCaseWithMemoryTransport):
1551
def test_add_text(self):
1552
backing = self.get_transport()
1553
request = smart_repo.SmartServerRepositoryAddSignatureText(backing)
1554
tree = self.make_branch_and_memory_tree('.')
1555
write_token = tree.lock_write()
1556
self.addCleanup(tree.unlock)
1558
tree.commit("Message", rev_id='rev1')
1559
tree.branch.repository.start_write_group()
1560
write_group_tokens = tree.branch.repository.suspend_write_group()
1561
self.assertEqual(None, request.execute('', write_token,
1562
'rev1', *write_group_tokens))
1563
response = request.do_body('somesignature')
1564
self.assertTrue(response.is_successful())
1565
self.assertEqual(response.args[0], 'ok')
1566
write_group_tokens = response.args[1:]
1567
tree.branch.repository.resume_write_group(write_group_tokens)
1568
tree.branch.repository.commit_write_group()
1570
self.assertEqual("somesignature",
1571
tree.branch.repository.get_signature_text("rev1"))
1574
class TestSmartServerRepositoryAllRevisionIds(
1575
tests.TestCaseWithMemoryTransport):
1577
def test_empty(self):
1578
"""An empty body should be returned for an empty repository."""
1579
backing = self.get_transport()
1580
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1581
self.make_repository('.')
1583
smart_req.SuccessfulSmartServerResponse(("ok", ), ""),
1584
request.execute(''))
1586
def test_some_revisions(self):
1587
"""An empty body should be returned for an empty repository."""
1588
backing = self.get_transport()
1589
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1590
tree = self.make_branch_and_memory_tree('.')
1593
tree.commit(rev_id='origineel', message="message")
1594
tree.commit(rev_id='nog-een-revisie', message="message")
1597
smart_req.SuccessfulSmartServerResponse(("ok", ),
1598
"origineel\nnog-een-revisie"),
1599
request.execute(''))
1602
class TestSmartServerRepositoryBreakLock(tests.TestCaseWithMemoryTransport):
1604
def test_lock_to_break(self):
1605
backing = self.get_transport()
1606
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1607
tree = self.make_branch_and_memory_tree('.')
1608
tree.branch.repository.lock_write()
1610
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1611
request.execute(''))
1613
def test_nothing_to_break(self):
1614
backing = self.get_transport()
1615
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1616
tree = self.make_branch_and_memory_tree('.')
1618
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1619
request.execute(''))
1325
1622
class TestSmartServerRepositoryGetParentMap(tests.TestCaseWithMemoryTransport):
1327
1624
def test_trivial_bzipped(self):
1447
1744
request.execute('stacked', 1, (3, r3)))
1450
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1747
class TestSmartServerRepositoryIterRevisions(
1748
tests.TestCaseWithMemoryTransport):
1750
def test_basic(self):
1751
backing = self.get_transport()
1752
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1753
tree = self.make_branch_and_memory_tree('.', format='2a')
1756
tree.commit('1st commit', rev_id="rev1")
1757
tree.commit('2nd commit', rev_id="rev2")
1760
self.assertIs(None, request.execute(''))
1761
response = request.do_body("rev1\nrev2")
1762
self.assertTrue(response.is_successful())
1763
# Format 2a uses serializer format 10
1764
self.assertEquals(response.args, ("ok", "10"))
1766
self.addCleanup(tree.branch.lock_read().unlock)
1767
entries = [zlib.compress(record.get_bytes_as("fulltext")) for record in
1768
tree.branch.repository.revisions.get_record_stream(
1769
[("rev1", ), ("rev2", )], "unordered", True)]
1771
contents = "".join(response.body_stream)
1772
self.assertTrue(contents in (
1773
"".join([entries[0], entries[1]]),
1774
"".join([entries[1], entries[0]])))
1776
def test_missing(self):
1777
backing = self.get_transport()
1778
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1779
tree = self.make_branch_and_memory_tree('.', format='2a')
1781
self.assertIs(None, request.execute(''))
1782
response = request.do_body("rev1\nrev2")
1783
self.assertTrue(response.is_successful())
1784
# Format 2a uses serializer format 10
1785
self.assertEquals(response.args, ("ok", "10"))
1787
contents = "".join(response.body_stream)
1788
self.assertEquals(contents, "")
1791
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
1452
1793
def make_two_commit_repo(self):
1453
1794
tree = self.make_branch_and_memory_tree('.')
1485
1829
stream_bytes = ''.join(response.body_stream)
1486
1830
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1832
def test_search_everything(self):
1833
"""A search of 'everything' returns a stream."""
1834
backing = self.get_transport()
1835
request = smart_repo.SmartServerRepositoryGetStream_1_19(backing)
1836
repo, r1, r2 = self.make_two_commit_repo()
1837
serialised_fetch_spec = 'everything'
1838
request.execute('', repo._format.network_name())
1839
response = request.do_body(serialised_fetch_spec)
1840
self.assertEqual(('ok',), response.args)
1841
stream_bytes = ''.join(response.body_stream)
1842
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1489
1845
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
1511
1867
request.execute('', rev_id_utf8))
1870
class TestSmartServerRepositoryIterFilesBytes(tests.TestCaseWithTransport):
1872
def test_single(self):
1873
backing = self.get_transport()
1874
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1875
t = self.make_branch_and_tree('.')
1876
self.addCleanup(t.lock_write().unlock)
1877
self.build_tree_contents([("file", "somecontents")])
1878
t.add(["file"], ["thefileid"])
1879
t.commit(rev_id='somerev', message="add file")
1880
self.assertIs(None, request.execute(''))
1881
response = request.do_body("thefileid\0somerev\n")
1882
self.assertTrue(response.is_successful())
1883
self.assertEquals(response.args, ("ok", ))
1884
self.assertEquals("".join(response.body_stream),
1885
"ok\x000\n" + zlib.compress("somecontents"))
1887
def test_missing(self):
1888
backing = self.get_transport()
1889
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1890
t = self.make_branch_and_tree('.')
1891
self.addCleanup(t.lock_write().unlock)
1892
self.assertIs(None, request.execute(''))
1893
response = request.do_body("thefileid\0revision\n")
1894
self.assertTrue(response.is_successful())
1895
self.assertEquals(response.args, ("ok", ))
1896
self.assertEquals("".join(response.body_stream),
1897
"absent\x00thefileid\x00revision\x000\n")
1900
class TestSmartServerRequestHasSignatureForRevisionId(
1901
tests.TestCaseWithMemoryTransport):
1903
def test_missing_revision(self):
1904
"""For a missing revision, NoSuchRevision is returned."""
1905
backing = self.get_transport()
1906
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1908
self.make_repository('.')
1910
smart_req.FailedSmartServerResponse(
1911
('nosuchrevision', 'revid'), None),
1912
request.execute('', 'revid'))
1914
def test_missing_signature(self):
1915
"""For a missing signature, ('no', ) is returned."""
1916
backing = self.get_transport()
1917
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1919
tree = self.make_branch_and_memory_tree('.')
1922
r1 = tree.commit('a commit', rev_id='A')
1924
self.assertTrue(tree.branch.repository.has_revision('A'))
1925
self.assertEqual(smart_req.SmartServerResponse(('no', )),
1926
request.execute('', 'A'))
1928
def test_present_signature(self):
1929
"""For a present signature, ('yes', ) is returned."""
1930
backing = self.get_transport()
1931
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1933
strategy = gpg.LoopbackGPGStrategy(None)
1934
tree = self.make_branch_and_memory_tree('.')
1937
r1 = tree.commit('a commit', rev_id='A')
1938
tree.branch.repository.start_write_group()
1939
tree.branch.repository.sign_revision('A', strategy)
1940
tree.branch.repository.commit_write_group()
1942
self.assertTrue(tree.branch.repository.has_revision('A'))
1943
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
1944
request.execute('', 'A'))
1514
1947
class TestSmartServerRepositoryGatherStats(tests.TestCaseWithMemoryTransport):
1516
1949
def test_empty_revid(self):
1589
2033
request.execute('', ))
2036
class TestSmartServerRepositoryGetRevisionSignatureText(
2037
tests.TestCaseWithMemoryTransport):
2039
def test_get_signature(self):
2040
backing = self.get_transport()
2041
request = smart_repo.SmartServerRepositoryGetRevisionSignatureText(
2043
bb = self.make_branch_builder('.')
2044
bb.build_commit(rev_id='A')
2045
repo = bb.get_branch().repository
2046
strategy = gpg.LoopbackGPGStrategy(None)
2047
self.addCleanup(repo.lock_write().unlock)
2048
repo.start_write_group()
2049
repo.sign_revision('A', strategy)
2050
repo.commit_write_group()
2052
'-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
2053
Testament.from_revision(repo, 'A').as_short_text() +
2054
'-----END PSEUDO-SIGNED CONTENT-----\n')
2056
smart_req.SmartServerResponse(('ok', ), expected_body),
2057
request.execute('', 'A'))
2060
class TestSmartServerRepositoryMakeWorkingTrees(
2061
tests.TestCaseWithMemoryTransport):
2063
def test_make_working_trees(self):
2064
"""For a repository with working trees, ('yes', ) is returned."""
2065
backing = self.get_transport()
2066
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2067
r = self.make_repository('.')
2068
r.set_make_working_trees(True)
2069
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
2070
request.execute('', ))
2072
def test_is_not_shared(self):
2073
"""For a repository with working trees, ('no', ) is returned."""
2074
backing = self.get_transport()
2075
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2076
r = self.make_repository('.')
2077
r.set_make_working_trees(False)
2078
self.assertEqual(smart_req.SmartServerResponse(('no', )),
2079
request.execute('', ))
1592
2082
class TestSmartServerRepositoryLockWrite(tests.TestCaseWithMemoryTransport):
1594
2084
def test_lock_write_on_unlocked_repo(self):
1708
2198
smart_req.SmartServerResponse(('TokenMismatch',)), response)
2201
class TestSmartServerRepositoryGetPhysicalLockStatus(
2202
tests.TestCaseWithTransport):
2204
def test_with_write_lock(self):
2205
backing = self.get_transport()
2206
repo = self.make_repository('.')
2207
self.addCleanup(repo.lock_write().unlock)
2208
# lock_write() doesn't necessarily actually take a physical
2210
if repo.get_physical_lock_status():
2214
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2215
request = request_class(backing)
2216
self.assertEqual(smart_req.SuccessfulSmartServerResponse((expected,)),
2217
request.execute('', ))
2219
def test_without_write_lock(self):
2220
backing = self.get_transport()
2221
repo = self.make_repository('.')
2222
self.assertEquals(False, repo.get_physical_lock_status())
2223
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2224
request = request_class(backing)
2225
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('no',)),
2226
request.execute('', ))
2229
class TestSmartServerRepositoryReconcile(tests.TestCaseWithTransport):
2231
def test_reconcile(self):
2232
backing = self.get_transport()
2233
repo = self.make_repository('.')
2234
token = repo.lock_write().repository_token
2235
self.addCleanup(repo.unlock)
2236
request_class = smart_repo.SmartServerRepositoryReconcile
2237
request = request_class(backing)
2238
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
2240
'garbage_inventories: 0\n'
2241
'inconsistent_parents: 0\n'),
2242
request.execute('', token))
1711
2245
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1713
2247
def test_is_readonly_no(self):
1751
2285
self.assertTrue(repo.make_working_trees())
2288
class TestSmartServerRepositoryGetSerializerFormat(
2289
tests.TestCaseWithMemoryTransport):
2291
def test_get_serializer_format(self):
2292
backing = self.get_transport()
2293
repo = self.make_repository('.', format='2a')
2294
request_class = smart_repo.SmartServerRepositoryGetSerializerFormat
2295
request = request_class(backing)
2297
smart_req.SuccessfulSmartServerResponse(('ok', '10')),
2298
request.execute(''))
2301
class TestSmartServerRepositoryWriteGroup(
2302
tests.TestCaseWithMemoryTransport):
2304
def test_start_write_group(self):
2305
backing = self.get_transport()
2306
repo = self.make_repository('.')
2307
lock_token = repo.lock_write().repository_token
2308
self.addCleanup(repo.unlock)
2309
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2310
request = request_class(backing)
2311
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok', [])),
2312
request.execute('', lock_token))
2314
def test_start_write_group_unsuspendable(self):
2315
backing = self.get_transport()
2316
repo = self.make_repository('.', format='knit')
2317
lock_token = repo.lock_write().repository_token
2318
self.addCleanup(repo.unlock)
2319
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2320
request = request_class(backing)
2322
smart_req.FailedSmartServerResponse(('UnsuspendableWriteGroup',)),
2323
request.execute('', lock_token))
2325
def test_commit_write_group(self):
2326
backing = self.get_transport()
2327
repo = self.make_repository('.')
2328
lock_token = repo.lock_write().repository_token
2329
self.addCleanup(repo.unlock)
2330
repo.start_write_group()
2331
tokens = repo.suspend_write_group()
2332
request_class = smart_repo.SmartServerRepositoryCommitWriteGroup
2333
request = request_class(backing)
2334
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2335
request.execute('', lock_token, tokens))
2337
def test_abort_write_group(self):
2338
backing = self.get_transport()
2339
repo = self.make_repository('.')
2340
lock_token = repo.lock_write().repository_token
2341
repo.start_write_group()
2342
tokens = repo.suspend_write_group()
2343
self.addCleanup(repo.unlock)
2344
request_class = smart_repo.SmartServerRepositoryAbortWriteGroup
2345
request = request_class(backing)
2346
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2347
request.execute('', lock_token, tokens))
2349
def test_check_write_group(self):
2350
backing = self.get_transport()
2351
repo = self.make_repository('.')
2352
lock_token = repo.lock_write().repository_token
2353
repo.start_write_group()
2354
tokens = repo.suspend_write_group()
2355
self.addCleanup(repo.unlock)
2356
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2357
request = request_class(backing)
2358
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2359
request.execute('', lock_token, tokens))
2361
def test_check_write_group_invalid(self):
2362
backing = self.get_transport()
2363
repo = self.make_repository('.')
2364
lock_token = repo.lock_write().repository_token
2365
self.addCleanup(repo.unlock)
2366
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2367
request = request_class(backing)
2368
self.assertEqual(smart_req.FailedSmartServerResponse(
2369
('UnresumableWriteGroup', ['random'],
2370
'Malformed write group token')),
2371
request.execute('', lock_token, ["random"]))
1754
2374
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
1756
2376
def make_repo_needing_autopacking(self, path='.'):
1822
2442
"""All registered request_handlers can be found."""
1823
2443
# If there's a typo in a register_lazy call, this loop will fail with
1824
2444
# an AttributeError.
1825
for key, item in smart_req.request_handlers.iteritems():
2445
for key in smart_req.request_handlers.keys():
2447
item = smart_req.request_handlers.get(key)
2448
except AttributeError, e:
2449
raise AttributeError('failed to get %s: %s' % (key, e))
1828
2451
def assertHandlerEqual(self, verb, handler):
1829
2452
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1831
2454
def test_registered_methods(self):
1832
2455
"""Test that known methods are registered to the correct object."""
2456
self.assertHandlerEqual('Branch.break_lock',
2457
smart_branch.SmartServerBranchBreakLock)
1833
2458
self.assertHandlerEqual('Branch.get_config_file',
1834
2459
smart_branch.SmartServerBranchGetConfigFile)
2460
self.assertHandlerEqual('Branch.put_config_file',
2461
smart_branch.SmartServerBranchPutConfigFile)
1835
2462
self.assertHandlerEqual('Branch.get_parent',
1836
2463
smart_branch.SmartServerBranchGetParent)
2464
self.assertHandlerEqual('Branch.get_physical_lock_status',
2465
smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
1837
2466
self.assertHandlerEqual('Branch.get_tags_bytes',
1838
2467
smart_branch.SmartServerBranchGetTagsBytes)
1839
2468
self.assertHandlerEqual('Branch.lock_write',
1874
2509
smart_dir.SmartServerRequestOpenBranchV3)
1875
2510
self.assertHandlerEqual('PackRepository.autopack',
1876
2511
smart_packrepo.SmartServerPackRepositoryAutopack)
2512
self.assertHandlerEqual('Repository.add_signature_text',
2513
smart_repo.SmartServerRepositoryAddSignatureText)
2514
self.assertHandlerEqual('Repository.all_revision_ids',
2515
smart_repo.SmartServerRepositoryAllRevisionIds)
2516
self.assertHandlerEqual('Repository.break_lock',
2517
smart_repo.SmartServerRepositoryBreakLock)
1877
2518
self.assertHandlerEqual('Repository.gather_stats',
1878
2519
smart_repo.SmartServerRepositoryGatherStats)
1879
2520
self.assertHandlerEqual('Repository.get_parent_map',
1880
2521
smart_repo.SmartServerRepositoryGetParentMap)
2522
self.assertHandlerEqual('Repository.get_physical_lock_status',
2523
smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
1881
2524
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1882
2525
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1883
2526
self.assertHandlerEqual('Repository.get_revision_graph',
1884
2527
smart_repo.SmartServerRepositoryGetRevisionGraph)
2528
self.assertHandlerEqual('Repository.get_revision_signature_text',
2529
smart_repo.SmartServerRepositoryGetRevisionSignatureText)
1885
2530
self.assertHandlerEqual('Repository.get_stream',
1886
2531
smart_repo.SmartServerRepositoryGetStream)
2532
self.assertHandlerEqual('Repository.get_stream_1.19',
2533
smart_repo.SmartServerRepositoryGetStream_1_19)
2534
self.assertHandlerEqual('Repository.iter_revisions',
2535
smart_repo.SmartServerRepositoryIterRevisions)
1887
2536
self.assertHandlerEqual('Repository.has_revision',
1888
2537
smart_repo.SmartServerRequestHasRevision)
1889
2538
self.assertHandlerEqual('Repository.insert_stream',
1892
2541
smart_repo.SmartServerRepositoryInsertStreamLocked)
1893
2542
self.assertHandlerEqual('Repository.is_shared',
1894
2543
smart_repo.SmartServerRepositoryIsShared)
2544
self.assertHandlerEqual('Repository.iter_files_bytes',
2545
smart_repo.SmartServerRepositoryIterFilesBytes)
1895
2546
self.assertHandlerEqual('Repository.lock_write',
1896
2547
smart_repo.SmartServerRepositoryLockWrite)
2548
self.assertHandlerEqual('Repository.make_working_trees',
2549
smart_repo.SmartServerRepositoryMakeWorkingTrees)
2550
self.assertHandlerEqual('Repository.pack',
2551
smart_repo.SmartServerRepositoryPack)
2552
self.assertHandlerEqual('Repository.reconcile',
2553
smart_repo.SmartServerRepositoryReconcile)
1897
2554
self.assertHandlerEqual('Repository.tarball',
1898
2555
smart_repo.SmartServerRepositoryTarball)
1899
2556
self.assertHandlerEqual('Repository.unlock',
1900
2557
smart_repo.SmartServerRepositoryUnlock)
2558
self.assertHandlerEqual('Repository.start_write_group',
2559
smart_repo.SmartServerRepositoryStartWriteGroup)
2560
self.assertHandlerEqual('Repository.check_write_group',
2561
smart_repo.SmartServerRepositoryCheckWriteGroup)
2562
self.assertHandlerEqual('Repository.commit_write_group',
2563
smart_repo.SmartServerRepositoryCommitWriteGroup)
2564
self.assertHandlerEqual('Repository.abort_write_group',
2565
smart_repo.SmartServerRepositoryAbortWriteGroup)
2566
self.assertHandlerEqual('VersionedFileRepository.get_serializer_format',
2567
smart_repo.SmartServerRepositoryGetSerializerFormat)
1901
2568
self.assertHandlerEqual('Transport.is_readonly',
1902
2569
smart_req.SmartServerIsReadonly)
2572
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
2573
"""Tests for SmartTCPServer hooks."""
2576
super(SmartTCPServerHookTests, self).setUp()
2577
self.server = server.SmartTCPServer(self.get_transport())
2579
def test_run_server_started_hooks(self):
2580
"""Test the server started hooks get fired properly."""
2582
server.SmartTCPServer.hooks.install_named_hook('server_started',
2583
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2585
started_ex_calls = []
2586
server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
2587
lambda backing_urls, url: started_ex_calls.append((backing_urls, url)),
2589
self.server._sockname = ('example.com', 42)
2590
self.server.run_server_started_hooks()
2591
self.assertEquals(started_calls,
2592
[([self.get_transport().base], 'bzr://example.com:42/')])
2593
self.assertEquals(started_ex_calls,
2594
[([self.get_transport().base], self.server)])
2596
def test_run_server_started_hooks_ipv6(self):
2597
"""Test that socknames can contain 4-tuples."""
2598
self.server._sockname = ('::', 42, 0, 0)
2600
server.SmartTCPServer.hooks.install_named_hook('server_started',
2601
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2603
self.server.run_server_started_hooks()
2604
self.assertEquals(started_calls,
2605
[([self.get_transport().base], 'bzr://:::42/')])
2607
def test_run_server_stopped_hooks(self):
2608
"""Test the server stopped hooks."""
2609
self.server._sockname = ('example.com', 42)
2611
server.SmartTCPServer.hooks.install_named_hook('server_stopped',
2612
lambda backing_urls, url: stopped_calls.append((backing_urls, url)),
2614
self.server.run_server_stopped_hooks()
2615
self.assertEquals(stopped_calls,
2616
[([self.get_transport().base], 'bzr://example.com:42/')])
2619
class TestSmartServerRepositoryPack(tests.TestCaseWithMemoryTransport):
2621
def test_pack(self):
2622
backing = self.get_transport()
2623
request = smart_repo.SmartServerRepositoryPack(backing)
2624
tree = self.make_branch_and_memory_tree('.')
2625
repo_token = tree.branch.repository.lock_write().repository_token
2627
self.assertIs(None, request.execute('', repo_token, False))
2630
smart_req.SuccessfulSmartServerResponse(('ok', ), ),
2631
request.do_body(''))