28
from cStringIO import StringIO
29
31
from bzrlib import (
30
branch as _mod_branch,
38
from bzrlib.smart import (
39
branch as smart_branch,
41
repository as smart_repo,
42
packrepository as smart_packrepo,
47
from bzrlib.tests import test_server
48
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
54
57
def load_tests(standard_tests, module, loader):
55
58
"""Multiply tests version and protocol consistency."""
56
59
# FindRepository tests.
60
bzrdir_mod = bzrlib.smart.bzrdir
58
62
("find_repository", {
59
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
63
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
60
64
("find_repositoryV2", {
61
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
65
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
62
66
("find_repositoryV3", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
67
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
65
to_adapt, result = tests.split_suite_by_re(standard_tests,
69
to_adapt, result = split_suite_by_re(standard_tests,
66
70
"TestSmartServerRequestFindRepository")
67
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
71
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
69
73
tests.multiply_tests(v1_and_2, scenarios, result)
70
74
# The first scenario is only applicable to v1 protocols, it is deleted
99
103
# the default or a parameterized class, but rather use the
100
104
# TestCaseWithTransport infrastructure to set up a smart server and
102
self.overrideAttr(self, "transport_server", self.make_transport_server)
106
self.transport_server = self.make_transport_server
104
108
def make_transport_server(self):
105
return test_server.SmartTCPServer_for_testing('-' + self.id())
109
return smart.server.SmartTCPServer_for_testing('-' + self.id())
107
111
def get_smart_medium(self):
108
112
"""Get a smart medium to use in tests."""
109
113
return self.get_transport().get_smart_medium()
112
class TestByteStreamToStream(tests.TestCase):
114
def test_repeated_substreams_same_kind_are_one_stream(self):
115
# Make a stream - an iterable of bytestrings.
116
stream = [('text', [versionedfile.FulltextContentFactory(('k1',), None,
117
None, 'foo')]),('text', [
118
versionedfile.FulltextContentFactory(('k2',), None, None, 'bar')])]
119
fmt = bzrdir.format_registry.get('pack-0.92')().repository_format
120
bytes = smart_repo._stream_to_byte_stream(stream, fmt)
122
# Iterate the resulting iterable; checking that we get only one stream
124
fmt, stream = smart_repo._byte_stream_to_stream(bytes)
125
for kind, substream in stream:
126
streams.append((kind, list(substream)))
127
self.assertLength(1, streams)
128
self.assertLength(2, streams[0][1])
131
116
class TestSmartServerResponse(tests.TestCase):
133
118
def test__eq__(self):
134
self.assertEqual(smart_req.SmartServerResponse(('ok', )),
135
smart_req.SmartServerResponse(('ok', )))
136
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
137
smart_req.SmartServerResponse(('ok', ), 'body'))
138
self.assertNotEqual(smart_req.SmartServerResponse(('ok', )),
139
smart_req.SmartServerResponse(('notok', )))
140
self.assertNotEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
141
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', )))
142
127
self.assertNotEqual(None,
143
smart_req.SmartServerResponse(('ok', )))
128
SmartServerResponse(('ok', )))
145
130
def test__str__(self):
146
131
"""SmartServerResponses can be stringified."""
147
132
self.assertEqual(
148
133
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
149
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
134
str(SuccessfulSmartServerResponse(('args',), 'body')))
150
135
self.assertEqual(
151
136
"<FailedSmartServerResponse args=('args',) body='body'>",
152
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
137
str(FailedSmartServerResponse(('args',), 'body')))
155
140
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
157
142
def test_translate_client_path(self):
158
143
transport = self.get_transport()
159
request = smart_req.SmartServerRequest(transport, 'foo/')
144
request = SmartServerRequest(transport, 'foo/')
160
145
self.assertEqual('./', request.translate_client_path('foo/'))
161
146
self.assertRaises(
162
147
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
415
376
"""Initializing a missing directory should fail like the bzrdir api."""
416
377
backing = self.get_transport()
417
378
name = self.make_bzrdir('reference')._format.network_name()
418
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
379
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
419
380
self.assertRaises(errors.NoSuchFile, request.execute, name,
420
381
'subdir/dir', 'False', 'False', 'False', '', '', '', '', 'False')
422
383
def test_initialized_dir(self):
423
"""Initializing an extant directory should fail like the bzrdir api."""
384
"""Initializing an extant dirctory should fail like the bzrdir api."""
424
385
backing = self.get_transport()
425
386
name = self.make_bzrdir('reference')._format.network_name()
426
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
387
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
427
388
self.make_bzrdir('subdir')
428
389
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
429
390
'False', 'False', 'False', '', '', '', '', 'False')
432
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
434
def test_no_directory(self):
435
backing = self.get_transport()
436
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
437
self.assertEqual(smart_req.SmartServerResponse(('no', )),
438
request.execute('does-not-exist'))
440
def test_empty_directory(self):
441
backing = self.get_transport()
442
backing.mkdir('empty')
443
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
444
self.assertEqual(smart_req.SmartServerResponse(('no', )),
445
request.execute('empty'))
447
def test_outside_root_client_path(self):
448
backing = self.get_transport()
449
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
450
root_client_path='root')
451
self.assertEqual(smart_req.SmartServerResponse(('no', )),
452
request.execute('not-root'))
455
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
457
def test_no_directory(self):
458
backing = self.get_transport()
459
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
460
self.assertEqual(smart_req.SmartServerResponse(('no', )),
461
request.execute('does-not-exist'))
463
def test_empty_directory(self):
464
backing = self.get_transport()
465
backing.mkdir('empty')
466
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
467
self.assertEqual(smart_req.SmartServerResponse(('no', )),
468
request.execute('empty'))
470
def test_present_without_workingtree(self):
471
backing = self.get_transport()
472
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
473
self.make_bzrdir('.')
474
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
477
def test_outside_root_client_path(self):
478
backing = self.get_transport()
479
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
480
root_client_path='root')
481
self.assertEqual(smart_req.SmartServerResponse(('no',)),
482
request.execute('not-root'))
485
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
487
def test_present_with_workingtree(self):
488
self.vfs_transport_factory = test_server.LocalURLServer
489
backing = self.get_transport()
490
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
491
bd = self.make_bzrdir('.')
492
bd.create_repository()
494
bd.create_workingtree()
495
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
499
393
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
501
395
def test_no_branch(self):
502
396
"""When there is no branch, ('nobranch', ) is returned."""
503
397
backing = self.get_transport()
504
request = smart_dir.SmartServerRequestOpenBranch(backing)
398
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
505
399
self.make_bzrdir('.')
506
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
400
self.assertEqual(SmartServerResponse(('nobranch', )),
507
401
request.execute(''))
509
403
def test_branch(self):
510
404
"""When there is a branch, 'ok' is returned."""
511
405
backing = self.get_transport()
512
request = smart_dir.SmartServerRequestOpenBranch(backing)
406
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
513
407
self.make_branch('.')
514
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
408
self.assertEqual(SmartServerResponse(('ok', '')),
515
409
request.execute(''))
517
411
def test_branch_reference(self):
518
412
"""When there is a branch reference, the reference URL is returned."""
519
self.vfs_transport_factory = test_server.LocalURLServer
520
413
backing = self.get_transport()
521
request = smart_dir.SmartServerRequestOpenBranch(backing)
414
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
522
415
branch = self.make_branch('branch')
523
416
checkout = branch.create_checkout('reference',lightweight=True)
524
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
417
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
526
418
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
527
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
419
self.assertEqual(SmartServerResponse(('ok', reference_url)),
528
420
request.execute('reference'))
530
def test_notification_on_branch_from_repository(self):
531
"""When there is a repository, the error should return details."""
532
backing = self.get_transport()
533
request = smart_dir.SmartServerRequestOpenBranch(backing)
534
repo = self.make_repository('.')
535
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
539
423
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
542
426
"""When there is no branch, ('nobranch', ) is returned."""
543
427
backing = self.get_transport()
544
428
self.make_bzrdir('.')
545
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
546
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
549
def test_branch(self):
550
"""When there is a branch, 'ok' is returned."""
551
backing = self.get_transport()
552
expected = self.make_branch('.')._format.network_name()
553
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
554
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
555
('branch', expected)),
558
def test_branch_reference(self):
559
"""When there is a branch reference, the reference URL is returned."""
560
self.vfs_transport_factory = test_server.LocalURLServer
561
backing = self.get_transport()
562
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
563
branch = self.make_branch('branch')
564
checkout = branch.create_checkout('reference',lightweight=True)
565
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
567
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
568
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
569
('ref', reference_url)),
570
request.execute('reference'))
572
def test_stacked_branch(self):
573
"""Opening a stacked branch does not open the stacked-on branch."""
574
trunk = self.make_branch('trunk')
575
feature = self.make_branch('feature')
576
feature.set_stacked_on_url(trunk.base)
578
_mod_branch.Branch.hooks.install_named_hook(
579
'open', opened_branches.append, None)
580
backing = self.get_transport()
581
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
584
response = request.execute('feature')
586
request.teardown_jail()
587
expected_format = feature._format.network_name()
588
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
589
('branch', expected_format)),
591
self.assertLength(1, opened_branches)
593
def test_notification_on_branch_from_repository(self):
594
"""When there is a repository, the error should return details."""
595
backing = self.get_transport()
596
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
597
repo = self.make_repository('.')
598
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
602
class TestSmartServerRequestOpenBranchV3(TestCaseWithChrootedTransport):
604
def test_no_branch(self):
605
"""When there is no branch, ('nobranch', ) is returned."""
606
backing = self.get_transport()
607
self.make_bzrdir('.')
608
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
609
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
612
def test_branch(self):
613
"""When there is a branch, 'ok' is returned."""
614
backing = self.get_transport()
615
expected = self.make_branch('.')._format.network_name()
616
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
617
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
618
('branch', expected)),
621
def test_branch_reference(self):
622
"""When there is a branch reference, the reference URL is returned."""
623
self.vfs_transport_factory = test_server.LocalURLServer
624
backing = self.get_transport()
625
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
626
branch = self.make_branch('branch')
627
checkout = branch.create_checkout('reference',lightweight=True)
628
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
630
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
631
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
632
('ref', reference_url)),
633
request.execute('reference'))
635
def test_stacked_branch(self):
636
"""Opening a stacked branch does not open the stacked-on branch."""
637
trunk = self.make_branch('trunk')
638
feature = self.make_branch('feature')
639
feature.set_stacked_on_url(trunk.base)
641
_mod_branch.Branch.hooks.install_named_hook(
642
'open', opened_branches.append, None)
643
backing = self.get_transport()
644
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
647
response = request.execute('feature')
649
request.teardown_jail()
650
expected_format = feature._format.network_name()
651
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
652
('branch', expected_format)),
654
self.assertLength(1, opened_branches)
656
def test_notification_on_branch_from_repository(self):
657
"""When there is a repository, the error should return details."""
658
backing = self.get_transport()
659
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
660
repo = self.make_repository('.')
661
self.assertEqual(smart_req.SmartServerResponse(
662
('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)
666
473
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
774
579
def test_value_name(self):
775
580
branch = self.make_branch('.')
776
request = smart_branch.SmartServerBranchRequestSetConfigOption(
581
request = smart.branch.SmartServerBranchRequestSetConfigOption(
777
582
branch.bzrdir.root_transport)
778
583
branch_token, repo_token = self.get_lock_tokens(branch)
779
584
config = branch._get_config()
780
585
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
782
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
587
self.assertEqual(SuccessfulSmartServerResponse(()), result)
783
588
self.assertEqual('bar', config.get_option('foo'))
787
590
def test_value_name_section(self):
788
591
branch = self.make_branch('.')
789
request = smart_branch.SmartServerBranchRequestSetConfigOption(
592
request = smart.branch.SmartServerBranchRequestSetConfigOption(
790
593
branch.bzrdir.root_transport)
791
594
branch_token, repo_token = self.get_lock_tokens(branch)
792
595
config = branch._get_config()
793
596
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
795
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
598
self.assertEqual(SuccessfulSmartServerResponse(()), result)
796
599
self.assertEqual('bar', config.get_option('foo', 'gam'))
801
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
804
TestLockedBranch.setUp(self)
805
# A dict with non-ascii keys and values to exercise unicode
807
self.encoded_value_dict = (
808
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
810
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
812
def test_value_name(self):
813
branch = self.make_branch('.')
814
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
815
branch.bzrdir.root_transport)
816
branch_token, repo_token = self.get_lock_tokens(branch)
817
config = branch._get_config()
818
result = request.execute('', branch_token, repo_token,
819
self.encoded_value_dict, 'foo', '')
820
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
821
self.assertEqual(self.value_dict, config.get_option('foo'))
825
def test_value_name_section(self):
826
branch = self.make_branch('.')
827
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
828
branch.bzrdir.root_transport)
829
branch_token, repo_token = self.get_lock_tokens(branch)
830
config = branch._get_config()
831
result = request.execute('', branch_token, repo_token,
832
self.encoded_value_dict, 'foo', 'gam')
833
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
834
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
839
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
840
# Only called when the branch format and tags match [yay factory
841
# methods] so only need to test straight forward cases.
843
def test_set_bytes(self):
844
base_branch = self.make_branch('base')
845
tag_bytes = base_branch._get_tags_bytes()
846
# get_lock_tokens takes out a lock.
847
branch_token, repo_token = self.get_lock_tokens(base_branch)
848
request = smart_branch.SmartServerBranchSetTagsBytes(
849
self.get_transport())
850
response = request.execute('base', branch_token, repo_token)
851
self.assertEqual(None, response)
852
response = request.do_chunk(tag_bytes)
853
self.assertEqual(None, response)
854
response = request.do_end()
856
smart_req.SuccessfulSmartServerResponse(()), response)
859
def test_lock_failed(self):
860
base_branch = self.make_branch('base')
861
base_branch.lock_write()
862
tag_bytes = base_branch._get_tags_bytes()
863
request = smart_branch.SmartServerBranchSetTagsBytes(
864
self.get_transport())
865
self.assertRaises(errors.TokenMismatch, request.execute,
866
'base', 'wrong token', 'wrong token')
867
# The request handler will keep processing the message parts, so even
868
# if the request fails immediately do_chunk and do_end are still
870
request.do_chunk(tag_bytes)
876
602
class SetLastRevisionTestBase(TestLockedBranch):
1093
818
def test_get_parent_none(self):
1094
819
base_branch = self.make_branch('base')
1095
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
820
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1096
821
response = request.execute('base')
1097
822
self.assertEquals(
1098
smart_req.SuccessfulSmartServerResponse(('',)), response)
823
SuccessfulSmartServerResponse(('',)), response)
1100
825
def test_get_parent_something(self):
1101
826
base_branch = self.make_branch('base')
1102
827
base_branch.set_parent(self.get_url('foo'))
1103
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
828
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1104
829
response = request.execute('base')
1105
830
self.assertEquals(
1106
smart_req.SuccessfulSmartServerResponse(("../foo",)),
831
SuccessfulSmartServerResponse(("../foo",)),
1110
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
835
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1112
837
def test_set_parent_none(self):
1113
838
branch = self.make_branch('base', format="1.9")
1114
839
branch.lock_write()
1115
840
branch._set_parent_location('foo')
1117
request = smart_branch.SmartServerBranchRequestSetParentLocation(
842
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1118
843
self.get_transport())
1119
branch_token, repo_token = self.get_lock_tokens(branch)
844
branch_token = branch.lock_write()
845
repo_token = branch.repository.lock_write()
1121
847
response = request.execute('base', branch_token, repo_token, '')
849
branch.repository.unlock()
1124
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
851
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1125
852
self.assertEqual(None, branch.get_parent())
1127
854
def test_set_parent_something(self):
1128
855
branch = self.make_branch('base', format="1.9")
1129
request = smart_branch.SmartServerBranchRequestSetParentLocation(
856
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1130
857
self.get_transport())
1131
branch_token, repo_token = self.get_lock_tokens(branch)
858
branch_token = branch.lock_write()
859
repo_token = branch.repository.lock_write()
1133
861
response = request.execute('base', branch_token, repo_token,
864
branch.repository.unlock()
1137
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
866
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1138
867
self.assertEqual('http://bar/', branch.get_parent())
1141
class TestSmartServerBranchRequestGetTagsBytes(
1142
tests.TestCaseWithMemoryTransport):
1143
# Only called when the branch format and tags match [yay factory
1144
# 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.
1146
874
def test_get_bytes(self):
1147
875
base_branch = self.make_branch('base')
1148
request = smart_branch.SmartServerBranchGetTagsBytes(
876
request = smart.branch.SmartServerBranchGetTagsBytes(
1149
877
self.get_transport())
1150
878
response = request.execute('base')
1151
879
self.assertEquals(
1152
smart_req.SuccessfulSmartServerResponse(('',)), response)
880
SuccessfulSmartServerResponse(('',)), response)
1155
883
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1159
887
stacked_branch = self.make_branch('stacked', format='1.6')
1160
888
# typically should be relative
1161
889
stacked_branch.set_stacked_on_url('../base')
1162
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
890
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1163
891
self.get_transport())
1164
892
response = request.execute('stacked')
1165
893
self.assertEquals(
1166
smart_req.SmartServerResponse(('ok', '../base')),
894
SmartServerResponse(('ok', '../base')),
1170
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
898
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1172
900
def setUp(self):
1173
901
tests.TestCaseWithMemoryTransport.setUp(self)
1175
903
def test_lock_write_on_unlocked_branch(self):
1176
904
backing = self.get_transport()
1177
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
905
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1178
906
branch = self.make_branch('.', format='knit')
1179
907
repository = branch.repository
1180
908
response = request.execute('')
1181
909
branch_nonce = branch.control_files._lock.peek().get('nonce')
1182
910
repository_nonce = repository.control_files._lock.peek().get('nonce')
1183
self.assertEqual(smart_req.SmartServerResponse(
1184
('ok', branch_nonce, repository_nonce)),
912
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1186
914
# The branch (and associated repository) is now locked. Verify that
1187
915
# with a new branch object.
1188
916
new_branch = repository.bzrdir.open_branch()
1189
917
self.assertRaises(errors.LockContention, new_branch.lock_write)
1191
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1192
response = request.execute('', branch_nonce, repository_nonce)
1194
919
def test_lock_write_on_locked_branch(self):
1195
920
backing = self.get_transport()
1196
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
921
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1197
922
branch = self.make_branch('.')
1198
branch_token = branch.lock_write().branch_token
1199
924
branch.leave_lock_in_place()
1201
926
response = request.execute('')
1202
927
self.assertEqual(
1203
smart_req.SmartServerResponse(('LockContention',)), response)
1205
branch.lock_write(branch_token)
1206
branch.dont_leave_lock_in_place()
928
SmartServerResponse(('LockContention',)), response)
1209
930
def test_lock_write_with_tokens_on_locked_branch(self):
1210
931
backing = self.get_transport()
1211
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
932
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1212
933
branch = self.make_branch('.', format='knit')
1213
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()
1214
937
branch.leave_lock_in_place()
1215
938
branch.repository.leave_lock_in_place()
1217
940
response = request.execute('',
1218
941
branch_token, repo_token)
1219
942
self.assertEqual(
1220
smart_req.SmartServerResponse(('ok', branch_token, repo_token)),
1223
branch.repository.lock_write(repo_token)
1224
branch.repository.dont_leave_lock_in_place()
1225
branch.repository.unlock()
1226
branch.lock_write(branch_token)
1227
branch.dont_leave_lock_in_place()
943
SmartServerResponse(('ok', branch_token, repo_token)), response)
1230
945
def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1231
946
backing = self.get_transport()
1232
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
947
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1233
948
branch = self.make_branch('.', format='knit')
1234
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()
1235
952
branch.leave_lock_in_place()
1236
953
branch.repository.leave_lock_in_place()
1238
955
response = request.execute('',
1239
956
branch_token+'xxx', repo_token)
1240
957
self.assertEqual(
1241
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1243
branch.repository.lock_write(repo_token)
1244
branch.repository.dont_leave_lock_in_place()
1245
branch.repository.unlock()
1246
branch.lock_write(branch_token)
1247
branch.dont_leave_lock_in_place()
958
SmartServerResponse(('TokenMismatch',)), response)
1250
960
def test_lock_write_on_locked_repo(self):
1251
961
backing = self.get_transport()
1252
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
962
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1253
963
branch = self.make_branch('.', format='knit')
1254
repo = branch.repository
1255
repo_token = repo.lock_write().repository_token
1256
repo.leave_lock_in_place()
964
branch.repository.lock_write()
965
branch.repository.leave_lock_in_place()
966
branch.repository.unlock()
1258
967
response = request.execute('')
1259
968
self.assertEqual(
1260
smart_req.SmartServerResponse(('LockContention',)), response)
1262
repo.lock_write(repo_token)
1263
repo.dont_leave_lock_in_place()
969
SmartServerResponse(('LockContention',)), response)
1266
971
def test_lock_write_on_readonly_transport(self):
1267
972
backing = self.get_readonly_transport()
1268
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
973
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1269
974
branch = self.make_branch('.')
1270
975
root = self.get_transport().clone('/')
1271
976
path = urlutils.relative_url(root.base, self.get_transport().base)
1304
1011
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1305
1012
backing = self.get_transport()
1306
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1013
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1307
1014
branch = self.make_branch('.', format='knit')
1308
1015
response = request.execute(
1309
1016
'', 'branch token', 'repo token')
1310
1017
self.assertEqual(
1311
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1018
SmartServerResponse(('TokenMismatch',)), response)
1313
1020
def test_unlock_on_unlocked_branch_locked_repo(self):
1314
1021
backing = self.get_transport()
1315
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1022
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1316
1023
branch = self.make_branch('.', format='knit')
1317
1024
# Lock the repository.
1318
repo_token = branch.repository.lock_write().repository_token
1025
repo_token = branch.repository.lock_write()
1319
1026
branch.repository.leave_lock_in_place()
1320
1027
branch.repository.unlock()
1321
1028
# Issue branch lock_write request on the unlocked branch (with locked
1323
response = request.execute('', 'branch token', repo_token)
1030
response = request.execute(
1031
'', 'branch token', repo_token)
1324
1032
self.assertEqual(
1325
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1327
branch.repository.lock_write(repo_token)
1328
branch.repository.dont_leave_lock_in_place()
1329
branch.repository.unlock()
1033
SmartServerResponse(('TokenMismatch',)), response)
1332
1036
class TestSmartServerRepositoryRequest(tests.TestCaseWithMemoryTransport):
1350
1054
def test_trivial_bzipped(self):
1351
1055
# This tests that the wire encoding is actually bzipped
1352
1056
backing = self.get_transport()
1353
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1057
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1354
1058
tree = self.make_branch_and_memory_tree('.')
1356
1060
self.assertEqual(None,
1357
1061
request.execute('', 'missing-id'))
1358
1062
# Note that it returns a body that is bzipped.
1359
1063
self.assertEqual(
1360
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1064
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1361
1065
request.do_body('\n\n0\n'))
1363
1067
def test_trivial_include_missing(self):
1364
1068
backing = self.get_transport()
1365
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1069
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1366
1070
tree = self.make_branch_and_memory_tree('.')
1368
1072
self.assertEqual(None,
1369
1073
request.execute('', 'missing-id', 'include-missing:'))
1370
1074
self.assertEqual(
1371
smart_req.SuccessfulSmartServerResponse(('ok', ),
1075
SuccessfulSmartServerResponse(('ok', ),
1372
1076
bz2.compress('missing:missing-id')),
1373
1077
request.do_body('\n\n0\n'))
1376
class TestSmartServerRepositoryGetRevisionGraph(
1377
tests.TestCaseWithMemoryTransport):
1080
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1379
1082
def test_none_argument(self):
1380
1083
backing = self.get_transport()
1381
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1084
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1382
1085
tree = self.make_branch_and_memory_tree('.')
1383
1086
tree.lock_write()
1421
1124
# Note that it still returns body (of zero bytes).
1422
self.assertEqual(smart_req.SmartServerResponse(
1423
('nosuchrevision', 'missingrevision', ), ''),
1424
request.execute('', 'missingrevision'))
1427
class TestSmartServerRepositoryGetRevIdForRevno(
1428
tests.TestCaseWithMemoryTransport):
1430
def test_revno_found(self):
1431
backing = self.get_transport()
1432
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1433
tree = self.make_branch_and_memory_tree('.')
1436
rev1_id_utf8 = u'\xc8'.encode('utf-8')
1437
rev2_id_utf8 = u'\xc9'.encode('utf-8')
1438
tree.commit('1st commit', rev_id=rev1_id_utf8)
1439
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1442
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1443
request.execute('', 1, (2, rev2_id_utf8)))
1445
def test_known_revid_missing(self):
1446
backing = self.get_transport()
1447
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1448
repo = self.make_repository('.')
1450
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1451
request.execute('', 1, (2, 'ghost')))
1453
def test_history_incomplete(self):
1454
backing = self.get_transport()
1455
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1456
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1458
parent.add([''], ['TREE_ROOT'])
1459
r1 = parent.commit(message='first commit')
1460
r2 = parent.commit(message='second commit')
1462
local = self.make_branch_and_memory_tree('local', format='1.9')
1463
local.branch.pull(parent.branch)
1464
local.set_parent_ids([r2])
1465
r3 = local.commit(message='local commit')
1466
local.branch.create_clone_on_transport(
1467
self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1469
smart_req.SmartServerResponse(('history-incomplete', 2, r2)),
1470
request.execute('stacked', 1, (3, r3)))
1473
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
1126
SmartServerResponse(('nosuchrevision', 'missingrevision', ), ''),
1127
request.execute('', 'missingrevision'))
1130
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1475
1132
def make_two_commit_repo(self):
1476
1133
tree = self.make_branch_and_memory_tree('.')
1511
1165
stream_bytes = ''.join(response.body_stream)
1512
1166
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1514
def test_search_everything(self):
1515
"""A search of 'everything' returns a stream."""
1516
backing = self.get_transport()
1517
request = smart_repo.SmartServerRepositoryGetStream_1_19(backing)
1518
repo, r1, r2 = self.make_two_commit_repo()
1519
serialised_fetch_spec = 'everything'
1520
request.execute('', repo._format.network_name())
1521
response = request.do_body(serialised_fetch_spec)
1522
self.assertEqual(('ok',), response.args)
1523
stream_bytes = ''.join(response.body_stream)
1524
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1527
1169
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
1529
1171
def test_missing_revision(self):
1530
1172
"""For a missing revision, ('no', ) is returned."""
1531
1173
backing = self.get_transport()
1532
request = smart_repo.SmartServerRequestHasRevision(backing)
1174
request = smart.repository.SmartServerRequestHasRevision(backing)
1533
1175
self.make_repository('.')
1534
self.assertEqual(smart_req.SmartServerResponse(('no', )),
1176
self.assertEqual(SmartServerResponse(('no', )),
1535
1177
request.execute('', 'revid'))
1537
1179
def test_present_revision(self):
1538
1180
"""For a present revision, ('yes', ) is returned."""
1539
1181
backing = self.get_transport()
1540
request = smart_repo.SmartServerRequestHasRevision(backing)
1182
request = smart.repository.SmartServerRequestHasRevision(backing)
1541
1183
tree = self.make_branch_and_memory_tree('.')
1542
1184
tree.lock_write()
1632
1274
def test_lock_write_on_unlocked_repo(self):
1633
1275
backing = self.get_transport()
1634
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1276
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1635
1277
repository = self.make_repository('.', format='knit')
1636
1278
response = request.execute('')
1637
1279
nonce = repository.control_files._lock.peek().get('nonce')
1638
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1280
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1639
1281
# The repository is now locked. Verify that with a new repository
1641
1283
new_repo = repository.bzrdir.open_repository()
1642
1284
self.assertRaises(errors.LockContention, new_repo.lock_write)
1644
request = smart_repo.SmartServerRepositoryUnlock(backing)
1645
response = request.execute('', nonce)
1647
1286
def test_lock_write_on_locked_repo(self):
1648
1287
backing = self.get_transport()
1649
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1288
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1650
1289
repository = self.make_repository('.', format='knit')
1651
repo_token = repository.lock_write().repository_token
1290
repository.lock_write()
1652
1291
repository.leave_lock_in_place()
1653
1292
repository.unlock()
1654
1293
response = request.execute('')
1655
1294
self.assertEqual(
1656
smart_req.SmartServerResponse(('LockContention',)), response)
1658
repository.lock_write(repo_token)
1659
repository.dont_leave_lock_in_place()
1295
SmartServerResponse(('LockContention',)), response)
1662
1297
def test_lock_write_on_readonly_transport(self):
1663
1298
backing = self.get_readonly_transport()
1664
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1299
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1665
1300
repository = self.make_repository('.', format='knit')
1666
1301
response = request.execute('')
1667
1302
self.assertFalse(response.is_successful())
1680
1315
def test_insert_stream_empty(self):
1681
1316
backing = self.get_transport()
1682
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1317
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1683
1318
repository = self.make_repository('.')
1684
1319
response = request.execute('', '')
1685
1320
self.assertEqual(None, response)
1686
1321
response = request.do_chunk(self.make_empty_byte_stream(repository))
1687
1322
self.assertEqual(None, response)
1688
1323
response = request.do_end()
1689
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1324
self.assertEqual(SmartServerResponse(('ok', )), response)
1692
1327
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1694
1329
def test_insert_stream_empty(self):
1695
1330
backing = self.get_transport()
1696
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1331
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1698
1333
repository = self.make_repository('.', format='knit')
1699
lock_token = repository.lock_write().repository_token
1334
lock_token = repository.lock_write()
1700
1335
response = request.execute('', '', lock_token)
1701
1336
self.assertEqual(None, response)
1702
1337
response = request.do_chunk(self.make_empty_byte_stream(repository))
1703
1338
self.assertEqual(None, response)
1704
1339
response = request.do_end()
1705
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1340
self.assertEqual(SmartServerResponse(('ok', )), response)
1706
1341
repository.unlock()
1708
1343
def test_insert_stream_with_wrong_lock_token(self):
1709
1344
backing = self.get_transport()
1710
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1345
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1712
1347
repository = self.make_repository('.', format='knit')
1713
lock_token = repository.lock_write().repository_token
1348
lock_token = repository.lock_write()
1714
1349
self.assertRaises(
1715
1350
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1716
1351
repository.unlock()
1740
1375
def test_unlock_on_unlocked_repo(self):
1741
1376
backing = self.get_transport()
1742
request = smart_repo.SmartServerRepositoryUnlock(backing)
1377
request = smart.repository.SmartServerRepositoryUnlock(backing)
1743
1378
repository = self.make_repository('.', format='knit')
1744
1379
response = request.execute('', 'some token')
1745
1380
self.assertEqual(
1746
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1381
SmartServerResponse(('TokenMismatch',)), response)
1749
1384
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1751
1386
def test_is_readonly_no(self):
1752
1387
backing = self.get_transport()
1753
request = smart_req.SmartServerIsReadonly(backing)
1388
request = smart.request.SmartServerIsReadonly(backing)
1754
1389
response = request.execute()
1755
1390
self.assertEqual(
1756
smart_req.SmartServerResponse(('no',)), response)
1391
SmartServerResponse(('no',)), response)
1758
1393
def test_is_readonly_yes(self):
1759
1394
backing = self.get_readonly_transport()
1760
request = smart_req.SmartServerIsReadonly(backing)
1395
request = smart.request.SmartServerIsReadonly(backing)
1761
1396
response = request.execute()
1762
1397
self.assertEqual(
1763
smart_req.SmartServerResponse(('yes',)), response)
1766
class TestSmartServerRepositorySetMakeWorkingTrees(
1767
tests.TestCaseWithMemoryTransport):
1398
SmartServerResponse(('yes',)), response)
1401
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1769
1403
def test_set_false(self):
1770
1404
backing = self.get_transport()
1771
1405
repo = self.make_repository('.', shared=True)
1772
1406
repo.set_make_working_trees(True)
1773
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1407
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1774
1408
request = request_class(backing)
1775
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1409
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1776
1410
request.execute('', 'False'))
1777
1411
repo = repo.bzrdir.open_repository()
1778
1412
self.assertFalse(repo.make_working_trees())
1860
1481
"""All registered request_handlers can be found."""
1861
1482
# If there's a typo in a register_lazy call, this loop will fail with
1862
1483
# an AttributeError.
1863
for key, item in smart_req.request_handlers.iteritems():
1484
for key, item in smart.request.request_handlers.iteritems():
1866
1487
def assertHandlerEqual(self, verb, handler):
1867
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1488
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1869
1490
def test_registered_methods(self):
1870
1491
"""Test that known methods are registered to the correct object."""
1871
1492
self.assertHandlerEqual('Branch.get_config_file',
1872
smart_branch.SmartServerBranchGetConfigFile)
1493
smart.branch.SmartServerBranchGetConfigFile)
1873
1494
self.assertHandlerEqual('Branch.get_parent',
1874
smart_branch.SmartServerBranchGetParent)
1495
smart.branch.SmartServerBranchGetParent)
1875
1496
self.assertHandlerEqual('Branch.get_tags_bytes',
1876
smart_branch.SmartServerBranchGetTagsBytes)
1497
smart.branch.SmartServerBranchGetTagsBytes)
1877
1498
self.assertHandlerEqual('Branch.lock_write',
1878
smart_branch.SmartServerBranchRequestLockWrite)
1499
smart.branch.SmartServerBranchRequestLockWrite)
1879
1500
self.assertHandlerEqual('Branch.last_revision_info',
1880
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1501
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1881
1502
self.assertHandlerEqual('Branch.revision_history',
1882
smart_branch.SmartServerRequestRevisionHistory)
1503
smart.branch.SmartServerRequestRevisionHistory)
1883
1504
self.assertHandlerEqual('Branch.set_config_option',
1884
smart_branch.SmartServerBranchRequestSetConfigOption)
1505
smart.branch.SmartServerBranchRequestSetConfigOption)
1885
1506
self.assertHandlerEqual('Branch.set_last_revision',
1886
smart_branch.SmartServerBranchRequestSetLastRevision)
1507
smart.branch.SmartServerBranchRequestSetLastRevision)
1887
1508
self.assertHandlerEqual('Branch.set_last_revision_info',
1888
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1509
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1889
1510
self.assertHandlerEqual('Branch.set_last_revision_ex',
1890
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1511
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1891
1512
self.assertHandlerEqual('Branch.set_parent_location',
1892
smart_branch.SmartServerBranchRequestSetParentLocation)
1513
smart.branch.SmartServerBranchRequestSetParentLocation)
1893
1514
self.assertHandlerEqual('Branch.unlock',
1894
smart_branch.SmartServerBranchRequestUnlock)
1515
smart.branch.SmartServerBranchRequestUnlock)
1895
1516
self.assertHandlerEqual('BzrDir.find_repository',
1896
smart_dir.SmartServerRequestFindRepositoryV1)
1517
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1897
1518
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1898
smart_dir.SmartServerRequestFindRepositoryV2)
1519
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1899
1520
self.assertHandlerEqual('BzrDirFormat.initialize',
1900
smart_dir.SmartServerRequestInitializeBzrDir)
1901
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1902
smart_dir.SmartServerRequestBzrDirInitializeEx)
1521
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1522
self.assertHandlerEqual('BzrDirFormat.initialize_ex',
1523
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1903
1524
self.assertHandlerEqual('BzrDir.cloning_metadir',
1904
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1525
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1905
1526
self.assertHandlerEqual('BzrDir.get_config_file',
1906
smart_dir.SmartServerBzrDirRequestConfigFile)
1527
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1907
1528
self.assertHandlerEqual('BzrDir.open_branch',
1908
smart_dir.SmartServerRequestOpenBranch)
1529
smart.bzrdir.SmartServerRequestOpenBranch)
1909
1530
self.assertHandlerEqual('BzrDir.open_branchV2',
1910
smart_dir.SmartServerRequestOpenBranchV2)
1911
self.assertHandlerEqual('BzrDir.open_branchV3',
1912
smart_dir.SmartServerRequestOpenBranchV3)
1531
smart.bzrdir.SmartServerRequestOpenBranchV2)
1913
1532
self.assertHandlerEqual('PackRepository.autopack',
1914
smart_packrepo.SmartServerPackRepositoryAutopack)
1533
smart.packrepository.SmartServerPackRepositoryAutopack)
1915
1534
self.assertHandlerEqual('Repository.gather_stats',
1916
smart_repo.SmartServerRepositoryGatherStats)
1535
smart.repository.SmartServerRepositoryGatherStats)
1917
1536
self.assertHandlerEqual('Repository.get_parent_map',
1918
smart_repo.SmartServerRepositoryGetParentMap)
1919
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1920
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1537
smart.repository.SmartServerRepositoryGetParentMap)
1921
1538
self.assertHandlerEqual('Repository.get_revision_graph',
1922
smart_repo.SmartServerRepositoryGetRevisionGraph)
1539
smart.repository.SmartServerRepositoryGetRevisionGraph)
1923
1540
self.assertHandlerEqual('Repository.get_stream',
1924
smart_repo.SmartServerRepositoryGetStream)
1925
self.assertHandlerEqual('Repository.get_stream_1.19',
1926
smart_repo.SmartServerRepositoryGetStream_1_19)
1541
smart.repository.SmartServerRepositoryGetStream)
1927
1542
self.assertHandlerEqual('Repository.has_revision',
1928
smart_repo.SmartServerRequestHasRevision)
1543
smart.repository.SmartServerRequestHasRevision)
1929
1544
self.assertHandlerEqual('Repository.insert_stream',
1930
smart_repo.SmartServerRepositoryInsertStream)
1545
smart.repository.SmartServerRepositoryInsertStream)
1931
1546
self.assertHandlerEqual('Repository.insert_stream_locked',
1932
smart_repo.SmartServerRepositoryInsertStreamLocked)
1547
smart.repository.SmartServerRepositoryInsertStreamLocked)
1933
1548
self.assertHandlerEqual('Repository.is_shared',
1934
smart_repo.SmartServerRepositoryIsShared)
1549
smart.repository.SmartServerRepositoryIsShared)
1935
1550
self.assertHandlerEqual('Repository.lock_write',
1936
smart_repo.SmartServerRepositoryLockWrite)
1551
smart.repository.SmartServerRepositoryLockWrite)
1937
1552
self.assertHandlerEqual('Repository.tarball',
1938
smart_repo.SmartServerRepositoryTarball)
1553
smart.repository.SmartServerRepositoryTarball)
1939
1554
self.assertHandlerEqual('Repository.unlock',
1940
smart_repo.SmartServerRepositoryUnlock)
1555
smart.repository.SmartServerRepositoryUnlock)
1941
1556
self.assertHandlerEqual('Transport.is_readonly',
1942
smart_req.SmartServerIsReadonly)
1945
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
1946
"""Tests for SmartTCPServer hooks."""
1949
super(SmartTCPServerHookTests, self).setUp()
1950
self.server = server.SmartTCPServer(self.get_transport())
1952
def test_run_server_started_hooks(self):
1953
"""Test the server started hooks get fired properly."""
1955
server.SmartTCPServer.hooks.install_named_hook('server_started',
1956
lambda backing_urls, url: started_calls.append((backing_urls, url)),
1958
started_ex_calls = []
1959
server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
1960
lambda backing_urls, url: started_ex_calls.append((backing_urls, url)),
1962
self.server._sockname = ('example.com', 42)
1963
self.server.run_server_started_hooks()
1964
self.assertEquals(started_calls,
1965
[([self.get_transport().base], 'bzr://example.com:42/')])
1966
self.assertEquals(started_ex_calls,
1967
[([self.get_transport().base], self.server)])
1969
def test_run_server_started_hooks_ipv6(self):
1970
"""Test that socknames can contain 4-tuples."""
1971
self.server._sockname = ('::', 42, 0, 0)
1973
server.SmartTCPServer.hooks.install_named_hook('server_started',
1974
lambda backing_urls, url: started_calls.append((backing_urls, url)),
1976
self.server.run_server_started_hooks()
1977
self.assertEquals(started_calls,
1978
[([self.get_transport().base], 'bzr://:::42/')])
1980
def test_run_server_stopped_hooks(self):
1981
"""Test the server stopped hooks."""
1982
self.server._sockname = ('example.com', 42)
1984
server.SmartTCPServer.hooks.install_named_hook('server_stopped',
1985
lambda backing_urls, url: stopped_calls.append((backing_urls, url)),
1987
self.server.run_server_stopped_hooks()
1988
self.assertEquals(stopped_calls,
1989
[([self.get_transport().base], 'bzr://example.com:42/')])
1557
smart.request.SmartServerIsReadonly)