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/..')
286
if (smart_dir.SmartServerRequestFindRepositoryV3 ==
254
if (smart.bzrdir.SmartServerRequestFindRepositoryV3 ==
287
255
self._request_class):
288
return smart_req.SuccessfulSmartServerResponse(
256
return SuccessfulSmartServerResponse(
289
257
('ok', '', rich_root, subtrees, external,
290
258
repo._format.network_name()))
291
elif (smart_dir.SmartServerRequestFindRepositoryV2 ==
259
elif (smart.bzrdir.SmartServerRequestFindRepositoryV2 ==
292
260
self._request_class):
293
261
# All tests so far are on formats, and for non-external
295
return smart_req.SuccessfulSmartServerResponse(
263
return SuccessfulSmartServerResponse(
296
264
('ok', '', rich_root, subtrees, external))
298
return smart_req.SuccessfulSmartServerResponse(
299
('ok', '', rich_root, subtrees))
266
return SuccessfulSmartServerResponse(('ok', '', rich_root, subtrees))
301
268
def test_shared_repository(self):
302
269
"""When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
427
388
"""Initializing an extant directory should fail like the bzrdir api."""
428
389
backing = self.get_transport()
429
390
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
391
request = smart.bzrdir.SmartServerRequestBzrDirInitializeEx(backing)
431
392
self.make_bzrdir('subdir')
432
393
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
394
'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
397
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
399
def test_no_branch(self):
506
400
"""When there is no branch, ('nobranch', ) is returned."""
507
401
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
402
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
403
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
404
self.assertEqual(SmartServerResponse(('nobranch', )),
511
405
request.execute(''))
513
407
def test_branch(self):
514
408
"""When there is a branch, 'ok' is returned."""
515
409
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
410
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
411
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
412
self.assertEqual(SmartServerResponse(('ok', '')),
519
413
request.execute(''))
521
415
def test_branch_reference(self):
522
416
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
417
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
418
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
419
branch = self.make_branch('branch')
527
420
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
421
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
422
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
423
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
424
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
427
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
430
"""When there is no branch, ('nobranch', ) is returned."""
547
431
backing = self.get_transport()
548
432
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')),
433
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
434
self.assertEqual(SmartServerResponse(('nobranch', )),
437
def test_branch(self):
438
"""When there is a branch, 'ok' is returned."""
439
backing = self.get_transport()
440
expected = self.make_branch('.')._format.network_name()
441
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
442
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
445
def test_branch_reference(self):
446
"""When there is a branch reference, the reference URL is returned."""
447
backing = self.get_transport()
448
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
449
branch = self.make_branch('branch')
450
checkout = branch.create_checkout('reference',lightweight=True)
451
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
452
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
453
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
454
request.execute('reference'))
456
def test_stacked_branch(self):
457
"""Opening a stacked branch does not open the stacked-on branch."""
458
trunk = self.make_branch('trunk')
459
feature = self.make_branch('feature')
460
feature.set_stacked_on_url(trunk.base)
462
Branch.hooks.install_named_hook('open', opened_branches.append, None)
463
backing = self.get_transport()
464
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
467
response = request.execute('feature')
469
request.teardown_jail()
470
expected_format = feature._format.network_name()
472
SuccessfulSmartServerResponse(('branch', expected_format)),
474
self.assertLength(1, opened_branches)
670
477
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
512
def test_branch_reference(self):
706
513
"""When there is a branch reference, NotBranchError is raised."""
707
514
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
515
request = smart.branch.SmartServerBranchRequest(backing)
709
516
branch = self.make_branch('branch')
710
517
checkout = branch.create_checkout('reference',lightweight=True)
711
518
self.assertRaises(errors.NotBranchError,
712
519
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
522
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
524
def test_empty(self):
719
525
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
526
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
527
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
528
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
529
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
530
request.execute(''))
726
532
def test_not_empty(self):
727
533
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
534
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
535
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
536
tree = self.make_branch_and_memory_tree('.')
731
537
tree.lock_write()
778
583
def test_value_name(self):
779
584
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
585
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
586
branch.bzrdir.root_transport)
782
587
branch_token, repo_token = self.get_lock_tokens(branch)
783
588
config = branch._get_config()
784
589
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
591
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
592
self.assertEqual('bar', config.get_option('foo'))
791
596
def test_value_name_section(self):
792
597
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
598
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
599
branch.bzrdir.root_transport)
795
600
branch_token, repo_token = self.get_lock_tokens(branch)
796
601
config = branch._get_config()
797
602
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
604
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
605
self.assertEqual('bar', config.get_option('foo', 'gam'))
1145
948
def test_lock_write_on_unlocked_branch(self):
1146
949
backing = self.get_transport()
1147
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
950
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1148
951
branch = self.make_branch('.', format='knit')
1149
952
repository = branch.repository
1150
953
response = request.execute('')
1151
954
branch_nonce = branch.control_files._lock.peek().get('nonce')
1152
955
repository_nonce = repository.control_files._lock.peek().get('nonce')
1153
self.assertEqual(smart_req.SmartServerResponse(
1154
('ok', branch_nonce, repository_nonce)),
957
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1156
959
# The branch (and associated repository) is now locked. Verify that
1157
960
# with a new branch object.
1158
961
new_branch = repository.bzrdir.open_branch()
1159
962
self.assertRaises(errors.LockContention, new_branch.lock_write)
1161
request = smart_branch.SmartServerBranchRequestUnlock(backing)
964
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1162
965
response = request.execute('', branch_nonce, repository_nonce)
1164
967
def test_lock_write_on_locked_branch(self):
1165
968
backing = self.get_transport()
1166
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
969
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1167
970
branch = self.make_branch('.')
1168
971
branch_token = branch.lock_write()
1169
972
branch.leave_lock_in_place()
1171
974
response = request.execute('')
1172
975
self.assertEqual(
1173
smart_req.SmartServerResponse(('LockContention',)), response)
976
SmartServerResponse(('LockContention',)), response)
1175
978
branch.lock_write(branch_token)
1176
979
branch.dont_leave_lock_in_place()
1327
1129
def test_trivial_bzipped(self):
1328
1130
# This tests that the wire encoding is actually bzipped
1329
1131
backing = self.get_transport()
1330
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1132
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1331
1133
tree = self.make_branch_and_memory_tree('.')
1333
1135
self.assertEqual(None,
1334
1136
request.execute('', 'missing-id'))
1335
1137
# Note that it returns a body that is bzipped.
1336
1138
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1139
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1338
1140
request.do_body('\n\n0\n'))
1340
1142
def test_trivial_include_missing(self):
1341
1143
backing = self.get_transport()
1342
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1144
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1343
1145
tree = self.make_branch_and_memory_tree('.')
1345
1147
self.assertEqual(None,
1346
1148
request.execute('', 'missing-id', 'include-missing:'))
1347
1149
self.assertEqual(
1348
smart_req.SuccessfulSmartServerResponse(('ok', ),
1150
SuccessfulSmartServerResponse(('ok', ),
1349
1151
bz2.compress('missing:missing-id')),
1350
1152
request.do_body('\n\n0\n'))
1353
class TestSmartServerRepositoryGetRevisionGraph(
1354
tests.TestCaseWithMemoryTransport):
1155
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1356
1157
def test_none_argument(self):
1357
1158
backing = self.get_transport()
1358
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1159
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1359
1160
tree = self.make_branch_and_memory_tree('.')
1360
1161
tree.lock_write()
1416
1216
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1419
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1219
self.assertEqual(SmartServerResponse(('ok', rev1_id_utf8)),
1420
1220
request.execute('', 1, (2, rev2_id_utf8)))
1422
1222
def test_known_revid_missing(self):
1423
1223
backing = self.get_transport()
1424
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1224
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1425
1225
repo = self.make_repository('.')
1426
1226
self.assertEqual(
1427
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1227
FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1428
1228
request.execute('', 1, (2, 'ghost')))
1430
1230
def test_history_incomplete(self):
1431
1231
backing = self.get_transport()
1432
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1232
request = smart.repository.SmartServerRepositoryGetRevIdForRevno(backing)
1433
1233
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1434
1234
parent.lock_write()
1435
1235
parent.add([''], ['TREE_ROOT'])
1594
1394
def test_lock_write_on_unlocked_repo(self):
1595
1395
backing = self.get_transport()
1596
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1396
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1597
1397
repository = self.make_repository('.', format='knit')
1598
1398
response = request.execute('')
1599
1399
nonce = repository.control_files._lock.peek().get('nonce')
1600
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1400
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1601
1401
# The repository is now locked. Verify that with a new repository
1603
1403
new_repo = repository.bzrdir.open_repository()
1604
1404
self.assertRaises(errors.LockContention, new_repo.lock_write)
1606
request = smart_repo.SmartServerRepositoryUnlock(backing)
1406
request = smart.repository.SmartServerRepositoryUnlock(backing)
1607
1407
response = request.execute('', nonce)
1609
1409
def test_lock_write_on_locked_repo(self):
1610
1410
backing = self.get_transport()
1611
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1411
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1612
1412
repository = self.make_repository('.', format='knit')
1613
1413
repo_token = repository.lock_write()
1614
1414
repository.leave_lock_in_place()
1615
1415
repository.unlock()
1616
1416
response = request.execute('')
1617
1417
self.assertEqual(
1618
smart_req.SmartServerResponse(('LockContention',)), response)
1418
SmartServerResponse(('LockContention',)), response)
1620
1420
repository.lock_write(repo_token)
1621
1421
repository.dont_leave_lock_in_place()
1702
1502
def test_unlock_on_unlocked_repo(self):
1703
1503
backing = self.get_transport()
1704
request = smart_repo.SmartServerRepositoryUnlock(backing)
1504
request = smart.repository.SmartServerRepositoryUnlock(backing)
1705
1505
repository = self.make_repository('.', format='knit')
1706
1506
response = request.execute('', 'some token')
1707
1507
self.assertEqual(
1708
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1508
SmartServerResponse(('TokenMismatch',)), response)
1711
1511
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1713
1513
def test_is_readonly_no(self):
1714
1514
backing = self.get_transport()
1715
request = smart_req.SmartServerIsReadonly(backing)
1515
request = smart.request.SmartServerIsReadonly(backing)
1716
1516
response = request.execute()
1717
1517
self.assertEqual(
1718
smart_req.SmartServerResponse(('no',)), response)
1518
SmartServerResponse(('no',)), response)
1720
1520
def test_is_readonly_yes(self):
1721
1521
backing = self.get_readonly_transport()
1722
request = smart_req.SmartServerIsReadonly(backing)
1522
request = smart.request.SmartServerIsReadonly(backing)
1723
1523
response = request.execute()
1724
1524
self.assertEqual(
1725
smart_req.SmartServerResponse(('yes',)), response)
1728
class TestSmartServerRepositorySetMakeWorkingTrees(
1729
tests.TestCaseWithMemoryTransport):
1525
SmartServerResponse(('yes',)), response)
1528
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1731
1530
def test_set_false(self):
1732
1531
backing = self.get_transport()
1733
1532
repo = self.make_repository('.', shared=True)
1734
1533
repo.set_make_working_trees(True)
1735
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1534
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1736
1535
request = request_class(backing)
1737
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1536
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1738
1537
request.execute('', 'False'))
1739
1538
repo = repo.bzrdir.open_repository()
1740
1539
self.assertFalse(repo.make_working_trees())
1822
1608
"""All registered request_handlers can be found."""
1823
1609
# If there's a typo in a register_lazy call, this loop will fail with
1824
1610
# an AttributeError.
1825
for key, item in smart_req.request_handlers.iteritems():
1611
for key, item in smart.request.request_handlers.iteritems():
1828
1614
def assertHandlerEqual(self, verb, handler):
1829
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1615
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1831
1617
def test_registered_methods(self):
1832
1618
"""Test that known methods are registered to the correct object."""
1833
1619
self.assertHandlerEqual('Branch.get_config_file',
1834
smart_branch.SmartServerBranchGetConfigFile)
1620
smart.branch.SmartServerBranchGetConfigFile)
1835
1621
self.assertHandlerEqual('Branch.get_parent',
1836
smart_branch.SmartServerBranchGetParent)
1622
smart.branch.SmartServerBranchGetParent)
1837
1623
self.assertHandlerEqual('Branch.get_tags_bytes',
1838
smart_branch.SmartServerBranchGetTagsBytes)
1624
smart.branch.SmartServerBranchGetTagsBytes)
1839
1625
self.assertHandlerEqual('Branch.lock_write',
1840
smart_branch.SmartServerBranchRequestLockWrite)
1626
smart.branch.SmartServerBranchRequestLockWrite)
1841
1627
self.assertHandlerEqual('Branch.last_revision_info',
1842
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1628
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1843
1629
self.assertHandlerEqual('Branch.revision_history',
1844
smart_branch.SmartServerRequestRevisionHistory)
1630
smart.branch.SmartServerRequestRevisionHistory)
1845
1631
self.assertHandlerEqual('Branch.set_config_option',
1846
smart_branch.SmartServerBranchRequestSetConfigOption)
1632
smart.branch.SmartServerBranchRequestSetConfigOption)
1847
1633
self.assertHandlerEqual('Branch.set_last_revision',
1848
smart_branch.SmartServerBranchRequestSetLastRevision)
1634
smart.branch.SmartServerBranchRequestSetLastRevision)
1849
1635
self.assertHandlerEqual('Branch.set_last_revision_info',
1850
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1636
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1851
1637
self.assertHandlerEqual('Branch.set_last_revision_ex',
1852
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1638
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1853
1639
self.assertHandlerEqual('Branch.set_parent_location',
1854
smart_branch.SmartServerBranchRequestSetParentLocation)
1640
smart.branch.SmartServerBranchRequestSetParentLocation)
1855
1641
self.assertHandlerEqual('Branch.unlock',
1856
smart_branch.SmartServerBranchRequestUnlock)
1642
smart.branch.SmartServerBranchRequestUnlock)
1857
1643
self.assertHandlerEqual('BzrDir.find_repository',
1858
smart_dir.SmartServerRequestFindRepositoryV1)
1644
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1859
1645
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1860
smart_dir.SmartServerRequestFindRepositoryV2)
1646
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1861
1647
self.assertHandlerEqual('BzrDirFormat.initialize',
1862
smart_dir.SmartServerRequestInitializeBzrDir)
1648
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1863
1649
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1864
smart_dir.SmartServerRequestBzrDirInitializeEx)
1650
smart.bzrdir.SmartServerRequestBzrDirInitializeEx)
1865
1651
self.assertHandlerEqual('BzrDir.cloning_metadir',
1866
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1652
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1867
1653
self.assertHandlerEqual('BzrDir.get_config_file',
1868
smart_dir.SmartServerBzrDirRequestConfigFile)
1654
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1869
1655
self.assertHandlerEqual('BzrDir.open_branch',
1870
smart_dir.SmartServerRequestOpenBranch)
1656
smart.bzrdir.SmartServerRequestOpenBranch)
1871
1657
self.assertHandlerEqual('BzrDir.open_branchV2',
1872
smart_dir.SmartServerRequestOpenBranchV2)
1873
self.assertHandlerEqual('BzrDir.open_branchV3',
1874
smart_dir.SmartServerRequestOpenBranchV3)
1658
smart.bzrdir.SmartServerRequestOpenBranchV2)
1875
1659
self.assertHandlerEqual('PackRepository.autopack',
1876
smart_packrepo.SmartServerPackRepositoryAutopack)
1660
smart.packrepository.SmartServerPackRepositoryAutopack)
1877
1661
self.assertHandlerEqual('Repository.gather_stats',
1878
smart_repo.SmartServerRepositoryGatherStats)
1662
smart.repository.SmartServerRepositoryGatherStats)
1879
1663
self.assertHandlerEqual('Repository.get_parent_map',
1880
smart_repo.SmartServerRepositoryGetParentMap)
1664
smart.repository.SmartServerRepositoryGetParentMap)
1881
1665
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1882
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1666
smart.repository.SmartServerRepositoryGetRevIdForRevno)
1883
1667
self.assertHandlerEqual('Repository.get_revision_graph',
1884
smart_repo.SmartServerRepositoryGetRevisionGraph)
1668
smart.repository.SmartServerRepositoryGetRevisionGraph)
1885
1669
self.assertHandlerEqual('Repository.get_stream',
1886
smart_repo.SmartServerRepositoryGetStream)
1670
smart.repository.SmartServerRepositoryGetStream)
1887
1671
self.assertHandlerEqual('Repository.has_revision',
1888
smart_repo.SmartServerRequestHasRevision)
1672
smart.repository.SmartServerRequestHasRevision)
1889
1673
self.assertHandlerEqual('Repository.insert_stream',
1890
smart_repo.SmartServerRepositoryInsertStream)
1674
smart.repository.SmartServerRepositoryInsertStream)
1891
1675
self.assertHandlerEqual('Repository.insert_stream_locked',
1892
smart_repo.SmartServerRepositoryInsertStreamLocked)
1676
smart.repository.SmartServerRepositoryInsertStreamLocked)
1893
1677
self.assertHandlerEqual('Repository.is_shared',
1894
smart_repo.SmartServerRepositoryIsShared)
1678
smart.repository.SmartServerRepositoryIsShared)
1895
1679
self.assertHandlerEqual('Repository.lock_write',
1896
smart_repo.SmartServerRepositoryLockWrite)
1680
smart.repository.SmartServerRepositoryLockWrite)
1897
1681
self.assertHandlerEqual('Repository.tarball',
1898
smart_repo.SmartServerRepositoryTarball)
1682
smart.repository.SmartServerRepositoryTarball)
1899
1683
self.assertHandlerEqual('Repository.unlock',
1900
smart_repo.SmartServerRepositoryUnlock)
1684
smart.repository.SmartServerRepositoryUnlock)
1901
1685
self.assertHandlerEqual('Transport.is_readonly',
1902
smart_req.SmartServerIsReadonly)
1686
smart.request.SmartServerIsReadonly)