215
213
referenced_branch = self.make_branch('referenced')
216
214
dir = self.make_bzrdir('.')
217
215
local_result = dir.cloning_metadir()
218
reference = BranchReferenceFormat().initialize(dir, referenced_branch)
219
reference_url = BranchReferenceFormat().get_reference(dir)
216
reference = _mod_branch.BranchReferenceFormat().initialize(
217
dir, target_branch=referenced_branch)
218
reference_url = _mod_branch.BranchReferenceFormat().get_reference(dir)
220
219
# The server shouldn't try to follow the branch reference, so it's fine
221
220
# if the referenced branch isn't reachable.
222
221
backing.rename('referenced', 'moved')
223
222
request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
224
223
request = request_class(backing)
225
expected = FailedSmartServerResponse(('BranchReference',))
224
expected = smart_req.FailedSmartServerResponse(('BranchReference',))
226
225
self.assertEqual(expected, request.execute('', 'False'))
228
class TestSmartServerBzrDirRequestCloningMetaDir(
229
tests.TestCaseWithMemoryTransport):
230
"""Tests for BzrDir.checkout_metadir."""
232
def test_checkout_metadir(self):
233
backing = self.get_transport()
234
request = smart_dir.SmartServerBzrDirRequestCheckoutMetaDir(
236
branch = self.make_branch('.', format='2a')
237
response = request.execute('')
239
smart_req.SmartServerResponse(
240
('Bazaar-NG meta directory, format 1\n',
241
'Bazaar repository format 2a (needs bzr 1.16 or later)\n',
242
'Bazaar Branch Format 7 (needs bzr 1.6)\n')),
246
class TestSmartServerBzrDirRequestDestroyBranch(
247
tests.TestCaseWithMemoryTransport):
248
"""Tests for BzrDir.destroy_branch."""
250
def test_destroy_branch_default(self):
251
"""The default branch can be removed."""
252
backing = self.get_transport()
253
dir = self.make_branch('.').bzrdir
254
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
255
request = request_class(backing)
256
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
257
self.assertEqual(expected, request.execute('', None))
259
def test_destroy_branch_named(self):
260
"""A named branch can be removed."""
261
backing = self.get_transport()
262
dir = self.make_repository('.', format="development-colo").bzrdir
263
dir.create_branch(name="branchname")
264
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
265
request = request_class(backing)
266
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
267
self.assertEqual(expected, request.execute('', "branchname"))
269
def test_destroy_branch_missing(self):
270
"""An error is raised if the branch didn't exist."""
271
backing = self.get_transport()
272
dir = self.make_bzrdir('.', format="development-colo")
273
request_class = smart_dir.SmartServerBzrDirRequestDestroyBranch
274
request = request_class(backing)
275
expected = smart_req.FailedSmartServerResponse(('nobranch',), None)
276
self.assertEqual(expected, request.execute('', "branchname"))
279
class TestSmartServerBzrDirRequestHasWorkingTree(
280
tests.TestCaseWithTransport):
281
"""Tests for BzrDir.has_workingtree."""
283
def test_has_workingtree_yes(self):
284
"""A working tree is present."""
285
backing = self.get_transport()
286
dir = self.make_branch_and_tree('.').bzrdir
287
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
288
request = request_class(backing)
289
expected = smart_req.SuccessfulSmartServerResponse(('yes',))
290
self.assertEqual(expected, request.execute(''))
292
def test_has_workingtree_no(self):
293
"""A working tree is missing."""
294
backing = self.get_transport()
295
dir = self.make_bzrdir('.')
296
request_class = smart_dir.SmartServerBzrDirRequestHasWorkingTree
297
request = request_class(backing)
298
expected = smart_req.SuccessfulSmartServerResponse(('no',))
299
self.assertEqual(expected, request.execute(''))
302
class TestSmartServerBzrDirRequestDestroyRepository(
303
tests.TestCaseWithMemoryTransport):
304
"""Tests for BzrDir.destroy_repository."""
306
def test_destroy_repository_default(self):
307
"""The repository can be removed."""
308
backing = self.get_transport()
309
dir = self.make_repository('.').bzrdir
310
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
311
request = request_class(backing)
312
expected = smart_req.SuccessfulSmartServerResponse(('ok',))
313
self.assertEqual(expected, request.execute(''))
315
def test_destroy_repository_missing(self):
316
"""An error is raised if the repository didn't exist."""
317
backing = self.get_transport()
318
dir = self.make_bzrdir('.')
319
request_class = smart_dir.SmartServerBzrDirRequestDestroyRepository
320
request = request_class(backing)
321
expected = smart_req.FailedSmartServerResponse(
322
('norepository',), None)
323
self.assertEqual(expected, request.execute(''))
229
326
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
230
327
"""Tests for BzrDir.create_repository."""
421
525
"""Initializing an extant directory should fail like the bzrdir api."""
422
526
backing = self.get_transport()
423
527
name = self.make_bzrdir('reference')._format.network_name()
424
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
528
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
425
529
self.make_bzrdir('subdir')
426
530
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
427
531
'False', 'False', 'False', '', '', '', '', 'False')
430
534
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
432
536
def test_no_directory(self):
433
537
backing = self.get_transport()
434
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
435
self.assertEqual(SmartServerResponse(('no', )),
538
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
539
self.assertEqual(smart_req.SmartServerResponse(('no', )),
436
540
request.execute('does-not-exist'))
438
542
def test_empty_directory(self):
439
543
backing = self.get_transport()
440
544
backing.mkdir('empty')
441
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
442
self.assertEqual(SmartServerResponse(('no', )),
545
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
546
self.assertEqual(smart_req.SmartServerResponse(('no', )),
443
547
request.execute('empty'))
445
549
def test_outside_root_client_path(self):
446
550
backing = self.get_transport()
447
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing,
551
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
448
552
root_client_path='root')
449
self.assertEqual(SmartServerResponse(('no', )),
553
self.assertEqual(smart_req.SmartServerResponse(('no', )),
450
554
request.execute('not-root'))
453
557
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
455
559
def test_no_directory(self):
456
560
backing = self.get_transport()
457
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
458
self.assertEqual(SmartServerResponse(('no', )),
561
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
562
self.assertEqual(smart_req.SmartServerResponse(('no', )),
459
563
request.execute('does-not-exist'))
461
565
def test_empty_directory(self):
462
566
backing = self.get_transport()
463
567
backing.mkdir('empty')
464
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
465
self.assertEqual(SmartServerResponse(('no', )),
568
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
569
self.assertEqual(smart_req.SmartServerResponse(('no', )),
466
570
request.execute('empty'))
468
572
def test_present_without_workingtree(self):
469
573
backing = self.get_transport()
470
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
574
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
575
self.make_bzrdir('.')
472
self.assertEqual(SmartServerResponse(('yes', 'no')),
576
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
473
577
request.execute(''))
475
579
def test_outside_root_client_path(self):
476
580
backing = self.get_transport()
477
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing,
581
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
478
582
root_client_path='root')
479
self.assertEqual(SmartServerResponse(('no',)),
583
self.assertEqual(smart_req.SmartServerResponse(('no',)),
480
584
request.execute('not-root'))
483
587
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
485
589
def test_present_with_workingtree(self):
486
self.vfs_transport_factory = local.LocalURLServer
590
self.vfs_transport_factory = test_server.LocalURLServer
487
591
backing = self.get_transport()
488
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
592
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
489
593
bd = self.make_bzrdir('.')
490
594
bd.create_repository()
491
595
bd.create_branch()
492
596
bd.create_workingtree()
493
self.assertEqual(SmartServerResponse(('yes', 'yes')),
597
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
494
598
request.execute(''))
531
644
"""When there is no branch, ('nobranch', ) is returned."""
532
645
backing = self.get_transport()
533
646
self.make_bzrdir('.')
534
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
535
self.assertEqual(SmartServerResponse(('nobranch', )),
538
def test_branch(self):
539
"""When there is a branch, 'ok' is returned."""
540
backing = self.get_transport()
541
expected = self.make_branch('.')._format.network_name()
542
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
543
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
546
def test_branch_reference(self):
547
"""When there is a branch reference, the reference URL is returned."""
548
self.vfs_transport_factory = local.LocalURLServer
549
backing = self.get_transport()
550
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
551
branch = self.make_branch('branch')
552
checkout = branch.create_checkout('reference',lightweight=True)
553
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
554
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
555
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
556
request.execute('reference'))
558
def test_stacked_branch(self):
559
"""Opening a stacked branch does not open the stacked-on branch."""
560
trunk = self.make_branch('trunk')
561
feature = self.make_branch('feature')
562
feature.set_stacked_on_url(trunk.base)
564
Branch.hooks.install_named_hook('open', opened_branches.append, None)
565
backing = self.get_transport()
566
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
569
response = request.execute('feature')
571
request.teardown_jail()
572
expected_format = feature._format.network_name()
574
SuccessfulSmartServerResponse(('branch', expected_format)),
576
self.assertLength(1, opened_branches)
647
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
648
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
651
def test_branch(self):
652
"""When there is a branch, 'ok' is returned."""
653
backing = self.get_transport()
654
expected = self.make_branch('.')._format.network_name()
655
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
656
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
657
('branch', expected)),
660
def test_branch_reference(self):
661
"""When there is a branch reference, the reference URL is returned."""
662
self.vfs_transport_factory = test_server.LocalURLServer
663
backing = self.get_transport()
664
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
665
branch = self.make_branch('branch')
666
checkout = branch.create_checkout('reference',lightweight=True)
667
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
669
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
670
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
671
('ref', reference_url)),
672
request.execute('reference'))
674
def test_stacked_branch(self):
675
"""Opening a stacked branch does not open the stacked-on branch."""
676
trunk = self.make_branch('trunk')
677
feature = self.make_branch('feature')
678
feature.set_stacked_on_url(trunk.base)
680
_mod_branch.Branch.hooks.install_named_hook(
681
'open', opened_branches.append, None)
682
backing = self.get_transport()
683
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
686
response = request.execute('feature')
688
request.teardown_jail()
689
expected_format = feature._format.network_name()
690
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
691
('branch', expected_format)),
693
self.assertLength(1, opened_branches)
695
def test_notification_on_branch_from_repository(self):
696
"""When there is a repository, the error should return details."""
697
backing = self.get_transport()
698
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
699
repo = self.make_repository('.')
700
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
704
class TestSmartServerRequestOpenBranchV3(TestCaseWithChrootedTransport):
706
def test_no_branch(self):
707
"""When there is no branch, ('nobranch', ) is returned."""
708
backing = self.get_transport()
709
self.make_bzrdir('.')
710
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
711
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
714
def test_branch(self):
715
"""When there is a branch, 'ok' is returned."""
716
backing = self.get_transport()
717
expected = self.make_branch('.')._format.network_name()
718
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
719
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
720
('branch', expected)),
723
def test_branch_reference(self):
724
"""When there is a branch reference, the reference URL is returned."""
725
self.vfs_transport_factory = test_server.LocalURLServer
726
backing = self.get_transport()
727
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
728
branch = self.make_branch('branch')
729
checkout = branch.create_checkout('reference',lightweight=True)
730
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
732
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
733
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
734
('ref', reference_url)),
735
request.execute('reference'))
737
def test_stacked_branch(self):
738
"""Opening a stacked branch does not open the stacked-on branch."""
739
trunk = self.make_branch('trunk')
740
feature = self.make_branch('feature')
741
feature.set_stacked_on_url(trunk.base)
743
_mod_branch.Branch.hooks.install_named_hook(
744
'open', opened_branches.append, None)
745
backing = self.get_transport()
746
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
749
response = request.execute('feature')
751
request.teardown_jail()
752
expected_format = feature._format.network_name()
753
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
754
('branch', expected_format)),
756
self.assertLength(1, opened_branches)
758
def test_notification_on_branch_from_repository(self):
759
"""When there is a repository, the error should return details."""
760
backing = self.get_transport()
761
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
762
repo = self.make_repository('.')
763
self.assertEqual(smart_req.SmartServerResponse(
764
('nobranch', 'location is a repository')),
579
768
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
664
890
# branch.control_files.get('branch.conf') for now - in the future it may
665
891
# perform more complex processing.
666
892
backing = self.get_transport()
667
request = smart.branch.SmartServerBranchGetConfigFile(backing)
893
request = smart_branch.SmartServerBranchGetConfigFile(backing)
668
894
branch = self.make_branch('.')
669
895
branch._transport.put_bytes('branch.conf', 'foo bar baz')
670
self.assertEqual(SmartServerResponse(('ok', ), 'foo bar baz'),
896
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'foo bar baz'),
671
897
request.execute(''))
674
900
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
676
902
def get_lock_tokens(self, branch):
677
branch_token = branch.lock_write()
678
repo_token = branch.repository.lock_write()
903
branch_token = branch.lock_write().branch_token
904
repo_token = branch.repository.lock_write().repository_token
679
905
branch.repository.unlock()
680
906
return branch_token, repo_token
909
class TestSmartServerBranchRequestPutConfigFile(TestLockedBranch):
911
def test_with_content(self):
912
backing = self.get_transport()
913
request = smart_branch.SmartServerBranchPutConfigFile(backing)
914
branch = self.make_branch('.')
915
branch_token, repo_token = self.get_lock_tokens(branch)
916
self.assertIs(None, request.execute('', branch_token, repo_token))
918
smart_req.SmartServerResponse(('ok', )),
919
request.do_body('foo bar baz'))
921
branch.control_transport.get_bytes('branch.conf'),
683
926
class TestSmartServerBranchRequestSetConfigOption(TestLockedBranch):
685
928
def test_value_name(self):
686
929
branch = self.make_branch('.')
687
request = smart.branch.SmartServerBranchRequestSetConfigOption(
930
request = smart_branch.SmartServerBranchRequestSetConfigOption(
688
931
branch.bzrdir.root_transport)
689
932
branch_token, repo_token = self.get_lock_tokens(branch)
690
933
config = branch._get_config()
691
934
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
693
self.assertEqual(SuccessfulSmartServerResponse(()), result)
936
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
694
937
self.assertEqual('bar', config.get_option('foo'))
698
941
def test_value_name_section(self):
699
942
branch = self.make_branch('.')
700
request = smart.branch.SmartServerBranchRequestSetConfigOption(
943
request = smart_branch.SmartServerBranchRequestSetConfigOption(
701
944
branch.bzrdir.root_transport)
702
945
branch_token, repo_token = self.get_lock_tokens(branch)
703
946
config = branch._get_config()
704
947
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
706
self.assertEqual(SuccessfulSmartServerResponse(()), result)
949
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
707
950
self.assertEqual('bar', config.get_option('foo', 'gam'))
955
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
958
TestLockedBranch.setUp(self)
959
# A dict with non-ascii keys and values to exercise unicode
961
self.encoded_value_dict = (
962
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
964
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
966
def test_value_name(self):
967
branch = self.make_branch('.')
968
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
969
branch.bzrdir.root_transport)
970
branch_token, repo_token = self.get_lock_tokens(branch)
971
config = branch._get_config()
972
result = request.execute('', branch_token, repo_token,
973
self.encoded_value_dict, 'foo', '')
974
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
975
self.assertEqual(self.value_dict, config.get_option('foo'))
979
def test_value_name_section(self):
980
branch = self.make_branch('.')
981
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
982
branch.bzrdir.root_transport)
983
branch_token, repo_token = self.get_lock_tokens(branch)
984
config = branch._get_config()
985
result = request.execute('', branch_token, repo_token,
986
self.encoded_value_dict, 'foo', 'gam')
987
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
988
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
712
993
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
713
994
# Only called when the branch format and tags match [yay factory
714
995
# methods] so only need to test straight forward cases.
953
1235
response = self.request.execute(
954
1236
'', branch_token, repo_token, 'child-1', 1, 0)
955
1237
self.assertEqual(
956
SuccessfulSmartServerResponse(('ok', 2, 'child-1')),
1238
smart_req.SuccessfulSmartServerResponse(('ok', 2, 'child-1')),
958
1240
self.unlock_branch()
959
1241
# The branch tip was changed.
960
1242
self.assertEqual('child-1', self.tree.branch.last_revision())
1245
class TestSmartServerBranchBreakLock(tests.TestCaseWithMemoryTransport):
1247
def test_lock_to_break(self):
1248
base_branch = self.make_branch('base')
1249
request = smart_branch.SmartServerBranchBreakLock(
1250
self.get_transport())
1251
base_branch.lock_write()
1253
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1254
request.execute('base'))
1256
def test_nothing_to_break(self):
1257
base_branch = self.make_branch('base')
1258
request = smart_branch.SmartServerBranchBreakLock(
1259
self.get_transport())
1261
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1262
request.execute('base'))
963
1265
class TestSmartServerBranchRequestGetParent(tests.TestCaseWithMemoryTransport):
965
1267
def test_get_parent_none(self):
966
1268
base_branch = self.make_branch('base')
967
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1269
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
968
1270
response = request.execute('base')
969
1271
self.assertEquals(
970
SuccessfulSmartServerResponse(('',)), response)
1272
smart_req.SuccessfulSmartServerResponse(('',)), response)
972
1274
def test_get_parent_something(self):
973
1275
base_branch = self.make_branch('base')
974
1276
base_branch.set_parent(self.get_url('foo'))
975
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1277
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
976
1278
response = request.execute('base')
977
1279
self.assertEquals(
978
SuccessfulSmartServerResponse(("../foo",)),
1280
smart_req.SuccessfulSmartServerResponse(("../foo",)),
982
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1284
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
984
1286
def test_set_parent_none(self):
985
1287
branch = self.make_branch('base', format="1.9")
986
1288
branch.lock_write()
987
1289
branch._set_parent_location('foo')
989
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1291
request = smart_branch.SmartServerBranchRequestSetParentLocation(
990
1292
self.get_transport())
991
branch_token = branch.lock_write()
992
repo_token = branch.repository.lock_write()
1293
branch_token, repo_token = self.get_lock_tokens(branch)
994
1295
response = request.execute('base', branch_token, repo_token, '')
996
branch.repository.unlock()
998
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1298
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
999
1299
self.assertEqual(None, branch.get_parent())
1001
1301
def test_set_parent_something(self):
1002
1302
branch = self.make_branch('base', format="1.9")
1003
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1303
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1004
1304
self.get_transport())
1005
branch_token = branch.lock_write()
1006
repo_token = branch.repository.lock_write()
1305
branch_token, repo_token = self.get_lock_tokens(branch)
1008
1307
response = request.execute('base', branch_token, repo_token,
1011
branch.repository.unlock()
1012
1310
branch.unlock()
1013
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1311
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1014
1312
self.assertEqual('http://bar/', branch.get_parent())
1017
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1315
class TestSmartServerBranchRequestGetTagsBytes(
1316
tests.TestCaseWithMemoryTransport):
1018
1317
# Only called when the branch format and tags match [yay factory
1019
1318
# methods] so only need to test straight forward cases.
1021
1320
def test_get_bytes(self):
1022
1321
base_branch = self.make_branch('base')
1023
request = smart.branch.SmartServerBranchGetTagsBytes(
1322
request = smart_branch.SmartServerBranchGetTagsBytes(
1024
1323
self.get_transport())
1025
1324
response = request.execute('base')
1026
1325
self.assertEquals(
1027
SuccessfulSmartServerResponse(('',)), response)
1326
smart_req.SuccessfulSmartServerResponse(('',)), response)
1030
1329
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1219
1540
# its the exact path being looked at and the server is not
1221
1542
backing = self.get_transport()
1222
request = smart.repository.SmartServerRepositoryRequest(backing)
1543
request = smart_repo.SmartServerRepositoryRequest(backing)
1223
1544
self.make_repository('.', shared=True)
1224
1545
self.make_bzrdir('subdir')
1225
1546
self.assertRaises(errors.NoRepositoryPresent,
1226
1547
request.execute, 'subdir')
1550
class TestSmartServerRepositoryAddSignatureText(tests.TestCaseWithMemoryTransport):
1552
def test_add_text(self):
1553
backing = self.get_transport()
1554
request = smart_repo.SmartServerRepositoryAddSignatureText(backing)
1555
tree = self.make_branch_and_memory_tree('.')
1556
write_token = tree.lock_write()
1557
self.addCleanup(tree.unlock)
1559
tree.commit("Message", rev_id='rev1')
1560
tree.branch.repository.start_write_group()
1561
write_group_tokens = tree.branch.repository.suspend_write_group()
1562
self.assertEqual(None, request.execute('', write_token,
1563
'rev1', *write_group_tokens))
1564
response = request.do_body('somesignature')
1565
self.assertTrue(response.is_successful())
1566
self.assertEqual(response.args[0], 'ok')
1567
write_group_tokens = response.args[1:]
1568
tree.branch.repository.resume_write_group(write_group_tokens)
1569
tree.branch.repository.commit_write_group()
1571
self.assertEqual("somesignature",
1572
tree.branch.repository.get_signature_text("rev1"))
1575
class TestSmartServerRepositoryAllRevisionIds(
1576
tests.TestCaseWithMemoryTransport):
1578
def test_empty(self):
1579
"""An empty body should be returned for an empty repository."""
1580
backing = self.get_transport()
1581
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1582
self.make_repository('.')
1584
smart_req.SuccessfulSmartServerResponse(("ok", ), ""),
1585
request.execute(''))
1587
def test_some_revisions(self):
1588
"""An empty body should be returned for an empty repository."""
1589
backing = self.get_transport()
1590
request = smart_repo.SmartServerRepositoryAllRevisionIds(backing)
1591
tree = self.make_branch_and_memory_tree('.')
1594
tree.commit(rev_id='origineel', message="message")
1595
tree.commit(rev_id='nog-een-revisie', message="message")
1598
smart_req.SuccessfulSmartServerResponse(("ok", ),
1599
"origineel\nnog-een-revisie"),
1600
request.execute(''))
1603
class TestSmartServerRepositoryBreakLock(tests.TestCaseWithMemoryTransport):
1605
def test_lock_to_break(self):
1606
backing = self.get_transport()
1607
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1608
tree = self.make_branch_and_memory_tree('.')
1609
tree.branch.repository.lock_write()
1611
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1612
request.execute(''))
1614
def test_nothing_to_break(self):
1615
backing = self.get_transport()
1616
request = smart_repo.SmartServerRepositoryBreakLock(backing)
1617
tree = self.make_branch_and_memory_tree('.')
1619
smart_req.SuccessfulSmartServerResponse(('ok', ), None),
1620
request.execute(''))
1229
1623
class TestSmartServerRepositoryGetParentMap(tests.TestCaseWithMemoryTransport):
1231
1625
def test_trivial_bzipped(self):
1232
1626
# This tests that the wire encoding is actually bzipped
1233
1627
backing = self.get_transport()
1234
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1628
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1235
1629
tree = self.make_branch_and_memory_tree('.')
1237
1631
self.assertEqual(None,
1238
1632
request.execute('', 'missing-id'))
1239
1633
# Note that it returns a body that is bzipped.
1240
1634
self.assertEqual(
1241
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1635
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1242
1636
request.do_body('\n\n0\n'))
1244
1638
def test_trivial_include_missing(self):
1245
1639
backing = self.get_transport()
1246
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1640
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1247
1641
tree = self.make_branch_and_memory_tree('.')
1249
1643
self.assertEqual(None,
1250
1644
request.execute('', 'missing-id', 'include-missing:'))
1251
1645
self.assertEqual(
1252
SuccessfulSmartServerResponse(('ok', ),
1646
smart_req.SuccessfulSmartServerResponse(('ok', ),
1253
1647
bz2.compress('missing:missing-id')),
1254
1648
request.do_body('\n\n0\n'))
1257
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1651
class TestSmartServerRepositoryGetRevisionGraph(
1652
tests.TestCaseWithMemoryTransport):
1259
1654
def test_none_argument(self):
1260
1655
backing = self.get_transport()
1261
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1656
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1262
1657
tree = self.make_branch_and_memory_tree('.')
1263
1658
tree.lock_write()
1409
1864
r1 = tree.commit('a commit', rev_id=rev_id_utf8)
1411
1866
self.assertTrue(tree.branch.repository.has_revision(rev_id_utf8))
1412
self.assertEqual(SmartServerResponse(('yes', )),
1867
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
1413
1868
request.execute('', rev_id_utf8))
1871
class TestSmartServerRepositoryIterFilesBytes(tests.TestCaseWithTransport):
1873
def test_single(self):
1874
backing = self.get_transport()
1875
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1876
t = self.make_branch_and_tree('.')
1877
self.addCleanup(t.lock_write().unlock)
1878
self.build_tree_contents([("file", "somecontents")])
1879
t.add(["file"], ["thefileid"])
1880
t.commit(rev_id='somerev', message="add file")
1881
self.assertIs(None, request.execute(''))
1882
response = request.do_body("thefileid\0somerev\n")
1883
self.assertTrue(response.is_successful())
1884
self.assertEquals(response.args, ("ok", ))
1885
self.assertEquals("".join(response.body_stream),
1886
"ok\x000\n" + zlib.compress("somecontents"))
1888
def test_missing(self):
1889
backing = self.get_transport()
1890
request = smart_repo.SmartServerRepositoryIterFilesBytes(backing)
1891
t = self.make_branch_and_tree('.')
1892
self.addCleanup(t.lock_write().unlock)
1893
self.assertIs(None, request.execute(''))
1894
response = request.do_body("thefileid\0revision\n")
1895
self.assertTrue(response.is_successful())
1896
self.assertEquals(response.args, ("ok", ))
1897
self.assertEquals("".join(response.body_stream),
1898
"absent\x00thefileid\x00revision\x000\n")
1901
class TestSmartServerRequestHasSignatureForRevisionId(
1902
tests.TestCaseWithMemoryTransport):
1904
def test_missing_revision(self):
1905
"""For a missing revision, NoSuchRevision is returned."""
1906
backing = self.get_transport()
1907
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1909
self.make_repository('.')
1911
smart_req.FailedSmartServerResponse(
1912
('nosuchrevision', 'revid'), None),
1913
request.execute('', 'revid'))
1915
def test_missing_signature(self):
1916
"""For a missing signature, ('no', ) is returned."""
1917
backing = self.get_transport()
1918
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1920
tree = self.make_branch_and_memory_tree('.')
1923
r1 = tree.commit('a commit', rev_id='A')
1925
self.assertTrue(tree.branch.repository.has_revision('A'))
1926
self.assertEqual(smart_req.SmartServerResponse(('no', )),
1927
request.execute('', 'A'))
1929
def test_present_signature(self):
1930
"""For a present signature, ('yes', ) is returned."""
1931
backing = self.get_transport()
1932
request = smart_repo.SmartServerRequestHasSignatureForRevisionId(
1934
strategy = gpg.LoopbackGPGStrategy(None)
1935
tree = self.make_branch_and_memory_tree('.')
1938
r1 = tree.commit('a commit', rev_id='A')
1939
tree.branch.repository.start_write_group()
1940
tree.branch.repository.sign_revision('A', strategy)
1941
tree.branch.repository.commit_write_group()
1943
self.assertTrue(tree.branch.repository.has_revision('A'))
1944
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
1945
request.execute('', 'A'))
1416
1948
class TestSmartServerRepositoryGatherStats(tests.TestCaseWithMemoryTransport):
1418
1950
def test_empty_revid(self):
1419
1951
"""With an empty revid, we get only size an number and revisions"""
1420
1952
backing = self.get_transport()
1421
request = smart.repository.SmartServerRepositoryGatherStats(backing)
1953
request = smart_repo.SmartServerRepositoryGatherStats(backing)
1422
1954
repository = self.make_repository('.')
1423
1955
stats = repository.gather_stats()
1424
1956
expected_body = 'revisions: 0\n'
1425
self.assertEqual(SmartServerResponse(('ok', ), expected_body),
1957
self.assertEqual(smart_req.SmartServerResponse(('ok', ), expected_body),
1426
1958
request.execute('', '', 'no'))
1428
1960
def test_revid_with_committers(self):
1429
1961
"""For a revid we get more infos."""
1430
1962
backing = self.get_transport()
1431
1963
rev_id_utf8 = u'\xc8abc'.encode('utf-8')
1432
request = smart.repository.SmartServerRepositoryGatherStats(backing)
1964
request = smart_repo.SmartServerRepositoryGatherStats(backing)
1433
1965
tree = self.make_branch_and_memory_tree('.')
1434
1966
tree.lock_write()
1467
1999
'firstrev: 123456.200 3600\n'
1468
2000
'latestrev: 654321.400 0\n'
1469
2001
'revisions: 2\n')
1470
self.assertEqual(SmartServerResponse(('ok', ), expected_body),
2002
self.assertEqual(smart_req.SmartServerResponse(('ok', ), expected_body),
1471
2003
request.execute('',
1472
2004
rev_id_utf8, 'yes'))
2006
def test_unknown_revid(self):
2007
"""An unknown revision id causes a 'nosuchrevision' error."""
2008
backing = self.get_transport()
2009
request = smart_repo.SmartServerRepositoryGatherStats(backing)
2010
repository = self.make_repository('.')
2011
expected_body = 'revisions: 0\n'
2013
smart_req.FailedSmartServerResponse(
2014
('nosuchrevision', 'mia'), None),
2015
request.execute('', 'mia', 'yes'))
1475
2018
class TestSmartServerRepositoryIsShared(tests.TestCaseWithMemoryTransport):
1477
2020
def test_is_shared(self):
1478
2021
"""For a shared repository, ('yes', ) is returned."""
1479
2022
backing = self.get_transport()
1480
request = smart.repository.SmartServerRepositoryIsShared(backing)
2023
request = smart_repo.SmartServerRepositoryIsShared(backing)
1481
2024
self.make_repository('.', shared=True)
1482
self.assertEqual(SmartServerResponse(('yes', )),
2025
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
1483
2026
request.execute('', ))
1485
2028
def test_is_not_shared(self):
1486
2029
"""For a shared repository, ('no', ) is returned."""
1487
2030
backing = self.get_transport()
1488
request = smart.repository.SmartServerRepositoryIsShared(backing)
2031
request = smart_repo.SmartServerRepositoryIsShared(backing)
1489
2032
self.make_repository('.', shared=False)
1490
self.assertEqual(SmartServerResponse(('no', )),
2033
self.assertEqual(smart_req.SmartServerResponse(('no', )),
2034
request.execute('', ))
2037
class TestSmartServerRepositoryGetRevisionSignatureText(
2038
tests.TestCaseWithMemoryTransport):
2040
def test_get_signature(self):
2041
backing = self.get_transport()
2042
request = smart_repo.SmartServerRepositoryGetRevisionSignatureText(
2044
bb = self.make_branch_builder('.')
2045
bb.build_commit(rev_id='A')
2046
repo = bb.get_branch().repository
2047
strategy = gpg.LoopbackGPGStrategy(None)
2048
self.addCleanup(repo.lock_write().unlock)
2049
repo.start_write_group()
2050
repo.sign_revision('A', strategy)
2051
repo.commit_write_group()
2053
'-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
2054
Testament.from_revision(repo, 'A').as_short_text() +
2055
'-----END PSEUDO-SIGNED CONTENT-----\n')
2057
smart_req.SmartServerResponse(('ok', ), expected_body),
2058
request.execute('', 'A'))
2061
class TestSmartServerRepositoryMakeWorkingTrees(
2062
tests.TestCaseWithMemoryTransport):
2064
def test_make_working_trees(self):
2065
"""For a repository with working trees, ('yes', ) is returned."""
2066
backing = self.get_transport()
2067
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2068
r = self.make_repository('.')
2069
r.set_make_working_trees(True)
2070
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
2071
request.execute('', ))
2073
def test_is_not_shared(self):
2074
"""For a repository with working trees, ('no', ) is returned."""
2075
backing = self.get_transport()
2076
request = smart_repo.SmartServerRepositoryMakeWorkingTrees(backing)
2077
r = self.make_repository('.')
2078
r.set_make_working_trees(False)
2079
self.assertEqual(smart_req.SmartServerResponse(('no', )),
1491
2080
request.execute('', ))
1604
2193
def test_unlock_on_unlocked_repo(self):
1605
2194
backing = self.get_transport()
1606
request = smart.repository.SmartServerRepositoryUnlock(backing)
2195
request = smart_repo.SmartServerRepositoryUnlock(backing)
1607
2196
repository = self.make_repository('.', format='knit')
1608
2197
response = request.execute('', 'some token')
1609
2198
self.assertEqual(
1610
SmartServerResponse(('TokenMismatch',)), response)
2199
smart_req.SmartServerResponse(('TokenMismatch',)), response)
2202
class TestSmartServerRepositoryGetPhysicalLockStatus(
2203
tests.TestCaseWithTransport):
2205
def test_with_write_lock(self):
2206
backing = self.get_transport()
2207
repo = self.make_repository('.')
2208
self.addCleanup(repo.lock_write().unlock)
2209
# lock_write() doesn't necessarily actually take a physical
2211
if repo.get_physical_lock_status():
2215
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2216
request = request_class(backing)
2217
self.assertEqual(smart_req.SuccessfulSmartServerResponse((expected,)),
2218
request.execute('', ))
2220
def test_without_write_lock(self):
2221
backing = self.get_transport()
2222
repo = self.make_repository('.')
2223
self.assertEquals(False, repo.get_physical_lock_status())
2224
request_class = smart_repo.SmartServerRepositoryGetPhysicalLockStatus
2225
request = request_class(backing)
2226
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('no',)),
2227
request.execute('', ))
2230
class TestSmartServerRepositoryReconcile(tests.TestCaseWithTransport):
2232
def test_reconcile(self):
2233
backing = self.get_transport()
2234
repo = self.make_repository('.')
2235
token = repo.lock_write().repository_token
2236
self.addCleanup(repo.unlock)
2237
request_class = smart_repo.SmartServerRepositoryReconcile
2238
request = request_class(backing)
2239
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
2241
'garbage_inventories: 0\n'
2242
'inconsistent_parents: 0\n'),
2243
request.execute('', token))
1613
2246
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1615
2248
def test_is_readonly_no(self):
1616
2249
backing = self.get_transport()
1617
request = smart.request.SmartServerIsReadonly(backing)
2250
request = smart_req.SmartServerIsReadonly(backing)
1618
2251
response = request.execute()
1619
2252
self.assertEqual(
1620
SmartServerResponse(('no',)), response)
2253
smart_req.SmartServerResponse(('no',)), response)
1622
2255
def test_is_readonly_yes(self):
1623
2256
backing = self.get_readonly_transport()
1624
request = smart.request.SmartServerIsReadonly(backing)
2257
request = smart_req.SmartServerIsReadonly(backing)
1625
2258
response = request.execute()
1626
2259
self.assertEqual(
1627
SmartServerResponse(('yes',)), response)
1630
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
2260
smart_req.SmartServerResponse(('yes',)), response)
2263
class TestSmartServerRepositorySetMakeWorkingTrees(
2264
tests.TestCaseWithMemoryTransport):
1632
2266
def test_set_false(self):
1633
2267
backing = self.get_transport()
1634
2268
repo = self.make_repository('.', shared=True)
1635
2269
repo.set_make_working_trees(True)
1636
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
2270
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1637
2271
request = request_class(backing)
1638
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
2272
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1639
2273
request.execute('', 'False'))
1640
2274
repo = repo.bzrdir.open_repository()
1641
2275
self.assertFalse(repo.make_working_trees())
1644
2278
backing = self.get_transport()
1645
2279
repo = self.make_repository('.', shared=True)
1646
2280
repo.set_make_working_trees(False)
1647
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
2281
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1648
2282
request = request_class(backing)
1649
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
2283
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1650
2284
request.execute('', 'True'))
1651
2285
repo = repo.bzrdir.open_repository()
1652
2286
self.assertTrue(repo.make_working_trees())
2289
class TestSmartServerRepositoryGetSerializerFormat(
2290
tests.TestCaseWithMemoryTransport):
2292
def test_get_serializer_format(self):
2293
backing = self.get_transport()
2294
repo = self.make_repository('.', format='2a')
2295
request_class = smart_repo.SmartServerRepositoryGetSerializerFormat
2296
request = request_class(backing)
2298
smart_req.SuccessfulSmartServerResponse(('ok', '10')),
2299
request.execute(''))
2302
class TestSmartServerRepositoryWriteGroup(
2303
tests.TestCaseWithMemoryTransport):
2305
def test_start_write_group(self):
2306
backing = self.get_transport()
2307
repo = self.make_repository('.')
2308
lock_token = repo.lock_write().repository_token
2309
self.addCleanup(repo.unlock)
2310
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2311
request = request_class(backing)
2312
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok', [])),
2313
request.execute('', lock_token))
2315
def test_start_write_group_unsuspendable(self):
2316
backing = self.get_transport()
2317
repo = self.make_repository('.', format='knit')
2318
lock_token = repo.lock_write().repository_token
2319
self.addCleanup(repo.unlock)
2320
request_class = smart_repo.SmartServerRepositoryStartWriteGroup
2321
request = request_class(backing)
2323
smart_req.FailedSmartServerResponse(('UnsuspendableWriteGroup',)),
2324
request.execute('', lock_token))
2326
def test_commit_write_group(self):
2327
backing = self.get_transport()
2328
repo = self.make_repository('.')
2329
lock_token = repo.lock_write().repository_token
2330
self.addCleanup(repo.unlock)
2331
repo.start_write_group()
2332
tokens = repo.suspend_write_group()
2333
request_class = smart_repo.SmartServerRepositoryCommitWriteGroup
2334
request = request_class(backing)
2335
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2336
request.execute('', lock_token, tokens))
2338
def test_abort_write_group(self):
2339
backing = self.get_transport()
2340
repo = self.make_repository('.')
2341
lock_token = repo.lock_write().repository_token
2342
repo.start_write_group()
2343
tokens = repo.suspend_write_group()
2344
self.addCleanup(repo.unlock)
2345
request_class = smart_repo.SmartServerRepositoryAbortWriteGroup
2346
request = request_class(backing)
2347
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2348
request.execute('', lock_token, tokens))
2350
def test_check_write_group(self):
2351
backing = self.get_transport()
2352
repo = self.make_repository('.')
2353
lock_token = repo.lock_write().repository_token
2354
repo.start_write_group()
2355
tokens = repo.suspend_write_group()
2356
self.addCleanup(repo.unlock)
2357
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2358
request = request_class(backing)
2359
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
2360
request.execute('', lock_token, tokens))
2362
def test_check_write_group_invalid(self):
2363
backing = self.get_transport()
2364
repo = self.make_repository('.')
2365
lock_token = repo.lock_write().repository_token
2366
self.addCleanup(repo.unlock)
2367
request_class = smart_repo.SmartServerRepositoryCheckWriteGroup
2368
request = request_class(backing)
2369
self.assertEqual(smart_req.FailedSmartServerResponse(
2370
('UnresumableWriteGroup', ['random'],
2371
'Malformed write group token')),
2372
request.execute('', lock_token, ["random"]))
1655
2375
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
1657
2377
def make_repo_needing_autopacking(self, path='.'):
1723
2443
"""All registered request_handlers can be found."""
1724
2444
# If there's a typo in a register_lazy call, this loop will fail with
1725
2445
# an AttributeError.
1726
for key, item in smart.request.request_handlers.iteritems():
2446
for key in smart_req.request_handlers.keys():
2448
item = smart_req.request_handlers.get(key)
2449
except AttributeError, e:
2450
raise AttributeError('failed to get %s: %s' % (key, e))
1729
2452
def assertHandlerEqual(self, verb, handler):
1730
self.assertEqual(smart.request.request_handlers.get(verb), handler)
2453
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1732
2455
def test_registered_methods(self):
1733
2456
"""Test that known methods are registered to the correct object."""
2457
self.assertHandlerEqual('Branch.break_lock',
2458
smart_branch.SmartServerBranchBreakLock)
1734
2459
self.assertHandlerEqual('Branch.get_config_file',
1735
smart.branch.SmartServerBranchGetConfigFile)
2460
smart_branch.SmartServerBranchGetConfigFile)
2461
self.assertHandlerEqual('Branch.put_config_file',
2462
smart_branch.SmartServerBranchPutConfigFile)
1736
2463
self.assertHandlerEqual('Branch.get_parent',
1737
smart.branch.SmartServerBranchGetParent)
2464
smart_branch.SmartServerBranchGetParent)
2465
self.assertHandlerEqual('Branch.get_physical_lock_status',
2466
smart_branch.SmartServerBranchRequestGetPhysicalLockStatus)
1738
2467
self.assertHandlerEqual('Branch.get_tags_bytes',
1739
smart.branch.SmartServerBranchGetTagsBytes)
2468
smart_branch.SmartServerBranchGetTagsBytes)
1740
2469
self.assertHandlerEqual('Branch.lock_write',
1741
smart.branch.SmartServerBranchRequestLockWrite)
2470
smart_branch.SmartServerBranchRequestLockWrite)
1742
2471
self.assertHandlerEqual('Branch.last_revision_info',
1743
smart.branch.SmartServerBranchRequestLastRevisionInfo)
2472
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1744
2473
self.assertHandlerEqual('Branch.revision_history',
1745
smart.branch.SmartServerRequestRevisionHistory)
2474
smart_branch.SmartServerRequestRevisionHistory)
2475
self.assertHandlerEqual('Branch.revision_id_to_revno',
2476
smart_branch.SmartServerBranchRequestRevisionIdToRevno)
1746
2477
self.assertHandlerEqual('Branch.set_config_option',
1747
smart.branch.SmartServerBranchRequestSetConfigOption)
2478
smart_branch.SmartServerBranchRequestSetConfigOption)
1748
2479
self.assertHandlerEqual('Branch.set_last_revision',
1749
smart.branch.SmartServerBranchRequestSetLastRevision)
2480
smart_branch.SmartServerBranchRequestSetLastRevision)
1750
2481
self.assertHandlerEqual('Branch.set_last_revision_info',
1751
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
2482
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1752
2483
self.assertHandlerEqual('Branch.set_last_revision_ex',
1753
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
2484
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1754
2485
self.assertHandlerEqual('Branch.set_parent_location',
1755
smart.branch.SmartServerBranchRequestSetParentLocation)
2486
smart_branch.SmartServerBranchRequestSetParentLocation)
1756
2487
self.assertHandlerEqual('Branch.unlock',
1757
smart.branch.SmartServerBranchRequestUnlock)
2488
smart_branch.SmartServerBranchRequestUnlock)
2489
self.assertHandlerEqual('BzrDir.destroy_branch',
2490
smart_dir.SmartServerBzrDirRequestDestroyBranch)
1758
2491
self.assertHandlerEqual('BzrDir.find_repository',
1759
smart.bzrdir.SmartServerRequestFindRepositoryV1)
2492
smart_dir.SmartServerRequestFindRepositoryV1)
1760
2493
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1761
smart.bzrdir.SmartServerRequestFindRepositoryV2)
2494
smart_dir.SmartServerRequestFindRepositoryV2)
1762
2495
self.assertHandlerEqual('BzrDirFormat.initialize',
1763
smart.bzrdir.SmartServerRequestInitializeBzrDir)
2496
smart_dir.SmartServerRequestInitializeBzrDir)
1764
2497
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1765
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
2498
smart_dir.SmartServerRequestBzrDirInitializeEx)
2499
self.assertHandlerEqual('BzrDir.checkout_metadir',
2500
smart_dir.SmartServerBzrDirRequestCheckoutMetaDir)
1766
2501
self.assertHandlerEqual('BzrDir.cloning_metadir',
1767
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
2502
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1768
2503
self.assertHandlerEqual('BzrDir.get_config_file',
1769
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
2504
smart_dir.SmartServerBzrDirRequestConfigFile)
1770
2505
self.assertHandlerEqual('BzrDir.open_branch',
1771
smart.bzrdir.SmartServerRequestOpenBranch)
2506
smart_dir.SmartServerRequestOpenBranch)
1772
2507
self.assertHandlerEqual('BzrDir.open_branchV2',
1773
smart.bzrdir.SmartServerRequestOpenBranchV2)
2508
smart_dir.SmartServerRequestOpenBranchV2)
2509
self.assertHandlerEqual('BzrDir.open_branchV3',
2510
smart_dir.SmartServerRequestOpenBranchV3)
1774
2511
self.assertHandlerEqual('PackRepository.autopack',
1775
smart.packrepository.SmartServerPackRepositoryAutopack)
2512
smart_packrepo.SmartServerPackRepositoryAutopack)
2513
self.assertHandlerEqual('Repository.add_signature_text',
2514
smart_repo.SmartServerRepositoryAddSignatureText)
2515
self.assertHandlerEqual('Repository.all_revision_ids',
2516
smart_repo.SmartServerRepositoryAllRevisionIds)
2517
self.assertHandlerEqual('Repository.break_lock',
2518
smart_repo.SmartServerRepositoryBreakLock)
1776
2519
self.assertHandlerEqual('Repository.gather_stats',
1777
smart.repository.SmartServerRepositoryGatherStats)
2520
smart_repo.SmartServerRepositoryGatherStats)
1778
2521
self.assertHandlerEqual('Repository.get_parent_map',
1779
smart.repository.SmartServerRepositoryGetParentMap)
2522
smart_repo.SmartServerRepositoryGetParentMap)
2523
self.assertHandlerEqual('Repository.get_physical_lock_status',
2524
smart_repo.SmartServerRepositoryGetPhysicalLockStatus)
1780
2525
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1781
smart.repository.SmartServerRepositoryGetRevIdForRevno)
2526
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1782
2527
self.assertHandlerEqual('Repository.get_revision_graph',
1783
smart.repository.SmartServerRepositoryGetRevisionGraph)
2528
smart_repo.SmartServerRepositoryGetRevisionGraph)
2529
self.assertHandlerEqual('Repository.get_revision_signature_text',
2530
smart_repo.SmartServerRepositoryGetRevisionSignatureText)
1784
2531
self.assertHandlerEqual('Repository.get_stream',
1785
smart.repository.SmartServerRepositoryGetStream)
2532
smart_repo.SmartServerRepositoryGetStream)
2533
self.assertHandlerEqual('Repository.get_stream_1.19',
2534
smart_repo.SmartServerRepositoryGetStream_1_19)
2535
self.assertHandlerEqual('Repository.iter_revisions',
2536
smart_repo.SmartServerRepositoryIterRevisions)
1786
2537
self.assertHandlerEqual('Repository.has_revision',
1787
smart.repository.SmartServerRequestHasRevision)
2538
smart_repo.SmartServerRequestHasRevision)
1788
2539
self.assertHandlerEqual('Repository.insert_stream',
1789
smart.repository.SmartServerRepositoryInsertStream)
2540
smart_repo.SmartServerRepositoryInsertStream)
1790
2541
self.assertHandlerEqual('Repository.insert_stream_locked',
1791
smart.repository.SmartServerRepositoryInsertStreamLocked)
2542
smart_repo.SmartServerRepositoryInsertStreamLocked)
1792
2543
self.assertHandlerEqual('Repository.is_shared',
1793
smart.repository.SmartServerRepositoryIsShared)
2544
smart_repo.SmartServerRepositoryIsShared)
2545
self.assertHandlerEqual('Repository.iter_files_bytes',
2546
smart_repo.SmartServerRepositoryIterFilesBytes)
1794
2547
self.assertHandlerEqual('Repository.lock_write',
1795
smart.repository.SmartServerRepositoryLockWrite)
2548
smart_repo.SmartServerRepositoryLockWrite)
2549
self.assertHandlerEqual('Repository.make_working_trees',
2550
smart_repo.SmartServerRepositoryMakeWorkingTrees)
2551
self.assertHandlerEqual('Repository.pack',
2552
smart_repo.SmartServerRepositoryPack)
2553
self.assertHandlerEqual('Repository.reconcile',
2554
smart_repo.SmartServerRepositoryReconcile)
1796
2555
self.assertHandlerEqual('Repository.tarball',
1797
smart.repository.SmartServerRepositoryTarball)
2556
smart_repo.SmartServerRepositoryTarball)
1798
2557
self.assertHandlerEqual('Repository.unlock',
1799
smart.repository.SmartServerRepositoryUnlock)
2558
smart_repo.SmartServerRepositoryUnlock)
2559
self.assertHandlerEqual('Repository.start_write_group',
2560
smart_repo.SmartServerRepositoryStartWriteGroup)
2561
self.assertHandlerEqual('Repository.check_write_group',
2562
smart_repo.SmartServerRepositoryCheckWriteGroup)
2563
self.assertHandlerEqual('Repository.commit_write_group',
2564
smart_repo.SmartServerRepositoryCommitWriteGroup)
2565
self.assertHandlerEqual('Repository.abort_write_group',
2566
smart_repo.SmartServerRepositoryAbortWriteGroup)
2567
self.assertHandlerEqual('VersionedFileRepository.get_serializer_format',
2568
smart_repo.SmartServerRepositoryGetSerializerFormat)
2569
self.assertHandlerEqual('VersionedFileRepository.get_inventories',
2570
smart_repo.SmartServerRepositoryGetInventories)
1800
2571
self.assertHandlerEqual('Transport.is_readonly',
1801
smart.request.SmartServerIsReadonly)
2572
smart_req.SmartServerIsReadonly)
2575
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
2576
"""Tests for SmartTCPServer hooks."""
2579
super(SmartTCPServerHookTests, self).setUp()
2580
self.server = server.SmartTCPServer(self.get_transport())
2582
def test_run_server_started_hooks(self):
2583
"""Test the server started hooks get fired properly."""
2585
server.SmartTCPServer.hooks.install_named_hook('server_started',
2586
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2588
started_ex_calls = []
2589
server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
2590
lambda backing_urls, url: started_ex_calls.append((backing_urls, url)),
2592
self.server._sockname = ('example.com', 42)
2593
self.server.run_server_started_hooks()
2594
self.assertEquals(started_calls,
2595
[([self.get_transport().base], 'bzr://example.com:42/')])
2596
self.assertEquals(started_ex_calls,
2597
[([self.get_transport().base], self.server)])
2599
def test_run_server_started_hooks_ipv6(self):
2600
"""Test that socknames can contain 4-tuples."""
2601
self.server._sockname = ('::', 42, 0, 0)
2603
server.SmartTCPServer.hooks.install_named_hook('server_started',
2604
lambda backing_urls, url: started_calls.append((backing_urls, url)),
2606
self.server.run_server_started_hooks()
2607
self.assertEquals(started_calls,
2608
[([self.get_transport().base], 'bzr://:::42/')])
2610
def test_run_server_stopped_hooks(self):
2611
"""Test the server stopped hooks."""
2612
self.server._sockname = ('example.com', 42)
2614
server.SmartTCPServer.hooks.install_named_hook('server_stopped',
2615
lambda backing_urls, url: stopped_calls.append((backing_urls, url)),
2617
self.server.run_server_stopped_hooks()
2618
self.assertEquals(stopped_calls,
2619
[([self.get_transport().base], 'bzr://example.com:42/')])
2622
class TestSmartServerRepositoryPack(tests.TestCaseWithMemoryTransport):
2624
def test_pack(self):
2625
backing = self.get_transport()
2626
request = smart_repo.SmartServerRepositoryPack(backing)
2627
tree = self.make_branch_and_memory_tree('.')
2628
repo_token = tree.branch.repository.lock_write().repository_token
2630
self.assertIs(None, request.execute('', repo_token, False))
2633
smart_req.SuccessfulSmartServerResponse(('ok', ), ),
2634
request.do_body(''))
2637
class TestSmartServerRepositoryGetInventories(tests.TestCaseWithTransport):
2639
def _get_serialized_inventory_delta(self, repository, base_revid, revid):
2640
base_inv = repository.revision_tree(base_revid).inventory
2641
inv = repository.revision_tree(revid).inventory
2642
inv_delta = inv._make_delta(base_inv)
2643
serializer = inventory_delta.InventoryDeltaSerializer(True, False)
2644
return "".join(serializer.delta_to_lines(base_revid, revid, inv_delta))
2646
def test_single(self):
2647
backing = self.get_transport()
2648
request = smart_repo.SmartServerRepositoryGetInventories(backing)
2649
t = self.make_branch_and_tree('.', format='2a')
2650
self.addCleanup(t.lock_write().unlock)
2651
self.build_tree_contents([("file", "somecontents")])
2652
t.add(["file"], ["thefileid"])
2653
t.commit(rev_id='somerev', message="add file")
2654
self.assertIs(None, request.execute('', 'unordered'))
2655
response = request.do_body("somerev\n")
2656
self.assertTrue(response.is_successful())
2657
self.assertEquals(response.args, ("ok", ))
2658
stream = [('inventory-deltas', [
2659
versionedfile.FulltextContentFactory('somerev', None, None,
2660
self._get_serialized_inventory_delta(
2661
t.branch.repository, 'null:', 'somerev'))])]
2662
fmt = bzrdir.format_registry.get('2a')().repository_format
2664
"".join(response.body_stream),
2665
"".join(smart_repo._stream_to_byte_stream(stream, fmt)))
2667
def test_empty(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("")
2677
self.assertTrue(response.is_successful())
2678
self.assertEquals(response.args, ("ok", ))
2679
self.assertEquals("".join(response.body_stream),
2680
"Bazaar pack format 1 (introduced in 0.18)\nB54\n\nBazaar repository format 2a (needs bzr 1.16 or later)\nE")