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 (
40
from bzrlib.branch import Branch, BranchReferenceFormat
41
import bzrlib.smart.branch
42
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
43
import bzrlib.smart.packrepository
44
import bzrlib.smart.repository
45
from bzrlib.smart.request import (
46
FailedSmartServerResponse,
49
SuccessfulSmartServerResponse,
51
from bzrlib.tests import (
54
from bzrlib.transport import chroot, get_transport
58
57
def load_tests(standard_tests, module, loader):
59
58
"""Multiply tests version and protocol consistency."""
60
59
# FindRepository tests.
60
bzrdir_mod = bzrlib.smart.bzrdir
62
62
("find_repository", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
63
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
64
64
("find_repositoryV2", {
65
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
65
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
66
66
("find_repositoryV3", {
67
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
67
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
69
to_adapt, result = tests.split_suite_by_re(standard_tests,
69
to_adapt, result = split_suite_by_re(standard_tests,
70
70
"TestSmartServerRequestFindRepository")
71
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
71
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
73
73
tests.multiply_tests(v1_and_2, scenarios, result)
74
74
# The first scenario is only applicable to v1 protocols, it is deleted
106
106
self.transport_server = self.make_transport_server
108
108
def make_transport_server(self):
109
return test_server.SmartTCPServer_for_testing('-' + self.id())
109
return smart.server.SmartTCPServer_for_testing('-' + self.id())
111
111
def get_smart_medium(self):
112
112
"""Get a smart medium to use in tests."""
113
113
return self.get_transport().get_smart_medium()
116
class TestByteStreamToStream(tests.TestCase):
118
def test_repeated_substreams_same_kind_are_one_stream(self):
119
# Make a stream - an iterable of bytestrings.
120
stream = [('text', [versionedfile.FulltextContentFactory(('k1',), None,
121
None, 'foo')]),('text', [
122
versionedfile.FulltextContentFactory(('k2',), None, None, 'bar')])]
123
fmt = bzrdir.format_registry.get('pack-0.92')().repository_format
124
bytes = smart_repo._stream_to_byte_stream(stream, fmt)
126
# Iterate the resulting iterable; checking that we get only one stream
128
fmt, stream = smart_repo._byte_stream_to_stream(bytes)
129
for kind, substream in stream:
130
streams.append((kind, list(substream)))
131
self.assertLength(1, streams)
132
self.assertLength(2, streams[0][1])
135
116
class TestSmartServerResponse(tests.TestCase):
137
118
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', )))
119
self.assertEqual(SmartServerResponse(('ok', )),
120
SmartServerResponse(('ok', )))
121
self.assertEqual(SmartServerResponse(('ok', ), 'body'),
122
SmartServerResponse(('ok', ), 'body'))
123
self.assertNotEqual(SmartServerResponse(('ok', )),
124
SmartServerResponse(('notok', )))
125
self.assertNotEqual(SmartServerResponse(('ok', ), 'body'),
126
SmartServerResponse(('ok', )))
146
127
self.assertNotEqual(None,
147
smart_req.SmartServerResponse(('ok', )))
128
SmartServerResponse(('ok', )))
149
130
def test__str__(self):
150
131
"""SmartServerResponses can be stringified."""
151
132
self.assertEqual(
152
133
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
153
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
134
str(SuccessfulSmartServerResponse(('args',), 'body')))
154
135
self.assertEqual(
155
136
"<FailedSmartServerResponse args=('args',) body='body'>",
156
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
137
str(FailedSmartServerResponse(('args',), 'body')))
159
140
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
161
142
def test_translate_client_path(self):
162
143
transport = self.get_transport()
163
request = smart_req.SmartServerRequest(transport, 'foo/')
144
request = SmartServerRequest(transport, 'foo/')
164
145
self.assertEqual('./', request.translate_client_path('foo/'))
165
146
self.assertRaises(
166
147
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
282
if repo._format.supports_external_lookups:
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
250
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
251
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
289
('ok', '', rich_root, subtrees, external,
252
return SuccessfulSmartServerResponse(
253
('ok', '', rich_root, subtrees, 'no',
290
254
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
255
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
256
self._request_class):
293
257
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
296
('ok', '', rich_root, subtrees, external))
259
return SuccessfulSmartServerResponse(
260
('ok', '', rich_root, subtrees, 'no'))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
262
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
264
def test_shared_repository(self):
302
265
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
419
376
"""Initializing a missing directory should fail like the bzrdir api."""
420
377
backing = self.get_transport()
421
378
name = self.make_bzrdir('reference')._format.network_name()
422
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
379
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
423
380
self.assertRaises(errors.NoSuchFile, request.execute, name,
424
381
'subdir/dir', 'False', 'False', 'False', '', '', '', '', 'False')
426
383
def test_initialized_dir(self):
427
"""Initializing an extant directory should fail like the bzrdir api."""
384
"""Initializing an extant dirctory should fail like the bzrdir api."""
428
385
backing = self.get_transport()
429
386
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
387
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
388
self.make_bzrdir('subdir')
432
389
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
390
'False', 'False', 'False', '', '', '', '', 'False')
436
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
438
def test_no_directory(self):
439
backing = self.get_transport()
440
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
441
self.assertEqual(smart_req.SmartServerResponse(('no', )),
442
request.execute('does-not-exist'))
444
def test_empty_directory(self):
445
backing = self.get_transport()
446
backing.mkdir('empty')
447
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
448
self.assertEqual(smart_req.SmartServerResponse(('no', )),
449
request.execute('empty'))
451
def test_outside_root_client_path(self):
452
backing = self.get_transport()
453
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
454
root_client_path='root')
455
self.assertEqual(smart_req.SmartServerResponse(('no', )),
456
request.execute('not-root'))
459
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
461
def test_no_directory(self):
462
backing = self.get_transport()
463
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
464
self.assertEqual(smart_req.SmartServerResponse(('no', )),
465
request.execute('does-not-exist'))
467
def test_empty_directory(self):
468
backing = self.get_transport()
469
backing.mkdir('empty')
470
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
471
self.assertEqual(smart_req.SmartServerResponse(('no', )),
472
request.execute('empty'))
474
def test_present_without_workingtree(self):
475
backing = self.get_transport()
476
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
477
self.make_bzrdir('.')
478
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
481
def test_outside_root_client_path(self):
482
backing = self.get_transport()
483
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
484
root_client_path='root')
485
self.assertEqual(smart_req.SmartServerResponse(('no',)),
486
request.execute('not-root'))
489
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
491
def test_present_with_workingtree(self):
492
self.vfs_transport_factory = test_server.LocalURLServer
493
backing = self.get_transport()
494
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
495
bd = self.make_bzrdir('.')
496
bd.create_repository()
498
bd.create_workingtree()
499
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
503
393
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
395
def test_no_branch(self):
506
396
"""When there is no branch, ('nobranch', ) is returned."""
507
397
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
398
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
399
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
400
self.assertEqual(SmartServerResponse(('nobranch', )),
511
401
request.execute(''))
513
403
def test_branch(self):
514
404
"""When there is a branch, 'ok' is returned."""
515
405
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
406
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
407
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
408
self.assertEqual(SmartServerResponse(('ok', '')),
519
409
request.execute(''))
521
411
def test_branch_reference(self):
522
412
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
413
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
414
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
415
branch = self.make_branch('branch')
527
416
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
417
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
418
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
419
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
420
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
423
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
426
"""When there is no branch, ('nobranch', ) is returned."""
547
427
backing = self.get_transport()
548
428
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')),
429
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
430
self.assertEqual(SmartServerResponse(('nobranch', )),
433
def test_branch(self):
434
"""When there is a branch, 'ok' is returned."""
435
backing = self.get_transport()
436
expected = self.make_branch('.')._format.network_name()
437
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
438
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
441
def test_branch_reference(self):
442
"""When there is a branch reference, the reference URL is returned."""
443
backing = self.get_transport()
444
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
445
branch = self.make_branch('branch')
446
checkout = branch.create_checkout('reference',lightweight=True)
447
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
448
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
449
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
450
request.execute('reference'))
452
def test_stacked_branch(self):
453
"""Opening a stacked branch does not open the stacked-on branch."""
454
trunk = self.make_branch('trunk')
455
feature = self.make_branch('feature', format='1.9')
456
feature.set_stacked_on_url(trunk.base)
458
Branch.hooks.install_named_hook('open', opened_branches.append, None)
459
backing = self.get_transport()
460
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
463
response = request.execute('feature')
465
request.teardown_jail()
466
expected_format = feature._format.network_name()
468
SuccessfulSmartServerResponse(('branch', expected_format)),
470
self.assertLength(1, opened_branches)
670
473
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
508
def test_branch_reference(self):
706
509
"""When there is a branch reference, NotBranchError is raised."""
707
510
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
511
request = smart.branch.SmartServerBranchRequest(backing)
709
512
branch = self.make_branch('branch')
710
513
checkout = branch.create_checkout('reference',lightweight=True)
711
514
self.assertRaises(errors.NotBranchError,
712
515
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
518
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
520
def test_empty(self):
719
521
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
522
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
523
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
524
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
525
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
526
request.execute(''))
726
528
def test_not_empty(self):
727
529
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
530
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
531
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
532
tree = self.make_branch_and_memory_tree('.')
731
533
tree.lock_write()
778
579
def test_value_name(self):
779
580
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
581
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
582
branch.bzrdir.root_transport)
782
583
branch_token, repo_token = self.get_lock_tokens(branch)
783
584
config = branch._get_config()
784
585
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
587
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
588
self.assertEqual('bar', config.get_option('foo'))
791
592
def test_value_name_section(self):
792
593
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
594
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
595
branch.bzrdir.root_transport)
795
596
branch_token, repo_token = self.get_lock_tokens(branch)
796
597
config = branch._get_config()
797
598
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
600
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
601
self.assertEqual('bar', config.get_option('foo', 'gam'))
805
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
806
# Only called when the branch format and tags match [yay factory
807
# methods] so only need to test straight forward cases.
809
def test_set_bytes(self):
810
base_branch = self.make_branch('base')
811
tag_bytes = base_branch._get_tags_bytes()
812
# get_lock_tokens takes out a lock.
813
branch_token, repo_token = self.get_lock_tokens(base_branch)
814
request = smart_branch.SmartServerBranchSetTagsBytes(
815
self.get_transport())
816
response = request.execute('base', branch_token, repo_token)
817
self.assertEqual(None, response)
818
response = request.do_chunk(tag_bytes)
819
self.assertEqual(None, response)
820
response = request.do_end()
822
smart_req.SuccessfulSmartServerResponse(()), response)
825
def test_lock_failed(self):
826
base_branch = self.make_branch('base')
827
base_branch.lock_write()
828
tag_bytes = base_branch._get_tags_bytes()
829
request = smart_branch.SmartServerBranchSetTagsBytes(
830
self.get_transport())
831
self.assertRaises(errors.TokenMismatch, request.execute,
832
'base', 'wrong token', 'wrong token')
833
# The request handler will keep processing the message parts, so even
834
# if the request fails immediately do_chunk and do_end are still
836
request.do_chunk(tag_bytes)
842
606
class SetLastRevisionTestBase(TestLockedBranch):
843
607
"""Base test case for verbs that implement set_last_revision."""
1145
907
def test_lock_write_on_unlocked_branch(self):
1146
908
backing = self.get_transport()
1147
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
909
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1148
910
branch = self.make_branch('.', format='knit')
1149
911
repository = branch.repository
1150
912
response = request.execute('')
1151
913
branch_nonce = branch.control_files._lock.peek().get('nonce')
1152
914
repository_nonce = repository.control_files._lock.peek().get('nonce')
1153
self.assertEqual(smart_req.SmartServerResponse(
1154
('ok', branch_nonce, repository_nonce)),
916
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1156
918
# The branch (and associated repository) is now locked. Verify that
1157
919
# with a new branch object.
1158
920
new_branch = repository.bzrdir.open_branch()
1159
921
self.assertRaises(errors.LockContention, new_branch.lock_write)
1161
request = smart_branch.SmartServerBranchRequestUnlock(backing)
923
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1162
924
response = request.execute('', branch_nonce, repository_nonce)
1164
926
def test_lock_write_on_locked_branch(self):
1165
927
backing = self.get_transport()
1166
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
928
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1167
929
branch = self.make_branch('.')
1168
930
branch_token = branch.lock_write()
1169
931
branch.leave_lock_in_place()
1171
933
response = request.execute('')
1172
934
self.assertEqual(
1173
smart_req.SmartServerResponse(('LockContention',)), response)
935
SmartServerResponse(('LockContention',)), response)
1175
937
branch.lock_write(branch_token)
1176
938
branch.dont_leave_lock_in_place()
1327
1088
def test_trivial_bzipped(self):
1328
1089
# This tests that the wire encoding is actually bzipped
1329
1090
backing = self.get_transport()
1330
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1091
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1331
1092
tree = self.make_branch_and_memory_tree('.')
1333
1094
self.assertEqual(None,
1334
1095
request.execute('', 'missing-id'))
1335
1096
# Note that it returns a body that is bzipped.
1336
1097
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1098
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1338
1099
request.do_body('\n\n0\n'))
1340
1101
def test_trivial_include_missing(self):
1341
1102
backing = self.get_transport()
1342
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1103
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1343
1104
tree = self.make_branch_and_memory_tree('.')
1345
1106
self.assertEqual(None,
1346
1107
request.execute('', 'missing-id', 'include-missing:'))
1347
1108
self.assertEqual(
1348
smart_req.SuccessfulSmartServerResponse(('ok', ),
1109
SuccessfulSmartServerResponse(('ok', ),
1349
1110
bz2.compress('missing:missing-id')),
1350
1111
request.do_body('\n\n0\n'))
1353
class TestSmartServerRepositoryGetRevisionGraph(
1354
tests.TestCaseWithMemoryTransport):
1114
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1356
1116
def test_none_argument(self):
1357
1117
backing = self.get_transport()
1358
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1118
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1359
1119
tree = self.make_branch_and_memory_tree('.')
1360
1120
tree.lock_write()
1398
1158
# Note that it still returns body (of zero bytes).
1399
self.assertEqual(smart_req.SmartServerResponse(
1400
('nosuchrevision', 'missingrevision', ), ''),
1401
request.execute('', 'missingrevision'))
1404
class TestSmartServerRepositoryGetRevIdForRevno(
1405
tests.TestCaseWithMemoryTransport):
1407
def test_revno_found(self):
1408
backing = self.get_transport()
1409
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1410
tree = self.make_branch_and_memory_tree('.')
1413
rev1_id_utf8 = u'\xc8'.encode('utf-8')
1414
rev2_id_utf8 = u'\xc9'.encode('utf-8')
1415
tree.commit('1st commit', rev_id=rev1_id_utf8)
1416
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1419
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1420
request.execute('', 1, (2, rev2_id_utf8)))
1422
def test_known_revid_missing(self):
1423
backing = self.get_transport()
1424
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1425
repo = self.make_repository('.')
1427
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1428
request.execute('', 1, (2, 'ghost')))
1430
def test_history_incomplete(self):
1431
backing = self.get_transport()
1432
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1433
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1435
parent.add([''], ['TREE_ROOT'])
1436
r1 = parent.commit(message='first commit')
1437
r2 = parent.commit(message='second commit')
1439
local = self.make_branch_and_memory_tree('local', format='1.9')
1440
local.branch.pull(parent.branch)
1441
local.set_parent_ids([r2])
1442
r3 = local.commit(message='local commit')
1443
local.branch.create_clone_on_transport(
1444
self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1446
smart_req.SmartServerResponse(('history-incomplete', 2, r2)),
1447
request.execute('stacked', 1, (3, r3)))
1160
SmartServerResponse(('nosuchrevision', 'missingrevision', ), ''),
1161
request.execute('', 'missingrevision'))
1450
1164
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1594
1308
def test_lock_write_on_unlocked_repo(self):
1595
1309
backing = self.get_transport()
1596
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1310
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1597
1311
repository = self.make_repository('.', format='knit')
1598
1312
response = request.execute('')
1599
1313
nonce = repository.control_files._lock.peek().get('nonce')
1600
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1314
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1601
1315
# The repository is now locked. Verify that with a new repository
1603
1317
new_repo = repository.bzrdir.open_repository()
1604
1318
self.assertRaises(errors.LockContention, new_repo.lock_write)
1606
request = smart_repo.SmartServerRepositoryUnlock(backing)
1320
request = smart.repository.SmartServerRepositoryUnlock(backing)
1607
1321
response = request.execute('', nonce)
1609
1323
def test_lock_write_on_locked_repo(self):
1610
1324
backing = self.get_transport()
1611
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1325
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1612
1326
repository = self.make_repository('.', format='knit')
1613
1327
repo_token = repository.lock_write()
1614
1328
repository.leave_lock_in_place()
1615
1329
repository.unlock()
1616
1330
response = request.execute('')
1617
1331
self.assertEqual(
1618
smart_req.SmartServerResponse(('LockContention',)), response)
1332
SmartServerResponse(('LockContention',)), response)
1620
1334
repository.lock_write(repo_token)
1621
1335
repository.dont_leave_lock_in_place()
1702
1416
def test_unlock_on_unlocked_repo(self):
1703
1417
backing = self.get_transport()
1704
request = smart_repo.SmartServerRepositoryUnlock(backing)
1418
request = smart.repository.SmartServerRepositoryUnlock(backing)
1705
1419
repository = self.make_repository('.', format='knit')
1706
1420
response = request.execute('', 'some token')
1707
1421
self.assertEqual(
1708
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1422
SmartServerResponse(('TokenMismatch',)), response)
1711
1425
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1713
1427
def test_is_readonly_no(self):
1714
1428
backing = self.get_transport()
1715
request = smart_req.SmartServerIsReadonly(backing)
1429
request = smart.request.SmartServerIsReadonly(backing)
1716
1430
response = request.execute()
1717
1431
self.assertEqual(
1718
smart_req.SmartServerResponse(('no',)), response)
1432
SmartServerResponse(('no',)), response)
1720
1434
def test_is_readonly_yes(self):
1721
1435
backing = self.get_readonly_transport()
1722
request = smart_req.SmartServerIsReadonly(backing)
1436
request = smart.request.SmartServerIsReadonly(backing)
1723
1437
response = request.execute()
1724
1438
self.assertEqual(
1725
smart_req.SmartServerResponse(('yes',)), response)
1728
class TestSmartServerRepositorySetMakeWorkingTrees(
1729
tests.TestCaseWithMemoryTransport):
1439
SmartServerResponse(('yes',)), response)
1442
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1731
1444
def test_set_false(self):
1732
1445
backing = self.get_transport()
1733
1446
repo = self.make_repository('.', shared=True)
1734
1447
repo.set_make_working_trees(True)
1735
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1448
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1736
1449
request = request_class(backing)
1737
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1450
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1738
1451
request.execute('', 'False'))
1739
1452
repo = repo.bzrdir.open_repository()
1740
1453
self.assertFalse(repo.make_working_trees())
1822
1522
"""All registered request_handlers can be found."""
1823
1523
# If there's a typo in a register_lazy call, this loop will fail with
1824
1524
# an AttributeError.
1825
for key, item in smart_req.request_handlers.iteritems():
1525
for key, item in smart.request.request_handlers.iteritems():
1828
1528
def assertHandlerEqual(self, verb, handler):
1829
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1529
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1831
1531
def test_registered_methods(self):
1832
1532
"""Test that known methods are registered to the correct object."""
1833
1533
self.assertHandlerEqual('Branch.get_config_file',
1834
smart_branch.SmartServerBranchGetConfigFile)
1534
smart.branch.SmartServerBranchGetConfigFile)
1835
1535
self.assertHandlerEqual('Branch.get_parent',
1836
smart_branch.SmartServerBranchGetParent)
1536
smart.branch.SmartServerBranchGetParent)
1837
1537
self.assertHandlerEqual('Branch.get_tags_bytes',
1838
smart_branch.SmartServerBranchGetTagsBytes)
1538
smart.branch.SmartServerBranchGetTagsBytes)
1839
1539
self.assertHandlerEqual('Branch.lock_write',
1840
smart_branch.SmartServerBranchRequestLockWrite)
1540
smart.branch.SmartServerBranchRequestLockWrite)
1841
1541
self.assertHandlerEqual('Branch.last_revision_info',
1842
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1542
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1843
1543
self.assertHandlerEqual('Branch.revision_history',
1844
smart_branch.SmartServerRequestRevisionHistory)
1544
smart.branch.SmartServerRequestRevisionHistory)
1845
1545
self.assertHandlerEqual('Branch.set_config_option',
1846
smart_branch.SmartServerBranchRequestSetConfigOption)
1546
smart.branch.SmartServerBranchRequestSetConfigOption)
1847
1547
self.assertHandlerEqual('Branch.set_last_revision',
1848
smart_branch.SmartServerBranchRequestSetLastRevision)
1548
smart.branch.SmartServerBranchRequestSetLastRevision)
1849
1549
self.assertHandlerEqual('Branch.set_last_revision_info',
1850
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1550
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1851
1551
self.assertHandlerEqual('Branch.set_last_revision_ex',
1852
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1552
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1853
1553
self.assertHandlerEqual('Branch.set_parent_location',
1854
smart_branch.SmartServerBranchRequestSetParentLocation)
1554
smart.branch.SmartServerBranchRequestSetParentLocation)
1855
1555
self.assertHandlerEqual('Branch.unlock',
1856
smart_branch.SmartServerBranchRequestUnlock)
1556
smart.branch.SmartServerBranchRequestUnlock)
1857
1557
self.assertHandlerEqual('BzrDir.find_repository',
1858
smart_dir.SmartServerRequestFindRepositoryV1)
1558
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1859
1559
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1860
smart_dir.SmartServerRequestFindRepositoryV2)
1560
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1861
1561
self.assertHandlerEqual('BzrDirFormat.initialize',
1862
smart_dir.SmartServerRequestInitializeBzrDir)
1863
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1864
smart_dir.SmartServerRequestBzrDirInitializeEx)
1562
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1563
self.assertHandlerEqual('BzrDirFormat.initialize_ex',
1564
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1865
1565
self.assertHandlerEqual('BzrDir.cloning_metadir',
1866
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1566
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1867
1567
self.assertHandlerEqual('BzrDir.get_config_file',
1868
smart_dir.SmartServerBzrDirRequestConfigFile)
1568
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1869
1569
self.assertHandlerEqual('BzrDir.open_branch',
1870
smart_dir.SmartServerRequestOpenBranch)
1570
smart.bzrdir.SmartServerRequestOpenBranch)
1871
1571
self.assertHandlerEqual('BzrDir.open_branchV2',
1872
smart_dir.SmartServerRequestOpenBranchV2)
1873
self.assertHandlerEqual('BzrDir.open_branchV3',
1874
smart_dir.SmartServerRequestOpenBranchV3)
1572
smart.bzrdir.SmartServerRequestOpenBranchV2)
1875
1573
self.assertHandlerEqual('PackRepository.autopack',
1876
smart_packrepo.SmartServerPackRepositoryAutopack)
1574
smart.packrepository.SmartServerPackRepositoryAutopack)
1877
1575
self.assertHandlerEqual('Repository.gather_stats',
1878
smart_repo.SmartServerRepositoryGatherStats)
1576
smart.repository.SmartServerRepositoryGatherStats)
1879
1577
self.assertHandlerEqual('Repository.get_parent_map',
1880
smart_repo.SmartServerRepositoryGetParentMap)
1881
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1882
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1578
smart.repository.SmartServerRepositoryGetParentMap)
1883
1579
self.assertHandlerEqual('Repository.get_revision_graph',
1884
smart_repo.SmartServerRepositoryGetRevisionGraph)
1580
smart.repository.SmartServerRepositoryGetRevisionGraph)
1885
1581
self.assertHandlerEqual('Repository.get_stream',
1886
smart_repo.SmartServerRepositoryGetStream)
1582
smart.repository.SmartServerRepositoryGetStream)
1887
1583
self.assertHandlerEqual('Repository.has_revision',
1888
smart_repo.SmartServerRequestHasRevision)
1584
smart.repository.SmartServerRequestHasRevision)
1889
1585
self.assertHandlerEqual('Repository.insert_stream',
1890
smart_repo.SmartServerRepositoryInsertStream)
1586
smart.repository.SmartServerRepositoryInsertStream)
1891
1587
self.assertHandlerEqual('Repository.insert_stream_locked',
1892
smart_repo.SmartServerRepositoryInsertStreamLocked)
1588
smart.repository.SmartServerRepositoryInsertStreamLocked)
1893
1589
self.assertHandlerEqual('Repository.is_shared',
1894
smart_repo.SmartServerRepositoryIsShared)
1590
smart.repository.SmartServerRepositoryIsShared)
1895
1591
self.assertHandlerEqual('Repository.lock_write',
1896
smart_repo.SmartServerRepositoryLockWrite)
1592
smart.repository.SmartServerRepositoryLockWrite)
1897
1593
self.assertHandlerEqual('Repository.tarball',
1898
smart_repo.SmartServerRepositoryTarball)
1594
smart.repository.SmartServerRepositoryTarball)
1899
1595
self.assertHandlerEqual('Repository.unlock',
1900
smart_repo.SmartServerRepositoryUnlock)
1596
smart.repository.SmartServerRepositoryUnlock)
1901
1597
self.assertHandlerEqual('Transport.is_readonly',
1902
smart_req.SmartServerIsReadonly)
1598
smart.request.SmartServerIsReadonly)