31
31
from bzrlib import (
33
branch as _mod_branch,
42
from bzrlib.smart import (
43
branch as smart_branch,
45
repository as smart_repo,
46
packrepository as smart_packrepo,
51
from bzrlib.tests import test_server
52
from bzrlib.transport import (
41
from bzrlib.branch import Branch, BranchReferenceFormat
42
import bzrlib.smart.branch
43
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
44
import bzrlib.smart.packrepository
45
import bzrlib.smart.repository
46
from bzrlib.smart.request import (
47
FailedSmartServerResponse,
50
SuccessfulSmartServerResponse,
52
from bzrlib.tests import (
55
from bzrlib.transport import chroot, get_transport
58
58
def load_tests(standard_tests, module, loader):
59
59
"""Multiply tests version and protocol consistency."""
60
60
# FindRepository tests.
61
bzrdir_mod = bzrlib.smart.bzrdir
62
63
("find_repository", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
64
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
64
65
("find_repositoryV2", {
65
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
66
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
66
67
("find_repositoryV3", {
67
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
68
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
69
to_adapt, result = tests.split_suite_by_re(standard_tests,
70
to_adapt, result = split_suite_by_re(standard_tests,
70
71
"TestSmartServerRequestFindRepository")
71
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
72
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
73
74
tests.multiply_tests(v1_and_2, scenarios, result)
74
75
# The first scenario is only applicable to v1 protocols, it is deleted
135
136
class TestSmartServerResponse(tests.TestCase):
137
138
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', )))
139
self.assertEqual(SmartServerResponse(('ok', )),
140
SmartServerResponse(('ok', )))
141
self.assertEqual(SmartServerResponse(('ok', ), 'body'),
142
SmartServerResponse(('ok', ), 'body'))
143
self.assertNotEqual(SmartServerResponse(('ok', )),
144
SmartServerResponse(('notok', )))
145
self.assertNotEqual(SmartServerResponse(('ok', ), 'body'),
146
SmartServerResponse(('ok', )))
146
147
self.assertNotEqual(None,
147
smart_req.SmartServerResponse(('ok', )))
148
SmartServerResponse(('ok', )))
149
150
def test__str__(self):
150
151
"""SmartServerResponses can be stringified."""
151
152
self.assertEqual(
152
153
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
153
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
154
str(SuccessfulSmartServerResponse(('args',), 'body')))
154
155
self.assertEqual(
155
156
"<FailedSmartServerResponse args=('args',) body='body'>",
156
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
157
str(FailedSmartServerResponse(('args',), 'body')))
159
160
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
161
162
def test_translate_client_path(self):
162
163
transport = self.get_transport()
163
request = smart_req.SmartServerRequest(transport, 'foo/')
164
request = SmartServerRequest(transport, 'foo/')
164
165
self.assertEqual('./', request.translate_client_path('foo/'))
165
166
self.assertRaises(
166
167
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
274
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
275
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
276
return SuccessfulSmartServerResponse(
289
277
('ok', '', rich_root, subtrees, external,
290
278
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
279
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
280
self._request_class):
293
281
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
283
return SuccessfulSmartServerResponse(
296
284
('ok', '', rich_root, subtrees, external))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
286
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
288
def test_shared_repository(self):
302
289
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
427
408
"""Initializing an extant directory should fail like the bzrdir api."""
428
409
backing = self.get_transport()
429
410
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
411
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
412
self.make_bzrdir('subdir')
432
413
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
414
'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
417
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
419
def test_no_branch(self):
506
420
"""When there is no branch, ('nobranch', ) is returned."""
507
421
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
422
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
423
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
424
self.assertEqual(SmartServerResponse(('nobranch', )),
511
425
request.execute(''))
513
427
def test_branch(self):
514
428
"""When there is a branch, 'ok' is returned."""
515
429
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
430
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
431
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
432
self.assertEqual(SmartServerResponse(('ok', '')),
519
433
request.execute(''))
521
435
def test_branch_reference(self):
522
436
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
437
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
438
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
439
branch = self.make_branch('branch')
527
440
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
441
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
442
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
443
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
444
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
447
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
450
"""When there is no branch, ('nobranch', ) is returned."""
547
451
backing = self.get_transport()
548
452
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')),
453
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
454
self.assertEqual(SmartServerResponse(('nobranch', )),
457
def test_branch(self):
458
"""When there is a branch, 'ok' is returned."""
459
backing = self.get_transport()
460
expected = self.make_branch('.')._format.network_name()
461
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
462
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
465
def test_branch_reference(self):
466
"""When there is a branch reference, the reference URL is returned."""
467
backing = self.get_transport()
468
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
469
branch = self.make_branch('branch')
470
checkout = branch.create_checkout('reference',lightweight=True)
471
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
472
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
473
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
474
request.execute('reference'))
476
def test_stacked_branch(self):
477
"""Opening a stacked branch does not open the stacked-on branch."""
478
trunk = self.make_branch('trunk')
479
feature = self.make_branch('feature')
480
feature.set_stacked_on_url(trunk.base)
482
Branch.hooks.install_named_hook('open', opened_branches.append, None)
483
backing = self.get_transport()
484
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
487
response = request.execute('feature')
489
request.teardown_jail()
490
expected_format = feature._format.network_name()
492
SuccessfulSmartServerResponse(('branch', expected_format)),
494
self.assertLength(1, opened_branches)
670
497
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
532
def test_branch_reference(self):
706
533
"""When there is a branch reference, NotBranchError is raised."""
707
534
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
535
request = smart.branch.SmartServerBranchRequest(backing)
709
536
branch = self.make_branch('branch')
710
537
checkout = branch.create_checkout('reference',lightweight=True)
711
538
self.assertRaises(errors.NotBranchError,
712
539
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
542
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
544
def test_empty(self):
719
545
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
546
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
547
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
548
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
549
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
550
request.execute(''))
726
552
def test_not_empty(self):
727
553
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
554
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
555
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
556
tree = self.make_branch_and_memory_tree('.')
731
557
tree.lock_write()
778
603
def test_value_name(self):
779
604
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
605
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
606
branch.bzrdir.root_transport)
782
607
branch_token, repo_token = self.get_lock_tokens(branch)
783
608
config = branch._get_config()
784
609
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
611
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
612
self.assertEqual('bar', config.get_option('foo'))
791
616
def test_value_name_section(self):
792
617
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
618
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
619
branch.bzrdir.root_transport)
795
620
branch_token, repo_token = self.get_lock_tokens(branch)
796
621
config = branch._get_config()
797
622
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
624
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
625
self.assertEqual('bar', config.get_option('foo', 'gam'))
805
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
808
TestLockedBranch.setUp(self)
809
# A dict with non-ascii keys and values to exercise unicode
811
self.encoded_value_dict = (
812
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
814
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
816
def test_value_name(self):
817
branch = self.make_branch('.')
818
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
819
branch.bzrdir.root_transport)
820
branch_token, repo_token = self.get_lock_tokens(branch)
821
config = branch._get_config()
822
result = request.execute('', branch_token, repo_token,
823
self.encoded_value_dict, 'foo', '')
824
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
825
self.assertEqual(self.value_dict, config.get_option('foo'))
829
def test_value_name_section(self):
830
branch = self.make_branch('.')
831
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
832
branch.bzrdir.root_transport)
833
branch_token, repo_token = self.get_lock_tokens(branch)
834
config = branch._get_config()
835
result = request.execute('', branch_token, repo_token,
836
self.encoded_value_dict, 'foo', 'gam')
837
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
838
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
843
630
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
844
631
# Only called when the branch format and tags match [yay factory
845
632
# methods] so only need to test straight forward cases.
1097
883
def test_get_parent_none(self):
1098
884
base_branch = self.make_branch('base')
1099
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
885
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1100
886
response = request.execute('base')
1101
887
self.assertEquals(
1102
smart_req.SuccessfulSmartServerResponse(('',)), response)
888
SuccessfulSmartServerResponse(('',)), response)
1104
890
def test_get_parent_something(self):
1105
891
base_branch = self.make_branch('base')
1106
892
base_branch.set_parent(self.get_url('foo'))
1107
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
893
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1108
894
response = request.execute('base')
1109
895
self.assertEquals(
1110
smart_req.SuccessfulSmartServerResponse(("../foo",)),
896
SuccessfulSmartServerResponse(("../foo",)),
1114
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
900
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1116
902
def test_set_parent_none(self):
1117
903
branch = self.make_branch('base', format="1.9")
1118
904
branch.lock_write()
1119
905
branch._set_parent_location('foo')
1121
request = smart_branch.SmartServerBranchRequestSetParentLocation(
907
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1122
908
self.get_transport())
1123
branch_token, repo_token = self.get_lock_tokens(branch)
909
branch_token = branch.lock_write()
910
repo_token = branch.repository.lock_write()
1125
912
response = request.execute('base', branch_token, repo_token, '')
914
branch.repository.unlock()
1128
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
916
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1129
917
self.assertEqual(None, branch.get_parent())
1131
919
def test_set_parent_something(self):
1132
920
branch = self.make_branch('base', format="1.9")
1133
request = smart_branch.SmartServerBranchRequestSetParentLocation(
921
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1134
922
self.get_transport())
1135
branch_token, repo_token = self.get_lock_tokens(branch)
923
branch_token = branch.lock_write()
924
repo_token = branch.repository.lock_write()
1137
926
response = request.execute('base', branch_token, repo_token,
929
branch.repository.unlock()
1141
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
931
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1142
932
self.assertEqual('http://bar/', branch.get_parent())
1145
class TestSmartServerBranchRequestGetTagsBytes(
1146
tests.TestCaseWithMemoryTransport):
935
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1147
936
# Only called when the branch format and tags match [yay factory
1148
937
# methods] so only need to test straight forward cases.
1150
939
def test_get_bytes(self):
1151
940
base_branch = self.make_branch('base')
1152
request = smart_branch.SmartServerBranchGetTagsBytes(
941
request = smart.branch.SmartServerBranchGetTagsBytes(
1153
942
self.get_transport())
1154
943
response = request.execute('base')
1155
944
self.assertEquals(
1156
smart_req.SuccessfulSmartServerResponse(('',)), response)
945
SuccessfulSmartServerResponse(('',)), response)
1159
948
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1163
952
stacked_branch = self.make_branch('stacked', format='1.6')
1164
953
# typically should be relative
1165
954
stacked_branch.set_stacked_on_url('../base')
1166
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
955
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1167
956
self.get_transport())
1168
957
response = request.execute('stacked')
1169
958
self.assertEquals(
1170
smart_req.SmartServerResponse(('ok', '../base')),
959
SmartServerResponse(('ok', '../base')),
1174
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
963
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1176
965
def setUp(self):
1177
966
tests.TestCaseWithMemoryTransport.setUp(self)
1179
968
def test_lock_write_on_unlocked_branch(self):
1180
969
backing = self.get_transport()
1181
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
970
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1182
971
branch = self.make_branch('.', format='knit')
1183
972
repository = branch.repository
1184
973
response = request.execute('')
1185
974
branch_nonce = branch.control_files._lock.peek().get('nonce')
1186
975
repository_nonce = repository.control_files._lock.peek().get('nonce')
1187
self.assertEqual(smart_req.SmartServerResponse(
1188
('ok', branch_nonce, repository_nonce)),
977
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1190
979
# The branch (and associated repository) is now locked. Verify that
1191
980
# with a new branch object.
1192
981
new_branch = repository.bzrdir.open_branch()
1193
982
self.assertRaises(errors.LockContention, new_branch.lock_write)
1195
request = smart_branch.SmartServerBranchRequestUnlock(backing)
984
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1196
985
response = request.execute('', branch_nonce, repository_nonce)
1198
987
def test_lock_write_on_locked_branch(self):
1199
988
backing = self.get_transport()
1200
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
989
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1201
990
branch = self.make_branch('.')
1202
branch_token = branch.lock_write().branch_token
991
branch_token = branch.lock_write()
1203
992
branch.leave_lock_in_place()
1205
994
response = request.execute('')
1206
995
self.assertEqual(
1207
smart_req.SmartServerResponse(('LockContention',)), response)
996
SmartServerResponse(('LockContention',)), response)
1209
998
branch.lock_write(branch_token)
1210
999
branch.dont_leave_lock_in_place()
1308
1102
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1309
1103
backing = self.get_transport()
1310
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1104
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1311
1105
branch = self.make_branch('.', format='knit')
1312
1106
response = request.execute(
1313
1107
'', 'branch token', 'repo token')
1314
1108
self.assertEqual(
1315
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1109
SmartServerResponse(('TokenMismatch',)), response)
1317
1111
def test_unlock_on_unlocked_branch_locked_repo(self):
1318
1112
backing = self.get_transport()
1319
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1113
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1320
1114
branch = self.make_branch('.', format='knit')
1321
1115
# Lock the repository.
1322
repo_token = branch.repository.lock_write().repository_token
1116
repo_token = branch.repository.lock_write()
1323
1117
branch.repository.leave_lock_in_place()
1324
1118
branch.repository.unlock()
1325
1119
# Issue branch lock_write request on the unlocked branch (with locked
1327
response = request.execute('', 'branch token', repo_token)
1121
response = request.execute(
1122
'', 'branch token', repo_token)
1328
1123
self.assertEqual(
1329
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1124
SmartServerResponse(('TokenMismatch',)), response)
1331
1126
branch.repository.lock_write(repo_token)
1332
1127
branch.repository.dont_leave_lock_in_place()
1354
1149
def test_trivial_bzipped(self):
1355
1150
# This tests that the wire encoding is actually bzipped
1356
1151
backing = self.get_transport()
1357
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1152
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1358
1153
tree = self.make_branch_and_memory_tree('.')
1360
1155
self.assertEqual(None,
1361
1156
request.execute('', 'missing-id'))
1362
1157
# Note that it returns a body that is bzipped.
1363
1158
self.assertEqual(
1364
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1159
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1365
1160
request.do_body('\n\n0\n'))
1367
1162
def test_trivial_include_missing(self):
1368
1163
backing = self.get_transport()
1369
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1164
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1370
1165
tree = self.make_branch_and_memory_tree('.')
1372
1167
self.assertEqual(None,
1373
1168
request.execute('', 'missing-id', 'include-missing:'))
1374
1169
self.assertEqual(
1375
smart_req.SuccessfulSmartServerResponse(('ok', ),
1170
SuccessfulSmartServerResponse(('ok', ),
1376
1171
bz2.compress('missing:missing-id')),
1377
1172
request.do_body('\n\n0\n'))
1380
class TestSmartServerRepositoryGetRevisionGraph(
1381
tests.TestCaseWithMemoryTransport):
1175
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1383
1177
def test_none_argument(self):
1384
1178
backing = self.get_transport()
1385
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1179
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1386
1180
tree = self.make_branch_and_memory_tree('.')
1387
1181
tree.lock_write()
1443
1236
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1446
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1239
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1447
1240
request.execute('', 1, (2, rev2_id_utf8)))
1449
1242
def test_known_revid_missing(self):
1450
1243
backing = self.get_transport()
1451
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1244
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1452
1245
repo = self.make_repository('.')
1453
1246
self.assertEqual(
1454
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1247
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1455
1248
request.execute('', 1, (2, 'ghost')))
1457
1250
def test_history_incomplete(self):
1458
1251
backing = self.get_transport()
1459
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1252
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1460
1253
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1461
1254
parent.lock_write()
1462
1255
parent.add([''], ['TREE_ROOT'])
1621
1414
def test_lock_write_on_unlocked_repo(self):
1622
1415
backing = self.get_transport()
1623
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1416
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1624
1417
repository = self.make_repository('.', format='knit')
1625
1418
response = request.execute('')
1626
1419
nonce = repository.control_files._lock.peek().get('nonce')
1627
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1420
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1628
1421
# The repository is now locked. Verify that with a new repository
1630
1423
new_repo = repository.bzrdir.open_repository()
1631
1424
self.assertRaises(errors.LockContention, new_repo.lock_write)
1633
request = smart_repo.SmartServerRepositoryUnlock(backing)
1426
request = smart.repository.SmartServerRepositoryUnlock(backing)
1634
1427
response = request.execute('', nonce)
1636
1429
def test_lock_write_on_locked_repo(self):
1637
1430
backing = self.get_transport()
1638
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1431
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1639
1432
repository = self.make_repository('.', format='knit')
1640
repo_token = repository.lock_write().repository_token
1433
repo_token = repository.lock_write()
1641
1434
repository.leave_lock_in_place()
1642
1435
repository.unlock()
1643
1436
response = request.execute('')
1644
1437
self.assertEqual(
1645
smart_req.SmartServerResponse(('LockContention',)), response)
1438
SmartServerResponse(('LockContention',)), response)
1647
1440
repository.lock_write(repo_token)
1648
1441
repository.dont_leave_lock_in_place()
1669
1462
def test_insert_stream_empty(self):
1670
1463
backing = self.get_transport()
1671
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1464
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1672
1465
repository = self.make_repository('.')
1673
1466
response = request.execute('', '')
1674
1467
self.assertEqual(None, response)
1675
1468
response = request.do_chunk(self.make_empty_byte_stream(repository))
1676
1469
self.assertEqual(None, response)
1677
1470
response = request.do_end()
1678
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1471
self.assertEqual(SmartServerResponse(('ok', )), response)
1681
1474
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1683
1476
def test_insert_stream_empty(self):
1684
1477
backing = self.get_transport()
1685
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1478
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1687
1480
repository = self.make_repository('.', format='knit')
1688
lock_token = repository.lock_write().repository_token
1481
lock_token = repository.lock_write()
1689
1482
response = request.execute('', '', lock_token)
1690
1483
self.assertEqual(None, response)
1691
1484
response = request.do_chunk(self.make_empty_byte_stream(repository))
1692
1485
self.assertEqual(None, response)
1693
1486
response = request.do_end()
1694
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1487
self.assertEqual(SmartServerResponse(('ok', )), response)
1695
1488
repository.unlock()
1697
1490
def test_insert_stream_with_wrong_lock_token(self):
1698
1491
backing = self.get_transport()
1699
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1492
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1701
1494
repository = self.make_repository('.', format='knit')
1702
lock_token = repository.lock_write().repository_token
1495
lock_token = repository.lock_write()
1703
1496
self.assertRaises(
1704
1497
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1705
1498
repository.unlock()
1729
1522
def test_unlock_on_unlocked_repo(self):
1730
1523
backing = self.get_transport()
1731
request = smart_repo.SmartServerRepositoryUnlock(backing)
1524
request = smart.repository.SmartServerRepositoryUnlock(backing)
1732
1525
repository = self.make_repository('.', format='knit')
1733
1526
response = request.execute('', 'some token')
1734
1527
self.assertEqual(
1735
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1528
SmartServerResponse(('TokenMismatch',)), response)
1738
1531
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1740
1533
def test_is_readonly_no(self):
1741
1534
backing = self.get_transport()
1742
request = smart_req.SmartServerIsReadonly(backing)
1535
request = smart.request.SmartServerIsReadonly(backing)
1743
1536
response = request.execute()
1744
1537
self.assertEqual(
1745
smart_req.SmartServerResponse(('no',)), response)
1538
SmartServerResponse(('no',)), response)
1747
1540
def test_is_readonly_yes(self):
1748
1541
backing = self.get_readonly_transport()
1749
request = smart_req.SmartServerIsReadonly(backing)
1542
request = smart.request.SmartServerIsReadonly(backing)
1750
1543
response = request.execute()
1751
1544
self.assertEqual(
1752
smart_req.SmartServerResponse(('yes',)), response)
1755
class TestSmartServerRepositorySetMakeWorkingTrees(
1756
tests.TestCaseWithMemoryTransport):
1545
SmartServerResponse(('yes',)), response)
1548
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1758
1550
def test_set_false(self):
1759
1551
backing = self.get_transport()
1760
1552
repo = self.make_repository('.', shared=True)
1761
1553
repo.set_make_working_trees(True)
1762
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1554
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1763
1555
request = request_class(backing)
1764
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1556
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1765
1557
request.execute('', 'False'))
1766
1558
repo = repo.bzrdir.open_repository()
1767
1559
self.assertFalse(repo.make_working_trees())
1849
1628
"""All registered request_handlers can be found."""
1850
1629
# If there's a typo in a register_lazy call, this loop will fail with
1851
1630
# an AttributeError.
1852
for key, item in smart_req.request_handlers.iteritems():
1631
for key, item in smart.request.request_handlers.iteritems():
1855
1634
def assertHandlerEqual(self, verb, handler):
1856
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1635
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1858
1637
def test_registered_methods(self):
1859
1638
"""Test that known methods are registered to the correct object."""
1860
1639
self.assertHandlerEqual('Branch.get_config_file',
1861
smart_branch.SmartServerBranchGetConfigFile)
1640
smart.branch.SmartServerBranchGetConfigFile)
1862
1641
self.assertHandlerEqual('Branch.get_parent',
1863
smart_branch.SmartServerBranchGetParent)
1642
smart.branch.SmartServerBranchGetParent)
1864
1643
self.assertHandlerEqual('Branch.get_tags_bytes',
1865
smart_branch.SmartServerBranchGetTagsBytes)
1644
smart.branch.SmartServerBranchGetTagsBytes)
1866
1645
self.assertHandlerEqual('Branch.lock_write',
1867
smart_branch.SmartServerBranchRequestLockWrite)
1646
smart.branch.SmartServerBranchRequestLockWrite)
1868
1647
self.assertHandlerEqual('Branch.last_revision_info',
1869
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1648
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1870
1649
self.assertHandlerEqual('Branch.revision_history',
1871
smart_branch.SmartServerRequestRevisionHistory)
1650
smart.branch.SmartServerRequestRevisionHistory)
1872
1651
self.assertHandlerEqual('Branch.set_config_option',
1873
smart_branch.SmartServerBranchRequestSetConfigOption)
1652
smart.branch.SmartServerBranchRequestSetConfigOption)
1874
1653
self.assertHandlerEqual('Branch.set_last_revision',
1875
smart_branch.SmartServerBranchRequestSetLastRevision)
1654
smart.branch.SmartServerBranchRequestSetLastRevision)
1876
1655
self.assertHandlerEqual('Branch.set_last_revision_info',
1877
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1656
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1878
1657
self.assertHandlerEqual('Branch.set_last_revision_ex',
1879
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1658
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1880
1659
self.assertHandlerEqual('Branch.set_parent_location',
1881
smart_branch.SmartServerBranchRequestSetParentLocation)
1660
smart.branch.SmartServerBranchRequestSetParentLocation)
1882
1661
self.assertHandlerEqual('Branch.unlock',
1883
smart_branch.SmartServerBranchRequestUnlock)
1662
smart.branch.SmartServerBranchRequestUnlock)
1884
1663
self.assertHandlerEqual('BzrDir.find_repository',
1885
smart_dir.SmartServerRequestFindRepositoryV1)
1664
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1886
1665
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1887
smart_dir.SmartServerRequestFindRepositoryV2)
1666
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1888
1667
self.assertHandlerEqual('BzrDirFormat.initialize',
1889
smart_dir.SmartServerRequestInitializeBzrDir)
1668
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1890
1669
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1891
smart_dir.SmartServerRequestBzrDirInitializeEx)
1670
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1892
1671
self.assertHandlerEqual('BzrDir.cloning_metadir',
1893
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1672
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1894
1673
self.assertHandlerEqual('BzrDir.get_config_file',
1895
smart_dir.SmartServerBzrDirRequestConfigFile)
1674
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1896
1675
self.assertHandlerEqual('BzrDir.open_branch',
1897
smart_dir.SmartServerRequestOpenBranch)
1676
smart.bzrdir.SmartServerRequestOpenBranch)
1898
1677
self.assertHandlerEqual('BzrDir.open_branchV2',
1899
smart_dir.SmartServerRequestOpenBranchV2)
1900
self.assertHandlerEqual('BzrDir.open_branchV3',
1901
smart_dir.SmartServerRequestOpenBranchV3)
1678
smart.bzrdir.SmartServerRequestOpenBranchV2)
1902
1679
self.assertHandlerEqual('PackRepository.autopack',
1903
smart_packrepo.SmartServerPackRepositoryAutopack)
1680
smart.packrepository.SmartServerPackRepositoryAutopack)
1904
1681
self.assertHandlerEqual('Repository.gather_stats',
1905
smart_repo.SmartServerRepositoryGatherStats)
1682
smart.repository.SmartServerRepositoryGatherStats)
1906
1683
self.assertHandlerEqual('Repository.get_parent_map',
1907
smart_repo.SmartServerRepositoryGetParentMap)
1684
smart.repository.SmartServerRepositoryGetParentMap)
1908
1685
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1909
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1686
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1910
1687
self.assertHandlerEqual('Repository.get_revision_graph',
1911
smart_repo.SmartServerRepositoryGetRevisionGraph)
1688
smart.repository.SmartServerRepositoryGetRevisionGraph)
1912
1689
self.assertHandlerEqual('Repository.get_stream',
1913
smart_repo.SmartServerRepositoryGetStream)
1690
smart.repository.SmartServerRepositoryGetStream)
1914
1691
self.assertHandlerEqual('Repository.has_revision',
1915
smart_repo.SmartServerRequestHasRevision)
1692
smart.repository.SmartServerRequestHasRevision)
1916
1693
self.assertHandlerEqual('Repository.insert_stream',
1917
smart_repo.SmartServerRepositoryInsertStream)
1694
smart.repository.SmartServerRepositoryInsertStream)
1918
1695
self.assertHandlerEqual('Repository.insert_stream_locked',
1919
smart_repo.SmartServerRepositoryInsertStreamLocked)
1696
smart.repository.SmartServerRepositoryInsertStreamLocked)
1920
1697
self.assertHandlerEqual('Repository.is_shared',
1921
smart_repo.SmartServerRepositoryIsShared)
1698
smart.repository.SmartServerRepositoryIsShared)
1922
1699
self.assertHandlerEqual('Repository.lock_write',
1923
smart_repo.SmartServerRepositoryLockWrite)
1700
smart.repository.SmartServerRepositoryLockWrite)
1924
1701
self.assertHandlerEqual('Repository.tarball',
1925
smart_repo.SmartServerRepositoryTarball)
1702
smart.repository.SmartServerRepositoryTarball)
1926
1703
self.assertHandlerEqual('Repository.unlock',
1927
smart_repo.SmartServerRepositoryUnlock)
1704
smart.repository.SmartServerRepositoryUnlock)
1928
1705
self.assertHandlerEqual('Transport.is_readonly',
1929
smart_req.SmartServerIsReadonly)
1706
smart.request.SmartServerIsReadonly)