225
227
self.assertEqual(expected, request.execute('', 'False'))
230
class TestSmartServerBzrDirRequestCloningMetaDir(
231
tests.TestCaseWithMemoryTransport):
232
"""Tests for BzrDir.checkout_metadir."""
234
def test_checkout_metadir(self):
235
backing = self.get_transport()
236
request = smart_dir.SmartServerBzrDirRequestCheckoutMetaDir(
238
branch = self.make_branch('.', format='2a')
239
response = request.execute('')
241
smart_req.SmartServerResponse(
242
('Bazaar-NG meta directory, format 1\n',
243
'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
244
'Bazaar Branch Format 7 (needs bzr 1.6)\n')),
248
class TestSmartServerBzrDirRequestDestroyBranch(
249
tests.TestCaseWithMemoryTransport):
250
"""Tests for BzrDir.destroy_branch."""
252
def test_destroy_branch_default(self):
253
"""The default branch can be removed."""
254
backing = self.get_transport()
255
dir = self.make_branch('.').bzrdir
256
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
257
request = request_class(backing)
258
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
259
self.assertEqual(expected, request.execute('', None))
261
def test_destroy_branch_named(self):
262
"""A named branch can be removed."""
263
backing = self.get_transport()
264
dir = self.make_repository('.', format="development-colo").bzrdir
265
dir.create_branch(name="branchname")
266
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
267
request = request_class(backing)
268
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
269
self.assertEqual(expected, request.execute('', "branchname"))
271
def test_destroy_branch_missing(self):
272
"""An error is raised if the branch didn't exist."""
273
backing = self.get_transport()
274
dir = self.make_bzrdir('.', format="development-colo")
275
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
276
request = request_class(backing)
277
expected = smart_req.FailedSmartServerResponse(('nobranch',), None)
278
self.assertEqual(expected, request.execute('', "branchname"))
281
class TestSmartServerBzrDirRequestHasWorkingTree(
282
tests.TestCaseWithTransport):
283
"""Tests for BzrDir.has_workingtree."""
285
def test_has_workingtree_yes(self):
286
"""A working tree is present."""
287
backing = self.get_transport()
288
dir = self.make_branch_and_tree('.').bzrdir
289
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
290
request = request_class(backing)
291
expected = smart_req.SuccessfulSmartServerResponse(('yes',))
292
self.assertEqual(expected, request.execute(''))
294
def test_has_workingtree_no(self):
295
"""A working tree is missing."""
296
backing = self.get_transport()
297
dir = self.make_bzrdir('.')
298
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
299
request = request_class(backing)
300
expected = smart_req.SuccessfulSmartServerResponse(('no',))
301
self.assertEqual(expected, request.execute(''))
304
class TestSmartServerBzrDirRequestDestroyRepository(
305
tests.TestCaseWithMemoryTransport):
306
"""Tests for BzrDir.destroy_repository."""
308
def test_destroy_repository_default(self):
309
"""The repository can be removed."""
310
backing = self.get_transport()
311
dir = self.make_repository('.').bzrdir
312
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
313
request = request_class(backing)
314
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
315
self.assertEqual(expected, request.execute(''))
317
def test_destroy_repository_missing(self):
318
"""An error is raised if the repository didn't exist."""
319
backing = self.get_transport()
320
dir = self.make_bzrdir('.')
321
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
322
request = request_class(backing)
323
expected = smart_req.FailedSmartServerResponse(
324
('norepository',), None)
325
self.assertEqual(expected, request.execute(''))
228
328
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
229
329
"""Tests for BzrDir.create_repository."""
360
460
self.assertEqual(expected, request.execute(''))
463
class TestSmartServerBzrDirRequestGetBranches(
464
tests.TestCaseWithMemoryTransport):
465
"""Tests for BzrDir.get_branches."""
467
def test_simple(self):
468
backing = self.get_transport()
469
branch = self.make_branch('.')
470
request_class = smart_dir.SmartServerBzrDirRequestGetBranches
471
request = request_class(backing)
472
local_result = bencode.bencode(
473
{"": ("branch", branch._format.network_name())})
474
expected = smart_req.SuccessfulSmartServerResponse(
475
("success", ), local_result)
476
self.assertEqual(expected, request.execute(''))
478
def test_empty(self):
479
backing = self.get_transport()
480
dir = self.make_bzrdir('.')
481
request_class = smart_dir.SmartServerBzrDirRequestGetBranches
482
request = request_class(backing)
483
local_result = bencode.bencode({})
484
expected = smart_req.SuccessfulSmartServerResponse(
485
('success',), local_result)
486
self.assertEqual(expected, request.execute(''))
363
489
class TestSmartServerRequestInitializeBzrDir(tests.TestCaseWithMemoryTransport):
365
491
def test_empty_dir(self):
983
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
986
TestLockedBranch.setUp(self)
987
# A dict with non-ascii keys and values to exercise unicode
989
self.encoded_value_dict = (
990
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
992
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
994
def test_value_name(self):
995
branch = self.make_branch('.')
996
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
997
branch.bzrdir.root_transport)
998
branch_token, repo_token = self.get_lock_tokens(branch)
999
config = branch._get_config()
1000
result = request.execute('', branch_token, repo_token,
1001
self.encoded_value_dict, 'foo', '')
1002
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
1003
self.assertEqual(self.value_dict, config.get_option('foo'))
1007
def test_value_name_section(self):
1008
branch = self.make_branch('.')
1009
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
1010
branch.bzrdir.root_transport)
1011
branch_token, repo_token = self.get_lock_tokens(branch)
1012
config = branch._get_config()
1013
result = request.execute('', branch_token, repo_token,
1014
self.encoded_value_dict, 'foo', 'gam')
1015
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
1016
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
805
1021
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
806
1022
# Only called when the branch format and tags match [yay factory
807
1023
# methods] so only need to test straight forward cases.
1082
1318
branch.unlock()
1083
1319
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1084
1320
self.get_transport())
1085
branch_token = branch.lock_write()
1086
repo_token = branch.repository.lock_write()
1321
branch_token, repo_token = self.get_lock_tokens(branch)
1088
1323
response = request.execute('base', branch_token, repo_token, '')
1090
branch.repository.unlock()
1091
1325
branch.unlock()
1092
1326
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1327
# Refresh branch as SetParentLocation modified it
1328
branch = branch.bzrdir.open_branch()
1093
1329
self.assertEqual(None, branch.get_parent())
1095
1331
def test_set_parent_something(self):
1096
1332
branch = self.make_branch('base', format="1.9")
1097
1333
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1098
1334
self.get_transport())
1099
branch_token = branch.lock_write()
1100
repo_token = branch.repository.lock_write()
1335
branch_token, repo_token = self.get_lock_tokens(branch)
1102
1337
response = request.execute('base', branch_token, repo_token,
1105
branch.repository.unlock()
1106
1340
branch.unlock()
1107
1341
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1108
self.assertEqual('http://bar/', branch.get_parent())
1342
refreshed = _mod_branch.Branch.open(branch.base)
1343
self.assertEqual('http://bar/', refreshed.get_parent())
1111
1346
class TestSmartServerBranchRequestGetTagsBytes(
1249
1477
self.assertEqual('LockFailed', error_name)
1252
class TestSmartServerBranchRequestUnlock(tests.TestCaseWithMemoryTransport):
1255
tests.TestCaseWithMemoryTransport.setUp(self)
1480
class TestSmartServerBranchRequestGetPhysicalLockStatus(TestLockedBranch):
1482
def test_true(self):
1483
backing = self.get_transport()
1484
request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1486
branch = self.make_branch('.')
1487
branch_token, repo_token = self.get_lock_tokens(branch)
1488
self.assertEqual(True, branch.get_physical_lock_status())
1489
response = request.execute('')
1491
smart_req.SmartServerResponse(('yes',)), response)
1494
def test_false(self):
1495
backing = self.get_transport()
1496
request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1498
branch = self.make_branch('.')
1499
self.assertEqual(False, branch.get_physical_lock_status())
1500
response = request.execute('')
1502
smart_req.SmartServerResponse(('no',)), response)
1505
class TestSmartServerBranchRequestUnlock(TestLockedBranch):
1257
1507
def test_unlock_on_locked_branch_and_repo(self):
1258
1508
backing = self.get_transport()
1259
1509
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1260
1510
branch = self.make_branch('.', format='knit')
1261
1511
# Lock the branch
1262
branch_token = branch.lock_write()
1263
repo_token = branch.repository.lock_write()
1264
branch.repository.unlock()
1512
branch_token, repo_token = self.get_lock_tokens(branch)
1265
1513
# Unlock the branch (and repo) object, leaving the physical locks
1267
1515
branch.leave_lock_in_place()
1322
1569
request.execute, 'subdir')
1572
class TestSmartServerRepositoryAddSignatureText(tests.TestCaseWithMemoryTransport):
1574
def test_add_text(self):
1575
backing = self.get_transport()
1576
request = smart_repo.SmartServerRepositoryAddSignatureText(backing)
1577
tree = self.make_branch_and_memory_tree('.')
1578
write_token = tree.lock_write()
1579
self.addCleanup(tree.unlock)
1581
tree.commit("Message", rev_id='rev1')
1582
tree.branch.repository.start_write_group()
1583
write_group_tokens = tree.branch.repository.suspend_write_group()
1584
self.assertEqual(None, request.execute('', write_token,
1585
'rev1', *write_group_tokens))
1586
response = request.do_body('somesignature')
1587
self.assertTrue(response.is_successful())
1588
self.assertEqual(response.args[0], 'ok')
1589
write_group_tokens = response.args[1:]
1590
tree.branch.repository.resume_write_group(write_group_tokens)
1591
tree.branch.repository.commit_write_group()
1593
self.assertEqual("somesignature",
1594
tree.branch.repository.get_signature_text("rev1"))
1597
class TestSmartServerRepositoryAllRevisionIds(
1598
tests.TestCaseWithMemoryTransport):
1600
def test_empty(self):
1601
"""An empty body should be returned for an empty repository."""
1602
backing = self.get_transport()
1603
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1604
self.make_repository('.')
1606
smart_req.SuccessfulSmartServerResponse(("ok", ), ""),
1607
request.execute(''))
1609
def test_some_revisions(self):
1610
"""An empty body should be returned for an empty repository."""
1611
backing = self.get_transport()
1612
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1613
tree = self.make_branch_and_memory_tree('.')
1616
tree.commit(rev_id='origineel', message="message")
1617
tree.commit(rev_id='nog-een-revisie', message="message")
1620
smart_req.SuccessfulSmartServerResponse(("ok", ),
1621
"origineel\nnog-een-revisie"),
1622
request.execute(''))
1625
class TestSmartServerRepositoryBreakLock(tests.TestCaseWithMemoryTransport):
1627
def test_lock_to_break(self):
1628
backing = self.get_transport()
1629
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1630
tree = self.make_branch_and_memory_tree('.')
1631
tree.branch.repository.lock_write()
1633
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1634
request.execute(''))
1636
def test_nothing_to_break(self):
1637
backing = self.get_transport()
1638
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1639
tree = self.make_branch_and_memory_tree('.')
1641
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1642
request.execute(''))
1325
1645
class TestSmartServerRepositoryGetParentMap(tests.TestCaseWithMemoryTransport):
1327
1647
def test_trivial_bzipped(self):
1447
1767
request.execute('stacked', 1, (3, r3)))
1450
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1770
class TestSmartServerRepositoryIterRevisions(
1771
tests.TestCaseWithMemoryTransport):
1773
def test_basic(self):
1774
backing = self.get_transport()
1775
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1776
tree = self.make_branch_and_memory_tree('.', format='2a')
1779
tree.commit('1st commit', rev_id="rev1")
1780
tree.commit('2nd commit', rev_id="rev2")
1783
self.assertIs(None, request.execute(''))
1784
response = request.do_body("rev1\nrev2")
1785
self.assertTrue(response.is_successful())
1786
# Format 2a uses serializer format 10
1787
self.assertEqual(response.args, ("ok", "10"))
1789
self.addCleanup(tree.branch.lock_read().unlock)
1790
entries = [zlib.compress(record.get_bytes_as("fulltext")) for record in
1791
tree.branch.repository.revisions.get_record_stream(
1792
[("rev1", ), ("rev2", )], "unordered", True)]
1794
contents = "".join(response.body_stream)
1795
self.assertTrue(contents in (
1796
"".join([entries[0], entries[1]]),
1797
"".join([entries[1], entries[0]])))
1799
def test_missing(self):
1800
backing = self.get_transport()
1801
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1802
tree = self.make_branch_and_memory_tree('.', format='2a')
1804
self.assertIs(None, request.execute(''))
1805
response = request.do_body("rev1\nrev2")
1806
self.assertTrue(response.is_successful())
1807
# Format 2a uses serializer format 10
1808
self.assertEqual(response.args, ("ok", "10"))
1810
contents = "".join(response.body_stream)
1811
self.assertEqual(contents, "")
1814
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
1452
1816
def make_two_commit_repo(self):
1453
1817
tree = self.make_branch_and_memory_tree('.')
1511
1890
request.execute('', rev_id_utf8))
1893
class TestSmartServerRepositoryIterFilesBytes(tests.TestCaseWithTransport):
1895
def test_single(self):
1896
backing = self.get_transport()
1897
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1898
t = self.make_branch_and_tree('.')
1899
self.addCleanup(t.lock_write().unlock)
1900
self.build_tree_contents([("file", "somecontents")])
1901
t.add(["file"], ["thefileid"])
1902
t.commit(rev_id='somerev', message="add file")
1903
self.assertIs(None, request.execute(''))
1904
response = request.do_body("thefileid\0somerev\n")
1905
self.assertTrue(response.is_successful())
1906
self.assertEqual(response.args, ("ok", ))
1907
self.assertEqual("".join(response.body_stream),
1908
"ok\x000\n" + zlib.compress("somecontents"))
1910
def test_missing(self):
1911
backing = self.get_transport()
1912
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1913
t = self.make_branch_and_tree('.')
1914
self.addCleanup(t.lock_write().unlock)
1915
self.assertIs(None, request.execute(''))
1916
response = request.do_body("thefileid\0revision\n")
1917
self.assertTrue(response.is_successful())
1918
self.assertEqual(response.args, ("ok", ))
1919
self.assertEqual("".join(response.body_stream),
1920
"absent\x00thefileid\x00revision\x000\n")
1923
class TestSmartServerRequestHasSignatureForRevisionId(
1924
tests.TestCaseWithMemoryTransport):
1926
def test_missing_revision(self):
1927
"""For a missing revision, NoSuchRevision is returned."""
1928
backing = self.get_transport()
1929
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1931
self.make_repository('.')
1933
smart_req.FailedSmartServerResponse(
1934
('nosuchrevision', 'revid'), None),
1935
request.execute('', 'revid'))
1937
def test_missing_signature(self):
1938
"""For a missing signature, ('no', ) is returned."""
1939
backing = self.get_transport()
1940
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1942
tree = self.make_branch_and_memory_tree('.')
1945
r1 = tree.commit('a commit', rev_id='A')
1947
self.assertTrue(tree.branch.repository.has_revision('A'))
1948
self.assertEqual(smart_req.SmartServerResponse(('no', )),
1949
request.execute('', 'A'))
1951
def test_present_signature(self):
1952
"""For a present signature, ('yes', ) is returned."""
1953
backing = self.get_transport()
1954
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1956
strategy = gpg.LoopbackGPGStrategy(None)
1957
tree = self.make_branch_and_memory_tree('.')
1960
r1 = tree.commit('a commit', rev_id='A')
1961
tree.branch.repository.start_write_group()
1962
tree.branch.repository.sign_revision('A', strategy)
1963
tree.branch.repository.commit_write_group()
1965
self.assertTrue(tree.branch.repository.has_revision('A'))
1966
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
1967
request.execute('', 'A'))
1514
1970
class TestSmartServerRepositoryGatherStats(tests.TestCaseWithMemoryTransport):
1516
1972
def test_empty_revid(self):
1589
2056
request.execute('', ))
2059
class TestSmartServerRepositoryGetRevisionSignatureText(
2060
tests.TestCaseWithMemoryTransport):
2062
def test_get_signature(self):
2063
backing = self.get_transport()
2064
request = smart_repo.SmartServerRepositoryGetRevisionSignatureText(
2066
bb = self.make_branch_builder('.')
2067
bb.build_commit(rev_id='A')
2068
repo = bb.get_branch().repository
2069
strategy = gpg.LoopbackGPGStrategy(None)
2070
self.addCleanup(repo.lock_write().unlock)
2071
repo.start_write_group()
2072
repo.sign_revision('A', strategy)
2073
repo.commit_write_group()
2075
'-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
2076
Testament.from_revision(repo, 'A').as_short_text() +
2077
'-----END PSEUDO-SIGNED CONTENT-----\n')
2079
smart_req.SmartServerResponse(('ok', ), expected_body),
2080
request.execute('', 'A'))
2083
class TestSmartServerRepositoryMakeWorkingTrees(
2084
tests.TestCaseWithMemoryTransport):
2086
def test_make_working_trees(self):
2087
"""For a repository with working trees, ('yes', ) is returned."""
2088
backing = self.get_transport()
2089
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2090
r = self.make_repository('.')
2091
r.set_make_working_trees(True)
2092
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
2093
request.execute('', ))
2095
def test_is_not_shared(self):
2096
"""For a repository with working trees, ('no', ) is returned."""
2097
backing = self.get_transport()
2098
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2099
r = self.make_repository('.')
2100
r.set_make_working_trees(False)
2101
self.assertEqual(smart_req.SmartServerResponse(('no', )),
2102
request.execute('', ))
1592
2105
class TestSmartServerRepositoryLockWrite(tests.TestCaseWithMemoryTransport):
1594
2107
def test_lock_write_on_unlocked_repo(self):
1708
2218
smart_req.SmartServerResponse(('TokenMismatch',)), response)
2221
class TestSmartServerRepositoryGetPhysicalLockStatus(
2222
tests.TestCaseWithTransport):
2224
def test_with_write_lock(self):
2225
backing = self.get_transport()
2226
repo = self.make_repository('.')
2227
self.addCleanup(repo.lock_write().unlock)
2228
# lock_write() doesn't necessarily actually take a physical
2230
if repo.get_physical_lock_status():
2234
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2235
request = request_class(backing)
2236
self.assertEqual(smart_req.SuccessfulSmartServerResponse((expected,)),
2237
request.execute('', ))
2239
def test_without_write_lock(self):
2240
backing = self.get_transport()
2241
repo = self.make_repository('.')
2242
self.assertEqual(False, repo.get_physical_lock_status())
2243
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2244
request = request_class(backing)
2245
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('no',)),
2246
request.execute('', ))
2249
class TestSmartServerRepositoryReconcile(tests.TestCaseWithTransport):
2251
def test_reconcile(self):
2252
backing = self.get_transport()
2253
repo = self.make_repository('.')
2254
token = repo.lock_write().repository_token
2255
self.addCleanup(repo.unlock)
2256
request_class = smart_repo.SmartServerRepositoryReconcile
2257
request = request_class(backing)
2258
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
2260
'garbage_inventories: 0\n'
2261
'inconsistent_parents: 0\n'),
2262
request.execute('', token))
1711
2265
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1713
2267
def test_is_readonly_no(self):
1751
2305
self.assertTrue(repo.make_working_trees())
2308
class TestSmartServerRepositoryGetSerializerFormat(
2309
tests.TestCaseWithMemoryTransport):
2311
def test_get_serializer_format(self):
2312
backing = self.get_transport()
2313
repo = self.make_repository('.', format='2a')
2314
request_class = smart_repo.SmartServerRepositoryGetSerializerFormat
2315
request = request_class(backing)
2317
smart_req.SuccessfulSmartServerResponse(('ok', '10')),
2318
request.execute(''))
2321
class TestSmartServerRepositoryWriteGroup(
2322
tests.TestCaseWithMemoryTransport):
2324
def test_start_write_group(self):
2325
backing = self.get_transport()
2326
repo = self.make_repository('.')
2327
lock_token = repo.lock_write().repository_token
2328
self.addCleanup(repo.unlock)
2329
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2330
request = request_class(backing)
2331
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok', [])),
2332
request.execute('', lock_token))
2334
def test_start_write_group_unsuspendable(self):
2335
backing = self.get_transport()
2336
repo = self.make_repository('.', format='knit')
2337
lock_token = repo.lock_write().repository_token
2338
self.addCleanup(repo.unlock)
2339
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2340
request = request_class(backing)
2342
smart_req.FailedSmartServerResponse(('UnsuspendableWriteGroup',)),
2343
request.execute('', lock_token))
2345
def test_commit_write_group(self):
2346
backing = self.get_transport()
2347
repo = self.make_repository('.')
2348
lock_token = repo.lock_write().repository_token
2349
self.addCleanup(repo.unlock)
2350
repo.start_write_group()
2351
tokens = repo.suspend_write_group()
2352
request_class = smart_repo.SmartServerRepositoryCommitWriteGroup
2353
request = request_class(backing)
2354
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2355
request.execute('', lock_token, tokens))
2357
def test_abort_write_group(self):
2358
backing = self.get_transport()
2359
repo = self.make_repository('.')
2360
lock_token = repo.lock_write().repository_token
2361
repo.start_write_group()
2362
tokens = repo.suspend_write_group()
2363
self.addCleanup(repo.unlock)
2364
request_class = smart_repo.SmartServerRepositoryAbortWriteGroup
2365
request = request_class(backing)
2366
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2367
request.execute('', lock_token, tokens))
2369
def test_check_write_group(self):
2370
backing = self.get_transport()
2371
repo = self.make_repository('.')
2372
lock_token = repo.lock_write().repository_token
2373
repo.start_write_group()
2374
tokens = repo.suspend_write_group()
2375
self.addCleanup(repo.unlock)
2376
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2377
request = request_class(backing)
2378
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2379
request.execute('', lock_token, tokens))
2381
def test_check_write_group_invalid(self):
2382
backing = self.get_transport()
2383
repo = self.make_repository('.')
2384
lock_token = repo.lock_write().repository_token
2385
self.addCleanup(repo.unlock)
2386
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2387
request = request_class(backing)
2388
self.assertEqual(smart_req.FailedSmartServerResponse(
2389
('UnresumableWriteGroup', ['random'],
2390
'Malformed write group token')),
2391
request.execute('', lock_token, ["random"]))
1754
2394
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
1756
2396
def make_repo_needing_autopacking(self, path='.'):
1822
2462
"""All registered request_handlers can be found."""
1823
2463
# If there's a typo in a register_lazy call, this loop will fail with
1824
2464
# an AttributeError.
1825
for key, item in smart_req.request_handlers.iteritems():
2465
for key in smart_req.request_handlers.keys():
2467
item = smart_req.request_handlers.get(key)
2468
except AttributeError as e:
2469
raise AttributeError('failed to get %s: %s' % (key, e))
1828
2471
def assertHandlerEqual(self, verb, handler):
1829
2472
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1831
2474
def test_registered_methods(self):
1832
2475
"""Test that known methods are registered to the correct object."""
2476
self.assertHandlerEqual('Branch.break_lock',
2477
smart_branch.SmartServerBranchBreakLock)
1833
2478
self.assertHandlerEqual('Branch.get_config_file',
1834
2479
smart_branch.SmartServerBranchGetConfigFile)
2480
self.assertHandlerEqual('Branch.put_config_file',
2481
smart_branch.SmartServerBranchPutConfigFile)
1835
2482
self.assertHandlerEqual('Branch.get_parent',
1836
2483
smart_branch.SmartServerBranchGetParent)
2484
self.assertHandlerEqual('Branch.get_physical_lock_status',
2485
smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
1837
2486
self.assertHandlerEqual('Branch.get_tags_bytes',
1838
2487
smart_branch.SmartServerBranchGetTagsBytes)
1839
2488
self.assertHandlerEqual('Branch.lock_write',
1874
2531
smart_dir.SmartServerRequestOpenBranchV3)
1875
2532
self.assertHandlerEqual('PackRepository.autopack',
1876
2533
smart_packrepo.SmartServerPackRepositoryAutopack)
2534
self.assertHandlerEqual('Repository.add_signature_text',
2535
smart_repo.SmartServerRepositoryAddSignatureText)
2536
self.assertHandlerEqual('Repository.all_revision_ids',
2537
smart_repo.SmartServerRepositoryAllRevisionIds)
2538
self.assertHandlerEqual('Repository.break_lock',
2539
smart_repo.SmartServerRepositoryBreakLock)
1877
2540
self.assertHandlerEqual('Repository.gather_stats',
1878
2541
smart_repo.SmartServerRepositoryGatherStats)
1879
2542
self.assertHandlerEqual('Repository.get_parent_map',
1880
2543
smart_repo.SmartServerRepositoryGetParentMap)
2544
self.assertHandlerEqual('Repository.get_physical_lock_status',
2545
smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
1881
2546
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1882
2547
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1883
2548
self.assertHandlerEqual('Repository.get_revision_graph',
1884
2549
smart_repo.SmartServerRepositoryGetRevisionGraph)
2550
self.assertHandlerEqual('Repository.get_revision_signature_text',
2551
smart_repo.SmartServerRepositoryGetRevisionSignatureText)
1885
2552
self.assertHandlerEqual('Repository.get_stream',
1886
2553
smart_repo.SmartServerRepositoryGetStream)
2554
self.assertHandlerEqual('Repository.get_stream_1.19',
2555
smart_repo.SmartServerRepositoryGetStream_1_19)
2556
self.assertHandlerEqual('Repository.iter_revisions',
2557
smart_repo.SmartServerRepositoryIterRevisions)
1887
2558
self.assertHandlerEqual('Repository.has_revision',
1888
2559
smart_repo.SmartServerRequestHasRevision)
1889
2560
self.assertHandlerEqual('Repository.insert_stream',
1892
2563
smart_repo.SmartServerRepositoryInsertStreamLocked)
1893
2564
self.assertHandlerEqual('Repository.is_shared',
1894
2565
smart_repo.SmartServerRepositoryIsShared)
2566
self.assertHandlerEqual('Repository.iter_files_bytes',
2567
smart_repo.SmartServerRepositoryIterFilesBytes)
1895
2568
self.assertHandlerEqual('Repository.lock_write',
1896
2569
smart_repo.SmartServerRepositoryLockWrite)
2570
self.assertHandlerEqual('Repository.make_working_trees',
2571
smart_repo.SmartServerRepositoryMakeWorkingTrees)
2572
self.assertHandlerEqual('Repository.pack',
2573
smart_repo.SmartServerRepositoryPack)
2574
self.assertHandlerEqual('Repository.reconcile',
2575
smart_repo.SmartServerRepositoryReconcile)
1897
2576
self.assertHandlerEqual('Repository.tarball',
1898
2577
smart_repo.SmartServerRepositoryTarball)
1899
2578
self.assertHandlerEqual('Repository.unlock',
1900
2579
smart_repo.SmartServerRepositoryUnlock)
2580
self.assertHandlerEqual('Repository.start_write_group',
2581
smart_repo.SmartServerRepositoryStartWriteGroup)
2582
self.assertHandlerEqual('Repository.check_write_group',
2583
smart_repo.SmartServerRepositoryCheckWriteGroup)
2584
self.assertHandlerEqual('Repository.commit_write_group',
2585
smart_repo.SmartServerRepositoryCommitWriteGroup)
2586
self.assertHandlerEqual('Repository.abort_write_group',
2587
smart_repo.SmartServerRepositoryAbortWriteGroup)
2588
self.assertHandlerEqual('VersionedFileRepository.get_serializer_format',
2589
smart_repo.SmartServerRepositoryGetSerializerFormat)
2590
self.assertHandlerEqual('VersionedFileRepository.get_inventories',
2591
smart_repo.SmartServerRepositoryGetInventories)
1901
2592
self.assertHandlerEqual('Transport.is_readonly',
1902
2593
smart_req.SmartServerIsReadonly)
2596
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
2597
"""Tests for SmartTCPServer hooks."""
2600
super(SmartTCPServerHookTests, self).setUp()
2601
self.server = server.SmartTCPServer(self.get_transport())
2603
def test_run_server_started_hooks(self):
2604
"""Test the server started hooks get fired properly."""
2606
server.SmartTCPServer.hooks.install_named_hook('server_started',
2607
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2609
started_ex_calls = []
2610
server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
2611
lambda backing_urls, url: started_ex_calls.append((backing_urls, url)),
2613
self.server._sockname = ('example.com', 42)
2614
self.server.run_server_started_hooks()
2615
self.assertEqual(started_calls,
2616
[([self.get_transport().base], 'bzr://example.com:42/')])
2617
self.assertEqual(started_ex_calls,
2618
[([self.get_transport().base], self.server)])
2620
def test_run_server_started_hooks_ipv6(self):
2621
"""Test that socknames can contain 4-tuples."""
2622
self.server._sockname = ('::', 42, 0, 0)
2624
server.SmartTCPServer.hooks.install_named_hook('server_started',
2625
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2627
self.server.run_server_started_hooks()
2628
self.assertEqual(started_calls,
2629
[([self.get_transport().base], 'bzr://:::42/')])
2631
def test_run_server_stopped_hooks(self):
2632
"""Test the server stopped hooks."""
2633
self.server._sockname = ('example.com', 42)
2635
server.SmartTCPServer.hooks.install_named_hook('server_stopped',
2636
lambda backing_urls, url: stopped_calls.append((backing_urls, url)),
2638
self.server.run_server_stopped_hooks()
2639
self.assertEqual(stopped_calls,
2640
[([self.get_transport().base], 'bzr://example.com:42/')])
2643
class TestSmartServerRepositoryPack(tests.TestCaseWithMemoryTransport):
2645
def test_pack(self):
2646
backing = self.get_transport()
2647
request = smart_repo.SmartServerRepositoryPack(backing)
2648
tree = self.make_branch_and_memory_tree('.')
2649
repo_token = tree.branch.repository.lock_write().repository_token
2651
self.assertIs(None, request.execute('', repo_token, False))
2654
smart_req.SuccessfulSmartServerResponse(('ok', ), ),
2655
request.do_body(''))
2658
class TestSmartServerRepositoryGetInventories(tests.TestCaseWithTransport):
2660
def _get_serialized_inventory_delta(self, repository, base_revid, revid):
2661
base_inv = repository.revision_tree(base_revid).root_inventory
2662
inv = repository.revision_tree(revid).root_inventory
2663
inv_delta = inv._make_delta(base_inv)
2664
serializer = inventory_delta.InventoryDeltaSerializer(True, False)
2665
return "".join(serializer.delta_to_lines(base_revid, revid, inv_delta))
2667
def test_single(self):
2668
backing = self.get_transport()
2669
request = smart_repo.SmartServerRepositoryGetInventories(backing)
2670
t = self.make_branch_and_tree('.', format='2a')
2671
self.addCleanup(t.lock_write().unlock)
2672
self.build_tree_contents([("file", "somecontents")])
2673
t.add(["file"], ["thefileid"])
2674
t.commit(rev_id='somerev', message="add file")
2675
self.assertIs(None, request.execute('', 'unordered'))
2676
response = request.do_body("somerev\n")
2677
self.assertTrue(response.is_successful())
2678
self.assertEqual(response.args, ("ok", ))
2679
stream = [('inventory-deltas', [
2680
versionedfile.FulltextContentFactory('somerev', None, None,
2681
self._get_serialized_inventory_delta(
2682
t.branch.repository, 'null:', 'somerev'))])]
2683
fmt = controldir.format_registry.get('2a')().repository_format
2685
"".join(response.body_stream),
2686
"".join(smart_repo._stream_to_byte_stream(stream, fmt)))
2688
def test_empty(self):
2689
backing = self.get_transport()
2690
request = smart_repo.SmartServerRepositoryGetInventories(backing)
2691
t = self.make_branch_and_tree('.', format='2a')
2692
self.addCleanup(t.lock_write().unlock)
2693
self.build_tree_contents([("file", "somecontents")])
2694
t.add(["file"], ["thefileid"])
2695
t.commit(rev_id='somerev', message="add file")
2696
self.assertIs(None, request.execute('', 'unordered'))
2697
response = request.do_body("")
2698
self.assertTrue(response.is_successful())
2699
self.assertEqual(response.args, ("ok", ))
2700
self.assertEqual("".join(response.body_stream),
2701
"Bazaar pack format 1 (introduced in 0.18)\nB54\n\nBazaar repository format 2a (needs bzr 1.16 or later)\nE")