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'))
1145
1126
def test_lock_write_on_unlocked_branch(self):
1146
1127
backing = self.get_transport()
1147
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1128
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1148
1129
branch = self.make_branch('.', format='knit')
1149
1130
repository = branch.repository
1150
1131
response = request.execute('')
1151
1132
branch_nonce = branch.control_files._lock.peek().get('nonce')
1152
1133
repository_nonce = repository.control_files._lock.peek().get('nonce')
1153
self.assertEqual(smart_req.SmartServerResponse(
1154
('ok', branch_nonce, repository_nonce)),
1135
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1156
1137
# The branch (and associated repository) is now locked. Verify that
1157
1138
# with a new branch object.
1158
1139
new_branch = repository.bzrdir.open_branch()
1159
1140
self.assertRaises(errors.LockContention, new_branch.lock_write)
1161
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1142
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1162
1143
response = request.execute('', branch_nonce, repository_nonce)
1164
1145
def test_lock_write_on_locked_branch(self):
1165
1146
backing = self.get_transport()
1166
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1147
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1167
1148
branch = self.make_branch('.')
1168
1149
branch_token = branch.lock_write()
1169
1150
branch.leave_lock_in_place()
1170
1151
branch.unlock()
1171
1152
response = request.execute('')
1172
1153
self.assertEqual(
1173
smart_req.SmartServerResponse(('LockContention',)), response)
1154
SmartServerResponse(('LockContention',)), response)
1175
1156
branch.lock_write(branch_token)
1176
1157
branch.dont_leave_lock_in_place()
1327
1307
def test_trivial_bzipped(self):
1328
1308
# This tests that the wire encoding is actually bzipped
1329
1309
backing = self.get_transport()
1330
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1310
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1331
1311
tree = self.make_branch_and_memory_tree('.')
1333
1313
self.assertEqual(None,
1334
1314
request.execute('', 'missing-id'))
1335
1315
# Note that it returns a body that is bzipped.
1336
1316
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1317
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1338
1318
request.do_body('\n\n0\n'))
1340
1320
def test_trivial_include_missing(self):
1341
1321
backing = self.get_transport()
1342
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1322
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1343
1323
tree = self.make_branch_and_memory_tree('.')
1345
1325
self.assertEqual(None,
1346
1326
request.execute('', 'missing-id', 'include-missing:'))
1347
1327
self.assertEqual(
1348
smart_req.SuccessfulSmartServerResponse(('ok', ),
1328
SuccessfulSmartServerResponse(('ok', ),
1349
1329
bz2.compress('missing:missing-id')),
1350
1330
request.do_body('\n\n0\n'))
1353
class TestSmartServerRepositoryGetRevisionGraph(
1354
tests.TestCaseWithMemoryTransport):
1333
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1356
1335
def test_none_argument(self):
1357
1336
backing = self.get_transport()
1358
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1337
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1359
1338
tree = self.make_branch_and_memory_tree('.')
1360
1339
tree.lock_write()
1416
1394
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1419
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1397
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1420
1398
request.execute('', 1, (2, rev2_id_utf8)))
1422
1400
def test_known_revid_missing(self):
1423
1401
backing = self.get_transport()
1424
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1402
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1425
1403
repo = self.make_repository('.')
1426
1404
self.assertEqual(
1427
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1405
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1428
1406
request.execute('', 1, (2, 'ghost')))
1430
1408
def test_history_incomplete(self):
1431
1409
backing = self.get_transport()
1432
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1410
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1433
1411
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1434
1412
parent.lock_write()
1435
1413
parent.add([''], ['TREE_ROOT'])
1594
1572
def test_lock_write_on_unlocked_repo(self):
1595
1573
backing = self.get_transport()
1596
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1574
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1597
1575
repository = self.make_repository('.', format='knit')
1598
1576
response = request.execute('')
1599
1577
nonce = repository.control_files._lock.peek().get('nonce')
1600
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1578
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1601
1579
# The repository is now locked. Verify that with a new repository
1603
1581
new_repo = repository.bzrdir.open_repository()
1604
1582
self.assertRaises(errors.LockContention, new_repo.lock_write)
1606
request = smart_repo.SmartServerRepositoryUnlock(backing)
1584
request = smart.repository.SmartServerRepositoryUnlock(backing)
1607
1585
response = request.execute('', nonce)
1609
1587
def test_lock_write_on_locked_repo(self):
1610
1588
backing = self.get_transport()
1611
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1589
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1612
1590
repository = self.make_repository('.', format='knit')
1613
1591
repo_token = repository.lock_write()
1614
1592
repository.leave_lock_in_place()
1615
1593
repository.unlock()
1616
1594
response = request.execute('')
1617
1595
self.assertEqual(
1618
smart_req.SmartServerResponse(('LockContention',)), response)
1596
SmartServerResponse(('LockContention',)), response)
1620
1598
repository.lock_write(repo_token)
1621
1599
repository.dont_leave_lock_in_place()
1702
1680
def test_unlock_on_unlocked_repo(self):
1703
1681
backing = self.get_transport()
1704
request = smart_repo.SmartServerRepositoryUnlock(backing)
1682
request = smart.repository.SmartServerRepositoryUnlock(backing)
1705
1683
repository = self.make_repository('.', format='knit')
1706
1684
response = request.execute('', 'some token')
1707
1685
self.assertEqual(
1708
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1686
SmartServerResponse(('TokenMismatch',)), response)
1711
1689
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1713
1691
def test_is_readonly_no(self):
1714
1692
backing = self.get_transport()
1715
request = smart_req.SmartServerIsReadonly(backing)
1693
request = smart.request.SmartServerIsReadonly(backing)
1716
1694
response = request.execute()
1717
1695
self.assertEqual(
1718
smart_req.SmartServerResponse(('no',)), response)
1696
SmartServerResponse(('no',)), response)
1720
1698
def test_is_readonly_yes(self):
1721
1699
backing = self.get_readonly_transport()
1722
request = smart_req.SmartServerIsReadonly(backing)
1700
request = smart.request.SmartServerIsReadonly(backing)
1723
1701
response = request.execute()
1724
1702
self.assertEqual(
1725
smart_req.SmartServerResponse(('yes',)), response)
1728
class TestSmartServerRepositorySetMakeWorkingTrees(
1729
tests.TestCaseWithMemoryTransport):
1703
SmartServerResponse(('yes',)), response)
1706
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1731
1708
def test_set_false(self):
1732
1709
backing = self.get_transport()
1733
1710
repo = self.make_repository('.', shared=True)
1734
1711
repo.set_make_working_trees(True)
1735
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1712
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1736
1713
request = request_class(backing)
1737
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1714
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1738
1715
request.execute('', 'False'))
1739
1716
repo = repo.bzrdir.open_repository()
1740
1717
self.assertFalse(repo.make_working_trees())
1822
1799
"""All registered request_handlers can be found."""
1823
1800
# If there's a typo in a register_lazy call, this loop will fail with
1824
1801
# an AttributeError.
1825
for key, item in smart_req.request_handlers.iteritems():
1802
for key, item in smart.request.request_handlers.iteritems():
1828
1805
def assertHandlerEqual(self, verb, handler):
1829
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1806
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1831
1808
def test_registered_methods(self):
1832
1809
"""Test that known methods are registered to the correct object."""
1833
1810
self.assertHandlerEqual('Branch.get_config_file',
1834
smart_branch.SmartServerBranchGetConfigFile)
1811
smart.branch.SmartServerBranchGetConfigFile)
1835
1812
self.assertHandlerEqual('Branch.get_parent',
1836
smart_branch.SmartServerBranchGetParent)
1813
smart.branch.SmartServerBranchGetParent)
1837
1814
self.assertHandlerEqual('Branch.get_tags_bytes',
1838
smart_branch.SmartServerBranchGetTagsBytes)
1815
smart.branch.SmartServerBranchGetTagsBytes)
1839
1816
self.assertHandlerEqual('Branch.lock_write',
1840
smart_branch.SmartServerBranchRequestLockWrite)
1817
smart.branch.SmartServerBranchRequestLockWrite)
1841
1818
self.assertHandlerEqual('Branch.last_revision_info',
1842
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1819
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1843
1820
self.assertHandlerEqual('Branch.revision_history',
1844
smart_branch.SmartServerRequestRevisionHistory)
1821
smart.branch.SmartServerRequestRevisionHistory)
1845
1822
self.assertHandlerEqual('Branch.set_config_option',
1846
smart_branch.SmartServerBranchRequestSetConfigOption)
1823
smart.branch.SmartServerBranchRequestSetConfigOption)
1847
1824
self.assertHandlerEqual('Branch.set_last_revision',
1848
smart_branch.SmartServerBranchRequestSetLastRevision)
1825
smart.branch.SmartServerBranchRequestSetLastRevision)
1849
1826
self.assertHandlerEqual('Branch.set_last_revision_info',
1850
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1827
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1851
1828
self.assertHandlerEqual('Branch.set_last_revision_ex',
1852
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1829
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1853
1830
self.assertHandlerEqual('Branch.set_parent_location',
1854
smart_branch.SmartServerBranchRequestSetParentLocation)
1831
smart.branch.SmartServerBranchRequestSetParentLocation)
1855
1832
self.assertHandlerEqual('Branch.unlock',
1856
smart_branch.SmartServerBranchRequestUnlock)
1833
smart.branch.SmartServerBranchRequestUnlock)
1857
1834
self.assertHandlerEqual('BzrDir.find_repository',
1858
smart_dir.SmartServerRequestFindRepositoryV1)
1835
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1859
1836
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1860
smart_dir.SmartServerRequestFindRepositoryV2)
1837
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1861
1838
self.assertHandlerEqual('BzrDirFormat.initialize',
1862
smart_dir.SmartServerRequestInitializeBzrDir)
1839
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1863
1840
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1864
smart_dir.SmartServerRequestBzrDirInitializeEx)
1841
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1865
1842
self.assertHandlerEqual('BzrDir.cloning_metadir',
1866
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1843
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1867
1844
self.assertHandlerEqual('BzrDir.get_config_file',
1868
smart_dir.SmartServerBzrDirRequestConfigFile)
1845
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1869
1846
self.assertHandlerEqual('BzrDir.open_branch',
1870
smart_dir.SmartServerRequestOpenBranch)
1847
smart.bzrdir.SmartServerRequestOpenBranch)
1871
1848
self.assertHandlerEqual('BzrDir.open_branchV2',
1872
smart_dir.SmartServerRequestOpenBranchV2)
1849
smart.bzrdir.SmartServerRequestOpenBranchV2)
1873
1850
self.assertHandlerEqual('BzrDir.open_branchV3',
1874
smart_dir.SmartServerRequestOpenBranchV3)
1851
smart.bzrdir.SmartServerRequestOpenBranchV3)
1875
1852
self.assertHandlerEqual('PackRepository.autopack',
1876
smart_packrepo.SmartServerPackRepositoryAutopack)
1853
smart.packrepository.SmartServerPackRepositoryAutopack)
1877
1854
self.assertHandlerEqual('Repository.gather_stats',
1878
smart_repo.SmartServerRepositoryGatherStats)
1855
smart.repository.SmartServerRepositoryGatherStats)
1879
1856
self.assertHandlerEqual('Repository.get_parent_map',
1880
smart_repo.SmartServerRepositoryGetParentMap)
1857
smart.repository.SmartServerRepositoryGetParentMap)
1881
1858
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1882
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1859
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1883
1860
self.assertHandlerEqual('Repository.get_revision_graph',
1884
smart_repo.SmartServerRepositoryGetRevisionGraph)
1861
smart.repository.SmartServerRepositoryGetRevisionGraph)
1885
1862
self.assertHandlerEqual('Repository.get_stream',
1886
smart_repo.SmartServerRepositoryGetStream)
1863
smart.repository.SmartServerRepositoryGetStream)
1887
1864
self.assertHandlerEqual('Repository.has_revision',
1888
smart_repo.SmartServerRequestHasRevision)
1865
smart.repository.SmartServerRequestHasRevision)
1889
1866
self.assertHandlerEqual('Repository.insert_stream',
1890
smart_repo.SmartServerRepositoryInsertStream)
1867
smart.repository.SmartServerRepositoryInsertStream)
1891
1868
self.assertHandlerEqual('Repository.insert_stream_locked',
1892
smart_repo.SmartServerRepositoryInsertStreamLocked)
1869
smart.repository.SmartServerRepositoryInsertStreamLocked)
1893
1870
self.assertHandlerEqual('Repository.is_shared',
1894
smart_repo.SmartServerRepositoryIsShared)
1871
smart.repository.SmartServerRepositoryIsShared)
1895
1872
self.assertHandlerEqual('Repository.lock_write',
1896
smart_repo.SmartServerRepositoryLockWrite)
1873
smart.repository.SmartServerRepositoryLockWrite)
1897
1874
self.assertHandlerEqual('Repository.tarball',
1898
smart_repo.SmartServerRepositoryTarball)
1875
smart.repository.SmartServerRepositoryTarball)
1899
1876
self.assertHandlerEqual('Repository.unlock',
1900
smart_repo.SmartServerRepositoryUnlock)
1877
smart.repository.SmartServerRepositoryUnlock)
1901
1878
self.assertHandlerEqual('Transport.is_readonly',
1902
smart_req.SmartServerIsReadonly)
1879
smart.request.SmartServerIsReadonly)