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, local, memory
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
417
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
438
419
def test_no_directory(self):
439
420
backing = self.get_transport()
440
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
441
self.assertEqual(smart_req.SmartServerResponse(('no', )),
421
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
422
self.assertEqual(SmartServerResponse(('no', )),
442
423
request.execute('does-not-exist'))
444
425
def test_empty_directory(self):
445
426
backing = self.get_transport()
446
427
backing.mkdir('empty')
447
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
448
self.assertEqual(smart_req.SmartServerResponse(('no', )),
428
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing)
429
self.assertEqual(SmartServerResponse(('no', )),
449
430
request.execute('empty'))
451
432
def test_outside_root_client_path(self):
452
433
backing = self.get_transport()
453
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
434
request = smart.bzrdir.SmartServerRequestOpenBzrDir(backing,
454
435
root_client_path='root')
455
self.assertEqual(smart_req.SmartServerResponse(('no', )),
436
self.assertEqual(SmartServerResponse(('no', )),
456
437
request.execute('not-root'))
459
440
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
461
442
def test_no_directory(self):
462
443
backing = self.get_transport()
463
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
464
self.assertEqual(smart_req.SmartServerResponse(('no', )),
444
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
445
self.assertEqual(SmartServerResponse(('no', )),
465
446
request.execute('does-not-exist'))
467
448
def test_empty_directory(self):
468
449
backing = self.get_transport()
469
450
backing.mkdir('empty')
470
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
self.assertEqual(smart_req.SmartServerResponse(('no', )),
451
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
452
self.assertEqual(SmartServerResponse(('no', )),
472
453
request.execute('empty'))
474
455
def test_present_without_workingtree(self):
475
456
backing = self.get_transport()
476
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
457
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
477
458
self.make_bzrdir('.')
478
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
459
self.assertEqual(SmartServerResponse(('yes', 'no')),
479
460
request.execute(''))
481
462
def test_outside_root_client_path(self):
482
463
backing = self.get_transport()
483
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
464
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing,
484
465
root_client_path='root')
485
self.assertEqual(smart_req.SmartServerResponse(('no',)),
466
self.assertEqual(SmartServerResponse(('no',)),
486
467
request.execute('not-root'))
489
470
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
491
472
def test_present_with_workingtree(self):
492
self.vfs_transport_factory = test_server.LocalURLServer
473
self.vfs_transport_factory = local.LocalURLServer
493
474
backing = self.get_transport()
494
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
475
request = smart.bzrdir.SmartServerRequestOpenBzrDir_2_1(backing)
495
476
bd = self.make_bzrdir('.')
496
477
bd.create_repository()
497
478
bd.create_branch()
498
479
bd.create_workingtree()
499
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
480
self.assertEqual(SmartServerResponse(('yes', 'yes')),
500
481
request.execute(''))
505
486
def test_no_branch(self):
506
487
"""When there is no branch, ('nobranch', ) is returned."""
507
488
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
489
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
490
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
491
self.assertEqual(SmartServerResponse(('nobranch', )),
511
492
request.execute(''))
513
494
def test_branch(self):
514
495
"""When there is a branch, 'ok' is returned."""
515
496
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
497
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
498
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
499
self.assertEqual(SmartServerResponse(('ok', '')),
519
500
request.execute(''))
521
502
def test_branch_reference(self):
522
503
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
504
self.vfs_transport_factory = local.LocalURLServer
524
505
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
506
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
507
branch = self.make_branch('branch')
527
508
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
509
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
510
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
511
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
512
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
515
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
518
"""When there is no branch, ('nobranch', ) is returned."""
547
519
backing = self.get_transport()
548
520
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')),
521
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
522
self.assertEqual(SmartServerResponse(('nobranch', )),
525
def test_branch(self):
526
"""When there is a branch, 'ok' is returned."""
527
backing = self.get_transport()
528
expected = self.make_branch('.')._format.network_name()
529
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
530
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
533
def test_branch_reference(self):
534
"""When there is a branch reference, the reference URL is returned."""
535
self.vfs_transport_factory = local.LocalURLServer
536
backing = self.get_transport()
537
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
538
branch = self.make_branch('branch')
539
checkout = branch.create_checkout('reference',lightweight=True)
540
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
541
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
542
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
543
request.execute('reference'))
545
def test_stacked_branch(self):
546
"""Opening a stacked branch does not open the stacked-on branch."""
547
trunk = self.make_branch('trunk')
548
feature = self.make_branch('feature')
549
feature.set_stacked_on_url(trunk.base)
551
Branch.hooks.install_named_hook('open', opened_branches.append, None)
552
backing = self.get_transport()
553
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
556
response = request.execute('feature')
558
request.teardown_jail()
559
expected_format = feature._format.network_name()
561
SuccessfulSmartServerResponse(('branch', expected_format)),
563
self.assertLength(1, opened_branches)
670
566
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
601
def test_branch_reference(self):
706
602
"""When there is a branch reference, NotBranchError is raised."""
707
603
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
604
request = smart.branch.SmartServerBranchRequest(backing)
709
605
branch = self.make_branch('branch')
710
606
checkout = branch.create_checkout('reference',lightweight=True)
711
607
self.assertRaises(errors.NotBranchError,
712
608
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
611
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
613
def test_empty(self):
719
614
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
615
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
616
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
617
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
618
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
619
request.execute(''))
726
621
def test_not_empty(self):
727
622
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
623
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
624
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
625
tree = self.make_branch_and_memory_tree('.')
731
626
tree.lock_write()
778
672
def test_value_name(self):
779
673
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
674
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
675
branch.bzrdir.root_transport)
782
676
branch_token, repo_token = self.get_lock_tokens(branch)
783
677
config = branch._get_config()
784
678
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
680
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
681
self.assertEqual('bar', config.get_option('foo'))
791
685
def test_value_name_section(self):
792
686
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
687
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
688
branch.bzrdir.root_transport)
795
689
branch_token, repo_token = self.get_lock_tokens(branch)
796
690
config = branch._get_config()
797
691
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
693
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
694
self.assertEqual('bar', config.get_option('foo', 'gam'))
1059
952
def test_get_parent_none(self):
1060
953
base_branch = self.make_branch('base')
1061
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
954
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1062
955
response = request.execute('base')
1063
956
self.assertEquals(
1064
smart_req.SuccessfulSmartServerResponse(('',)), response)
957
SuccessfulSmartServerResponse(('',)), response)
1066
959
def test_get_parent_something(self):
1067
960
base_branch = self.make_branch('base')
1068
961
base_branch.set_parent(self.get_url('foo'))
1069
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
962
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1070
963
response = request.execute('base')
1071
964
self.assertEquals(
1072
smart_req.SuccessfulSmartServerResponse(("../foo",)),
965
SuccessfulSmartServerResponse(("../foo",)),
1076
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
969
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1078
971
def test_set_parent_none(self):
1079
972
branch = self.make_branch('base', format="1.9")
1080
973
branch.lock_write()
1081
974
branch._set_parent_location('foo')
1083
request = smart_branch.SmartServerBranchRequestSetParentLocation(
976
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1084
977
self.get_transport())
1085
branch_token, repo_token = self.get_lock_tokens(branch)
978
branch_token = branch.lock_write()
979
repo_token = branch.repository.lock_write()
1087
981
response = request.execute('base', branch_token, repo_token, '')
983
branch.repository.unlock()
1090
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
985
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1091
986
self.assertEqual(None, branch.get_parent())
1093
988
def test_set_parent_something(self):
1094
989
branch = self.make_branch('base', format="1.9")
1095
request = smart_branch.SmartServerBranchRequestSetParentLocation(
990
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1096
991
self.get_transport())
1097
branch_token, repo_token = self.get_lock_tokens(branch)
992
branch_token = branch.lock_write()
993
repo_token = branch.repository.lock_write()
1099
995
response = request.execute('base', branch_token, repo_token,
998
branch.repository.unlock()
1103
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1000
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1104
1001
self.assertEqual('http://bar/', branch.get_parent())
1107
class TestSmartServerBranchRequestGetTagsBytes(
1108
tests.TestCaseWithMemoryTransport):
1004
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
1109
1005
# Only called when the branch format and tags match [yay factory
1110
1006
# methods] so only need to test straight forward cases.
1112
1008
def test_get_bytes(self):
1113
1009
base_branch = self.make_branch('base')
1114
request = smart_branch.SmartServerBranchGetTagsBytes(
1010
request = smart.branch.SmartServerBranchGetTagsBytes(
1115
1011
self.get_transport())
1116
1012
response = request.execute('base')
1117
1013
self.assertEquals(
1118
smart_req.SuccessfulSmartServerResponse(('',)), response)
1014
SuccessfulSmartServerResponse(('',)), response)
1121
1017
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1125
1021
stacked_branch = self.make_branch('stacked', format='1.6')
1126
1022
# typically should be relative
1127
1023
stacked_branch.set_stacked_on_url('../base')
1128
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
1024
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1129
1025
self.get_transport())
1130
1026
response = request.execute('stacked')
1131
1027
self.assertEquals(
1132
smart_req.SmartServerResponse(('ok', '../base')),
1028
SmartServerResponse(('ok', '../base')),
1136
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
1032
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1138
1034
def setUp(self):
1139
1035
tests.TestCaseWithMemoryTransport.setUp(self)
1141
1037
def test_lock_write_on_unlocked_branch(self):
1142
1038
backing = self.get_transport()
1143
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1039
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1144
1040
branch = self.make_branch('.', format='knit')
1145
1041
repository = branch.repository
1146
1042
response = request.execute('')
1147
1043
branch_nonce = branch.control_files._lock.peek().get('nonce')
1148
1044
repository_nonce = repository.control_files._lock.peek().get('nonce')
1149
self.assertEqual(smart_req.SmartServerResponse(
1150
('ok', branch_nonce, repository_nonce)),
1046
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1152
1048
# The branch (and associated repository) is now locked. Verify that
1153
1049
# with a new branch object.
1154
1050
new_branch = repository.bzrdir.open_branch()
1155
1051
self.assertRaises(errors.LockContention, new_branch.lock_write)
1157
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1053
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1158
1054
response = request.execute('', branch_nonce, repository_nonce)
1160
1056
def test_lock_write_on_locked_branch(self):
1161
1057
backing = self.get_transport()
1162
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1058
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1163
1059
branch = self.make_branch('.')
1164
branch_token = branch.lock_write().branch_token
1060
branch_token = branch.lock_write()
1165
1061
branch.leave_lock_in_place()
1166
1062
branch.unlock()
1167
1063
response = request.execute('')
1168
1064
self.assertEqual(
1169
smart_req.SmartServerResponse(('LockContention',)), response)
1065
SmartServerResponse(('LockContention',)), response)
1171
1067
branch.lock_write(branch_token)
1172
1068
branch.dont_leave_lock_in_place()
1270
1171
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1271
1172
backing = self.get_transport()
1272
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1173
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1273
1174
branch = self.make_branch('.', format='knit')
1274
1175
response = request.execute(
1275
1176
'', 'branch token', 'repo token')
1276
1177
self.assertEqual(
1277
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1178
SmartServerResponse(('TokenMismatch',)), response)
1279
1180
def test_unlock_on_unlocked_branch_locked_repo(self):
1280
1181
backing = self.get_transport()
1281
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1182
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1282
1183
branch = self.make_branch('.', format='knit')
1283
1184
# Lock the repository.
1284
repo_token = branch.repository.lock_write().repository_token
1185
repo_token = branch.repository.lock_write()
1285
1186
branch.repository.leave_lock_in_place()
1286
1187
branch.repository.unlock()
1287
1188
# Issue branch lock_write request on the unlocked branch (with locked
1289
response = request.execute('', 'branch token', repo_token)
1190
response = request.execute(
1191
'', 'branch token', repo_token)
1290
1192
self.assertEqual(
1291
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1193
SmartServerResponse(('TokenMismatch',)), response)
1293
1195
branch.repository.lock_write(repo_token)
1294
1196
branch.repository.dont_leave_lock_in_place()
1316
1218
def test_trivial_bzipped(self):
1317
1219
# This tests that the wire encoding is actually bzipped
1318
1220
backing = self.get_transport()
1319
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1221
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1320
1222
tree = self.make_branch_and_memory_tree('.')
1322
1224
self.assertEqual(None,
1323
1225
request.execute('', 'missing-id'))
1324
1226
# Note that it returns a body that is bzipped.
1325
1227
self.assertEqual(
1326
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1228
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1327
1229
request.do_body('\n\n0\n'))
1329
1231
def test_trivial_include_missing(self):
1330
1232
backing = self.get_transport()
1331
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1233
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1332
1234
tree = self.make_branch_and_memory_tree('.')
1334
1236
self.assertEqual(None,
1335
1237
request.execute('', 'missing-id', 'include-missing:'))
1336
1238
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ),
1239
SuccessfulSmartServerResponse(('ok', ),
1338
1240
bz2.compress('missing:missing-id')),
1339
1241
request.do_body('\n\n0\n'))
1342
class TestSmartServerRepositoryGetRevisionGraph(
1343
tests.TestCaseWithMemoryTransport):
1244
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1345
1246
def test_none_argument(self):
1346
1247
backing = self.get_transport()
1347
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1248
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1348
1249
tree = self.make_branch_and_memory_tree('.')
1349
1250
tree.lock_write()
1405
1305
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1408
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1308
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1409
1309
request.execute('', 1, (2, rev2_id_utf8)))
1411
1311
def test_known_revid_missing(self):
1412
1312
backing = self.get_transport()
1413
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1313
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1414
1314
repo = self.make_repository('.')
1415
1315
self.assertEqual(
1416
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1316
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1417
1317
request.execute('', 1, (2, 'ghost')))
1419
1319
def test_history_incomplete(self):
1420
1320
backing = self.get_transport()
1421
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1321
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1422
1322
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1423
1323
parent.lock_write()
1424
1324
parent.add([''], ['TREE_ROOT'])
1583
1483
def test_lock_write_on_unlocked_repo(self):
1584
1484
backing = self.get_transport()
1585
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1485
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1586
1486
repository = self.make_repository('.', format='knit')
1587
1487
response = request.execute('')
1588
1488
nonce = repository.control_files._lock.peek().get('nonce')
1589
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1489
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1590
1490
# The repository is now locked. Verify that with a new repository
1592
1492
new_repo = repository.bzrdir.open_repository()
1593
1493
self.assertRaises(errors.LockContention, new_repo.lock_write)
1595
request = smart_repo.SmartServerRepositoryUnlock(backing)
1495
request = smart.repository.SmartServerRepositoryUnlock(backing)
1596
1496
response = request.execute('', nonce)
1598
1498
def test_lock_write_on_locked_repo(self):
1599
1499
backing = self.get_transport()
1600
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1500
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1601
1501
repository = self.make_repository('.', format='knit')
1602
repo_token = repository.lock_write().repository_token
1502
repo_token = repository.lock_write()
1603
1503
repository.leave_lock_in_place()
1604
1504
repository.unlock()
1605
1505
response = request.execute('')
1606
1506
self.assertEqual(
1607
smart_req.SmartServerResponse(('LockContention',)), response)
1507
SmartServerResponse(('LockContention',)), response)
1609
1509
repository.lock_write(repo_token)
1610
1510
repository.dont_leave_lock_in_place()
1631
1531
def test_insert_stream_empty(self):
1632
1532
backing = self.get_transport()
1633
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1533
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1634
1534
repository = self.make_repository('.')
1635
1535
response = request.execute('', '')
1636
1536
self.assertEqual(None, response)
1637
1537
response = request.do_chunk(self.make_empty_byte_stream(repository))
1638
1538
self.assertEqual(None, response)
1639
1539
response = request.do_end()
1640
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1540
self.assertEqual(SmartServerResponse(('ok', )), response)
1643
1543
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1645
1545
def test_insert_stream_empty(self):
1646
1546
backing = self.get_transport()
1647
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1547
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1649
1549
repository = self.make_repository('.', format='knit')
1650
lock_token = repository.lock_write().repository_token
1550
lock_token = repository.lock_write()
1651
1551
response = request.execute('', '', lock_token)
1652
1552
self.assertEqual(None, response)
1653
1553
response = request.do_chunk(self.make_empty_byte_stream(repository))
1654
1554
self.assertEqual(None, response)
1655
1555
response = request.do_end()
1656
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1556
self.assertEqual(SmartServerResponse(('ok', )), response)
1657
1557
repository.unlock()
1659
1559
def test_insert_stream_with_wrong_lock_token(self):
1660
1560
backing = self.get_transport()
1661
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1561
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1663
1563
repository = self.make_repository('.', format='knit')
1664
lock_token = repository.lock_write().repository_token
1564
lock_token = repository.lock_write()
1665
1565
self.assertRaises(
1666
1566
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1667
1567
repository.unlock()
1691
1591
def test_unlock_on_unlocked_repo(self):
1692
1592
backing = self.get_transport()
1693
request = smart_repo.SmartServerRepositoryUnlock(backing)
1593
request = smart.repository.SmartServerRepositoryUnlock(backing)
1694
1594
repository = self.make_repository('.', format='knit')
1695
1595
response = request.execute('', 'some token')
1696
1596
self.assertEqual(
1697
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1597
SmartServerResponse(('TokenMismatch',)), response)
1700
1600
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1702
1602
def test_is_readonly_no(self):
1703
1603
backing = self.get_transport()
1704
request = smart_req.SmartServerIsReadonly(backing)
1604
request = smart.request.SmartServerIsReadonly(backing)
1705
1605
response = request.execute()
1706
1606
self.assertEqual(
1707
smart_req.SmartServerResponse(('no',)), response)
1607
SmartServerResponse(('no',)), response)
1709
1609
def test_is_readonly_yes(self):
1710
1610
backing = self.get_readonly_transport()
1711
request = smart_req.SmartServerIsReadonly(backing)
1611
request = smart.request.SmartServerIsReadonly(backing)
1712
1612
response = request.execute()
1713
1613
self.assertEqual(
1714
smart_req.SmartServerResponse(('yes',)), response)
1717
class TestSmartServerRepositorySetMakeWorkingTrees(
1718
tests.TestCaseWithMemoryTransport):
1614
SmartServerResponse(('yes',)), response)
1617
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1720
1619
def test_set_false(self):
1721
1620
backing = self.get_transport()
1722
1621
repo = self.make_repository('.', shared=True)
1723
1622
repo.set_make_working_trees(True)
1724
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1623
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1725
1624
request = request_class(backing)
1726
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1625
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1727
1626
request.execute('', 'False'))
1728
1627
repo = repo.bzrdir.open_repository()
1729
1628
self.assertFalse(repo.make_working_trees())
1811
1697
"""All registered request_handlers can be found."""
1812
1698
# If there's a typo in a register_lazy call, this loop will fail with
1813
1699
# an AttributeError.
1814
for key, item in smart_req.request_handlers.iteritems():
1700
for key, item in smart.request.request_handlers.iteritems():
1817
1703
def assertHandlerEqual(self, verb, handler):
1818
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1704
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1820
1706
def test_registered_methods(self):
1821
1707
"""Test that known methods are registered to the correct object."""
1822
1708
self.assertHandlerEqual('Branch.get_config_file',
1823
smart_branch.SmartServerBranchGetConfigFile)
1709
smart.branch.SmartServerBranchGetConfigFile)
1824
1710
self.assertHandlerEqual('Branch.get_parent',
1825
smart_branch.SmartServerBranchGetParent)
1711
smart.branch.SmartServerBranchGetParent)
1826
1712
self.assertHandlerEqual('Branch.get_tags_bytes',
1827
smart_branch.SmartServerBranchGetTagsBytes)
1713
smart.branch.SmartServerBranchGetTagsBytes)
1828
1714
self.assertHandlerEqual('Branch.lock_write',
1829
smart_branch.SmartServerBranchRequestLockWrite)
1715
smart.branch.SmartServerBranchRequestLockWrite)
1830
1716
self.assertHandlerEqual('Branch.last_revision_info',
1831
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1717
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1832
1718
self.assertHandlerEqual('Branch.revision_history',
1833
smart_branch.SmartServerRequestRevisionHistory)
1719
smart.branch.SmartServerRequestRevisionHistory)
1834
1720
self.assertHandlerEqual('Branch.set_config_option',
1835
smart_branch.SmartServerBranchRequestSetConfigOption)
1721
smart.branch.SmartServerBranchRequestSetConfigOption)
1836
1722
self.assertHandlerEqual('Branch.set_last_revision',
1837
smart_branch.SmartServerBranchRequestSetLastRevision)
1723
smart.branch.SmartServerBranchRequestSetLastRevision)
1838
1724
self.assertHandlerEqual('Branch.set_last_revision_info',
1839
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1725
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1840
1726
self.assertHandlerEqual('Branch.set_last_revision_ex',
1841
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1727
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1842
1728
self.assertHandlerEqual('Branch.set_parent_location',
1843
smart_branch.SmartServerBranchRequestSetParentLocation)
1729
smart.branch.SmartServerBranchRequestSetParentLocation)
1844
1730
self.assertHandlerEqual('Branch.unlock',
1845
smart_branch.SmartServerBranchRequestUnlock)
1731
smart.branch.SmartServerBranchRequestUnlock)
1846
1732
self.assertHandlerEqual('BzrDir.find_repository',
1847
smart_dir.SmartServerRequestFindRepositoryV1)
1733
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1848
1734
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1849
smart_dir.SmartServerRequestFindRepositoryV2)
1735
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1850
1736
self.assertHandlerEqual('BzrDirFormat.initialize',
1851
smart_dir.SmartServerRequestInitializeBzrDir)
1737
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1852
1738
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1853
smart_dir.SmartServerRequestBzrDirInitializeEx)
1739
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1854
1740
self.assertHandlerEqual('BzrDir.cloning_metadir',
1855
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1741
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1856
1742
self.assertHandlerEqual('BzrDir.get_config_file',
1857
smart_dir.SmartServerBzrDirRequestConfigFile)
1743
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1858
1744
self.assertHandlerEqual('BzrDir.open_branch',
1859
smart_dir.SmartServerRequestOpenBranch)
1745
smart.bzrdir.SmartServerRequestOpenBranch)
1860
1746
self.assertHandlerEqual('BzrDir.open_branchV2',
1861
smart_dir.SmartServerRequestOpenBranchV2)
1862
self.assertHandlerEqual('BzrDir.open_branchV3',
1863
smart_dir.SmartServerRequestOpenBranchV3)
1747
smart.bzrdir.SmartServerRequestOpenBranchV2)
1864
1748
self.assertHandlerEqual('PackRepository.autopack',
1865
smart_packrepo.SmartServerPackRepositoryAutopack)
1749
smart.packrepository.SmartServerPackRepositoryAutopack)
1866
1750
self.assertHandlerEqual('Repository.gather_stats',
1867
smart_repo.SmartServerRepositoryGatherStats)
1751
smart.repository.SmartServerRepositoryGatherStats)
1868
1752
self.assertHandlerEqual('Repository.get_parent_map',
1869
smart_repo.SmartServerRepositoryGetParentMap)
1753
smart.repository.SmartServerRepositoryGetParentMap)
1870
1754
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1871
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1755
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1872
1756
self.assertHandlerEqual('Repository.get_revision_graph',
1873
smart_repo.SmartServerRepositoryGetRevisionGraph)
1757
smart.repository.SmartServerRepositoryGetRevisionGraph)
1874
1758
self.assertHandlerEqual('Repository.get_stream',
1875
smart_repo.SmartServerRepositoryGetStream)
1759
smart.repository.SmartServerRepositoryGetStream)
1876
1760
self.assertHandlerEqual('Repository.has_revision',
1877
smart_repo.SmartServerRequestHasRevision)
1761
smart.repository.SmartServerRequestHasRevision)
1878
1762
self.assertHandlerEqual('Repository.insert_stream',
1879
smart_repo.SmartServerRepositoryInsertStream)
1763
smart.repository.SmartServerRepositoryInsertStream)
1880
1764
self.assertHandlerEqual('Repository.insert_stream_locked',
1881
smart_repo.SmartServerRepositoryInsertStreamLocked)
1765
smart.repository.SmartServerRepositoryInsertStreamLocked)
1882
1766
self.assertHandlerEqual('Repository.is_shared',
1883
smart_repo.SmartServerRepositoryIsShared)
1767
smart.repository.SmartServerRepositoryIsShared)
1884
1768
self.assertHandlerEqual('Repository.lock_write',
1885
smart_repo.SmartServerRepositoryLockWrite)
1769
smart.repository.SmartServerRepositoryLockWrite)
1886
1770
self.assertHandlerEqual('Repository.tarball',
1887
smart_repo.SmartServerRepositoryTarball)
1771
smart.repository.SmartServerRepositoryTarball)
1888
1772
self.assertHandlerEqual('Repository.unlock',
1889
smart_repo.SmartServerRepositoryUnlock)
1773
smart.repository.SmartServerRepositoryUnlock)
1890
1774
self.assertHandlerEqual('Transport.is_readonly',
1891
smart_req.SmartServerIsReadonly)
1775
smart.request.SmartServerIsReadonly)