225
224
self.assertEqual(expected, request.execute('', 'False'))
227
class TestSmartServerBzrDirRequestDestroyBranch(
228
tests.TestCaseWithMemoryTransport):
229
"""Tests for BzrDir.destroy_branch."""
231
def test_destroy_branch_default(self):
232
"""The default branch can be removed."""
233
backing = self.get_transport()
234
dir = self.make_branch('.').bzrdir
235
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
236
request = request_class(backing)
237
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
238
self.assertEqual(expected, request.execute('', None))
240
def test_destroy_branch_named(self):
241
"""A named branch can be removed."""
242
backing = self.get_transport()
243
dir = self.make_repository('.', format="development-colo").bzrdir
244
dir.create_branch(name="branchname")
245
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
246
request = request_class(backing)
247
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
248
self.assertEqual(expected, request.execute('', "branchname"))
250
def test_destroy_branch_missing(self):
251
"""An error is raised if the branch didn't exist."""
252
backing = self.get_transport()
253
dir = self.make_bzrdir('.', format="development-colo")
254
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
255
request = request_class(backing)
256
expected = smart_req.FailedSmartServerResponse(('nobranch',), None)
257
self.assertEqual(expected, request.execute('', "branchname"))
260
class TestSmartServerBzrDirRequestHasWorkingTree(
261
tests.TestCaseWithTransport):
262
"""Tests for BzrDir.has_workingtree."""
264
def test_has_workingtree_yes(self):
265
"""A working tree is present."""
266
backing = self.get_transport()
267
dir = self.make_branch_and_tree('.').bzrdir
268
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
269
request = request_class(backing)
270
expected = smart_req.SuccessfulSmartServerResponse(('yes',))
271
self.assertEqual(expected, request.execute(''))
273
def test_has_workingtree_no(self):
274
"""A working tree is missing."""
275
backing = self.get_transport()
276
dir = self.make_bzrdir('.')
277
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
278
request = request_class(backing)
279
expected = smart_req.SuccessfulSmartServerResponse(('no',))
280
self.assertEqual(expected, request.execute(''))
283
class TestSmartServerBzrDirRequestDestroyRepository(
284
tests.TestCaseWithMemoryTransport):
285
"""Tests for BzrDir.destroy_repository."""
287
def test_destroy_repository_default(self):
288
"""The repository can be removed."""
289
backing = self.get_transport()
290
dir = self.make_repository('.').bzrdir
291
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
292
request = request_class(backing)
293
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
294
self.assertEqual(expected, request.execute(''))
296
def test_destroy_repository_missing(self):
297
"""An error is raised if the repository didn't exist."""
298
backing = self.get_transport()
299
dir = self.make_bzrdir('.')
300
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
301
request = request_class(backing)
302
expected = smart_req.FailedSmartServerResponse(
303
('norepository',), None)
304
self.assertEqual(expected, request.execute(''))
228
307
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
229
308
"""Tests for BzrDir.create_repository."""
739
818
request.execute(''))
821
class TestSmartServerBranchRequestRevisionIdToRevno(
822
tests.TestCaseWithMemoryTransport):
825
backing = self.get_transport()
826
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
828
self.make_branch('.')
829
self.assertEqual(smart_req.SmartServerResponse(('ok', '0')),
830
request.execute('', 'null:'))
832
def test_simple(self):
833
backing = self.get_transport()
834
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
836
tree = self.make_branch_and_memory_tree('.')
839
r1 = tree.commit('1st commit')
842
smart_req.SmartServerResponse(('ok', '1')),
843
request.execute('', r1))
845
def test_not_found(self):
846
backing = self.get_transport()
847
request = smart_branch.SmartServerBranchRequestRevisionIdToRevno(
849
branch = self.make_branch('.')
851
smart_req.FailedSmartServerResponse(
852
('NoSuchRevision', 'idontexist')),
853
request.execute('', 'idontexist'))
742
856
class TestSmartServerBranchRequestGetConfigFile(
743
857
tests.TestCaseWithMemoryTransport):
767
881
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
769
883
def get_lock_tokens(self, branch):
770
branch_token = branch.lock_write()
771
repo_token = branch.repository.lock_write()
884
branch_token = branch.lock_write().branch_token
885
repo_token = branch.repository.lock_write().repository_token
772
886
branch.repository.unlock()
773
887
return branch_token, repo_token
890
class TestSmartServerBranchRequestPutConfigFile(TestLockedBranch):
892
def test_with_content(self):
893
backing = self.get_transport()
894
request = smart_branch.SmartServerBranchPutConfigFile(backing)
895
branch = self.make_branch('.')
896
branch_token, repo_token = self.get_lock_tokens(branch)
897
self.assertIs(None, request.execute('', branch_token, repo_token))
899
smart_req.SmartServerResponse(('ok', )),
900
request.do_body('foo bar baz'))
902
branch.control_transport.get_bytes('branch.conf'),
776
907
class TestSmartServerBranchRequestSetConfigOption(TestLockedBranch):
778
909
def test_value_name(self):
936
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
939
TestLockedBranch.setUp(self)
940
# A dict with non-ascii keys and values to exercise unicode
942
self.encoded_value_dict = (
943
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
945
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
947
def test_value_name(self):
948
branch = self.make_branch('.')
949
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
950
branch.bzrdir.root_transport)
951
branch_token, repo_token = self.get_lock_tokens(branch)
952
config = branch._get_config()
953
result = request.execute('', branch_token, repo_token,
954
self.encoded_value_dict, 'foo', '')
955
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
956
self.assertEqual(self.value_dict, config.get_option('foo'))
960
def test_value_name_section(self):
961
branch = self.make_branch('.')
962
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
963
branch.bzrdir.root_transport)
964
branch_token, repo_token = self.get_lock_tokens(branch)
965
config = branch._get_config()
966
result = request.execute('', branch_token, repo_token,
967
self.encoded_value_dict, 'foo', 'gam')
968
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
969
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
805
974
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
806
975
# Only called when the branch format and tags match [yay factory
807
976
# methods] so only need to test straight forward cases.
1054
1223
self.assertEqual('child-1', self.tree.branch.last_revision())
1226
class TestSmartServerBranchBreakLock(tests.TestCaseWithMemoryTransport):
1228
def test_lock_to_break(self):
1229
base_branch = self.make_branch('base')
1230
request = smart_branch.SmartServerBranchBreakLock(
1231
self.get_transport())
1232
base_branch.lock_write()
1234
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1235
request.execute('base'))
1237
def test_nothing_to_break(self):
1238
base_branch = self.make_branch('base')
1239
request = smart_branch.SmartServerBranchBreakLock(
1240
self.get_transport())
1242
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1243
request.execute('base'))
1057
1246
class TestSmartServerBranchRequestGetParent(tests.TestCaseWithMemoryTransport):
1059
1248
def test_get_parent_none(self):
1249
1430
self.assertEqual('LockFailed', error_name)
1252
class TestSmartServerBranchRequestUnlock(tests.TestCaseWithMemoryTransport):
1433
class TestSmartServerBranchRequestGetPhysicalLockStatus(TestLockedBranch):
1436
tests.TestCaseWithMemoryTransport.setUp(self)
1438
def test_true(self):
1439
backing = self.get_transport()
1440
request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1442
branch = self.make_branch('.')
1443
branch_token, repo_token = self.get_lock_tokens(branch)
1444
self.assertEquals(True, branch.get_physical_lock_status())
1445
response = request.execute('')
1447
smart_req.SmartServerResponse(('yes',)), response)
1450
def test_false(self):
1451
backing = self.get_transport()
1452
request = smart_branch.SmartServerBranchRequestGetPhysicalLockStatus(
1454
branch = self.make_branch('.')
1455
self.assertEquals(False, branch.get_physical_lock_status())
1456
response = request.execute('')
1458
smart_req.SmartServerResponse(('no',)), response)
1461
class TestSmartServerBranchRequestUnlock(TestLockedBranch):
1254
1463
def setUp(self):
1255
1464
tests.TestCaseWithMemoryTransport.setUp(self)
1322
1528
request.execute, 'subdir')
1531
class TestSmartServerRepositoryAddSignatureText(tests.TestCaseWithMemoryTransport):
1533
def test_add_text(self):
1534
backing = self.get_transport()
1535
request = smart_repo.SmartServerRepositoryAddSignatureText(backing)
1536
tree = self.make_branch_and_memory_tree('.')
1537
write_token = tree.lock_write()
1538
self.addCleanup(tree.unlock)
1540
tree.commit("Message", rev_id='rev1')
1541
tree.branch.repository.start_write_group()
1542
write_group_tokens = tree.branch.repository.suspend_write_group()
1543
self.assertEqual(None, request.execute('', write_token,
1544
'rev1', *write_group_tokens))
1545
response = request.do_body('somesignature')
1546
self.assertTrue(response.is_successful())
1547
self.assertEqual(response.args[0], 'ok')
1548
write_group_tokens = response.args[1:]
1549
tree.branch.repository.resume_write_group(write_group_tokens)
1550
tree.branch.repository.commit_write_group()
1552
self.assertEqual("somesignature",
1553
tree.branch.repository.get_signature_text("rev1"))
1556
class TestSmartServerRepositoryAllRevisionIds(
1557
tests.TestCaseWithMemoryTransport):
1559
def test_empty(self):
1560
"""An empty body should be returned for an empty repository."""
1561
backing = self.get_transport()
1562
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1563
self.make_repository('.')
1565
smart_req.SuccessfulSmartServerResponse(("ok", ), ""),
1566
request.execute(''))
1568
def test_some_revisions(self):
1569
"""An empty body should be returned for an empty repository."""
1570
backing = self.get_transport()
1571
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1572
tree = self.make_branch_and_memory_tree('.')
1575
tree.commit(rev_id='origineel', message="message")
1576
tree.commit(rev_id='nog-een-revisie', message="message")
1579
smart_req.SuccessfulSmartServerResponse(("ok", ),
1580
"origineel\nnog-een-revisie"),
1581
request.execute(''))
1584
class TestSmartServerRepositoryBreakLock(tests.TestCaseWithMemoryTransport):
1586
def test_lock_to_break(self):
1587
backing = self.get_transport()
1588
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1589
tree = self.make_branch_and_memory_tree('.')
1590
tree.branch.repository.lock_write()
1592
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1593
request.execute(''))
1595
def test_nothing_to_break(self):
1596
backing = self.get_transport()
1597
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1598
tree = self.make_branch_and_memory_tree('.')
1600
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1601
request.execute(''))
1325
1604
class TestSmartServerRepositoryGetParentMap(tests.TestCaseWithMemoryTransport):
1327
1606
def test_trivial_bzipped(self):
1447
1726
request.execute('stacked', 1, (3, r3)))
1450
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1729
class TestSmartServerRepositoryIterRevisions(
1730
tests.TestCaseWithMemoryTransport):
1732
def test_basic(self):
1733
backing = self.get_transport()
1734
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1735
tree = self.make_branch_and_memory_tree('.', format='2a')
1738
tree.commit('1st commit', rev_id="rev1")
1739
tree.commit('2nd commit', rev_id="rev2")
1742
self.assertIs(None, request.execute(''))
1743
response = request.do_body("rev1\nrev2")
1744
self.assertTrue(response.is_successful())
1745
# Format 2a uses serializer format 10
1746
self.assertEquals(response.args, ("ok", "10"))
1748
self.addCleanup(tree.branch.lock_read().unlock)
1749
entries = [zlib.compress(record.get_bytes_as("fulltext")) for record in
1750
tree.branch.repository.revisions.get_record_stream(
1751
[("rev1", ), ("rev2", )], "unordered", True)]
1753
contents = "".join(response.body_stream)
1754
self.assertTrue(contents in (
1755
"".join([entries[0], entries[1]]),
1756
"".join([entries[1], entries[0]])))
1758
def test_missing(self):
1759
backing = self.get_transport()
1760
request = smart_repo.SmartServerRepositoryIterRevisions(backing)
1761
tree = self.make_branch_and_memory_tree('.', format='2a')
1763
self.assertIs(None, request.execute(''))
1764
response = request.do_body("rev1\nrev2")
1765
self.assertTrue(response.is_successful())
1766
# Format 2a uses serializer format 10
1767
self.assertEquals(response.args, ("ok", "10"))
1769
contents = "".join(response.body_stream)
1770
self.assertEquals(contents, "")
1773
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
1452
1775
def make_two_commit_repo(self):
1453
1776
tree = self.make_branch_and_memory_tree('.')
1485
1811
stream_bytes = ''.join(response.body_stream)
1486
1812
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1814
def test_search_everything(self):
1815
"""A search of 'everything' returns a stream."""
1816
backing = self.get_transport()
1817
request = smart_repo.SmartServerRepositoryGetStream_1_19(backing)
1818
repo, r1, r2 = self.make_two_commit_repo()
1819
serialised_fetch_spec = 'everything'
1820
request.execute('', repo._format.network_name())
1821
response = request.do_body(serialised_fetch_spec)
1822
self.assertEqual(('ok',), response.args)
1823
stream_bytes = ''.join(response.body_stream)
1824
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1489
1827
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
1511
1849
request.execute('', rev_id_utf8))
1852
class TestSmartServerRepositoryIterFilesBytes(tests.TestCaseWithTransport):
1854
def test_single(self):
1855
backing = self.get_transport()
1856
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1857
t = self.make_branch_and_tree('.')
1858
self.addCleanup(t.lock_write().unlock)
1859
self.build_tree_contents([("file", "somecontents")])
1860
t.add(["file"], ["thefileid"])
1861
t.commit(rev_id='somerev', message="add file")
1862
self.assertIs(None, request.execute(''))
1863
response = request.do_body("thefileid\0somerev\n")
1864
self.assertTrue(response.is_successful())
1865
self.assertEquals(response.args, ("ok", ))
1866
self.assertEquals("".join(response.body_stream),
1867
"ok\x000\n" + zlib.compress("somecontents"))
1869
def test_missing(self):
1870
backing = self.get_transport()
1871
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1872
t = self.make_branch_and_tree('.')
1873
self.addCleanup(t.lock_write().unlock)
1874
self.assertIs(None, request.execute(''))
1875
response = request.do_body("thefileid\0revision\n")
1876
self.assertTrue(response.is_successful())
1877
self.assertEquals(response.args, ("ok", ))
1878
self.assertEquals("".join(response.body_stream),
1879
"absent\x00thefileid\x00revision\x000\n")
1882
class TestSmartServerRequestHasSignatureForRevisionId(
1883
tests.TestCaseWithMemoryTransport):
1885
def test_missing_revision(self):
1886
"""For a missing revision, NoSuchRevision is returned."""
1887
backing = self.get_transport()
1888
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1890
self.make_repository('.')
1892
smart_req.FailedSmartServerResponse(
1893
('nosuchrevision', 'revid'), None),
1894
request.execute('', 'revid'))
1896
def test_missing_signature(self):
1897
"""For a missing signature, ('no', ) is returned."""
1898
backing = self.get_transport()
1899
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1901
tree = self.make_branch_and_memory_tree('.')
1904
r1 = tree.commit('a commit', rev_id='A')
1906
self.assertTrue(tree.branch.repository.has_revision('A'))
1907
self.assertEqual(smart_req.SmartServerResponse(('no', )),
1908
request.execute('', 'A'))
1910
def test_present_signature(self):
1911
"""For a present signature, ('yes', ) is returned."""
1912
backing = self.get_transport()
1913
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1915
strategy = gpg.LoopbackGPGStrategy(None)
1916
tree = self.make_branch_and_memory_tree('.')
1919
r1 = tree.commit('a commit', rev_id='A')
1920
tree.branch.repository.start_write_group()
1921
tree.branch.repository.sign_revision('A', strategy)
1922
tree.branch.repository.commit_write_group()
1924
self.assertTrue(tree.branch.repository.has_revision('A'))
1925
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
1926
request.execute('', 'A'))
1514
1929
class TestSmartServerRepositoryGatherStats(tests.TestCaseWithMemoryTransport):
1516
1931
def test_empty_revid(self):
1589
2015
request.execute('', ))
2018
class TestSmartServerRepositoryGetRevisionSignatureText(
2019
tests.TestCaseWithMemoryTransport):
2021
def test_get_signature(self):
2022
backing = self.get_transport()
2023
request = smart_repo.SmartServerRepositoryGetRevisionSignatureText(
2025
bb = self.make_branch_builder('.')
2026
bb.build_commit(rev_id='A')
2027
repo = bb.get_branch().repository
2028
strategy = gpg.LoopbackGPGStrategy(None)
2029
self.addCleanup(repo.lock_write().unlock)
2030
repo.start_write_group()
2031
repo.sign_revision('A', strategy)
2032
repo.commit_write_group()
2034
'-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
2035
Testament.from_revision(repo, 'A').as_short_text() +
2036
'-----END PSEUDO-SIGNED CONTENT-----\n')
2038
smart_req.SmartServerResponse(('ok', ), expected_body),
2039
request.execute('', 'A'))
2042
class TestSmartServerRepositoryMakeWorkingTrees(
2043
tests.TestCaseWithMemoryTransport):
2045
def test_make_working_trees(self):
2046
"""For a repository with working trees, ('yes', ) is returned."""
2047
backing = self.get_transport()
2048
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2049
r = self.make_repository('.')
2050
r.set_make_working_trees(True)
2051
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
2052
request.execute('', ))
2054
def test_is_not_shared(self):
2055
"""For a repository with working trees, ('no', ) is returned."""
2056
backing = self.get_transport()
2057
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2058
r = self.make_repository('.')
2059
r.set_make_working_trees(False)
2060
self.assertEqual(smart_req.SmartServerResponse(('no', )),
2061
request.execute('', ))
1592
2064
class TestSmartServerRepositoryLockWrite(tests.TestCaseWithMemoryTransport):
1594
2066
def test_lock_write_on_unlocked_repo(self):
1708
2180
smart_req.SmartServerResponse(('TokenMismatch',)), response)
2183
class TestSmartServerRepositoryGetPhysicalLockStatus(
2184
tests.TestCaseWithTransport):
2186
def test_with_write_lock(self):
2187
backing = self.get_transport()
2188
repo = self.make_repository('.')
2189
self.addCleanup(repo.lock_write().unlock)
2190
# lock_write() doesn't necessarily actually take a physical
2192
if repo.get_physical_lock_status():
2196
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2197
request = request_class(backing)
2198
self.assertEqual(smart_req.SuccessfulSmartServerResponse((expected,)),
2199
request.execute('', ))
2201
def test_without_write_lock(self):
2202
backing = self.get_transport()
2203
repo = self.make_repository('.')
2204
self.assertEquals(False, repo.get_physical_lock_status())
2205
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2206
request = request_class(backing)
2207
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('no',)),
2208
request.execute('', ))
1711
2211
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1713
2213
def test_is_readonly_no(self):
1751
2251
self.assertTrue(repo.make_working_trees())
2254
class TestSmartServerRepositoryGetSerializerFormat(
2255
tests.TestCaseWithMemoryTransport):
2257
def test_get_serializer_format(self):
2258
backing = self.get_transport()
2259
repo = self.make_repository('.', format='2a')
2260
request_class = smart_repo.SmartServerRepositoryGetSerializerFormat
2261
request = request_class(backing)
2263
smart_req.SuccessfulSmartServerResponse(('ok', '10')),
2264
request.execute(''))
2267
class TestSmartServerRepositoryWriteGroup(
2268
tests.TestCaseWithMemoryTransport):
2270
def test_start_write_group(self):
2271
backing = self.get_transport()
2272
repo = self.make_repository('.')
2273
lock_token = repo.lock_write().repository_token
2274
self.addCleanup(repo.unlock)
2275
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2276
request = request_class(backing)
2277
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok', [])),
2278
request.execute('', lock_token))
2280
def test_start_write_group_unsuspendable(self):
2281
backing = self.get_transport()
2282
repo = self.make_repository('.', format='knit')
2283
lock_token = repo.lock_write().repository_token
2284
self.addCleanup(repo.unlock)
2285
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2286
request = request_class(backing)
2288
smart_req.FailedSmartServerResponse(('UnsuspendableWriteGroup',)),
2289
request.execute('', lock_token))
2291
def test_commit_write_group(self):
2292
backing = self.get_transport()
2293
repo = self.make_repository('.')
2294
lock_token = repo.lock_write().repository_token
2295
self.addCleanup(repo.unlock)
2296
repo.start_write_group()
2297
tokens = repo.suspend_write_group()
2298
request_class = smart_repo.SmartServerRepositoryCommitWriteGroup
2299
request = request_class(backing)
2300
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2301
request.execute('', lock_token, tokens))
2303
def test_abort_write_group(self):
2304
backing = self.get_transport()
2305
repo = self.make_repository('.')
2306
lock_token = repo.lock_write().repository_token
2307
repo.start_write_group()
2308
tokens = repo.suspend_write_group()
2309
self.addCleanup(repo.unlock)
2310
request_class = smart_repo.SmartServerRepositoryAbortWriteGroup
2311
request = request_class(backing)
2312
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2313
request.execute('', lock_token, tokens))
2315
def test_check_write_group(self):
2316
backing = self.get_transport()
2317
repo = self.make_repository('.')
2318
lock_token = repo.lock_write().repository_token
2319
repo.start_write_group()
2320
tokens = repo.suspend_write_group()
2321
self.addCleanup(repo.unlock)
2322
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2323
request = request_class(backing)
2324
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2325
request.execute('', lock_token, tokens))
2327
def test_check_write_group_invalid(self):
2328
backing = self.get_transport()
2329
repo = self.make_repository('.')
2330
lock_token = repo.lock_write().repository_token
2331
self.addCleanup(repo.unlock)
2332
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2333
request = request_class(backing)
2334
self.assertEqual(smart_req.FailedSmartServerResponse(
2335
('UnresumableWriteGroup', ['random'],
2336
'Malformed write group token')),
2337
request.execute('', lock_token, ["random"]))
1754
2340
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
1756
2342
def make_repo_needing_autopacking(self, path='.'):
1822
2408
"""All registered request_handlers can be found."""
1823
2409
# If there's a typo in a register_lazy call, this loop will fail with
1824
2410
# an AttributeError.
1825
for key, item in smart_req.request_handlers.iteritems():
2411
for key in smart_req.request_handlers.keys():
2413
item = smart_req.request_handlers.get(key)
2414
except AttributeError, e:
2415
raise AttributeError('failed to get %s: %s' % (key, e))
1828
2417
def assertHandlerEqual(self, verb, handler):
1829
2418
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1831
2420
def test_registered_methods(self):
1832
2421
"""Test that known methods are registered to the correct object."""
2422
self.assertHandlerEqual('Branch.break_lock',
2423
smart_branch.SmartServerBranchBreakLock)
1833
2424
self.assertHandlerEqual('Branch.get_config_file',
1834
2425
smart_branch.SmartServerBranchGetConfigFile)
2426
self.assertHandlerEqual('Branch.put_config_file',
2427
smart_branch.SmartServerBranchPutConfigFile)
1835
2428
self.assertHandlerEqual('Branch.get_parent',
1836
2429
smart_branch.SmartServerBranchGetParent)
2430
self.assertHandlerEqual('Branch.get_physical_lock_status',
2431
smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
1837
2432
self.assertHandlerEqual('Branch.get_tags_bytes',
1838
2433
smart_branch.SmartServerBranchGetTagsBytes)
1839
2434
self.assertHandlerEqual('Branch.lock_write',
1874
2473
smart_dir.SmartServerRequestOpenBranchV3)
1875
2474
self.assertHandlerEqual('PackRepository.autopack',
1876
2475
smart_packrepo.SmartServerPackRepositoryAutopack)
2476
self.assertHandlerEqual('Repository.add_signature_text',
2477
smart_repo.SmartServerRepositoryAddSignatureText)
2478
self.assertHandlerEqual('Repository.all_revision_ids',
2479
smart_repo.SmartServerRepositoryAllRevisionIds)
2480
self.assertHandlerEqual('Repository.break_lock',
2481
smart_repo.SmartServerRepositoryBreakLock)
1877
2482
self.assertHandlerEqual('Repository.gather_stats',
1878
2483
smart_repo.SmartServerRepositoryGatherStats)
1879
2484
self.assertHandlerEqual('Repository.get_parent_map',
1880
2485
smart_repo.SmartServerRepositoryGetParentMap)
2486
self.assertHandlerEqual('Repository.get_physical_lock_status',
2487
smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
1881
2488
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1882
2489
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1883
2490
self.assertHandlerEqual('Repository.get_revision_graph',
1884
2491
smart_repo.SmartServerRepositoryGetRevisionGraph)
2492
self.assertHandlerEqual('Repository.get_revision_signature_text',
2493
smart_repo.SmartServerRepositoryGetRevisionSignatureText)
1885
2494
self.assertHandlerEqual('Repository.get_stream',
1886
2495
smart_repo.SmartServerRepositoryGetStream)
2496
self.assertHandlerEqual('Repository.get_stream_1.19',
2497
smart_repo.SmartServerRepositoryGetStream_1_19)
2498
self.assertHandlerEqual('Repository.iter_revisions',
2499
smart_repo.SmartServerRepositoryIterRevisions)
1887
2500
self.assertHandlerEqual('Repository.has_revision',
1888
2501
smart_repo.SmartServerRequestHasRevision)
1889
2502
self.assertHandlerEqual('Repository.insert_stream',
1892
2505
smart_repo.SmartServerRepositoryInsertStreamLocked)
1893
2506
self.assertHandlerEqual('Repository.is_shared',
1894
2507
smart_repo.SmartServerRepositoryIsShared)
2508
self.assertHandlerEqual('Repository.iter_files_bytes',
2509
smart_repo.SmartServerRepositoryIterFilesBytes)
1895
2510
self.assertHandlerEqual('Repository.lock_write',
1896
2511
smart_repo.SmartServerRepositoryLockWrite)
2512
self.assertHandlerEqual('Repository.make_working_trees',
2513
smart_repo.SmartServerRepositoryMakeWorkingTrees)
2514
self.assertHandlerEqual('Repository.pack',
2515
smart_repo.SmartServerRepositoryPack)
1897
2516
self.assertHandlerEqual('Repository.tarball',
1898
2517
smart_repo.SmartServerRepositoryTarball)
1899
2518
self.assertHandlerEqual('Repository.unlock',
1900
2519
smart_repo.SmartServerRepositoryUnlock)
2520
self.assertHandlerEqual('Repository.start_write_group',
2521
smart_repo.SmartServerRepositoryStartWriteGroup)
2522
self.assertHandlerEqual('Repository.check_write_group',
2523
smart_repo.SmartServerRepositoryCheckWriteGroup)
2524
self.assertHandlerEqual('Repository.commit_write_group',
2525
smart_repo.SmartServerRepositoryCommitWriteGroup)
2526
self.assertHandlerEqual('Repository.abort_write_group',
2527
smart_repo.SmartServerRepositoryAbortWriteGroup)
2528
self.assertHandlerEqual('VersionedFileRepository.get_serializer_format',
2529
smart_repo.SmartServerRepositoryGetSerializerFormat)
1901
2530
self.assertHandlerEqual('Transport.is_readonly',
1902
2531
smart_req.SmartServerIsReadonly)
2534
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
2535
"""Tests for SmartTCPServer hooks."""
2538
super(SmartTCPServerHookTests, self).setUp()
2539
self.server = server.SmartTCPServer(self.get_transport())
2541
def test_run_server_started_hooks(self):
2542
"""Test the server started hooks get fired properly."""
2544
server.SmartTCPServer.hooks.install_named_hook('server_started',
2545
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2547
started_ex_calls = []
2548
server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
2549
lambda backing_urls, url: started_ex_calls.append((backing_urls, url)),
2551
self.server._sockname = ('example.com', 42)
2552
self.server.run_server_started_hooks()
2553
self.assertEquals(started_calls,
2554
[([self.get_transport().base], 'bzr://example.com:42/')])
2555
self.assertEquals(started_ex_calls,
2556
[([self.get_transport().base], self.server)])
2558
def test_run_server_started_hooks_ipv6(self):
2559
"""Test that socknames can contain 4-tuples."""
2560
self.server._sockname = ('::', 42, 0, 0)
2562
server.SmartTCPServer.hooks.install_named_hook('server_started',
2563
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2565
self.server.run_server_started_hooks()
2566
self.assertEquals(started_calls,
2567
[([self.get_transport().base], 'bzr://:::42/')])
2569
def test_run_server_stopped_hooks(self):
2570
"""Test the server stopped hooks."""
2571
self.server._sockname = ('example.com', 42)
2573
server.SmartTCPServer.hooks.install_named_hook('server_stopped',
2574
lambda backing_urls, url: stopped_calls.append((backing_urls, url)),
2576
self.server.run_server_stopped_hooks()
2577
self.assertEquals(stopped_calls,
2578
[([self.get_transport().base], 'bzr://example.com:42/')])
2581
class TestSmartServerRepositoryPack(tests.TestCaseWithMemoryTransport):
2583
def test_pack(self):
2584
backing = self.get_transport()
2585
request = smart_repo.SmartServerRepositoryPack(backing)
2586
tree = self.make_branch_and_memory_tree('.')
2587
repo_token = tree.branch.repository.lock_write().repository_token
2589
self.assertIs(None, request.execute('', repo_token, False))
2592
smart_req.SuccessfulSmartServerResponse(('ok', ), ),
2593
request.do_body(''))