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 (
39
from bzrlib.branch import Branch, BranchReferenceFormat
40
import bzrlib.smart.branch
41
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
42
import bzrlib.smart.packrepository
43
import bzrlib.smart.repository
44
from bzrlib.smart.request import (
45
FailedSmartServerResponse,
48
SuccessfulSmartServerResponse,
50
from bzrlib.tests import (
53
from bzrlib.transport import chroot, get_transport
54
from bzrlib.util import bencode
58
57
def load_tests(standard_tests, module, loader):
59
58
"""Multiply tests version and protocol consistency."""
60
59
# FindRepository tests.
60
bzrdir_mod = bzrlib.smart.bzrdir
62
62
("find_repository", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
63
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
64
64
("find_repositoryV2", {
65
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
65
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
66
66
("find_repositoryV3", {
67
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
67
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
69
to_adapt, result = tests.split_suite_by_re(standard_tests,
69
to_adapt, result = split_suite_by_re(standard_tests,
70
70
"TestSmartServerRequestFindRepository")
71
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
71
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
73
73
tests.multiply_tests(v1_and_2, scenarios, result)
74
74
# The first scenario is only applicable to v1 protocols, it is deleted
106
106
self.transport_server = self.make_transport_server
108
108
def make_transport_server(self):
109
return test_server.SmartTCPServer_for_testing('-' + self.id())
109
return smart.server.SmartTCPServer_for_testing('-' + self.id())
111
111
def get_smart_medium(self):
112
112
"""Get a smart medium to use in tests."""
113
113
return self.get_transport().get_smart_medium()
116
class TestByteStreamToStream(tests.TestCase):
118
def test_repeated_substreams_same_kind_are_one_stream(self):
119
# Make a stream - an iterable of bytestrings.
120
stream = [('text', [versionedfile.FulltextContentFactory(('k1',), None,
121
None, 'foo')]),('text', [
122
versionedfile.FulltextContentFactory(('k2',), None, None, 'bar')])]
123
fmt = bzrdir.format_registry.get('pack-0.92')().repository_format
124
bytes = smart_repo._stream_to_byte_stream(stream, fmt)
126
# Iterate the resulting iterable; checking that we get only one stream
128
fmt, stream = smart_repo._byte_stream_to_stream(bytes)
129
for kind, substream in stream:
130
streams.append((kind, list(substream)))
131
self.assertLength(1, streams)
132
self.assertLength(2, streams[0][1])
135
116
class TestSmartServerResponse(tests.TestCase):
137
118
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', )))
119
self.assertEqual(SmartServerResponse(('ok', )),
120
SmartServerResponse(('ok', )))
121
self.assertEqual(SmartServerResponse(('ok', ), 'body'),
122
SmartServerResponse(('ok', ), 'body'))
123
self.assertNotEqual(SmartServerResponse(('ok', )),
124
SmartServerResponse(('notok', )))
125
self.assertNotEqual(SmartServerResponse(('ok', ), 'body'),
126
SmartServerResponse(('ok', )))
146
127
self.assertNotEqual(None,
147
smart_req.SmartServerResponse(('ok', )))
128
SmartServerResponse(('ok', )))
149
130
def test__str__(self):
150
131
"""SmartServerResponses can be stringified."""
151
132
self.assertEqual(
152
133
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
153
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
134
str(SuccessfulSmartServerResponse(('args',), 'body')))
154
135
self.assertEqual(
155
136
"<FailedSmartServerResponse args=('args',) body='body'>",
156
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
137
str(FailedSmartServerResponse(('args',), 'body')))
159
140
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
161
142
def test_translate_client_path(self):
162
143
transport = self.get_transport()
163
request = smart_req.SmartServerRequest(transport, 'foo/')
144
request = SmartServerRequest(transport, 'foo/')
164
145
self.assertEqual('./', request.translate_client_path('foo/'))
165
146
self.assertRaises(
166
147
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
282
if repo._format.supports_external_lookups:
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
250
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
251
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
289
('ok', '', rich_root, subtrees, external,
252
return SuccessfulSmartServerResponse(
253
('ok', '', rich_root, subtrees, 'no',
290
254
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
255
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
256
self._request_class):
293
257
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
296
('ok', '', rich_root, subtrees, external))
259
return SuccessfulSmartServerResponse(
260
('ok', '', rich_root, subtrees, 'no'))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
262
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
264
def test_shared_repository(self):
302
265
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
419
376
"""Initializing a missing directory should fail like the bzrdir api."""
420
377
backing = self.get_transport()
421
378
name = self.make_bzrdir('reference')._format.network_name()
422
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
379
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
423
380
self.assertRaises(errors.NoSuchFile, request.execute, name,
424
381
'subdir/dir', 'False', 'False', 'False', '', '', '', '', 'False')
426
383
def test_initialized_dir(self):
427
"""Initializing an extant directory should fail like the bzrdir api."""
384
"""Initializing an extant dirctory should fail like the bzrdir api."""
428
385
backing = self.get_transport()
429
386
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
387
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
388
self.make_bzrdir('subdir')
432
389
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
390
'False', 'False', 'False', '', '', '', '', 'False')
436
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
438
def test_no_directory(self):
439
backing = self.get_transport()
440
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
441
self.assertEqual(smart_req.SmartServerResponse(('no', )),
442
request.execute('does-not-exist'))
444
def test_empty_directory(self):
445
backing = self.get_transport()
446
backing.mkdir('empty')
447
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
448
self.assertEqual(smart_req.SmartServerResponse(('no', )),
449
request.execute('empty'))
451
def test_outside_root_client_path(self):
452
backing = self.get_transport()
453
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
454
root_client_path='root')
455
self.assertEqual(smart_req.SmartServerResponse(('no', )),
456
request.execute('not-root'))
459
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
461
def test_no_directory(self):
462
backing = self.get_transport()
463
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
464
self.assertEqual(smart_req.SmartServerResponse(('no', )),
465
request.execute('does-not-exist'))
467
def test_empty_directory(self):
468
backing = self.get_transport()
469
backing.mkdir('empty')
470
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
self.assertEqual(smart_req.SmartServerResponse(('no', )),
472
request.execute('empty'))
474
def test_present_without_workingtree(self):
475
backing = self.get_transport()
476
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
477
self.make_bzrdir('.')
478
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
481
def test_outside_root_client_path(self):
482
backing = self.get_transport()
483
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
484
root_client_path='root')
485
self.assertEqual(smart_req.SmartServerResponse(('no',)),
486
request.execute('not-root'))
489
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
491
def test_present_with_workingtree(self):
492
self.vfs_transport_factory = test_server.LocalURLServer
493
backing = self.get_transport()
494
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
495
bd = self.make_bzrdir('.')
496
bd.create_repository()
498
bd.create_workingtree()
499
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
503
393
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
395
def test_no_branch(self):
506
396
"""When there is no branch, ('nobranch', ) is returned."""
507
397
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
398
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
399
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
400
self.assertEqual(SmartServerResponse(('nobranch', )),
511
401
request.execute(''))
513
403
def test_branch(self):
514
404
"""When there is a branch, 'ok' is returned."""
515
405
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
406
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
407
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
408
self.assertEqual(SmartServerResponse(('ok', '')),
519
409
request.execute(''))
521
411
def test_branch_reference(self):
522
412
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
413
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
414
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
415
branch = self.make_branch('branch')
527
416
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
417
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
418
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
419
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
420
request.execute('reference'))
534
def test_notification_on_branch_from_repository(self):
535
"""When there is a repository, the error should return details."""
536
backing = self.get_transport()
537
request = smart_dir.SmartServerRequestOpenBranch(backing)
538
repo = self.make_repository('.')
539
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
543
423
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
426
"""When there is no branch, ('nobranch', ) is returned."""
547
427
backing = self.get_transport()
548
428
self.make_bzrdir('.')
549
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
550
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
553
def test_branch(self):
554
"""When there is a branch, 'ok' is returned."""
555
backing = self.get_transport()
556
expected = self.make_branch('.')._format.network_name()
557
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
558
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
559
('branch', expected)),
562
def test_branch_reference(self):
563
"""When there is a branch reference, the reference URL is returned."""
564
self.vfs_transport_factory = test_server.LocalURLServer
565
backing = self.get_transport()
566
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
567
branch = self.make_branch('branch')
568
checkout = branch.create_checkout('reference',lightweight=True)
569
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
571
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
572
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
573
('ref', reference_url)),
574
request.execute('reference'))
576
def test_stacked_branch(self):
577
"""Opening a stacked branch does not open the stacked-on branch."""
578
trunk = self.make_branch('trunk')
579
feature = self.make_branch('feature')
580
feature.set_stacked_on_url(trunk.base)
582
_mod_branch.Branch.hooks.install_named_hook(
583
'open', opened_branches.append, None)
584
backing = self.get_transport()
585
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
588
response = request.execute('feature')
590
request.teardown_jail()
591
expected_format = feature._format.network_name()
592
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
593
('branch', expected_format)),
595
self.assertLength(1, opened_branches)
597
def test_notification_on_branch_from_repository(self):
598
"""When there is a repository, the error should return details."""
599
backing = self.get_transport()
600
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
601
repo = self.make_repository('.')
602
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
606
class TestSmartServerRequestOpenBranchV3(TestCaseWithChrootedTransport):
608
def test_no_branch(self):
609
"""When there is no branch, ('nobranch', ) is returned."""
610
backing = self.get_transport()
611
self.make_bzrdir('.')
612
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
613
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
616
def test_branch(self):
617
"""When there is a branch, 'ok' is returned."""
618
backing = self.get_transport()
619
expected = self.make_branch('.')._format.network_name()
620
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
621
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
622
('branch', expected)),
625
def test_branch_reference(self):
626
"""When there is a branch reference, the reference URL is returned."""
627
self.vfs_transport_factory = test_server.LocalURLServer
628
backing = self.get_transport()
629
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
630
branch = self.make_branch('branch')
631
checkout = branch.create_checkout('reference',lightweight=True)
632
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
634
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
635
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
636
('ref', reference_url)),
637
request.execute('reference'))
639
def test_stacked_branch(self):
640
"""Opening a stacked branch does not open the stacked-on branch."""
641
trunk = self.make_branch('trunk')
642
feature = self.make_branch('feature')
643
feature.set_stacked_on_url(trunk.base)
645
_mod_branch.Branch.hooks.install_named_hook(
646
'open', opened_branches.append, None)
647
backing = self.get_transport()
648
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
651
response = request.execute('feature')
653
request.teardown_jail()
654
expected_format = feature._format.network_name()
655
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
656
('branch', expected_format)),
658
self.assertLength(1, opened_branches)
660
def test_notification_on_branch_from_repository(self):
661
"""When there is a repository, the error should return details."""
662
backing = self.get_transport()
663
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
664
repo = self.make_repository('.')
665
self.assertEqual(smart_req.SmartServerResponse(
666
('nobranch', 'location is a repository')),
429
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
430
self.assertEqual(SmartServerResponse(('nobranch', )),
433
def test_branch(self):
434
"""When there is a branch, 'ok' is returned."""
435
backing = self.get_transport()
436
expected = self.make_branch('.')._format.network_name()
437
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
438
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
441
def test_branch_reference(self):
442
"""When there is a branch reference, the reference URL is returned."""
443
backing = self.get_transport()
444
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
445
branch = self.make_branch('branch')
446
checkout = branch.create_checkout('reference',lightweight=True)
447
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
448
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
449
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
450
request.execute('reference'))
452
def test_stacked_branch(self):
453
"""Opening a stacked branch does not open the stacked-on branch."""
454
trunk = self.make_branch('trunk')
455
feature = self.make_branch('feature', format='1.9')
456
feature.set_stacked_on_url(trunk.base)
458
Branch.hooks.install_named_hook('open', opened_branches.append, None)
459
backing = self.get_transport()
460
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
463
response = request.execute('feature')
465
request.teardown_jail()
466
expected_format = feature._format.network_name()
468
SuccessfulSmartServerResponse(('branch', expected_format)),
470
self.assertLength(1, opened_branches)
670
473
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
508
def test_branch_reference(self):
706
509
"""When there is a branch reference, NotBranchError is raised."""
707
510
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
511
request = smart.branch.SmartServerBranchRequest(backing)
709
512
branch = self.make_branch('branch')
710
513
checkout = branch.create_checkout('reference',lightweight=True)
711
514
self.assertRaises(errors.NotBranchError,
712
515
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
518
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
520
def test_empty(self):
719
521
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
522
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
523
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
524
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
525
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
526
request.execute(''))
726
528
def test_not_empty(self):
727
529
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
530
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
531
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
532
tree = self.make_branch_and_memory_tree('.')
731
533
tree.lock_write()
778
579
def test_value_name(self):
779
580
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
581
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
582
branch.bzrdir.root_transport)
782
583
branch_token, repo_token = self.get_lock_tokens(branch)
783
584
config = branch._get_config()
784
585
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
587
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
588
self.assertEqual('bar', config.get_option('foo'))
791
590
def test_value_name_section(self):
792
591
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
592
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
593
branch.bzrdir.root_transport)
795
594
branch_token, repo_token = self.get_lock_tokens(branch)
796
595
config = branch._get_config()
797
596
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
598
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
599
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
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
844
# Only called when the branch format and tags match [yay factory
845
# methods] so only need to test straight forward cases.
847
def test_set_bytes(self):
848
base_branch = self.make_branch('base')
849
tag_bytes = base_branch._get_tags_bytes()
850
# get_lock_tokens takes out a lock.
851
branch_token, repo_token = self.get_lock_tokens(base_branch)
852
request = smart_branch.SmartServerBranchSetTagsBytes(
853
self.get_transport())
854
response = request.execute('base', branch_token, repo_token)
855
self.assertEqual(None, response)
856
response = request.do_chunk(tag_bytes)
857
self.assertEqual(None, response)
858
response = request.do_end()
860
smart_req.SuccessfulSmartServerResponse(()), response)
863
def test_lock_failed(self):
864
base_branch = self.make_branch('base')
865
base_branch.lock_write()
866
tag_bytes = base_branch._get_tags_bytes()
867
request = smart_branch.SmartServerBranchSetTagsBytes(
868
self.get_transport())
869
self.assertRaises(errors.TokenMismatch, request.execute,
870
'base', 'wrong token', 'wrong token')
871
# The request handler will keep processing the message parts, so even
872
# if the request fails immediately do_chunk and do_end are still
874
request.do_chunk(tag_bytes)
880
602
class SetLastRevisionTestBase(TestLockedBranch):
1097
818
def test_get_parent_none(self):
1098
819
base_branch = self.make_branch('base')
1099
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
820
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1100
821
response = request.execute('base')
1101
822
self.assertEquals(
1102
smart_req.SuccessfulSmartServerResponse(('',)), response)
823
SuccessfulSmartServerResponse(('',)), response)
1104
825
def test_get_parent_something(self):
1105
826
base_branch = self.make_branch('base')
1106
827
base_branch.set_parent(self.get_url('foo'))
1107
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
828
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1108
829
response = request.execute('base')
1109
830
self.assertEquals(
1110
smart_req.SuccessfulSmartServerResponse(("../foo",)),
831
SuccessfulSmartServerResponse(("../foo",)),
1114
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
835
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1116
837
def test_set_parent_none(self):
1117
838
branch = self.make_branch('base', format="1.9")
1118
839
branch.lock_write()
1119
840
branch._set_parent_location('foo')
1121
request = smart_branch.SmartServerBranchRequestSetParentLocation(
842
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1122
843
self.get_transport())
1123
branch_token, repo_token = self.get_lock_tokens(branch)
844
branch_token = branch.lock_write()
845
repo_token = branch.repository.lock_write()
1125
847
response = request.execute('base', branch_token, repo_token, '')
849
branch.repository.unlock()
1128
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
851
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1129
852
self.assertEqual(None, branch.get_parent())
1131
854
def test_set_parent_something(self):
1132
855
branch = self.make_branch('base', format="1.9")
1133
request = smart_branch.SmartServerBranchRequestSetParentLocation(
856
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1134
857
self.get_transport())
1135
branch_token, repo_token = self.get_lock_tokens(branch)
858
branch_token = branch.lock_write()
859
repo_token = branch.repository.lock_write()
1137
861
response = request.execute('base', branch_token, repo_token,
864
branch.repository.unlock()
1141
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
866
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1142
867
self.assertEqual('http://bar/', branch.get_parent())
1145
class TestSmartServerBranchRequestGetTagsBytes(
1146
tests.TestCaseWithMemoryTransport):
1147
# Only called when the branch format and tags match [yay factory
1148
# methods] so only need to test straight forward cases.
870
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
871
# Only called when the branch format and tags match [yay factory
872
# methods] so only need to test straight forward cases.
1150
874
def test_get_bytes(self):
1151
875
base_branch = self.make_branch('base')
1152
request = smart_branch.SmartServerBranchGetTagsBytes(
876
request = smart.branch.SmartServerBranchGetTagsBytes(
1153
877
self.get_transport())
1154
878
response = request.execute('base')
1155
879
self.assertEquals(
1156
smart_req.SuccessfulSmartServerResponse(('',)), response)
880
SuccessfulSmartServerResponse(('',)), response)
1159
883
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1163
887
stacked_branch = self.make_branch('stacked', format='1.6')
1164
888
# typically should be relative
1165
889
stacked_branch.set_stacked_on_url('../base')
1166
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
890
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1167
891
self.get_transport())
1168
892
response = request.execute('stacked')
1169
893
self.assertEquals(
1170
smart_req.SmartServerResponse(('ok', '../base')),
894
SmartServerResponse(('ok', '../base')),
1174
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
898
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1176
900
def setUp(self):
1177
901
tests.TestCaseWithMemoryTransport.setUp(self)
1179
903
def test_lock_write_on_unlocked_branch(self):
1180
904
backing = self.get_transport()
1181
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
905
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1182
906
branch = self.make_branch('.', format='knit')
1183
907
repository = branch.repository
1184
908
response = request.execute('')
1185
909
branch_nonce = branch.control_files._lock.peek().get('nonce')
1186
910
repository_nonce = repository.control_files._lock.peek().get('nonce')
1187
self.assertEqual(smart_req.SmartServerResponse(
1188
('ok', branch_nonce, repository_nonce)),
912
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1190
914
# The branch (and associated repository) is now locked. Verify that
1191
915
# with a new branch object.
1192
916
new_branch = repository.bzrdir.open_branch()
1193
917
self.assertRaises(errors.LockContention, new_branch.lock_write)
1195
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1196
response = request.execute('', branch_nonce, repository_nonce)
1198
919
def test_lock_write_on_locked_branch(self):
1199
920
backing = self.get_transport()
1200
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
921
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1201
922
branch = self.make_branch('.')
1202
branch_token = branch.lock_write().branch_token
1203
924
branch.leave_lock_in_place()
1205
926
response = request.execute('')
1206
927
self.assertEqual(
1207
smart_req.SmartServerResponse(('LockContention',)), response)
1209
branch.lock_write(branch_token)
1210
branch.dont_leave_lock_in_place()
928
SmartServerResponse(('LockContention',)), response)
1213
930
def test_lock_write_with_tokens_on_locked_branch(self):
1214
931
backing = self.get_transport()
1215
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
932
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1216
933
branch = self.make_branch('.', format='knit')
1217
branch_token, repo_token = self.get_lock_tokens(branch)
934
branch_token = branch.lock_write()
935
repo_token = branch.repository.lock_write()
936
branch.repository.unlock()
1218
937
branch.leave_lock_in_place()
1219
938
branch.repository.leave_lock_in_place()
1221
940
response = request.execute('',
1222
941
branch_token, repo_token)
1223
942
self.assertEqual(
1224
smart_req.SmartServerResponse(('ok', branch_token, repo_token)),
1227
branch.repository.lock_write(repo_token)
1228
branch.repository.dont_leave_lock_in_place()
1229
branch.repository.unlock()
1230
branch.lock_write(branch_token)
1231
branch.dont_leave_lock_in_place()
943
SmartServerResponse(('ok', branch_token, repo_token)), response)
1234
945
def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1235
946
backing = self.get_transport()
1236
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
947
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1237
948
branch = self.make_branch('.', format='knit')
1238
branch_token, repo_token = self.get_lock_tokens(branch)
949
branch_token = branch.lock_write()
950
repo_token = branch.repository.lock_write()
951
branch.repository.unlock()
1239
952
branch.leave_lock_in_place()
1240
953
branch.repository.leave_lock_in_place()
1242
955
response = request.execute('',
1243
956
branch_token+'xxx', repo_token)
1244
957
self.assertEqual(
1245
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1247
branch.repository.lock_write(repo_token)
1248
branch.repository.dont_leave_lock_in_place()
1249
branch.repository.unlock()
1250
branch.lock_write(branch_token)
1251
branch.dont_leave_lock_in_place()
958
SmartServerResponse(('TokenMismatch',)), response)
1254
960
def test_lock_write_on_locked_repo(self):
1255
961
backing = self.get_transport()
1256
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
962
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1257
963
branch = self.make_branch('.', format='knit')
1258
repo = branch.repository
1259
repo_token = repo.lock_write().repository_token
1260
repo.leave_lock_in_place()
964
branch.repository.lock_write()
965
branch.repository.leave_lock_in_place()
966
branch.repository.unlock()
1262
967
response = request.execute('')
1263
968
self.assertEqual(
1264
smart_req.SmartServerResponse(('LockContention',)), response)
1266
repo.lock_write(repo_token)
1267
repo.dont_leave_lock_in_place()
969
SmartServerResponse(('LockContention',)), response)
1270
971
def test_lock_write_on_readonly_transport(self):
1271
972
backing = self.get_readonly_transport()
1272
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
973
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1273
974
branch = self.make_branch('.')
1274
975
root = self.get_transport().clone('/')
1275
976
path = urlutils.relative_url(root.base, self.get_transport().base)
1308
1011
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1309
1012
backing = self.get_transport()
1310
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1013
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1311
1014
branch = self.make_branch('.', format='knit')
1312
1015
response = request.execute(
1313
1016
'', 'branch token', 'repo token')
1314
1017
self.assertEqual(
1315
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1018
SmartServerResponse(('TokenMismatch',)), response)
1317
1020
def test_unlock_on_unlocked_branch_locked_repo(self):
1318
1021
backing = self.get_transport()
1319
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1022
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1320
1023
branch = self.make_branch('.', format='knit')
1321
1024
# Lock the repository.
1322
repo_token = branch.repository.lock_write().repository_token
1025
repo_token = branch.repository.lock_write()
1323
1026
branch.repository.leave_lock_in_place()
1324
1027
branch.repository.unlock()
1325
1028
# Issue branch lock_write request on the unlocked branch (with locked
1327
response = request.execute('', 'branch token', repo_token)
1030
response = request.execute(
1031
'', 'branch token', repo_token)
1328
1032
self.assertEqual(
1329
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1331
branch.repository.lock_write(repo_token)
1332
branch.repository.dont_leave_lock_in_place()
1333
branch.repository.unlock()
1033
SmartServerResponse(('TokenMismatch',)), response)
1336
1036
class TestSmartServerRepositoryRequest(tests.TestCaseWithMemoryTransport):
1354
1054
def test_trivial_bzipped(self):
1355
1055
# This tests that the wire encoding is actually bzipped
1356
1056
backing = self.get_transport()
1357
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1057
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1358
1058
tree = self.make_branch_and_memory_tree('.')
1360
1060
self.assertEqual(None,
1361
1061
request.execute('', 'missing-id'))
1362
1062
# Note that it returns a body that is bzipped.
1363
1063
self.assertEqual(
1364
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1064
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1365
1065
request.do_body('\n\n0\n'))
1367
1067
def test_trivial_include_missing(self):
1368
1068
backing = self.get_transport()
1369
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1069
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1370
1070
tree = self.make_branch_and_memory_tree('.')
1372
1072
self.assertEqual(None,
1373
1073
request.execute('', 'missing-id', 'include-missing:'))
1374
1074
self.assertEqual(
1375
smart_req.SuccessfulSmartServerResponse(('ok', ),
1075
SuccessfulSmartServerResponse(('ok', ),
1376
1076
bz2.compress('missing:missing-id')),
1377
1077
request.do_body('\n\n0\n'))
1380
class TestSmartServerRepositoryGetRevisionGraph(
1381
tests.TestCaseWithMemoryTransport):
1080
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1383
1082
def test_none_argument(self):
1384
1083
backing = self.get_transport()
1385
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1084
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1386
1085
tree = self.make_branch_and_memory_tree('.')
1387
1086
tree.lock_write()
1425
1124
# Note that it still returns body (of zero bytes).
1426
self.assertEqual(smart_req.SmartServerResponse(
1427
('nosuchrevision', 'missingrevision', ), ''),
1428
request.execute('', 'missingrevision'))
1431
class TestSmartServerRepositoryGetRevIdForRevno(
1432
tests.TestCaseWithMemoryTransport):
1434
def test_revno_found(self):
1435
backing = self.get_transport()
1436
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1437
tree = self.make_branch_and_memory_tree('.')
1440
rev1_id_utf8 = u'\xc8'.encode('utf-8')
1441
rev2_id_utf8 = u'\xc9'.encode('utf-8')
1442
tree.commit('1st commit', rev_id=rev1_id_utf8)
1443
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1446
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1447
request.execute('', 1, (2, rev2_id_utf8)))
1449
def test_known_revid_missing(self):
1450
backing = self.get_transport()
1451
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1452
repo = self.make_repository('.')
1454
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1455
request.execute('', 1, (2, 'ghost')))
1457
def test_history_incomplete(self):
1458
backing = self.get_transport()
1459
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1460
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1462
parent.add([''], ['TREE_ROOT'])
1463
r1 = parent.commit(message='first commit')
1464
r2 = parent.commit(message='second commit')
1466
local = self.make_branch_and_memory_tree('local', format='1.9')
1467
local.branch.pull(parent.branch)
1468
local.set_parent_ids([r2])
1469
r3 = local.commit(message='local commit')
1470
local.branch.create_clone_on_transport(
1471
self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1473
smart_req.SmartServerResponse(('history-incomplete', 2, r2)),
1474
request.execute('stacked', 1, (3, r3)))
1126
SmartServerResponse(('nosuchrevision', 'missingrevision', ), ''),
1127
request.execute('', 'missingrevision'))
1477
1130
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1621
1274
def test_lock_write_on_unlocked_repo(self):
1622
1275
backing = self.get_transport()
1623
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1276
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1624
1277
repository = self.make_repository('.', format='knit')
1625
1278
response = request.execute('')
1626
1279
nonce = repository.control_files._lock.peek().get('nonce')
1627
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1280
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1628
1281
# The repository is now locked. Verify that with a new repository
1630
1283
new_repo = repository.bzrdir.open_repository()
1631
1284
self.assertRaises(errors.LockContention, new_repo.lock_write)
1633
request = smart_repo.SmartServerRepositoryUnlock(backing)
1634
response = request.execute('', nonce)
1636
1286
def test_lock_write_on_locked_repo(self):
1637
1287
backing = self.get_transport()
1638
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1288
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1639
1289
repository = self.make_repository('.', format='knit')
1640
repo_token = repository.lock_write().repository_token
1290
repository.lock_write()
1641
1291
repository.leave_lock_in_place()
1642
1292
repository.unlock()
1643
1293
response = request.execute('')
1644
1294
self.assertEqual(
1645
smart_req.SmartServerResponse(('LockContention',)), response)
1647
repository.lock_write(repo_token)
1648
repository.dont_leave_lock_in_place()
1295
SmartServerResponse(('LockContention',)), response)
1651
1297
def test_lock_write_on_readonly_transport(self):
1652
1298
backing = self.get_readonly_transport()
1653
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1299
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1654
1300
repository = self.make_repository('.', format='knit')
1655
1301
response = request.execute('')
1656
1302
self.assertFalse(response.is_successful())
1669
1315
def test_insert_stream_empty(self):
1670
1316
backing = self.get_transport()
1671
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1317
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1672
1318
repository = self.make_repository('.')
1673
1319
response = request.execute('', '')
1674
1320
self.assertEqual(None, response)
1675
1321
response = request.do_chunk(self.make_empty_byte_stream(repository))
1676
1322
self.assertEqual(None, response)
1677
1323
response = request.do_end()
1678
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1324
self.assertEqual(SmartServerResponse(('ok', )), response)
1681
1327
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1683
1329
def test_insert_stream_empty(self):
1684
1330
backing = self.get_transport()
1685
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1331
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1687
1333
repository = self.make_repository('.', format='knit')
1688
lock_token = repository.lock_write().repository_token
1334
lock_token = repository.lock_write()
1689
1335
response = request.execute('', '', lock_token)
1690
1336
self.assertEqual(None, response)
1691
1337
response = request.do_chunk(self.make_empty_byte_stream(repository))
1692
1338
self.assertEqual(None, response)
1693
1339
response = request.do_end()
1694
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1340
self.assertEqual(SmartServerResponse(('ok', )), response)
1695
1341
repository.unlock()
1697
1343
def test_insert_stream_with_wrong_lock_token(self):
1698
1344
backing = self.get_transport()
1699
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1345
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1701
1347
repository = self.make_repository('.', format='knit')
1702
lock_token = repository.lock_write().repository_token
1348
lock_token = repository.lock_write()
1703
1349
self.assertRaises(
1704
1350
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1705
1351
repository.unlock()
1729
1375
def test_unlock_on_unlocked_repo(self):
1730
1376
backing = self.get_transport()
1731
request = smart_repo.SmartServerRepositoryUnlock(backing)
1377
request = smart.repository.SmartServerRepositoryUnlock(backing)
1732
1378
repository = self.make_repository('.', format='knit')
1733
1379
response = request.execute('', 'some token')
1734
1380
self.assertEqual(
1735
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1381
SmartServerResponse(('TokenMismatch',)), response)
1738
1384
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1740
1386
def test_is_readonly_no(self):
1741
1387
backing = self.get_transport()
1742
request = smart_req.SmartServerIsReadonly(backing)
1388
request = smart.request.SmartServerIsReadonly(backing)
1743
1389
response = request.execute()
1744
1390
self.assertEqual(
1745
smart_req.SmartServerResponse(('no',)), response)
1391
SmartServerResponse(('no',)), response)
1747
1393
def test_is_readonly_yes(self):
1748
1394
backing = self.get_readonly_transport()
1749
request = smart_req.SmartServerIsReadonly(backing)
1395
request = smart.request.SmartServerIsReadonly(backing)
1750
1396
response = request.execute()
1751
1397
self.assertEqual(
1752
smart_req.SmartServerResponse(('yes',)), response)
1755
class TestSmartServerRepositorySetMakeWorkingTrees(
1756
tests.TestCaseWithMemoryTransport):
1398
SmartServerResponse(('yes',)), response)
1401
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1758
1403
def test_set_false(self):
1759
1404
backing = self.get_transport()
1760
1405
repo = self.make_repository('.', shared=True)
1761
1406
repo.set_make_working_trees(True)
1762
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1407
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1763
1408
request = request_class(backing)
1764
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1409
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1765
1410
request.execute('', 'False'))
1766
1411
repo = repo.bzrdir.open_repository()
1767
1412
self.assertFalse(repo.make_working_trees())
1849
1481
"""All registered request_handlers can be found."""
1850
1482
# If there's a typo in a register_lazy call, this loop will fail with
1851
1483
# an AttributeError.
1852
for key, item in smart_req.request_handlers.iteritems():
1484
for key, item in smart.request.request_handlers.iteritems():
1855
1487
def assertHandlerEqual(self, verb, handler):
1856
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1488
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1858
1490
def test_registered_methods(self):
1859
1491
"""Test that known methods are registered to the correct object."""
1860
1492
self.assertHandlerEqual('Branch.get_config_file',
1861
smart_branch.SmartServerBranchGetConfigFile)
1493
smart.branch.SmartServerBranchGetConfigFile)
1862
1494
self.assertHandlerEqual('Branch.get_parent',
1863
smart_branch.SmartServerBranchGetParent)
1495
smart.branch.SmartServerBranchGetParent)
1864
1496
self.assertHandlerEqual('Branch.get_tags_bytes',
1865
smart_branch.SmartServerBranchGetTagsBytes)
1497
smart.branch.SmartServerBranchGetTagsBytes)
1866
1498
self.assertHandlerEqual('Branch.lock_write',
1867
smart_branch.SmartServerBranchRequestLockWrite)
1499
smart.branch.SmartServerBranchRequestLockWrite)
1868
1500
self.assertHandlerEqual('Branch.last_revision_info',
1869
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1501
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1870
1502
self.assertHandlerEqual('Branch.revision_history',
1871
smart_branch.SmartServerRequestRevisionHistory)
1503
smart.branch.SmartServerRequestRevisionHistory)
1872
1504
self.assertHandlerEqual('Branch.set_config_option',
1873
smart_branch.SmartServerBranchRequestSetConfigOption)
1505
smart.branch.SmartServerBranchRequestSetConfigOption)
1874
1506
self.assertHandlerEqual('Branch.set_last_revision',
1875
smart_branch.SmartServerBranchRequestSetLastRevision)
1507
smart.branch.SmartServerBranchRequestSetLastRevision)
1876
1508
self.assertHandlerEqual('Branch.set_last_revision_info',
1877
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1509
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1878
1510
self.assertHandlerEqual('Branch.set_last_revision_ex',
1879
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1511
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1880
1512
self.assertHandlerEqual('Branch.set_parent_location',
1881
smart_branch.SmartServerBranchRequestSetParentLocation)
1513
smart.branch.SmartServerBranchRequestSetParentLocation)
1882
1514
self.assertHandlerEqual('Branch.unlock',
1883
smart_branch.SmartServerBranchRequestUnlock)
1515
smart.branch.SmartServerBranchRequestUnlock)
1884
1516
self.assertHandlerEqual('BzrDir.find_repository',
1885
smart_dir.SmartServerRequestFindRepositoryV1)
1517
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1886
1518
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1887
smart_dir.SmartServerRequestFindRepositoryV2)
1519
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1888
1520
self.assertHandlerEqual('BzrDirFormat.initialize',
1889
smart_dir.SmartServerRequestInitializeBzrDir)
1890
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1891
smart_dir.SmartServerRequestBzrDirInitializeEx)
1521
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1522
self.assertHandlerEqual('BzrDirFormat.initialize_ex',
1523
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1892
1524
self.assertHandlerEqual('BzrDir.cloning_metadir',
1893
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1525
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1894
1526
self.assertHandlerEqual('BzrDir.get_config_file',
1895
smart_dir.SmartServerBzrDirRequestConfigFile)
1527
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1896
1528
self.assertHandlerEqual('BzrDir.open_branch',
1897
smart_dir.SmartServerRequestOpenBranch)
1529
smart.bzrdir.SmartServerRequestOpenBranch)
1898
1530
self.assertHandlerEqual('BzrDir.open_branchV2',
1899
smart_dir.SmartServerRequestOpenBranchV2)
1900
self.assertHandlerEqual('BzrDir.open_branchV3',
1901
smart_dir.SmartServerRequestOpenBranchV3)
1531
smart.bzrdir.SmartServerRequestOpenBranchV2)
1902
1532
self.assertHandlerEqual('PackRepository.autopack',
1903
smart_packrepo.SmartServerPackRepositoryAutopack)
1533
smart.packrepository.SmartServerPackRepositoryAutopack)
1904
1534
self.assertHandlerEqual('Repository.gather_stats',
1905
smart_repo.SmartServerRepositoryGatherStats)
1535
smart.repository.SmartServerRepositoryGatherStats)
1906
1536
self.assertHandlerEqual('Repository.get_parent_map',
1907
smart_repo.SmartServerRepositoryGetParentMap)
1908
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1909
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1537
smart.repository.SmartServerRepositoryGetParentMap)
1910
1538
self.assertHandlerEqual('Repository.get_revision_graph',
1911
smart_repo.SmartServerRepositoryGetRevisionGraph)
1539
smart.repository.SmartServerRepositoryGetRevisionGraph)
1912
1540
self.assertHandlerEqual('Repository.get_stream',
1913
smart_repo.SmartServerRepositoryGetStream)
1541
smart.repository.SmartServerRepositoryGetStream)
1914
1542
self.assertHandlerEqual('Repository.has_revision',
1915
smart_repo.SmartServerRequestHasRevision)
1543
smart.repository.SmartServerRequestHasRevision)
1916
1544
self.assertHandlerEqual('Repository.insert_stream',
1917
smart_repo.SmartServerRepositoryInsertStream)
1545
smart.repository.SmartServerRepositoryInsertStream)
1918
1546
self.assertHandlerEqual('Repository.insert_stream_locked',
1919
smart_repo.SmartServerRepositoryInsertStreamLocked)
1547
smart.repository.SmartServerRepositoryInsertStreamLocked)
1920
1548
self.assertHandlerEqual('Repository.is_shared',
1921
smart_repo.SmartServerRepositoryIsShared)
1549
smart.repository.SmartServerRepositoryIsShared)
1922
1550
self.assertHandlerEqual('Repository.lock_write',
1923
smart_repo.SmartServerRepositoryLockWrite)
1551
smart.repository.SmartServerRepositoryLockWrite)
1924
1552
self.assertHandlerEqual('Repository.tarball',
1925
smart_repo.SmartServerRepositoryTarball)
1553
smart.repository.SmartServerRepositoryTarball)
1926
1554
self.assertHandlerEqual('Repository.unlock',
1927
smart_repo.SmartServerRepositoryUnlock)
1555
smart.repository.SmartServerRepositoryUnlock)
1928
1556
self.assertHandlerEqual('Transport.is_readonly',
1929
smart_req.SmartServerIsReadonly)
1557
smart.request.SmartServerIsReadonly)