31
31
from bzrlib import (
33
branch as _mod_branch,
42
from bzrlib.smart import (
43
branch as smart_branch,
45
repository as smart_repo,
46
packrepository as smart_packrepo,
51
from bzrlib.tests import test_server
52
from bzrlib.transport import (
41
from bzrlib.branch import Branch, BranchReferenceFormat
42
import bzrlib.smart.branch
43
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
44
import bzrlib.smart.packrepository
45
import bzrlib.smart.repository
46
import bzrlib.smart.vfs
47
from bzrlib.smart.request import (
48
FailedSmartServerResponse,
51
SuccessfulSmartServerResponse,
53
from bzrlib.tests import (
56
from bzrlib.transport import chroot, get_transport, local, memory
58
59
def load_tests(standard_tests, module, loader):
59
60
"""Multiply tests version and protocol consistency."""
60
61
# FindRepository tests.
62
bzrdir_mod = bzrlib.smart.bzrdir
62
64
("find_repository", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
65
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
64
66
("find_repositoryV2", {
65
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
67
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
66
68
("find_repositoryV3", {
67
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
69
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
69
to_adapt, result = tests.split_suite_by_re(standard_tests,
71
to_adapt, result = split_suite_by_re(standard_tests,
70
72
"TestSmartServerRequestFindRepository")
71
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
73
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
73
75
tests.multiply_tests(v1_and_2, scenarios, result)
74
76
# The first scenario is only applicable to v1 protocols, it is deleted
135
137
class TestSmartServerResponse(tests.TestCase):
137
139
def test__eq__(self):
138
self.assertEqual(smart_req.SmartServerResponse(('ok', )),
139
smart_req.SmartServerResponse(('ok', )))
140
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
141
smart_req.SmartServerResponse(('ok', ), 'body'))
142
self.assertNotEqual(smart_req.SmartServerResponse(('ok', )),
143
smart_req.SmartServerResponse(('notok', )))
144
self.assertNotEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
145
smart_req.SmartServerResponse(('ok', )))
140
self.assertEqual(SmartServerResponse(('ok', )),
141
SmartServerResponse(('ok', )))
142
self.assertEqual(SmartServerResponse(('ok', ), 'body'),
143
SmartServerResponse(('ok', ), 'body'))
144
self.assertNotEqual(SmartServerResponse(('ok', )),
145
SmartServerResponse(('notok', )))
146
self.assertNotEqual(SmartServerResponse(('ok', ), 'body'),
147
SmartServerResponse(('ok', )))
146
148
self.assertNotEqual(None,
147
smart_req.SmartServerResponse(('ok', )))
149
SmartServerResponse(('ok', )))
149
151
def test__str__(self):
150
152
"""SmartServerResponses can be stringified."""
151
153
self.assertEqual(
152
154
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
153
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
155
str(SuccessfulSmartServerResponse(('args',), 'body')))
154
156
self.assertEqual(
155
157
"<FailedSmartServerResponse args=('args',) body='body'>",
156
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
158
str(FailedSmartServerResponse(('args',), 'body')))
159
161
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
161
163
def test_translate_client_path(self):
162
164
transport = self.get_transport()
163
request = smart_req.SmartServerRequest(transport, 'foo/')
165
request = SmartServerRequest(transport, 'foo/')
164
166
self.assertEqual('./', request.translate_client_path('foo/'))
165
167
self.assertRaises(
166
168
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
287
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
288
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
289
return SuccessfulSmartServerResponse(
289
290
('ok', '', rich_root, subtrees, external,
290
291
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
292
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
293
self._request_class):
293
294
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
296
return SuccessfulSmartServerResponse(
296
297
('ok', '', rich_root, subtrees, external))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
299
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
301
def test_shared_repository(self):
302
302
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
427
421
"""Initializing an extant directory should fail like the bzrdir api."""
428
422
backing = self.get_transport()
429
423
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
424
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
425
self.make_bzrdir('subdir')
432
426
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
427
'False', 'False', 'False', '', '', '', '', 'False')
436
430
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
438
432
def test_no_directory(self):
439
433
backing = self.get_transport()
440
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
441
self.assertEqual(smart_req.SmartServerResponse(('no', )),
434
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
435
self.assertEqual(SmartServerResponse(('no', )),
442
436
request.execute('does-not-exist'))
444
438
def test_empty_directory(self):
445
439
backing = self.get_transport()
446
440
backing.mkdir('empty')
447
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
448
self.assertEqual(smart_req.SmartServerResponse(('no', )),
441
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
442
self.assertEqual(SmartServerResponse(('no', )),
449
443
request.execute('empty'))
451
445
def test_outside_root_client_path(self):
452
446
backing = self.get_transport()
453
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
447
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing,
454
448
root_client_path='root')
455
self.assertEqual(smart_req.SmartServerResponse(('no', )),
449
self.assertEqual(SmartServerResponse(('no', )),
456
450
request.execute('not-root'))
459
453
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
461
455
def test_no_directory(self):
462
456
backing = self.get_transport()
463
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
464
self.assertEqual(smart_req.SmartServerResponse(('no', )),
457
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
458
self.assertEqual(SmartServerResponse(('no', )),
465
459
request.execute('does-not-exist'))
467
461
def test_empty_directory(self):
468
462
backing = self.get_transport()
469
463
backing.mkdir('empty')
470
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
self.assertEqual(smart_req.SmartServerResponse(('no', )),
464
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
465
self.assertEqual(SmartServerResponse(('no', )),
472
466
request.execute('empty'))
474
468
def test_present_without_workingtree(self):
475
469
backing = self.get_transport()
476
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
470
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
477
471
self.make_bzrdir('.')
478
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
472
self.assertEqual(SmartServerResponse(('yes', 'no')),
479
473
request.execute(''))
481
475
def test_outside_root_client_path(self):
482
476
backing = self.get_transport()
483
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
477
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing,
484
478
root_client_path='root')
485
self.assertEqual(smart_req.SmartServerResponse(('no',)),
479
self.assertEqual(SmartServerResponse(('no',)),
486
480
request.execute('not-root'))
489
483
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
491
485
def test_present_with_workingtree(self):
492
self.vfs_transport_factory = test_server.LocalURLServer
486
self.vfs_transport_factory = local.LocalURLServer
493
487
backing = self.get_transport()
494
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
488
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
495
489
bd = self.make_bzrdir('.')
496
490
bd.create_repository()
497
491
bd.create_branch()
498
492
bd.create_workingtree()
499
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
493
self.assertEqual(SmartServerResponse(('yes', 'yes')),
500
494
request.execute(''))
505
499
def test_no_branch(self):
506
500
"""When there is no branch, ('nobranch', ) is returned."""
507
501
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
502
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
503
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
504
self.assertEqual(SmartServerResponse(('nobranch', )),
511
505
request.execute(''))
513
507
def test_branch(self):
514
508
"""When there is a branch, 'ok' is returned."""
515
509
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
510
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
511
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
512
self.assertEqual(SmartServerResponse(('ok', '')),
519
513
request.execute(''))
521
515
def test_branch_reference(self):
522
516
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
517
self.vfs_transport_factory = local.LocalURLServer
524
518
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
519
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
520
branch = self.make_branch('branch')
527
521
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
522
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
523
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
524
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
525
request.execute('reference'))
534
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
528
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
531
"""When there is no branch, ('nobranch', ) is returned."""
547
532
backing = self.get_transport()
548
533
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')),
534
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
535
self.assertEqual(SmartServerResponse(('nobranch', )),
538
def test_branch(self):
539
"""When there is a branch, 'ok' is returned."""
540
backing = self.get_transport()
541
expected = self.make_branch('.')._format.network_name()
542
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
543
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
546
def test_branch_reference(self):
547
"""When there is a branch reference, the reference URL is returned."""
548
self.vfs_transport_factory = local.LocalURLServer
549
backing = self.get_transport()
550
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
551
branch = self.make_branch('branch')
552
checkout = branch.create_checkout('reference',lightweight=True)
553
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
554
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
555
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
556
request.execute('reference'))
558
def test_stacked_branch(self):
559
"""Opening a stacked branch does not open the stacked-on branch."""
560
trunk = self.make_branch('trunk')
561
feature = self.make_branch('feature')
562
feature.set_stacked_on_url(trunk.base)
564
Branch.hooks.install_named_hook('open', opened_branches.append, None)
565
backing = self.get_transport()
566
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
569
response = request.execute('feature')
571
request.teardown_jail()
572
expected_format = feature._format.network_name()
574
SuccessfulSmartServerResponse(('branch', expected_format)),
576
self.assertLength(1, opened_branches)
670
579
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
614
def test_branch_reference(self):
706
615
"""When there is a branch reference, NotBranchError is raised."""
707
616
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
617
request = smart.branch.SmartServerBranchRequest(backing)
709
618
branch = self.make_branch('branch')
710
619
checkout = branch.create_checkout('reference',lightweight=True)
711
620
self.assertRaises(errors.NotBranchError,
712
621
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
624
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
626
def test_empty(self):
719
627
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
628
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
629
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
630
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
631
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
632
request.execute(''))
726
634
def test_not_empty(self):
727
635
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
636
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
637
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
638
tree = self.make_branch_and_memory_tree('.')
731
639
tree.lock_write()
778
685
def test_value_name(self):
779
686
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
687
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
688
branch.bzrdir.root_transport)
782
689
branch_token, repo_token = self.get_lock_tokens(branch)
783
690
config = branch._get_config()
784
691
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
693
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
694
self.assertEqual('bar', config.get_option('foo'))
791
698
def test_value_name_section(self):
792
699
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
700
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
701
branch.bzrdir.root_transport)
795
702
branch_token, repo_token = self.get_lock_tokens(branch)
796
703
config = branch._get_config()
797
704
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
706
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
707
self.assertEqual('bar', config.get_option('foo', 'gam'))
1059
965
def test_get_parent_none(self):
1060
966
base_branch = self.make_branch('base')
1061
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
967
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1062
968
response = request.execute('base')
1063
969
self.assertEquals(
1064
smart_req.SuccessfulSmartServerResponse(('',)), response)
970
SuccessfulSmartServerResponse(('',)), response)
1066
972
def test_get_parent_something(self):
1067
973
base_branch = self.make_branch('base')
1068
974
base_branch.set_parent(self.get_url('foo'))
1069
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
975
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1070
976
response = request.execute('base')
1071
977
self.assertEquals(
1072
smart_req.SuccessfulSmartServerResponse(("../foo",)),
978
SuccessfulSmartServerResponse(("../foo",)),
1076
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
982
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1078
984
def test_set_parent_none(self):
1079
985
branch = self.make_branch('base', format="1.9")
1080
986
branch.lock_write()
1081
987
branch._set_parent_location('foo')
1083
request = smart_branch.SmartServerBranchRequestSetParentLocation(
989
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1084
990
self.get_transport())
1085
branch_token, repo_token = self.get_lock_tokens(branch)
991
branch_token = branch.lock_write()
992
repo_token = branch.repository.lock_write()
1087
994
response = request.execute('base', branch_token, repo_token, '')
996
branch.repository.unlock()
1090
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
998
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1091
999
self.assertEqual(None, branch.get_parent())
1093
1001
def test_set_parent_something(self):
1094
1002
branch = self.make_branch('base', format="1.9")
1095
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1003
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1096
1004
self.get_transport())
1097
branch_token, repo_token = self.get_lock_tokens(branch)
1005
branch_token = branch.lock_write()
1006
repo_token = branch.repository.lock_write()
1099
1008
response = request.execute('base', branch_token, repo_token,
1011
branch.repository.unlock()
1102
1012
branch.unlock()
1103
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1013
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1104
1014
self.assertEqual('http://bar/', branch.get_parent())
1107
class TestSmartServerBranchRequestGetTagsBytes(
1108
tests.TestCaseWithMemoryTransport):
1017
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1109
1018
# Only called when the branch format and tags match [yay factory
1110
1019
# methods] so only need to test straight forward cases.
1112
1021
def test_get_bytes(self):
1113
1022
base_branch = self.make_branch('base')
1114
request = smart_branch.SmartServerBranchGetTagsBytes(
1023
request = smart.branch.SmartServerBranchGetTagsBytes(
1115
1024
self.get_transport())
1116
1025
response = request.execute('base')
1117
1026
self.assertEquals(
1118
smart_req.SuccessfulSmartServerResponse(('',)), response)
1027
SuccessfulSmartServerResponse(('',)), response)
1121
1030
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1125
1034
stacked_branch = self.make_branch('stacked', format='1.6')
1126
1035
# typically should be relative
1127
1036
stacked_branch.set_stacked_on_url('../base')
1128
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
1037
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1129
1038
self.get_transport())
1130
1039
response = request.execute('stacked')
1131
1040
self.assertEquals(
1132
smart_req.SmartServerResponse(('ok', '../base')),
1041
SmartServerResponse(('ok', '../base')),
1136
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
1045
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1138
1047
def setUp(self):
1139
1048
tests.TestCaseWithMemoryTransport.setUp(self)
1141
1050
def test_lock_write_on_unlocked_branch(self):
1142
1051
backing = self.get_transport()
1143
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1052
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1144
1053
branch = self.make_branch('.', format='knit')
1145
1054
repository = branch.repository
1146
1055
response = request.execute('')
1147
1056
branch_nonce = branch.control_files._lock.peek().get('nonce')
1148
1057
repository_nonce = repository.control_files._lock.peek().get('nonce')
1149
self.assertEqual(smart_req.SmartServerResponse(
1150
('ok', branch_nonce, repository_nonce)),
1059
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1152
1061
# The branch (and associated repository) is now locked. Verify that
1153
1062
# with a new branch object.
1154
1063
new_branch = repository.bzrdir.open_branch()
1155
1064
self.assertRaises(errors.LockContention, new_branch.lock_write)
1157
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1066
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1158
1067
response = request.execute('', branch_nonce, repository_nonce)
1160
1069
def test_lock_write_on_locked_branch(self):
1161
1070
backing = self.get_transport()
1162
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1071
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1163
1072
branch = self.make_branch('.')
1164
branch_token = branch.lock_write().branch_token
1073
branch_token = branch.lock_write()
1165
1074
branch.leave_lock_in_place()
1166
1075
branch.unlock()
1167
1076
response = request.execute('')
1168
1077
self.assertEqual(
1169
smart_req.SmartServerResponse(('LockContention',)), response)
1078
SmartServerResponse(('LockContention',)), response)
1171
1080
branch.lock_write(branch_token)
1172
1081
branch.dont_leave_lock_in_place()
1270
1184
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1271
1185
backing = self.get_transport()
1272
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1186
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1273
1187
branch = self.make_branch('.', format='knit')
1274
1188
response = request.execute(
1275
1189
'', 'branch token', 'repo token')
1276
1190
self.assertEqual(
1277
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1191
SmartServerResponse(('TokenMismatch',)), response)
1279
1193
def test_unlock_on_unlocked_branch_locked_repo(self):
1280
1194
backing = self.get_transport()
1281
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1195
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1282
1196
branch = self.make_branch('.', format='knit')
1283
1197
# Lock the repository.
1284
repo_token = branch.repository.lock_write().repository_token
1198
repo_token = branch.repository.lock_write()
1285
1199
branch.repository.leave_lock_in_place()
1286
1200
branch.repository.unlock()
1287
1201
# Issue branch lock_write request on the unlocked branch (with locked
1289
response = request.execute('', 'branch token', repo_token)
1203
response = request.execute(
1204
'', 'branch token', repo_token)
1290
1205
self.assertEqual(
1291
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1206
SmartServerResponse(('TokenMismatch',)), response)
1293
1208
branch.repository.lock_write(repo_token)
1294
1209
branch.repository.dont_leave_lock_in_place()
1316
1231
def test_trivial_bzipped(self):
1317
1232
# This tests that the wire encoding is actually bzipped
1318
1233
backing = self.get_transport()
1319
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1234
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1320
1235
tree = self.make_branch_and_memory_tree('.')
1322
1237
self.assertEqual(None,
1323
1238
request.execute('', 'missing-id'))
1324
1239
# Note that it returns a body that is bzipped.
1325
1240
self.assertEqual(
1326
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1241
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1327
1242
request.do_body('\n\n0\n'))
1329
1244
def test_trivial_include_missing(self):
1330
1245
backing = self.get_transport()
1331
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1246
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1332
1247
tree = self.make_branch_and_memory_tree('.')
1334
1249
self.assertEqual(None,
1335
1250
request.execute('', 'missing-id', 'include-missing:'))
1336
1251
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ),
1252
SuccessfulSmartServerResponse(('ok', ),
1338
1253
bz2.compress('missing:missing-id')),
1339
1254
request.do_body('\n\n0\n'))
1342
class TestSmartServerRepositoryGetRevisionGraph(
1343
tests.TestCaseWithMemoryTransport):
1257
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1345
1259
def test_none_argument(self):
1346
1260
backing = self.get_transport()
1347
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1261
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1348
1262
tree = self.make_branch_and_memory_tree('.')
1349
1263
tree.lock_write()
1405
1318
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1408
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1321
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1409
1322
request.execute('', 1, (2, rev2_id_utf8)))
1411
1324
def test_known_revid_missing(self):
1412
1325
backing = self.get_transport()
1413
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1326
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1414
1327
repo = self.make_repository('.')
1415
1328
self.assertEqual(
1416
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1329
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1417
1330
request.execute('', 1, (2, 'ghost')))
1419
1332
def test_history_incomplete(self):
1420
1333
backing = self.get_transport()
1421
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1334
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1422
1335
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1423
1336
parent.lock_write()
1424
1337
parent.add([''], ['TREE_ROOT'])
1583
1496
def test_lock_write_on_unlocked_repo(self):
1584
1497
backing = self.get_transport()
1585
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1498
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1586
1499
repository = self.make_repository('.', format='knit')
1587
1500
response = request.execute('')
1588
1501
nonce = repository.control_files._lock.peek().get('nonce')
1589
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1502
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1590
1503
# The repository is now locked. Verify that with a new repository
1592
1505
new_repo = repository.bzrdir.open_repository()
1593
1506
self.assertRaises(errors.LockContention, new_repo.lock_write)
1595
request = smart_repo.SmartServerRepositoryUnlock(backing)
1508
request = smart.repository.SmartServerRepositoryUnlock(backing)
1596
1509
response = request.execute('', nonce)
1598
1511
def test_lock_write_on_locked_repo(self):
1599
1512
backing = self.get_transport()
1600
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1513
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1601
1514
repository = self.make_repository('.', format='knit')
1602
repo_token = repository.lock_write().repository_token
1515
repo_token = repository.lock_write()
1603
1516
repository.leave_lock_in_place()
1604
1517
repository.unlock()
1605
1518
response = request.execute('')
1606
1519
self.assertEqual(
1607
smart_req.SmartServerResponse(('LockContention',)), response)
1520
SmartServerResponse(('LockContention',)), response)
1609
1522
repository.lock_write(repo_token)
1610
1523
repository.dont_leave_lock_in_place()
1631
1544
def test_insert_stream_empty(self):
1632
1545
backing = self.get_transport()
1633
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1546
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1634
1547
repository = self.make_repository('.')
1635
1548
response = request.execute('', '')
1636
1549
self.assertEqual(None, response)
1637
1550
response = request.do_chunk(self.make_empty_byte_stream(repository))
1638
1551
self.assertEqual(None, response)
1639
1552
response = request.do_end()
1640
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1553
self.assertEqual(SmartServerResponse(('ok', )), response)
1643
1556
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1645
1558
def test_insert_stream_empty(self):
1646
1559
backing = self.get_transport()
1647
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1560
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1649
1562
repository = self.make_repository('.', format='knit')
1650
lock_token = repository.lock_write().repository_token
1563
lock_token = repository.lock_write()
1651
1564
response = request.execute('', '', lock_token)
1652
1565
self.assertEqual(None, response)
1653
1566
response = request.do_chunk(self.make_empty_byte_stream(repository))
1654
1567
self.assertEqual(None, response)
1655
1568
response = request.do_end()
1656
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1569
self.assertEqual(SmartServerResponse(('ok', )), response)
1657
1570
repository.unlock()
1659
1572
def test_insert_stream_with_wrong_lock_token(self):
1660
1573
backing = self.get_transport()
1661
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1574
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1663
1576
repository = self.make_repository('.', format='knit')
1664
lock_token = repository.lock_write().repository_token
1577
lock_token = repository.lock_write()
1665
1578
self.assertRaises(
1666
1579
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1667
1580
repository.unlock()
1691
1604
def test_unlock_on_unlocked_repo(self):
1692
1605
backing = self.get_transport()
1693
request = smart_repo.SmartServerRepositoryUnlock(backing)
1606
request = smart.repository.SmartServerRepositoryUnlock(backing)
1694
1607
repository = self.make_repository('.', format='knit')
1695
1608
response = request.execute('', 'some token')
1696
1609
self.assertEqual(
1697
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1610
SmartServerResponse(('TokenMismatch',)), response)
1700
1613
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1702
1615
def test_is_readonly_no(self):
1703
1616
backing = self.get_transport()
1704
request = smart_req.SmartServerIsReadonly(backing)
1617
request = smart.request.SmartServerIsReadonly(backing)
1705
1618
response = request.execute()
1706
1619
self.assertEqual(
1707
smart_req.SmartServerResponse(('no',)), response)
1620
SmartServerResponse(('no',)), response)
1709
1622
def test_is_readonly_yes(self):
1710
1623
backing = self.get_readonly_transport()
1711
request = smart_req.SmartServerIsReadonly(backing)
1624
request = smart.request.SmartServerIsReadonly(backing)
1712
1625
response = request.execute()
1713
1626
self.assertEqual(
1714
smart_req.SmartServerResponse(('yes',)), response)
1717
class TestSmartServerRepositorySetMakeWorkingTrees(
1718
tests.TestCaseWithMemoryTransport):
1627
SmartServerResponse(('yes',)), response)
1630
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1720
1632
def test_set_false(self):
1721
1633
backing = self.get_transport()
1722
1634
repo = self.make_repository('.', shared=True)
1723
1635
repo.set_make_working_trees(True)
1724
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1636
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1725
1637
request = request_class(backing)
1726
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1638
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1727
1639
request.execute('', 'False'))
1728
1640
repo = repo.bzrdir.open_repository()
1729
1641
self.assertFalse(repo.make_working_trees())
1811
1723
"""All registered request_handlers can be found."""
1812
1724
# If there's a typo in a register_lazy call, this loop will fail with
1813
1725
# an AttributeError.
1814
for key, item in smart_req.request_handlers.iteritems():
1726
for key, item in smart.request.request_handlers.iteritems():
1817
1729
def assertHandlerEqual(self, verb, handler):
1818
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1730
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1820
1732
def test_registered_methods(self):
1821
1733
"""Test that known methods are registered to the correct object."""
1822
1734
self.assertHandlerEqual('Branch.get_config_file',
1823
smart_branch.SmartServerBranchGetConfigFile)
1735
smart.branch.SmartServerBranchGetConfigFile)
1824
1736
self.assertHandlerEqual('Branch.get_parent',
1825
smart_branch.SmartServerBranchGetParent)
1737
smart.branch.SmartServerBranchGetParent)
1826
1738
self.assertHandlerEqual('Branch.get_tags_bytes',
1827
smart_branch.SmartServerBranchGetTagsBytes)
1739
smart.branch.SmartServerBranchGetTagsBytes)
1828
1740
self.assertHandlerEqual('Branch.lock_write',
1829
smart_branch.SmartServerBranchRequestLockWrite)
1741
smart.branch.SmartServerBranchRequestLockWrite)
1830
1742
self.assertHandlerEqual('Branch.last_revision_info',
1831
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1743
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1832
1744
self.assertHandlerEqual('Branch.revision_history',
1833
smart_branch.SmartServerRequestRevisionHistory)
1745
smart.branch.SmartServerRequestRevisionHistory)
1834
1746
self.assertHandlerEqual('Branch.set_config_option',
1835
smart_branch.SmartServerBranchRequestSetConfigOption)
1747
smart.branch.SmartServerBranchRequestSetConfigOption)
1836
1748
self.assertHandlerEqual('Branch.set_last_revision',
1837
smart_branch.SmartServerBranchRequestSetLastRevision)
1749
smart.branch.SmartServerBranchRequestSetLastRevision)
1838
1750
self.assertHandlerEqual('Branch.set_last_revision_info',
1839
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1751
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1840
1752
self.assertHandlerEqual('Branch.set_last_revision_ex',
1841
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1753
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1842
1754
self.assertHandlerEqual('Branch.set_parent_location',
1843
smart_branch.SmartServerBranchRequestSetParentLocation)
1755
smart.branch.SmartServerBranchRequestSetParentLocation)
1844
1756
self.assertHandlerEqual('Branch.unlock',
1845
smart_branch.SmartServerBranchRequestUnlock)
1757
smart.branch.SmartServerBranchRequestUnlock)
1846
1758
self.assertHandlerEqual('BzrDir.find_repository',
1847
smart_dir.SmartServerRequestFindRepositoryV1)
1759
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1848
1760
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1849
smart_dir.SmartServerRequestFindRepositoryV2)
1761
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1850
1762
self.assertHandlerEqual('BzrDirFormat.initialize',
1851
smart_dir.SmartServerRequestInitializeBzrDir)
1763
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1852
1764
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1853
smart_dir.SmartServerRequestBzrDirInitializeEx)
1765
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1854
1766
self.assertHandlerEqual('BzrDir.cloning_metadir',
1855
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1767
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1856
1768
self.assertHandlerEqual('BzrDir.get_config_file',
1857
smart_dir.SmartServerBzrDirRequestConfigFile)
1769
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1858
1770
self.assertHandlerEqual('BzrDir.open_branch',
1859
smart_dir.SmartServerRequestOpenBranch)
1771
smart.bzrdir.SmartServerRequestOpenBranch)
1860
1772
self.assertHandlerEqual('BzrDir.open_branchV2',
1861
smart_dir.SmartServerRequestOpenBranchV2)
1862
self.assertHandlerEqual('BzrDir.open_branchV3',
1863
smart_dir.SmartServerRequestOpenBranchV3)
1773
smart.bzrdir.SmartServerRequestOpenBranchV2)
1864
1774
self.assertHandlerEqual('PackRepository.autopack',
1865
smart_packrepo.SmartServerPackRepositoryAutopack)
1775
smart.packrepository.SmartServerPackRepositoryAutopack)
1866
1776
self.assertHandlerEqual('Repository.gather_stats',
1867
smart_repo.SmartServerRepositoryGatherStats)
1777
smart.repository.SmartServerRepositoryGatherStats)
1868
1778
self.assertHandlerEqual('Repository.get_parent_map',
1869
smart_repo.SmartServerRepositoryGetParentMap)
1779
smart.repository.SmartServerRepositoryGetParentMap)
1870
1780
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1871
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1781
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1872
1782
self.assertHandlerEqual('Repository.get_revision_graph',
1873
smart_repo.SmartServerRepositoryGetRevisionGraph)
1783
smart.repository.SmartServerRepositoryGetRevisionGraph)
1874
1784
self.assertHandlerEqual('Repository.get_stream',
1875
smart_repo.SmartServerRepositoryGetStream)
1785
smart.repository.SmartServerRepositoryGetStream)
1876
1786
self.assertHandlerEqual('Repository.has_revision',
1877
smart_repo.SmartServerRequestHasRevision)
1787
smart.repository.SmartServerRequestHasRevision)
1878
1788
self.assertHandlerEqual('Repository.insert_stream',
1879
smart_repo.SmartServerRepositoryInsertStream)
1789
smart.repository.SmartServerRepositoryInsertStream)
1880
1790
self.assertHandlerEqual('Repository.insert_stream_locked',
1881
smart_repo.SmartServerRepositoryInsertStreamLocked)
1791
smart.repository.SmartServerRepositoryInsertStreamLocked)
1882
1792
self.assertHandlerEqual('Repository.is_shared',
1883
smart_repo.SmartServerRepositoryIsShared)
1793
smart.repository.SmartServerRepositoryIsShared)
1884
1794
self.assertHandlerEqual('Repository.lock_write',
1885
smart_repo.SmartServerRepositoryLockWrite)
1795
smart.repository.SmartServerRepositoryLockWrite)
1886
1796
self.assertHandlerEqual('Repository.tarball',
1887
smart_repo.SmartServerRepositoryTarball)
1797
smart.repository.SmartServerRepositoryTarball)
1888
1798
self.assertHandlerEqual('Repository.unlock',
1889
smart_repo.SmartServerRepositoryUnlock)
1799
smart.repository.SmartServerRepositoryUnlock)
1890
1800
self.assertHandlerEqual('Transport.is_readonly',
1891
smart_req.SmartServerIsReadonly)
1801
smart.request.SmartServerIsReadonly)