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
527
def test_notification_on_branch_from_repository(self):
535
528
"""When there is a repository, the error should return details."""
536
529
backing = self.get_transport()
537
request = smart_dir.SmartServerRequestOpenBranch(backing)
530
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
538
531
repo = self.make_repository('.')
539
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
532
self.assertEqual(SmartServerResponse(('nobranch',)),
540
533
request.execute(''))
546
539
"""When there is no branch, ('nobranch', ) is returned."""
547
540
backing = self.get_transport()
548
541
self.make_bzrdir('.')
549
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
550
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
542
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
543
self.assertEqual(SmartServerResponse(('nobranch', )),
551
544
request.execute(''))
553
546
def test_branch(self):
554
547
"""When there is a branch, 'ok' is returned."""
555
548
backing = self.get_transport()
556
549
expected = self.make_branch('.')._format.network_name()
557
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
558
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
559
('branch', expected)),
550
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
551
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
562
554
def test_branch_reference(self):
563
555
"""When there is a branch reference, the reference URL is returned."""
564
self.vfs_transport_factory = test_server.LocalURLServer
556
self.vfs_transport_factory = local.LocalURLServer
565
557
backing = self.get_transport()
566
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
558
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
567
559
branch = self.make_branch('branch')
568
560
checkout = branch.create_checkout('reference',lightweight=True)
569
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
561
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
571
562
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
572
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
573
('ref', reference_url)),
574
request.execute('reference'))
563
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
564
request.execute('reference'))
576
566
def test_stacked_branch(self):
577
567
"""Opening a stacked branch does not open the stacked-on branch."""
579
569
feature = self.make_branch('feature')
580
570
feature.set_stacked_on_url(trunk.base)
581
571
opened_branches = []
582
_mod_branch.Branch.hooks.install_named_hook(
583
'open', opened_branches.append, None)
572
Branch.hooks.install_named_hook('open', opened_branches.append, None)
584
573
backing = self.get_transport()
585
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
574
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
586
575
request.setup_jail()
588
577
response = request.execute('feature')
590
579
request.teardown_jail()
591
580
expected_format = feature._format.network_name()
592
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
593
('branch', expected_format)),
582
SuccessfulSmartServerResponse(('branch', expected_format)),
595
584
self.assertLength(1, opened_branches)
597
586
def test_notification_on_branch_from_repository(self):
598
587
"""When there is a repository, the error should return details."""
599
588
backing = self.get_transport()
600
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
589
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
601
590
repo = self.make_repository('.')
602
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
591
self.assertEqual(SmartServerResponse(('nobranch',)),
603
592
request.execute(''))
609
598
"""When there is no branch, ('nobranch', ) is returned."""
610
599
backing = self.get_transport()
611
600
self.make_bzrdir('.')
612
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
613
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
601
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
602
self.assertEqual(SmartServerResponse(('nobranch',)),
614
603
request.execute(''))
616
605
def test_branch(self):
617
606
"""When there is a branch, 'ok' is returned."""
618
607
backing = self.get_transport()
619
608
expected = self.make_branch('.')._format.network_name()
620
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
621
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
622
('branch', expected)),
609
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
610
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
625
613
def test_branch_reference(self):
626
614
"""When there is a branch reference, the reference URL is returned."""
627
self.vfs_transport_factory = test_server.LocalURLServer
615
self.vfs_transport_factory = local.LocalURLServer
628
616
backing = self.get_transport()
629
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
617
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
630
618
branch = self.make_branch('branch')
631
619
checkout = branch.create_checkout('reference',lightweight=True)
632
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
620
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
634
621
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
635
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
636
('ref', reference_url)),
637
request.execute('reference'))
622
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
623
request.execute('reference'))
639
625
def test_stacked_branch(self):
640
626
"""Opening a stacked branch does not open the stacked-on branch."""
642
628
feature = self.make_branch('feature')
643
629
feature.set_stacked_on_url(trunk.base)
644
630
opened_branches = []
645
_mod_branch.Branch.hooks.install_named_hook(
646
'open', opened_branches.append, None)
631
Branch.hooks.install_named_hook('open', opened_branches.append, None)
647
632
backing = self.get_transport()
648
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
633
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
649
634
request.setup_jail()
651
636
response = request.execute('feature')
653
638
request.teardown_jail()
654
639
expected_format = feature._format.network_name()
655
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
656
('branch', expected_format)),
641
SuccessfulSmartServerResponse(('branch', expected_format)),
658
643
self.assertLength(1, opened_branches)
660
645
def test_notification_on_branch_from_repository(self):
661
646
"""When there is a repository, the error should return details."""
662
647
backing = self.get_transport()
663
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
648
request = smart.bzrdir.SmartServerRequestOpenBranchV3(backing)
664
649
repo = self.make_repository('.')
665
self.assertEqual(smart_req.SmartServerResponse(
666
('nobranch', 'location is a repository')),
651
SmartServerResponse(('nobranch', 'location is a repository')),
670
655
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
690
def test_branch_reference(self):
706
691
"""When there is a branch reference, NotBranchError is raised."""
707
692
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
693
request = smart.branch.SmartServerBranchRequest(backing)
709
694
branch = self.make_branch('branch')
710
695
checkout = branch.create_checkout('reference',lightweight=True)
711
696
self.assertRaises(errors.NotBranchError,
712
697
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
700
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
702
def test_empty(self):
719
703
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
704
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
705
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
706
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
707
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
708
request.execute(''))
726
710
def test_not_empty(self):
727
711
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
712
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
713
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
714
tree = self.make_branch_and_memory_tree('.')
731
715
tree.lock_write()
778
761
def test_value_name(self):
779
762
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
763
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
764
branch.bzrdir.root_transport)
782
765
branch_token, repo_token = self.get_lock_tokens(branch)
783
766
config = branch._get_config()
784
767
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
769
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
770
self.assertEqual('bar', config.get_option('foo'))
791
774
def test_value_name_section(self):
792
775
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
776
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
777
branch.bzrdir.root_transport)
795
778
branch_token, repo_token = self.get_lock_tokens(branch)
796
779
config = branch._get_config()
797
780
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
782
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
783
self.assertEqual('bar', config.get_option('foo', 'gam'))
1059
1041
def test_get_parent_none(self):
1060
1042
base_branch = self.make_branch('base')
1061
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
1043
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1062
1044
response = request.execute('base')
1063
1045
self.assertEquals(
1064
smart_req.SuccessfulSmartServerResponse(('',)), response)
1046
SuccessfulSmartServerResponse(('',)), response)
1066
1048
def test_get_parent_something(self):
1067
1049
base_branch = self.make_branch('base')
1068
1050
base_branch.set_parent(self.get_url('foo'))
1069
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
1051
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1070
1052
response = request.execute('base')
1071
1053
self.assertEquals(
1072
smart_req.SuccessfulSmartServerResponse(("../foo",)),
1054
SuccessfulSmartServerResponse(("../foo",)),
1076
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
1058
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1078
1060
def test_set_parent_none(self):
1079
1061
branch = self.make_branch('base', format="1.9")
1080
1062
branch.lock_write()
1081
1063
branch._set_parent_location('foo')
1082
1064
branch.unlock()
1083
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1065
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1084
1066
self.get_transport())
1085
branch_token, repo_token = self.get_lock_tokens(branch)
1067
branch_token = branch.lock_write()
1068
repo_token = branch.repository.lock_write()
1087
1070
response = request.execute('base', branch_token, repo_token, '')
1072
branch.repository.unlock()
1089
1073
branch.unlock()
1090
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1074
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1091
1075
self.assertEqual(None, branch.get_parent())
1093
1077
def test_set_parent_something(self):
1094
1078
branch = self.make_branch('base', format="1.9")
1095
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1079
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1096
1080
self.get_transport())
1097
branch_token, repo_token = self.get_lock_tokens(branch)
1081
branch_token = branch.lock_write()
1082
repo_token = branch.repository.lock_write()
1099
1084
response = request.execute('base', branch_token, repo_token,
1087
branch.repository.unlock()
1102
1088
branch.unlock()
1103
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1089
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1104
1090
self.assertEqual('http://bar/', branch.get_parent())
1107
class TestSmartServerBranchRequestGetTagsBytes(
1108
tests.TestCaseWithMemoryTransport):
1093
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1109
1094
# Only called when the branch format and tags match [yay factory
1110
1095
# methods] so only need to test straight forward cases.
1112
1097
def test_get_bytes(self):
1113
1098
base_branch = self.make_branch('base')
1114
request = smart_branch.SmartServerBranchGetTagsBytes(
1099
request = smart.branch.SmartServerBranchGetTagsBytes(
1115
1100
self.get_transport())
1116
1101
response = request.execute('base')
1117
1102
self.assertEquals(
1118
smart_req.SuccessfulSmartServerResponse(('',)), response)
1103
SuccessfulSmartServerResponse(('',)), response)
1121
1106
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1125
1110
stacked_branch = self.make_branch('stacked', format='1.6')
1126
1111
# typically should be relative
1127
1112
stacked_branch.set_stacked_on_url('../base')
1128
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
1113
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1129
1114
self.get_transport())
1130
1115
response = request.execute('stacked')
1131
1116
self.assertEquals(
1132
smart_req.SmartServerResponse(('ok', '../base')),
1117
SmartServerResponse(('ok', '../base')),
1136
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
1121
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1138
1123
def setUp(self):
1139
1124
tests.TestCaseWithMemoryTransport.setUp(self)
1141
1126
def test_lock_write_on_unlocked_branch(self):
1142
1127
backing = self.get_transport()
1143
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1128
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1144
1129
branch = self.make_branch('.', format='knit')
1145
1130
repository = branch.repository
1146
1131
response = request.execute('')
1147
1132
branch_nonce = branch.control_files._lock.peek().get('nonce')
1148
1133
repository_nonce = repository.control_files._lock.peek().get('nonce')
1149
self.assertEqual(smart_req.SmartServerResponse(
1150
('ok', branch_nonce, repository_nonce)),
1135
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1152
1137
# The branch (and associated repository) is now locked. Verify that
1153
1138
# with a new branch object.
1154
1139
new_branch = repository.bzrdir.open_branch()
1155
1140
self.assertRaises(errors.LockContention, new_branch.lock_write)
1157
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1142
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1158
1143
response = request.execute('', branch_nonce, repository_nonce)
1160
1145
def test_lock_write_on_locked_branch(self):
1161
1146
backing = self.get_transport()
1162
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1147
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1163
1148
branch = self.make_branch('.')
1164
branch_token = branch.lock_write().branch_token
1149
branch_token = branch.lock_write()
1165
1150
branch.leave_lock_in_place()
1166
1151
branch.unlock()
1167
1152
response = request.execute('')
1168
1153
self.assertEqual(
1169
smart_req.SmartServerResponse(('LockContention',)), response)
1154
SmartServerResponse(('LockContention',)), response)
1171
1156
branch.lock_write(branch_token)
1172
1157
branch.dont_leave_lock_in_place()
1270
1260
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1271
1261
backing = self.get_transport()
1272
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1262
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1273
1263
branch = self.make_branch('.', format='knit')
1274
1264
response = request.execute(
1275
1265
'', 'branch token', 'repo token')
1276
1266
self.assertEqual(
1277
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1267
SmartServerResponse(('TokenMismatch',)), response)
1279
1269
def test_unlock_on_unlocked_branch_locked_repo(self):
1280
1270
backing = self.get_transport()
1281
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1271
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1282
1272
branch = self.make_branch('.', format='knit')
1283
1273
# Lock the repository.
1284
repo_token = branch.repository.lock_write().repository_token
1274
repo_token = branch.repository.lock_write()
1285
1275
branch.repository.leave_lock_in_place()
1286
1276
branch.repository.unlock()
1287
1277
# Issue branch lock_write request on the unlocked branch (with locked
1289
response = request.execute('', 'branch token', repo_token)
1279
response = request.execute(
1280
'', 'branch token', repo_token)
1290
1281
self.assertEqual(
1291
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1282
SmartServerResponse(('TokenMismatch',)), response)
1293
1284
branch.repository.lock_write(repo_token)
1294
1285
branch.repository.dont_leave_lock_in_place()
1316
1307
def test_trivial_bzipped(self):
1317
1308
# This tests that the wire encoding is actually bzipped
1318
1309
backing = self.get_transport()
1319
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1310
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1320
1311
tree = self.make_branch_and_memory_tree('.')
1322
1313
self.assertEqual(None,
1323
1314
request.execute('', 'missing-id'))
1324
1315
# Note that it returns a body that is bzipped.
1325
1316
self.assertEqual(
1326
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1317
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1327
1318
request.do_body('\n\n0\n'))
1329
1320
def test_trivial_include_missing(self):
1330
1321
backing = self.get_transport()
1331
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1322
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1332
1323
tree = self.make_branch_and_memory_tree('.')
1334
1325
self.assertEqual(None,
1335
1326
request.execute('', 'missing-id', 'include-missing:'))
1336
1327
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ),
1328
SuccessfulSmartServerResponse(('ok', ),
1338
1329
bz2.compress('missing:missing-id')),
1339
1330
request.do_body('\n\n0\n'))
1342
class TestSmartServerRepositoryGetRevisionGraph(
1343
tests.TestCaseWithMemoryTransport):
1333
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1345
1335
def test_none_argument(self):
1346
1336
backing = self.get_transport()
1347
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1337
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1348
1338
tree = self.make_branch_and_memory_tree('.')
1349
1339
tree.lock_write()
1405
1394
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1408
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1397
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1409
1398
request.execute('', 1, (2, rev2_id_utf8)))
1411
1400
def test_known_revid_missing(self):
1412
1401
backing = self.get_transport()
1413
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1402
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1414
1403
repo = self.make_repository('.')
1415
1404
self.assertEqual(
1416
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1405
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1417
1406
request.execute('', 1, (2, 'ghost')))
1419
1408
def test_history_incomplete(self):
1420
1409
backing = self.get_transport()
1421
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1410
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1422
1411
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1423
1412
parent.lock_write()
1424
1413
parent.add([''], ['TREE_ROOT'])
1583
1572
def test_lock_write_on_unlocked_repo(self):
1584
1573
backing = self.get_transport()
1585
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1574
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1586
1575
repository = self.make_repository('.', format='knit')
1587
1576
response = request.execute('')
1588
1577
nonce = repository.control_files._lock.peek().get('nonce')
1589
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1578
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1590
1579
# The repository is now locked. Verify that with a new repository
1592
1581
new_repo = repository.bzrdir.open_repository()
1593
1582
self.assertRaises(errors.LockContention, new_repo.lock_write)
1595
request = smart_repo.SmartServerRepositoryUnlock(backing)
1584
request = smart.repository.SmartServerRepositoryUnlock(backing)
1596
1585
response = request.execute('', nonce)
1598
1587
def test_lock_write_on_locked_repo(self):
1599
1588
backing = self.get_transport()
1600
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1589
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1601
1590
repository = self.make_repository('.', format='knit')
1602
repo_token = repository.lock_write().repository_token
1591
repo_token = repository.lock_write()
1603
1592
repository.leave_lock_in_place()
1604
1593
repository.unlock()
1605
1594
response = request.execute('')
1606
1595
self.assertEqual(
1607
smart_req.SmartServerResponse(('LockContention',)), response)
1596
SmartServerResponse(('LockContention',)), response)
1609
1598
repository.lock_write(repo_token)
1610
1599
repository.dont_leave_lock_in_place()
1631
1620
def test_insert_stream_empty(self):
1632
1621
backing = self.get_transport()
1633
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1622
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1634
1623
repository = self.make_repository('.')
1635
1624
response = request.execute('', '')
1636
1625
self.assertEqual(None, response)
1637
1626
response = request.do_chunk(self.make_empty_byte_stream(repository))
1638
1627
self.assertEqual(None, response)
1639
1628
response = request.do_end()
1640
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1629
self.assertEqual(SmartServerResponse(('ok', )), response)
1643
1632
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1645
1634
def test_insert_stream_empty(self):
1646
1635
backing = self.get_transport()
1647
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1636
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1649
1638
repository = self.make_repository('.', format='knit')
1650
lock_token = repository.lock_write().repository_token
1639
lock_token = repository.lock_write()
1651
1640
response = request.execute('', '', lock_token)
1652
1641
self.assertEqual(None, response)
1653
1642
response = request.do_chunk(self.make_empty_byte_stream(repository))
1654
1643
self.assertEqual(None, response)
1655
1644
response = request.do_end()
1656
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1645
self.assertEqual(SmartServerResponse(('ok', )), response)
1657
1646
repository.unlock()
1659
1648
def test_insert_stream_with_wrong_lock_token(self):
1660
1649
backing = self.get_transport()
1661
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1650
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1663
1652
repository = self.make_repository('.', format='knit')
1664
lock_token = repository.lock_write().repository_token
1653
lock_token = repository.lock_write()
1665
1654
self.assertRaises(
1666
1655
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1667
1656
repository.unlock()
1691
1680
def test_unlock_on_unlocked_repo(self):
1692
1681
backing = self.get_transport()
1693
request = smart_repo.SmartServerRepositoryUnlock(backing)
1682
request = smart.repository.SmartServerRepositoryUnlock(backing)
1694
1683
repository = self.make_repository('.', format='knit')
1695
1684
response = request.execute('', 'some token')
1696
1685
self.assertEqual(
1697
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1686
SmartServerResponse(('TokenMismatch',)), response)
1700
1689
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1702
1691
def test_is_readonly_no(self):
1703
1692
backing = self.get_transport()
1704
request = smart_req.SmartServerIsReadonly(backing)
1693
request = smart.request.SmartServerIsReadonly(backing)
1705
1694
response = request.execute()
1706
1695
self.assertEqual(
1707
smart_req.SmartServerResponse(('no',)), response)
1696
SmartServerResponse(('no',)), response)
1709
1698
def test_is_readonly_yes(self):
1710
1699
backing = self.get_readonly_transport()
1711
request = smart_req.SmartServerIsReadonly(backing)
1700
request = smart.request.SmartServerIsReadonly(backing)
1712
1701
response = request.execute()
1713
1702
self.assertEqual(
1714
smart_req.SmartServerResponse(('yes',)), response)
1717
class TestSmartServerRepositorySetMakeWorkingTrees(
1718
tests.TestCaseWithMemoryTransport):
1703
SmartServerResponse(('yes',)), response)
1706
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1720
1708
def test_set_false(self):
1721
1709
backing = self.get_transport()
1722
1710
repo = self.make_repository('.', shared=True)
1723
1711
repo.set_make_working_trees(True)
1724
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1712
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1725
1713
request = request_class(backing)
1726
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1714
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1727
1715
request.execute('', 'False'))
1728
1716
repo = repo.bzrdir.open_repository()
1729
1717
self.assertFalse(repo.make_working_trees())
1811
1799
"""All registered request_handlers can be found."""
1812
1800
# If there's a typo in a register_lazy call, this loop will fail with
1813
1801
# an AttributeError.
1814
for key, item in smart_req.request_handlers.iteritems():
1802
for key, item in smart.request.request_handlers.iteritems():
1817
1805
def assertHandlerEqual(self, verb, handler):
1818
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1806
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1820
1808
def test_registered_methods(self):
1821
1809
"""Test that known methods are registered to the correct object."""
1822
1810
self.assertHandlerEqual('Branch.get_config_file',
1823
smart_branch.SmartServerBranchGetConfigFile)
1811
smart.branch.SmartServerBranchGetConfigFile)
1824
1812
self.assertHandlerEqual('Branch.get_parent',
1825
smart_branch.SmartServerBranchGetParent)
1813
smart.branch.SmartServerBranchGetParent)
1826
1814
self.assertHandlerEqual('Branch.get_tags_bytes',
1827
smart_branch.SmartServerBranchGetTagsBytes)
1815
smart.branch.SmartServerBranchGetTagsBytes)
1828
1816
self.assertHandlerEqual('Branch.lock_write',
1829
smart_branch.SmartServerBranchRequestLockWrite)
1817
smart.branch.SmartServerBranchRequestLockWrite)
1830
1818
self.assertHandlerEqual('Branch.last_revision_info',
1831
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1819
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1832
1820
self.assertHandlerEqual('Branch.revision_history',
1833
smart_branch.SmartServerRequestRevisionHistory)
1821
smart.branch.SmartServerRequestRevisionHistory)
1834
1822
self.assertHandlerEqual('Branch.set_config_option',
1835
smart_branch.SmartServerBranchRequestSetConfigOption)
1823
smart.branch.SmartServerBranchRequestSetConfigOption)
1836
1824
self.assertHandlerEqual('Branch.set_last_revision',
1837
smart_branch.SmartServerBranchRequestSetLastRevision)
1825
smart.branch.SmartServerBranchRequestSetLastRevision)
1838
1826
self.assertHandlerEqual('Branch.set_last_revision_info',
1839
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1827
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1840
1828
self.assertHandlerEqual('Branch.set_last_revision_ex',
1841
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1829
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1842
1830
self.assertHandlerEqual('Branch.set_parent_location',
1843
smart_branch.SmartServerBranchRequestSetParentLocation)
1831
smart.branch.SmartServerBranchRequestSetParentLocation)
1844
1832
self.assertHandlerEqual('Branch.unlock',
1845
smart_branch.SmartServerBranchRequestUnlock)
1833
smart.branch.SmartServerBranchRequestUnlock)
1846
1834
self.assertHandlerEqual('BzrDir.find_repository',
1847
smart_dir.SmartServerRequestFindRepositoryV1)
1835
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1848
1836
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1849
smart_dir.SmartServerRequestFindRepositoryV2)
1837
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1850
1838
self.assertHandlerEqual('BzrDirFormat.initialize',
1851
smart_dir.SmartServerRequestInitializeBzrDir)
1839
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1852
1840
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1853
smart_dir.SmartServerRequestBzrDirInitializeEx)
1841
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1854
1842
self.assertHandlerEqual('BzrDir.cloning_metadir',
1855
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1843
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1856
1844
self.assertHandlerEqual('BzrDir.get_config_file',
1857
smart_dir.SmartServerBzrDirRequestConfigFile)
1845
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1858
1846
self.assertHandlerEqual('BzrDir.open_branch',
1859
smart_dir.SmartServerRequestOpenBranch)
1847
smart.bzrdir.SmartServerRequestOpenBranch)
1860
1848
self.assertHandlerEqual('BzrDir.open_branchV2',
1861
smart_dir.SmartServerRequestOpenBranchV2)
1849
smart.bzrdir.SmartServerRequestOpenBranchV2)
1862
1850
self.assertHandlerEqual('BzrDir.open_branchV3',
1863
smart_dir.SmartServerRequestOpenBranchV3)
1851
smart.bzrdir.SmartServerRequestOpenBranchV3)
1864
1852
self.assertHandlerEqual('PackRepository.autopack',
1865
smart_packrepo.SmartServerPackRepositoryAutopack)
1853
smart.packrepository.SmartServerPackRepositoryAutopack)
1866
1854
self.assertHandlerEqual('Repository.gather_stats',
1867
smart_repo.SmartServerRepositoryGatherStats)
1855
smart.repository.SmartServerRepositoryGatherStats)
1868
1856
self.assertHandlerEqual('Repository.get_parent_map',
1869
smart_repo.SmartServerRepositoryGetParentMap)
1857
smart.repository.SmartServerRepositoryGetParentMap)
1870
1858
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1871
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1859
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1872
1860
self.assertHandlerEqual('Repository.get_revision_graph',
1873
smart_repo.SmartServerRepositoryGetRevisionGraph)
1861
smart.repository.SmartServerRepositoryGetRevisionGraph)
1874
1862
self.assertHandlerEqual('Repository.get_stream',
1875
smart_repo.SmartServerRepositoryGetStream)
1863
smart.repository.SmartServerRepositoryGetStream)
1876
1864
self.assertHandlerEqual('Repository.has_revision',
1877
smart_repo.SmartServerRequestHasRevision)
1865
smart.repository.SmartServerRequestHasRevision)
1878
1866
self.assertHandlerEqual('Repository.insert_stream',
1879
smart_repo.SmartServerRepositoryInsertStream)
1867
smart.repository.SmartServerRepositoryInsertStream)
1880
1868
self.assertHandlerEqual('Repository.insert_stream_locked',
1881
smart_repo.SmartServerRepositoryInsertStreamLocked)
1869
smart.repository.SmartServerRepositoryInsertStreamLocked)
1882
1870
self.assertHandlerEqual('Repository.is_shared',
1883
smart_repo.SmartServerRepositoryIsShared)
1871
smart.repository.SmartServerRepositoryIsShared)
1884
1872
self.assertHandlerEqual('Repository.lock_write',
1885
smart_repo.SmartServerRepositoryLockWrite)
1873
smart.repository.SmartServerRepositoryLockWrite)
1886
1874
self.assertHandlerEqual('Repository.tarball',
1887
smart_repo.SmartServerRepositoryTarball)
1875
smart.repository.SmartServerRepositoryTarball)
1888
1876
self.assertHandlerEqual('Repository.unlock',
1889
smart_repo.SmartServerRepositoryUnlock)
1877
smart.repository.SmartServerRepositoryUnlock)
1890
1878
self.assertHandlerEqual('Transport.is_readonly',
1891
smart_req.SmartServerIsReadonly)
1879
smart.request.SmartServerIsReadonly)