31
31
from bzrlib import (
33
branch as _mod_branch,
42
from bzrlib.smart import (
43
branch as smart_branch,
45
repository as smart_repo,
46
packrepository as smart_packrepo,
51
from bzrlib.tests import test_server
52
from bzrlib.transport import (
41
from bzrlib.branch import Branch, BranchReferenceFormat
42
import bzrlib.smart.branch
43
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
44
import bzrlib.smart.packrepository
45
import bzrlib.smart.repository
46
import bzrlib.smart.vfs
47
from bzrlib.smart.request import (
48
FailedSmartServerResponse,
51
SuccessfulSmartServerResponse,
53
from bzrlib.tests import (
56
from bzrlib.transport import chroot, get_transport, local, memory
58
59
def load_tests(standard_tests, module, loader):
59
60
"""Multiply tests version and protocol consistency."""
60
61
# FindRepository tests.
62
bzrdir_mod = bzrlib.smart.bzrdir
62
64
("find_repository", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
65
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
64
66
("find_repositoryV2", {
65
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
67
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
66
68
("find_repositoryV3", {
67
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
69
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
69
to_adapt, result = tests.split_suite_by_re(standard_tests,
71
to_adapt, result = split_suite_by_re(standard_tests,
70
72
"TestSmartServerRequestFindRepository")
71
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
73
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
73
75
tests.multiply_tests(v1_and_2, scenarios, result)
74
76
# The first scenario is only applicable to v1 protocols, it is deleted
135
137
class TestSmartServerResponse(tests.TestCase):
137
139
def test__eq__(self):
138
self.assertEqual(smart_req.SmartServerResponse(('ok', )),
139
smart_req.SmartServerResponse(('ok', )))
140
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
141
smart_req.SmartServerResponse(('ok', ), 'body'))
142
self.assertNotEqual(smart_req.SmartServerResponse(('ok', )),
143
smart_req.SmartServerResponse(('notok', )))
144
self.assertNotEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
145
smart_req.SmartServerResponse(('ok', )))
140
self.assertEqual(SmartServerResponse(('ok', )),
141
SmartServerResponse(('ok', )))
142
self.assertEqual(SmartServerResponse(('ok', ), 'body'),
143
SmartServerResponse(('ok', ), 'body'))
144
self.assertNotEqual(SmartServerResponse(('ok', )),
145
SmartServerResponse(('notok', )))
146
self.assertNotEqual(SmartServerResponse(('ok', ), 'body'),
147
SmartServerResponse(('ok', )))
146
148
self.assertNotEqual(None,
147
smart_req.SmartServerResponse(('ok', )))
149
SmartServerResponse(('ok', )))
149
151
def test__str__(self):
150
152
"""SmartServerResponses can be stringified."""
151
153
self.assertEqual(
152
154
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
153
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
155
str(SuccessfulSmartServerResponse(('args',), 'body')))
154
156
self.assertEqual(
155
157
"<FailedSmartServerResponse args=('args',) body='body'>",
156
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
158
str(FailedSmartServerResponse(('args',), 'body')))
159
161
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
161
163
def test_translate_client_path(self):
162
164
transport = self.get_transport()
163
request = smart_req.SmartServerRequest(transport, 'foo/')
165
request = SmartServerRequest(transport, 'foo/')
164
166
self.assertEqual('./', request.translate_client_path('foo/'))
165
167
self.assertRaises(
166
168
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
287
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
288
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
289
return SuccessfulSmartServerResponse(
289
290
('ok', '', rich_root, subtrees, external,
290
291
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
292
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
293
self._request_class):
293
294
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
296
return SuccessfulSmartServerResponse(
296
297
('ok', '', rich_root, subtrees, external))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
299
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
301
def test_shared_repository(self):
302
302
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
427
421
"""Initializing an extant directory should fail like the bzrdir api."""
428
422
backing = self.get_transport()
429
423
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
424
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
425
self.make_bzrdir('subdir')
432
426
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
427
'False', 'False', 'False', '', '', '', '', 'False')
436
430
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
438
432
def test_no_directory(self):
439
433
backing = self.get_transport()
440
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
441
self.assertEqual(smart_req.SmartServerResponse(('no', )),
434
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
435
self.assertEqual(SmartServerResponse(('no', )),
442
436
request.execute('does-not-exist'))
444
438
def test_empty_directory(self):
445
439
backing = self.get_transport()
446
440
backing.mkdir('empty')
447
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
448
self.assertEqual(smart_req.SmartServerResponse(('no', )),
441
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
442
self.assertEqual(SmartServerResponse(('no', )),
449
443
request.execute('empty'))
451
445
def test_outside_root_client_path(self):
452
446
backing = self.get_transport()
453
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
447
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing,
454
448
root_client_path='root')
455
self.assertEqual(smart_req.SmartServerResponse(('no', )),
449
self.assertEqual(SmartServerResponse(('no', )),
456
450
request.execute('not-root'))
459
453
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
461
455
def test_no_directory(self):
462
456
backing = self.get_transport()
463
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
464
self.assertEqual(smart_req.SmartServerResponse(('no', )),
457
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
458
self.assertEqual(SmartServerResponse(('no', )),
465
459
request.execute('does-not-exist'))
467
461
def test_empty_directory(self):
468
462
backing = self.get_transport()
469
463
backing.mkdir('empty')
470
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
self.assertEqual(smart_req.SmartServerResponse(('no', )),
464
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
465
self.assertEqual(SmartServerResponse(('no', )),
472
466
request.execute('empty'))
474
468
def test_present_without_workingtree(self):
475
469
backing = self.get_transport()
476
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
470
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
477
471
self.make_bzrdir('.')
478
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
472
self.assertEqual(SmartServerResponse(('yes', 'no')),
479
473
request.execute(''))
481
475
def test_outside_root_client_path(self):
482
476
backing = self.get_transport()
483
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
477
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing,
484
478
root_client_path='root')
485
self.assertEqual(smart_req.SmartServerResponse(('no',)),
479
self.assertEqual(SmartServerResponse(('no',)),
486
480
request.execute('not-root'))
489
483
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
491
485
def test_present_with_workingtree(self):
492
self.vfs_transport_factory = test_server.LocalURLServer
486
self.vfs_transport_factory = local.LocalURLServer
493
487
backing = self.get_transport()
494
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
488
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
495
489
bd = self.make_bzrdir('.')
496
490
bd.create_repository()
497
491
bd.create_branch()
498
492
bd.create_workingtree()
499
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
493
self.assertEqual(SmartServerResponse(('yes', 'yes')),
500
494
request.execute(''))
505
499
def test_no_branch(self):
506
500
"""When there is no branch, ('nobranch', ) is returned."""
507
501
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
502
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
503
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
504
self.assertEqual(SmartServerResponse(('nobranch', )),
511
505
request.execute(''))
513
507
def test_branch(self):
514
508
"""When there is a branch, 'ok' is returned."""
515
509
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
510
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
511
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
512
self.assertEqual(SmartServerResponse(('ok', '')),
519
513
request.execute(''))
521
515
def test_branch_reference(self):
522
516
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
517
self.vfs_transport_factory = local.LocalURLServer
524
518
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
519
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
520
branch = self.make_branch('branch')
527
521
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
522
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
523
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
524
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
525
request.execute('reference'))
534
527
def test_notification_on_branch_from_repository(self):
535
528
"""When there is a repository, the error should return details."""
536
529
backing = self.get_transport()
537
request = smart_dir.SmartServerRequestOpenBranch(backing)
530
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
538
531
repo = self.make_repository('.')
539
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
532
self.assertEqual(SmartServerResponse(('nobranch',)),
540
533
request.execute(''))
546
539
"""When there is no branch, ('nobranch', ) is returned."""
547
540
backing = self.get_transport()
548
541
self.make_bzrdir('.')
549
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
550
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
542
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
543
self.assertEqual(SmartServerResponse(('nobranch', )),
551
544
request.execute(''))
553
546
def test_branch(self):
554
547
"""When there is a branch, 'ok' is returned."""
555
548
backing = self.get_transport()
556
549
expected = self.make_branch('.')._format.network_name()
557
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
558
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
559
('branch', expected)),
550
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
551
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
562
554
def test_branch_reference(self):
563
555
"""When there is a branch reference, the reference URL is returned."""
564
self.vfs_transport_factory = test_server.LocalURLServer
556
self.vfs_transport_factory = local.LocalURLServer
565
557
backing = self.get_transport()
566
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
558
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
567
559
branch = self.make_branch('branch')
568
560
checkout = branch.create_checkout('reference',lightweight=True)
569
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
561
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
571
562
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
572
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
573
('ref', reference_url)),
574
request.execute('reference'))
563
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
564
request.execute('reference'))
576
566
def test_stacked_branch(self):
577
567
"""Opening a stacked branch does not open the stacked-on branch."""
579
569
feature = self.make_branch('feature')
580
570
feature.set_stacked_on_url(trunk.base)
581
571
opened_branches = []
582
_mod_branch.Branch.hooks.install_named_hook(
583
'open', opened_branches.append, None)
572
Branch.hooks.install_named_hook('open', opened_branches.append, None)
584
573
backing = self.get_transport()
585
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
574
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
586
575
request.setup_jail()
588
577
response = request.execute('feature')
590
579
request.teardown_jail()
591
580
expected_format = feature._format.network_name()
592
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
593
('branch', expected_format)),
582
SuccessfulSmartServerResponse(('branch', expected_format)),
595
584
self.assertLength(1, opened_branches)
597
586
def test_notification_on_branch_from_repository(self):
598
587
"""When there is a repository, the error should return details."""
599
588
backing = self.get_transport()
600
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
589
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
601
590
repo = self.make_repository('.')
602
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
591
self.assertEqual(SmartServerResponse(('nobranch',)),
603
592
request.execute(''))
609
598
"""When there is no branch, ('nobranch', ) is returned."""
610
599
backing = self.get_transport()
611
600
self.make_bzrdir('.')
612
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
613
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
601
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
602
self.assertEqual(SmartServerResponse(('nobranch',)),
614
603
request.execute(''))
616
605
def test_branch(self):
617
606
"""When there is a branch, 'ok' is returned."""
618
607
backing = self.get_transport()
619
608
expected = self.make_branch('.')._format.network_name()
620
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
621
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
622
('branch', expected)),
609
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
610
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
625
613
def test_branch_reference(self):
626
614
"""When there is a branch reference, the reference URL is returned."""
627
self.vfs_transport_factory = test_server.LocalURLServer
615
self.vfs_transport_factory = local.LocalURLServer
628
616
backing = self.get_transport()
629
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
617
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
630
618
branch = self.make_branch('branch')
631
619
checkout = branch.create_checkout('reference',lightweight=True)
632
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
620
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
634
621
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
635
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
636
('ref', reference_url)),
637
request.execute('reference'))
622
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
623
request.execute('reference'))
639
625
def test_stacked_branch(self):
640
626
"""Opening a stacked branch does not open the stacked-on branch."""
642
628
feature = self.make_branch('feature')
643
629
feature.set_stacked_on_url(trunk.base)
644
630
opened_branches = []
645
_mod_branch.Branch.hooks.install_named_hook(
646
'open', opened_branches.append, None)
631
Branch.hooks.install_named_hook('open', opened_branches.append, None)
647
632
backing = self.get_transport()
648
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
633
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
649
634
request.setup_jail()
651
636
response = request.execute('feature')
653
638
request.teardown_jail()
654
639
expected_format = feature._format.network_name()
655
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
656
('branch', expected_format)),
641
SuccessfulSmartServerResponse(('branch', expected_format)),
658
643
self.assertLength(1, opened_branches)
660
645
def test_notification_on_branch_from_repository(self):
661
646
"""When there is a repository, the error should return details."""
662
647
backing = self.get_transport()
663
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
648
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
664
649
repo = self.make_repository('.')
665
self.assertEqual(smart_req.SmartServerResponse(
666
('nobranch', 'location is a repository')),
651
SmartServerResponse(('nobranch', 'location is a repository')),
670
655
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
690
def test_branch_reference(self):
706
691
"""When there is a branch reference, NotBranchError is raised."""
707
692
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
693
request = smart.branch.SmartServerBranchRequest(backing)
709
694
branch = self.make_branch('branch')
710
695
checkout = branch.create_checkout('reference',lightweight=True)
711
696
self.assertRaises(errors.NotBranchError,
712
697
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
700
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
702
def test_empty(self):
719
703
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
704
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
705
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
706
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
707
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
708
request.execute(''))
726
710
def test_not_empty(self):
727
711
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
712
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
713
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
714
tree = self.make_branch_and_memory_tree('.')
731
715
tree.lock_write()
778
761
def test_value_name(self):
779
762
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
763
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
764
branch.bzrdir.root_transport)
782
765
branch_token, repo_token = self.get_lock_tokens(branch)
783
766
config = branch._get_config()
784
767
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
769
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
770
self.assertEqual('bar', config.get_option('foo'))
791
774
def test_value_name_section(self):
792
775
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
776
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
777
branch.bzrdir.root_transport)
795
778
branch_token, repo_token = self.get_lock_tokens(branch)
796
779
config = branch._get_config()
797
780
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
782
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
783
self.assertEqual('bar', config.get_option('foo', 'gam'))
805
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
808
TestLockedBranch.setUp(self)
809
# A dict with non-ascii keys and values to exercise unicode
811
self.encoded_value_dict = (
812
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
814
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
816
def test_value_name(self):
817
branch = self.make_branch('.')
818
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
819
branch.bzrdir.root_transport)
820
branch_token, repo_token = self.get_lock_tokens(branch)
821
config = branch._get_config()
822
result = request.execute('', branch_token, repo_token,
823
self.encoded_value_dict, 'foo', '')
824
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
825
self.assertEqual(self.value_dict, config.get_option('foo'))
829
def test_value_name_section(self):
830
branch = self.make_branch('.')
831
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
832
branch.bzrdir.root_transport)
833
branch_token, repo_token = self.get_lock_tokens(branch)
834
config = branch._get_config()
835
result = request.execute('', branch_token, repo_token,
836
self.encoded_value_dict, 'foo', 'gam')
837
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
838
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
843
788
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
844
789
# Only called when the branch format and tags match [yay factory
845
790
# methods] so only need to test straight forward cases.
1097
1041
def test_get_parent_none(self):
1098
1042
base_branch = self.make_branch('base')
1099
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
1043
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1100
1044
response = request.execute('base')
1101
1045
self.assertEquals(
1102
smart_req.SuccessfulSmartServerResponse(('',)), response)
1046
SuccessfulSmartServerResponse(('',)), response)
1104
1048
def test_get_parent_something(self):
1105
1049
base_branch = self.make_branch('base')
1106
1050
base_branch.set_parent(self.get_url('foo'))
1107
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
1051
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1108
1052
response = request.execute('base')
1109
1053
self.assertEquals(
1110
smart_req.SuccessfulSmartServerResponse(("../foo",)),
1054
SuccessfulSmartServerResponse(("../foo",)),
1114
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
1058
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1116
1060
def test_set_parent_none(self):
1117
1061
branch = self.make_branch('base', format="1.9")
1118
1062
branch.lock_write()
1119
1063
branch._set_parent_location('foo')
1120
1064
branch.unlock()
1121
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1065
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1122
1066
self.get_transport())
1123
branch_token, repo_token = self.get_lock_tokens(branch)
1067
branch_token = branch.lock_write()
1068
repo_token = branch.repository.lock_write()
1125
1070
response = request.execute('base', branch_token, repo_token, '')
1072
branch.repository.unlock()
1127
1073
branch.unlock()
1128
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1074
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1129
1075
self.assertEqual(None, branch.get_parent())
1131
1077
def test_set_parent_something(self):
1132
1078
branch = self.make_branch('base', format="1.9")
1133
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1079
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1134
1080
self.get_transport())
1135
branch_token, repo_token = self.get_lock_tokens(branch)
1081
branch_token = branch.lock_write()
1082
repo_token = branch.repository.lock_write()
1137
1084
response = request.execute('base', branch_token, repo_token,
1087
branch.repository.unlock()
1140
1088
branch.unlock()
1141
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1089
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1142
1090
self.assertEqual('http://bar/', branch.get_parent())
1145
class TestSmartServerBranchRequestGetTagsBytes(
1146
tests.TestCaseWithMemoryTransport):
1093
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1147
1094
# Only called when the branch format and tags match [yay factory
1148
1095
# methods] so only need to test straight forward cases.
1150
1097
def test_get_bytes(self):
1151
1098
base_branch = self.make_branch('base')
1152
request = smart_branch.SmartServerBranchGetTagsBytes(
1099
request = smart.branch.SmartServerBranchGetTagsBytes(
1153
1100
self.get_transport())
1154
1101
response = request.execute('base')
1155
1102
self.assertEquals(
1156
smart_req.SuccessfulSmartServerResponse(('',)), response)
1103
SuccessfulSmartServerResponse(('',)), response)
1159
1106
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1163
1110
stacked_branch = self.make_branch('stacked', format='1.6')
1164
1111
# typically should be relative
1165
1112
stacked_branch.set_stacked_on_url('../base')
1166
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
1113
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1167
1114
self.get_transport())
1168
1115
response = request.execute('stacked')
1169
1116
self.assertEquals(
1170
smart_req.SmartServerResponse(('ok', '../base')),
1117
SmartServerResponse(('ok', '../base')),
1174
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
1121
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1176
1123
def setUp(self):
1177
1124
tests.TestCaseWithMemoryTransport.setUp(self)
1179
1126
def test_lock_write_on_unlocked_branch(self):
1180
1127
backing = self.get_transport()
1181
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1128
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1182
1129
branch = self.make_branch('.', format='knit')
1183
1130
repository = branch.repository
1184
1131
response = request.execute('')
1185
1132
branch_nonce = branch.control_files._lock.peek().get('nonce')
1186
1133
repository_nonce = repository.control_files._lock.peek().get('nonce')
1187
self.assertEqual(smart_req.SmartServerResponse(
1188
('ok', branch_nonce, repository_nonce)),
1135
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1190
1137
# The branch (and associated repository) is now locked. Verify that
1191
1138
# with a new branch object.
1192
1139
new_branch = repository.bzrdir.open_branch()
1193
1140
self.assertRaises(errors.LockContention, new_branch.lock_write)
1195
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1142
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1196
1143
response = request.execute('', branch_nonce, repository_nonce)
1198
1145
def test_lock_write_on_locked_branch(self):
1199
1146
backing = self.get_transport()
1200
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1147
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1201
1148
branch = self.make_branch('.')
1202
branch_token = branch.lock_write().branch_token
1149
branch_token = branch.lock_write()
1203
1150
branch.leave_lock_in_place()
1204
1151
branch.unlock()
1205
1152
response = request.execute('')
1206
1153
self.assertEqual(
1207
smart_req.SmartServerResponse(('LockContention',)), response)
1154
SmartServerResponse(('LockContention',)), response)
1209
1156
branch.lock_write(branch_token)
1210
1157
branch.dont_leave_lock_in_place()
1308
1260
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1309
1261
backing = self.get_transport()
1310
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1262
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1311
1263
branch = self.make_branch('.', format='knit')
1312
1264
response = request.execute(
1313
1265
'', 'branch token', 'repo token')
1314
1266
self.assertEqual(
1315
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1267
SmartServerResponse(('TokenMismatch',)), response)
1317
1269
def test_unlock_on_unlocked_branch_locked_repo(self):
1318
1270
backing = self.get_transport()
1319
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1271
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1320
1272
branch = self.make_branch('.', format='knit')
1321
1273
# Lock the repository.
1322
repo_token = branch.repository.lock_write().repository_token
1274
repo_token = branch.repository.lock_write()
1323
1275
branch.repository.leave_lock_in_place()
1324
1276
branch.repository.unlock()
1325
1277
# Issue branch lock_write request on the unlocked branch (with locked
1327
response = request.execute('', 'branch token', repo_token)
1279
response = request.execute(
1280
'', 'branch token', repo_token)
1328
1281
self.assertEqual(
1329
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1282
SmartServerResponse(('TokenMismatch',)), response)
1331
1284
branch.repository.lock_write(repo_token)
1332
1285
branch.repository.dont_leave_lock_in_place()
1354
1307
def test_trivial_bzipped(self):
1355
1308
# This tests that the wire encoding is actually bzipped
1356
1309
backing = self.get_transport()
1357
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1310
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1358
1311
tree = self.make_branch_and_memory_tree('.')
1360
1313
self.assertEqual(None,
1361
1314
request.execute('', 'missing-id'))
1362
1315
# Note that it returns a body that is bzipped.
1363
1316
self.assertEqual(
1364
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1317
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1365
1318
request.do_body('\n\n0\n'))
1367
1320
def test_trivial_include_missing(self):
1368
1321
backing = self.get_transport()
1369
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1322
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1370
1323
tree = self.make_branch_and_memory_tree('.')
1372
1325
self.assertEqual(None,
1373
1326
request.execute('', 'missing-id', 'include-missing:'))
1374
1327
self.assertEqual(
1375
smart_req.SuccessfulSmartServerResponse(('ok', ),
1328
SuccessfulSmartServerResponse(('ok', ),
1376
1329
bz2.compress('missing:missing-id')),
1377
1330
request.do_body('\n\n0\n'))
1380
class TestSmartServerRepositoryGetRevisionGraph(
1381
tests.TestCaseWithMemoryTransport):
1333
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1383
1335
def test_none_argument(self):
1384
1336
backing = self.get_transport()
1385
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1337
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1386
1338
tree = self.make_branch_and_memory_tree('.')
1387
1339
tree.lock_write()
1443
1394
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1446
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1397
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1447
1398
request.execute('', 1, (2, rev2_id_utf8)))
1449
1400
def test_known_revid_missing(self):
1450
1401
backing = self.get_transport()
1451
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1402
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1452
1403
repo = self.make_repository('.')
1453
1404
self.assertEqual(
1454
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1405
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1455
1406
request.execute('', 1, (2, 'ghost')))
1457
1408
def test_history_incomplete(self):
1458
1409
backing = self.get_transport()
1459
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1410
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1460
1411
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1461
1412
parent.lock_write()
1462
1413
parent.add([''], ['TREE_ROOT'])
1621
1572
def test_lock_write_on_unlocked_repo(self):
1622
1573
backing = self.get_transport()
1623
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1574
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1624
1575
repository = self.make_repository('.', format='knit')
1625
1576
response = request.execute('')
1626
1577
nonce = repository.control_files._lock.peek().get('nonce')
1627
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1578
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1628
1579
# The repository is now locked. Verify that with a new repository
1630
1581
new_repo = repository.bzrdir.open_repository()
1631
1582
self.assertRaises(errors.LockContention, new_repo.lock_write)
1633
request = smart_repo.SmartServerRepositoryUnlock(backing)
1584
request = smart.repository.SmartServerRepositoryUnlock(backing)
1634
1585
response = request.execute('', nonce)
1636
1587
def test_lock_write_on_locked_repo(self):
1637
1588
backing = self.get_transport()
1638
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1589
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1639
1590
repository = self.make_repository('.', format='knit')
1640
repo_token = repository.lock_write().repository_token
1591
repo_token = repository.lock_write()
1641
1592
repository.leave_lock_in_place()
1642
1593
repository.unlock()
1643
1594
response = request.execute('')
1644
1595
self.assertEqual(
1645
smart_req.SmartServerResponse(('LockContention',)), response)
1596
SmartServerResponse(('LockContention',)), response)
1647
1598
repository.lock_write(repo_token)
1648
1599
repository.dont_leave_lock_in_place()
1669
1620
def test_insert_stream_empty(self):
1670
1621
backing = self.get_transport()
1671
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1622
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1672
1623
repository = self.make_repository('.')
1673
1624
response = request.execute('', '')
1674
1625
self.assertEqual(None, response)
1675
1626
response = request.do_chunk(self.make_empty_byte_stream(repository))
1676
1627
self.assertEqual(None, response)
1677
1628
response = request.do_end()
1678
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1629
self.assertEqual(SmartServerResponse(('ok', )), response)
1681
1632
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1683
1634
def test_insert_stream_empty(self):
1684
1635
backing = self.get_transport()
1685
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1636
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1687
1638
repository = self.make_repository('.', format='knit')
1688
lock_token = repository.lock_write().repository_token
1639
lock_token = repository.lock_write()
1689
1640
response = request.execute('', '', lock_token)
1690
1641
self.assertEqual(None, response)
1691
1642
response = request.do_chunk(self.make_empty_byte_stream(repository))
1692
1643
self.assertEqual(None, response)
1693
1644
response = request.do_end()
1694
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1645
self.assertEqual(SmartServerResponse(('ok', )), response)
1695
1646
repository.unlock()
1697
1648
def test_insert_stream_with_wrong_lock_token(self):
1698
1649
backing = self.get_transport()
1699
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1650
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1701
1652
repository = self.make_repository('.', format='knit')
1702
lock_token = repository.lock_write().repository_token
1653
lock_token = repository.lock_write()
1703
1654
self.assertRaises(
1704
1655
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1705
1656
repository.unlock()
1729
1680
def test_unlock_on_unlocked_repo(self):
1730
1681
backing = self.get_transport()
1731
request = smart_repo.SmartServerRepositoryUnlock(backing)
1682
request = smart.repository.SmartServerRepositoryUnlock(backing)
1732
1683
repository = self.make_repository('.', format='knit')
1733
1684
response = request.execute('', 'some token')
1734
1685
self.assertEqual(
1735
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1686
SmartServerResponse(('TokenMismatch',)), response)
1738
1689
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1740
1691
def test_is_readonly_no(self):
1741
1692
backing = self.get_transport()
1742
request = smart_req.SmartServerIsReadonly(backing)
1693
request = smart.request.SmartServerIsReadonly(backing)
1743
1694
response = request.execute()
1744
1695
self.assertEqual(
1745
smart_req.SmartServerResponse(('no',)), response)
1696
SmartServerResponse(('no',)), response)
1747
1698
def test_is_readonly_yes(self):
1748
1699
backing = self.get_readonly_transport()
1749
request = smart_req.SmartServerIsReadonly(backing)
1700
request = smart.request.SmartServerIsReadonly(backing)
1750
1701
response = request.execute()
1751
1702
self.assertEqual(
1752
smart_req.SmartServerResponse(('yes',)), response)
1755
class TestSmartServerRepositorySetMakeWorkingTrees(
1756
tests.TestCaseWithMemoryTransport):
1703
SmartServerResponse(('yes',)), response)
1706
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1758
1708
def test_set_false(self):
1759
1709
backing = self.get_transport()
1760
1710
repo = self.make_repository('.', shared=True)
1761
1711
repo.set_make_working_trees(True)
1762
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1712
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1763
1713
request = request_class(backing)
1764
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1714
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1765
1715
request.execute('', 'False'))
1766
1716
repo = repo.bzrdir.open_repository()
1767
1717
self.assertFalse(repo.make_working_trees())
1849
1799
"""All registered request_handlers can be found."""
1850
1800
# If there's a typo in a register_lazy call, this loop will fail with
1851
1801
# an AttributeError.
1852
for key, item in smart_req.request_handlers.iteritems():
1802
for key, item in smart.request.request_handlers.iteritems():
1855
1805
def assertHandlerEqual(self, verb, handler):
1856
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1806
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1858
1808
def test_registered_methods(self):
1859
1809
"""Test that known methods are registered to the correct object."""
1860
1810
self.assertHandlerEqual('Branch.get_config_file',
1861
smart_branch.SmartServerBranchGetConfigFile)
1811
smart.branch.SmartServerBranchGetConfigFile)
1862
1812
self.assertHandlerEqual('Branch.get_parent',
1863
smart_branch.SmartServerBranchGetParent)
1813
smart.branch.SmartServerBranchGetParent)
1864
1814
self.assertHandlerEqual('Branch.get_tags_bytes',
1865
smart_branch.SmartServerBranchGetTagsBytes)
1815
smart.branch.SmartServerBranchGetTagsBytes)
1866
1816
self.assertHandlerEqual('Branch.lock_write',
1867
smart_branch.SmartServerBranchRequestLockWrite)
1817
smart.branch.SmartServerBranchRequestLockWrite)
1868
1818
self.assertHandlerEqual('Branch.last_revision_info',
1869
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1819
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1870
1820
self.assertHandlerEqual('Branch.revision_history',
1871
smart_branch.SmartServerRequestRevisionHistory)
1821
smart.branch.SmartServerRequestRevisionHistory)
1872
1822
self.assertHandlerEqual('Branch.set_config_option',
1873
smart_branch.SmartServerBranchRequestSetConfigOption)
1823
smart.branch.SmartServerBranchRequestSetConfigOption)
1874
1824
self.assertHandlerEqual('Branch.set_last_revision',
1875
smart_branch.SmartServerBranchRequestSetLastRevision)
1825
smart.branch.SmartServerBranchRequestSetLastRevision)
1876
1826
self.assertHandlerEqual('Branch.set_last_revision_info',
1877
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1827
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1878
1828
self.assertHandlerEqual('Branch.set_last_revision_ex',
1879
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1829
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1880
1830
self.assertHandlerEqual('Branch.set_parent_location',
1881
smart_branch.SmartServerBranchRequestSetParentLocation)
1831
smart.branch.SmartServerBranchRequestSetParentLocation)
1882
1832
self.assertHandlerEqual('Branch.unlock',
1883
smart_branch.SmartServerBranchRequestUnlock)
1833
smart.branch.SmartServerBranchRequestUnlock)
1884
1834
self.assertHandlerEqual('BzrDir.find_repository',
1885
smart_dir.SmartServerRequestFindRepositoryV1)
1835
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1886
1836
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1887
smart_dir.SmartServerRequestFindRepositoryV2)
1837
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1888
1838
self.assertHandlerEqual('BzrDirFormat.initialize',
1889
smart_dir.SmartServerRequestInitializeBzrDir)
1839
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1890
1840
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1891
smart_dir.SmartServerRequestBzrDirInitializeEx)
1841
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1892
1842
self.assertHandlerEqual('BzrDir.cloning_metadir',
1893
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1843
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1894
1844
self.assertHandlerEqual('BzrDir.get_config_file',
1895
smart_dir.SmartServerBzrDirRequestConfigFile)
1845
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1896
1846
self.assertHandlerEqual('BzrDir.open_branch',
1897
smart_dir.SmartServerRequestOpenBranch)
1847
smart.bzrdir.SmartServerRequestOpenBranch)
1898
1848
self.assertHandlerEqual('BzrDir.open_branchV2',
1899
smart_dir.SmartServerRequestOpenBranchV2)
1849
smart.bzrdir.SmartServerRequestOpenBranchV2)
1900
1850
self.assertHandlerEqual('BzrDir.open_branchV3',
1901
smart_dir.SmartServerRequestOpenBranchV3)
1851
smart.bzrdir.SmartServerRequestOpenBranchV3)
1902
1852
self.assertHandlerEqual('PackRepository.autopack',
1903
smart_packrepo.SmartServerPackRepositoryAutopack)
1853
smart.packrepository.SmartServerPackRepositoryAutopack)
1904
1854
self.assertHandlerEqual('Repository.gather_stats',
1905
smart_repo.SmartServerRepositoryGatherStats)
1855
smart.repository.SmartServerRepositoryGatherStats)
1906
1856
self.assertHandlerEqual('Repository.get_parent_map',
1907
smart_repo.SmartServerRepositoryGetParentMap)
1857
smart.repository.SmartServerRepositoryGetParentMap)
1908
1858
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1909
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1859
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1910
1860
self.assertHandlerEqual('Repository.get_revision_graph',
1911
smart_repo.SmartServerRepositoryGetRevisionGraph)
1861
smart.repository.SmartServerRepositoryGetRevisionGraph)
1912
1862
self.assertHandlerEqual('Repository.get_stream',
1913
smart_repo.SmartServerRepositoryGetStream)
1863
smart.repository.SmartServerRepositoryGetStream)
1914
1864
self.assertHandlerEqual('Repository.has_revision',
1915
smart_repo.SmartServerRequestHasRevision)
1865
smart.repository.SmartServerRequestHasRevision)
1916
1866
self.assertHandlerEqual('Repository.insert_stream',
1917
smart_repo.SmartServerRepositoryInsertStream)
1867
smart.repository.SmartServerRepositoryInsertStream)
1918
1868
self.assertHandlerEqual('Repository.insert_stream_locked',
1919
smart_repo.SmartServerRepositoryInsertStreamLocked)
1869
smart.repository.SmartServerRepositoryInsertStreamLocked)
1920
1870
self.assertHandlerEqual('Repository.is_shared',
1921
smart_repo.SmartServerRepositoryIsShared)
1871
smart.repository.SmartServerRepositoryIsShared)
1922
1872
self.assertHandlerEqual('Repository.lock_write',
1923
smart_repo.SmartServerRepositoryLockWrite)
1873
smart.repository.SmartServerRepositoryLockWrite)
1924
1874
self.assertHandlerEqual('Repository.tarball',
1925
smart_repo.SmartServerRepositoryTarball)
1875
smart.repository.SmartServerRepositoryTarball)
1926
1876
self.assertHandlerEqual('Repository.unlock',
1927
smart_repo.SmartServerRepositoryUnlock)
1877
smart.repository.SmartServerRepositoryUnlock)
1928
1878
self.assertHandlerEqual('Transport.is_readonly',
1929
smart_req.SmartServerIsReadonly)
1879
smart.request.SmartServerIsReadonly)