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 (
40
from bzrlib.branch import Branch, BranchReferenceFormat
41
import bzrlib.smart.branch
42
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
43
import bzrlib.smart.packrepository
44
import bzrlib.smart.repository
45
from bzrlib.smart.request import (
46
FailedSmartServerResponse,
49
SuccessfulSmartServerResponse,
51
from bzrlib.tests import (
54
from bzrlib.transport import chroot, get_transport
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/..')
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
254
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
255
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
256
return SuccessfulSmartServerResponse(
289
257
('ok', '', rich_root, subtrees, external,
290
258
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
259
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
260
self._request_class):
293
261
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
263
return SuccessfulSmartServerResponse(
296
264
('ok', '', rich_root, subtrees, external))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
266
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
268
def test_shared_repository(self):
302
269
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
427
388
"""Initializing an extant directory should fail like the bzrdir api."""
428
389
backing = self.get_transport()
429
390
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
391
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
392
self.make_bzrdir('subdir')
432
393
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
394
'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
397
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
399
def test_no_branch(self):
506
400
"""When there is no branch, ('nobranch', ) is returned."""
507
401
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
402
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
403
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
404
self.assertEqual(SmartServerResponse(('nobranch', )),
511
405
request.execute(''))
513
407
def test_branch(self):
514
408
"""When there is a branch, 'ok' is returned."""
515
409
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
410
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
411
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
412
self.assertEqual(SmartServerResponse(('ok', '')),
519
413
request.execute(''))
521
415
def test_branch_reference(self):
522
416
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
417
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
418
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
419
branch = self.make_branch('branch')
527
420
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
421
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
422
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
423
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
424
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
427
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
430
"""When there is no branch, ('nobranch', ) is returned."""
547
431
backing = self.get_transport()
548
432
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')),
433
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
434
self.assertEqual(SmartServerResponse(('nobranch', )),
437
def test_branch(self):
438
"""When there is a branch, 'ok' is returned."""
439
backing = self.get_transport()
440
expected = self.make_branch('.')._format.network_name()
441
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
442
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
445
def test_branch_reference(self):
446
"""When there is a branch reference, the reference URL is returned."""
447
backing = self.get_transport()
448
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
449
branch = self.make_branch('branch')
450
checkout = branch.create_checkout('reference',lightweight=True)
451
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
452
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
453
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
454
request.execute('reference'))
456
def test_stacked_branch(self):
457
"""Opening a stacked branch does not open the stacked-on branch."""
458
trunk = self.make_branch('trunk')
459
feature = self.make_branch('feature')
460
feature.set_stacked_on_url(trunk.base)
462
Branch.hooks.install_named_hook('open', opened_branches.append, None)
463
backing = self.get_transport()
464
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
467
response = request.execute('feature')
469
request.teardown_jail()
470
expected_format = feature._format.network_name()
472
SuccessfulSmartServerResponse(('branch', expected_format)),
474
self.assertLength(1, opened_branches)
670
477
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
512
def test_branch_reference(self):
706
513
"""When there is a branch reference, NotBranchError is raised."""
707
514
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
515
request = smart.branch.SmartServerBranchRequest(backing)
709
516
branch = self.make_branch('branch')
710
517
checkout = branch.create_checkout('reference',lightweight=True)
711
518
self.assertRaises(errors.NotBranchError,
712
519
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
522
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
524
def test_empty(self):
719
525
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
526
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
527
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
528
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
529
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
530
request.execute(''))
726
532
def test_not_empty(self):
727
533
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
534
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
535
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
536
tree = self.make_branch_and_memory_tree('.')
731
537
tree.lock_write()
778
583
def test_value_name(self):
779
584
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
585
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
586
branch.bzrdir.root_transport)
782
587
branch_token, repo_token = self.get_lock_tokens(branch)
783
588
config = branch._get_config()
784
589
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
591
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
592
self.assertEqual('bar', config.get_option('foo'))
791
596
def test_value_name_section(self):
792
597
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
598
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
599
branch.bzrdir.root_transport)
795
600
branch_token, repo_token = self.get_lock_tokens(branch)
796
601
config = branch._get_config()
797
602
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
604
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
605
self.assertEqual('bar', config.get_option('foo', 'gam'))
1059
863
def test_get_parent_none(self):
1060
864
base_branch = self.make_branch('base')
1061
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
865
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1062
866
response = request.execute('base')
1063
867
self.assertEquals(
1064
smart_req.SuccessfulSmartServerResponse(('',)), response)
868
SuccessfulSmartServerResponse(('',)), response)
1066
870
def test_get_parent_something(self):
1067
871
base_branch = self.make_branch('base')
1068
872
base_branch.set_parent(self.get_url('foo'))
1069
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
873
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1070
874
response = request.execute('base')
1071
875
self.assertEquals(
1072
smart_req.SuccessfulSmartServerResponse(("../foo",)),
876
SuccessfulSmartServerResponse(("../foo",)),
1076
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
880
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1078
882
def test_set_parent_none(self):
1079
883
branch = self.make_branch('base', format="1.9")
1080
884
branch.lock_write()
1081
885
branch._set_parent_location('foo')
1083
request = smart_branch.SmartServerBranchRequestSetParentLocation(
887
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1084
888
self.get_transport())
1085
branch_token, repo_token = self.get_lock_tokens(branch)
889
branch_token = branch.lock_write()
890
repo_token = branch.repository.lock_write()
1087
892
response = request.execute('base', branch_token, repo_token, '')
894
branch.repository.unlock()
1090
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
896
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1091
897
self.assertEqual(None, branch.get_parent())
1093
899
def test_set_parent_something(self):
1094
900
branch = self.make_branch('base', format="1.9")
1095
request = smart_branch.SmartServerBranchRequestSetParentLocation(
901
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1096
902
self.get_transport())
1097
branch_token, repo_token = self.get_lock_tokens(branch)
903
branch_token = branch.lock_write()
904
repo_token = branch.repository.lock_write()
1099
906
response = request.execute('base', branch_token, repo_token,
909
branch.repository.unlock()
1103
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
911
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1104
912
self.assertEqual('http://bar/', branch.get_parent())
1107
class TestSmartServerBranchRequestGetTagsBytes(
1108
tests.TestCaseWithMemoryTransport):
915
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1109
916
# Only called when the branch format and tags match [yay factory
1110
917
# methods] so only need to test straight forward cases.
1112
919
def test_get_bytes(self):
1113
920
base_branch = self.make_branch('base')
1114
request = smart_branch.SmartServerBranchGetTagsBytes(
921
request = smart.branch.SmartServerBranchGetTagsBytes(
1115
922
self.get_transport())
1116
923
response = request.execute('base')
1117
924
self.assertEquals(
1118
smart_req.SuccessfulSmartServerResponse(('',)), response)
925
SuccessfulSmartServerResponse(('',)), response)
1121
928
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1125
932
stacked_branch = self.make_branch('stacked', format='1.6')
1126
933
# typically should be relative
1127
934
stacked_branch.set_stacked_on_url('../base')
1128
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
935
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1129
936
self.get_transport())
1130
937
response = request.execute('stacked')
1131
938
self.assertEquals(
1132
smart_req.SmartServerResponse(('ok', '../base')),
939
SmartServerResponse(('ok', '../base')),
1136
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
943
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1138
945
def setUp(self):
1139
946
tests.TestCaseWithMemoryTransport.setUp(self)
1141
948
def test_lock_write_on_unlocked_branch(self):
1142
949
backing = self.get_transport()
1143
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
950
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1144
951
branch = self.make_branch('.', format='knit')
1145
952
repository = branch.repository
1146
953
response = request.execute('')
1147
954
branch_nonce = branch.control_files._lock.peek().get('nonce')
1148
955
repository_nonce = repository.control_files._lock.peek().get('nonce')
1149
self.assertEqual(smart_req.SmartServerResponse(
1150
('ok', branch_nonce, repository_nonce)),
957
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1152
959
# The branch (and associated repository) is now locked. Verify that
1153
960
# with a new branch object.
1154
961
new_branch = repository.bzrdir.open_branch()
1155
962
self.assertRaises(errors.LockContention, new_branch.lock_write)
1157
request = smart_branch.SmartServerBranchRequestUnlock(backing)
964
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1158
965
response = request.execute('', branch_nonce, repository_nonce)
1160
967
def test_lock_write_on_locked_branch(self):
1161
968
backing = self.get_transport()
1162
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
969
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1163
970
branch = self.make_branch('.')
1164
branch_token = branch.lock_write().branch_token
971
branch_token = branch.lock_write()
1165
972
branch.leave_lock_in_place()
1167
974
response = request.execute('')
1168
975
self.assertEqual(
1169
smart_req.SmartServerResponse(('LockContention',)), response)
976
SmartServerResponse(('LockContention',)), response)
1171
978
branch.lock_write(branch_token)
1172
979
branch.dont_leave_lock_in_place()
1270
1082
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1271
1083
backing = self.get_transport()
1272
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1084
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1273
1085
branch = self.make_branch('.', format='knit')
1274
1086
response = request.execute(
1275
1087
'', 'branch token', 'repo token')
1276
1088
self.assertEqual(
1277
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1089
SmartServerResponse(('TokenMismatch',)), response)
1279
1091
def test_unlock_on_unlocked_branch_locked_repo(self):
1280
1092
backing = self.get_transport()
1281
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1093
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1282
1094
branch = self.make_branch('.', format='knit')
1283
1095
# Lock the repository.
1284
repo_token = branch.repository.lock_write().repository_token
1096
repo_token = branch.repository.lock_write()
1285
1097
branch.repository.leave_lock_in_place()
1286
1098
branch.repository.unlock()
1287
1099
# Issue branch lock_write request on the unlocked branch (with locked
1289
response = request.execute('', 'branch token', repo_token)
1101
response = request.execute(
1102
'', 'branch token', repo_token)
1290
1103
self.assertEqual(
1291
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1104
SmartServerResponse(('TokenMismatch',)), response)
1293
1106
branch.repository.lock_write(repo_token)
1294
1107
branch.repository.dont_leave_lock_in_place()
1316
1129
def test_trivial_bzipped(self):
1317
1130
# This tests that the wire encoding is actually bzipped
1318
1131
backing = self.get_transport()
1319
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1132
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1320
1133
tree = self.make_branch_and_memory_tree('.')
1322
1135
self.assertEqual(None,
1323
1136
request.execute('', 'missing-id'))
1324
1137
# Note that it returns a body that is bzipped.
1325
1138
self.assertEqual(
1326
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1139
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1327
1140
request.do_body('\n\n0\n'))
1329
1142
def test_trivial_include_missing(self):
1330
1143
backing = self.get_transport()
1331
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1144
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1332
1145
tree = self.make_branch_and_memory_tree('.')
1334
1147
self.assertEqual(None,
1335
1148
request.execute('', 'missing-id', 'include-missing:'))
1336
1149
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ),
1150
SuccessfulSmartServerResponse(('ok', ),
1338
1151
bz2.compress('missing:missing-id')),
1339
1152
request.do_body('\n\n0\n'))
1342
class TestSmartServerRepositoryGetRevisionGraph(
1343
tests.TestCaseWithMemoryTransport):
1155
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1345
1157
def test_none_argument(self):
1346
1158
backing = self.get_transport()
1347
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1159
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1348
1160
tree = self.make_branch_and_memory_tree('.')
1349
1161
tree.lock_write()
1405
1216
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1408
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1219
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1409
1220
request.execute('', 1, (2, rev2_id_utf8)))
1411
1222
def test_known_revid_missing(self):
1412
1223
backing = self.get_transport()
1413
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1224
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1414
1225
repo = self.make_repository('.')
1415
1226
self.assertEqual(
1416
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1227
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1417
1228
request.execute('', 1, (2, 'ghost')))
1419
1230
def test_history_incomplete(self):
1420
1231
backing = self.get_transport()
1421
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1232
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1422
1233
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1423
1234
parent.lock_write()
1424
1235
parent.add([''], ['TREE_ROOT'])
1583
1394
def test_lock_write_on_unlocked_repo(self):
1584
1395
backing = self.get_transport()
1585
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1396
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1586
1397
repository = self.make_repository('.', format='knit')
1587
1398
response = request.execute('')
1588
1399
nonce = repository.control_files._lock.peek().get('nonce')
1589
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1400
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1590
1401
# The repository is now locked. Verify that with a new repository
1592
1403
new_repo = repository.bzrdir.open_repository()
1593
1404
self.assertRaises(errors.LockContention, new_repo.lock_write)
1595
request = smart_repo.SmartServerRepositoryUnlock(backing)
1406
request = smart.repository.SmartServerRepositoryUnlock(backing)
1596
1407
response = request.execute('', nonce)
1598
1409
def test_lock_write_on_locked_repo(self):
1599
1410
backing = self.get_transport()
1600
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1411
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1601
1412
repository = self.make_repository('.', format='knit')
1602
repo_token = repository.lock_write().repository_token
1413
repo_token = repository.lock_write()
1603
1414
repository.leave_lock_in_place()
1604
1415
repository.unlock()
1605
1416
response = request.execute('')
1606
1417
self.assertEqual(
1607
smart_req.SmartServerResponse(('LockContention',)), response)
1418
SmartServerResponse(('LockContention',)), response)
1609
1420
repository.lock_write(repo_token)
1610
1421
repository.dont_leave_lock_in_place()
1631
1442
def test_insert_stream_empty(self):
1632
1443
backing = self.get_transport()
1633
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1444
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1634
1445
repository = self.make_repository('.')
1635
1446
response = request.execute('', '')
1636
1447
self.assertEqual(None, response)
1637
1448
response = request.do_chunk(self.make_empty_byte_stream(repository))
1638
1449
self.assertEqual(None, response)
1639
1450
response = request.do_end()
1640
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1451
self.assertEqual(SmartServerResponse(('ok', )), response)
1643
1454
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1645
1456
def test_insert_stream_empty(self):
1646
1457
backing = self.get_transport()
1647
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1458
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1649
1460
repository = self.make_repository('.', format='knit')
1650
lock_token = repository.lock_write().repository_token
1461
lock_token = repository.lock_write()
1651
1462
response = request.execute('', '', lock_token)
1652
1463
self.assertEqual(None, response)
1653
1464
response = request.do_chunk(self.make_empty_byte_stream(repository))
1654
1465
self.assertEqual(None, response)
1655
1466
response = request.do_end()
1656
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1467
self.assertEqual(SmartServerResponse(('ok', )), response)
1657
1468
repository.unlock()
1659
1470
def test_insert_stream_with_wrong_lock_token(self):
1660
1471
backing = self.get_transport()
1661
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1472
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1663
1474
repository = self.make_repository('.', format='knit')
1664
lock_token = repository.lock_write().repository_token
1475
lock_token = repository.lock_write()
1665
1476
self.assertRaises(
1666
1477
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1667
1478
repository.unlock()
1691
1502
def test_unlock_on_unlocked_repo(self):
1692
1503
backing = self.get_transport()
1693
request = smart_repo.SmartServerRepositoryUnlock(backing)
1504
request = smart.repository.SmartServerRepositoryUnlock(backing)
1694
1505
repository = self.make_repository('.', format='knit')
1695
1506
response = request.execute('', 'some token')
1696
1507
self.assertEqual(
1697
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1508
SmartServerResponse(('TokenMismatch',)), response)
1700
1511
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1702
1513
def test_is_readonly_no(self):
1703
1514
backing = self.get_transport()
1704
request = smart_req.SmartServerIsReadonly(backing)
1515
request = smart.request.SmartServerIsReadonly(backing)
1705
1516
response = request.execute()
1706
1517
self.assertEqual(
1707
smart_req.SmartServerResponse(('no',)), response)
1518
SmartServerResponse(('no',)), response)
1709
1520
def test_is_readonly_yes(self):
1710
1521
backing = self.get_readonly_transport()
1711
request = smart_req.SmartServerIsReadonly(backing)
1522
request = smart.request.SmartServerIsReadonly(backing)
1712
1523
response = request.execute()
1713
1524
self.assertEqual(
1714
smart_req.SmartServerResponse(('yes',)), response)
1717
class TestSmartServerRepositorySetMakeWorkingTrees(
1718
tests.TestCaseWithMemoryTransport):
1525
SmartServerResponse(('yes',)), response)
1528
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1720
1530
def test_set_false(self):
1721
1531
backing = self.get_transport()
1722
1532
repo = self.make_repository('.', shared=True)
1723
1533
repo.set_make_working_trees(True)
1724
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1534
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1725
1535
request = request_class(backing)
1726
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1536
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1727
1537
request.execute('', 'False'))
1728
1538
repo = repo.bzrdir.open_repository()
1729
1539
self.assertFalse(repo.make_working_trees())
1811
1608
"""All registered request_handlers can be found."""
1812
1609
# If there's a typo in a register_lazy call, this loop will fail with
1813
1610
# an AttributeError.
1814
for key, item in smart_req.request_handlers.iteritems():
1611
for key, item in smart.request.request_handlers.iteritems():
1817
1614
def assertHandlerEqual(self, verb, handler):
1818
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1615
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1820
1617
def test_registered_methods(self):
1821
1618
"""Test that known methods are registered to the correct object."""
1822
1619
self.assertHandlerEqual('Branch.get_config_file',
1823
smart_branch.SmartServerBranchGetConfigFile)
1620
smart.branch.SmartServerBranchGetConfigFile)
1824
1621
self.assertHandlerEqual('Branch.get_parent',
1825
smart_branch.SmartServerBranchGetParent)
1622
smart.branch.SmartServerBranchGetParent)
1826
1623
self.assertHandlerEqual('Branch.get_tags_bytes',
1827
smart_branch.SmartServerBranchGetTagsBytes)
1624
smart.branch.SmartServerBranchGetTagsBytes)
1828
1625
self.assertHandlerEqual('Branch.lock_write',
1829
smart_branch.SmartServerBranchRequestLockWrite)
1626
smart.branch.SmartServerBranchRequestLockWrite)
1830
1627
self.assertHandlerEqual('Branch.last_revision_info',
1831
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1628
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1832
1629
self.assertHandlerEqual('Branch.revision_history',
1833
smart_branch.SmartServerRequestRevisionHistory)
1630
smart.branch.SmartServerRequestRevisionHistory)
1834
1631
self.assertHandlerEqual('Branch.set_config_option',
1835
smart_branch.SmartServerBranchRequestSetConfigOption)
1632
smart.branch.SmartServerBranchRequestSetConfigOption)
1836
1633
self.assertHandlerEqual('Branch.set_last_revision',
1837
smart_branch.SmartServerBranchRequestSetLastRevision)
1634
smart.branch.SmartServerBranchRequestSetLastRevision)
1838
1635
self.assertHandlerEqual('Branch.set_last_revision_info',
1839
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1636
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1840
1637
self.assertHandlerEqual('Branch.set_last_revision_ex',
1841
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1638
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1842
1639
self.assertHandlerEqual('Branch.set_parent_location',
1843
smart_branch.SmartServerBranchRequestSetParentLocation)
1640
smart.branch.SmartServerBranchRequestSetParentLocation)
1844
1641
self.assertHandlerEqual('Branch.unlock',
1845
smart_branch.SmartServerBranchRequestUnlock)
1642
smart.branch.SmartServerBranchRequestUnlock)
1846
1643
self.assertHandlerEqual('BzrDir.find_repository',
1847
smart_dir.SmartServerRequestFindRepositoryV1)
1644
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1848
1645
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1849
smart_dir.SmartServerRequestFindRepositoryV2)
1646
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1850
1647
self.assertHandlerEqual('BzrDirFormat.initialize',
1851
smart_dir.SmartServerRequestInitializeBzrDir)
1648
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1852
1649
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1853
smart_dir.SmartServerRequestBzrDirInitializeEx)
1650
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1854
1651
self.assertHandlerEqual('BzrDir.cloning_metadir',
1855
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1652
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1856
1653
self.assertHandlerEqual('BzrDir.get_config_file',
1857
smart_dir.SmartServerBzrDirRequestConfigFile)
1654
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1858
1655
self.assertHandlerEqual('BzrDir.open_branch',
1859
smart_dir.SmartServerRequestOpenBranch)
1656
smart.bzrdir.SmartServerRequestOpenBranch)
1860
1657
self.assertHandlerEqual('BzrDir.open_branchV2',
1861
smart_dir.SmartServerRequestOpenBranchV2)
1862
self.assertHandlerEqual('BzrDir.open_branchV3',
1863
smart_dir.SmartServerRequestOpenBranchV3)
1658
smart.bzrdir.SmartServerRequestOpenBranchV2)
1864
1659
self.assertHandlerEqual('PackRepository.autopack',
1865
smart_packrepo.SmartServerPackRepositoryAutopack)
1660
smart.packrepository.SmartServerPackRepositoryAutopack)
1866
1661
self.assertHandlerEqual('Repository.gather_stats',
1867
smart_repo.SmartServerRepositoryGatherStats)
1662
smart.repository.SmartServerRepositoryGatherStats)
1868
1663
self.assertHandlerEqual('Repository.get_parent_map',
1869
smart_repo.SmartServerRepositoryGetParentMap)
1664
smart.repository.SmartServerRepositoryGetParentMap)
1870
1665
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1871
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1666
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1872
1667
self.assertHandlerEqual('Repository.get_revision_graph',
1873
smart_repo.SmartServerRepositoryGetRevisionGraph)
1668
smart.repository.SmartServerRepositoryGetRevisionGraph)
1874
1669
self.assertHandlerEqual('Repository.get_stream',
1875
smart_repo.SmartServerRepositoryGetStream)
1670
smart.repository.SmartServerRepositoryGetStream)
1876
1671
self.assertHandlerEqual('Repository.has_revision',
1877
smart_repo.SmartServerRequestHasRevision)
1672
smart.repository.SmartServerRequestHasRevision)
1878
1673
self.assertHandlerEqual('Repository.insert_stream',
1879
smart_repo.SmartServerRepositoryInsertStream)
1674
smart.repository.SmartServerRepositoryInsertStream)
1880
1675
self.assertHandlerEqual('Repository.insert_stream_locked',
1881
smart_repo.SmartServerRepositoryInsertStreamLocked)
1676
smart.repository.SmartServerRepositoryInsertStreamLocked)
1882
1677
self.assertHandlerEqual('Repository.is_shared',
1883
smart_repo.SmartServerRepositoryIsShared)
1678
smart.repository.SmartServerRepositoryIsShared)
1884
1679
self.assertHandlerEqual('Repository.lock_write',
1885
smart_repo.SmartServerRepositoryLockWrite)
1680
smart.repository.SmartServerRepositoryLockWrite)
1886
1681
self.assertHandlerEqual('Repository.tarball',
1887
smart_repo.SmartServerRepositoryTarball)
1682
smart.repository.SmartServerRepositoryTarball)
1888
1683
self.assertHandlerEqual('Repository.unlock',
1889
smart_repo.SmartServerRepositoryUnlock)
1684
smart.repository.SmartServerRepositoryUnlock)
1890
1685
self.assertHandlerEqual('Transport.is_readonly',
1891
smart_req.SmartServerIsReadonly)
1686
smart.request.SmartServerIsReadonly)