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 (
39
from bzrlib.branch import Branch, BranchReferenceFormat
40
import bzrlib.smart.branch
41
import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
42
import bzrlib.smart.packrepository
43
import bzrlib.smart.repository
44
from bzrlib.smart.request import (
45
FailedSmartServerResponse,
48
SuccessfulSmartServerResponse,
50
from bzrlib.tests import (
53
from bzrlib.transport import chroot, get_transport
54
from bzrlib.util import bencode
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'."""
378
337
def test_missing_dir(self):
379
338
"""Initializing a missing directory should fail like the bzrdir api."""
380
339
backing = self.get_transport()
381
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
340
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
382
341
self.assertRaises(errors.NoSuchFile,
383
342
request.execute, 'subdir')
385
344
def test_initialized_dir(self):
386
345
"""Initializing an extant bzrdir should fail like the bzrdir api."""
387
346
backing = self.get_transport()
388
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
347
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
389
348
self.make_bzrdir('subdir')
390
349
self.assertRaises(errors.FileExists,
391
350
request.execute, 'subdir')
394
class TestSmartServerRequestBzrDirInitializeEx(
395
tests.TestCaseWithMemoryTransport):
396
"""Basic tests for BzrDir.initialize_ex_1.16 in the smart server.
398
The main unit tests in test_bzrdir exercise the API comprehensively.
401
def test_empty_dir(self):
402
"""Initializing an empty dir should succeed and do it."""
403
backing = self.get_transport()
404
name = self.make_bzrdir('reference')._format.network_name()
405
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
407
smart_req.SmartServerResponse(('', '', '', '', '', '', name,
408
'False', '', '', '')),
409
request.execute(name, '', 'True', 'False', 'False', '', '', '', '',
411
made_dir = bzrdir.BzrDir.open_from_transport(backing)
412
# no branch, tree or repository is expected with the current
414
self.assertRaises(errors.NoWorkingTree, made_dir.open_workingtree)
415
self.assertRaises(errors.NotBranchError, made_dir.open_branch)
416
self.assertRaises(errors.NoRepositoryPresent, made_dir.open_repository)
418
def test_missing_dir(self):
419
"""Initializing a missing directory should fail like the bzrdir api."""
420
backing = self.get_transport()
421
name = self.make_bzrdir('reference')._format.network_name()
422
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
423
self.assertRaises(errors.NoSuchFile, request.execute, name,
424
'subdir/dir', 'False', 'False', 'False', '', '', '', '', 'False')
426
def test_initialized_dir(self):
427
"""Initializing an extant directory should fail like the bzrdir api."""
428
backing = self.get_transport()
429
name = self.make_bzrdir('reference')._format.network_name()
430
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
431
self.make_bzrdir('subdir')
432
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
433
'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
353
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
355
def test_no_branch(self):
506
356
"""When there is no branch, ('nobranch', ) is returned."""
507
357
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
358
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
359
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
360
self.assertEqual(SmartServerResponse(('nobranch', )),
511
361
request.execute(''))
513
363
def test_branch(self):
514
364
"""When there is a branch, 'ok' is returned."""
515
365
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
366
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
367
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
368
self.assertEqual(SmartServerResponse(('ok', '')),
519
369
request.execute(''))
521
371
def test_branch_reference(self):
522
372
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
373
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
374
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
375
branch = self.make_branch('branch')
527
376
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
377
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
378
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
379
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
380
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
383
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
546
386
"""When there is no branch, ('nobranch', ) is returned."""
547
387
backing = self.get_transport()
548
388
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')),
389
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
390
self.assertEqual(SmartServerResponse(('nobranch', )),
393
def test_branch(self):
394
"""When there is a branch, 'ok' is returned."""
395
backing = self.get_transport()
396
expected = self.make_branch('.')._format.network_name()
397
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
398
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
401
def test_branch_reference(self):
402
"""When there is a branch reference, the reference URL is returned."""
403
backing = self.get_transport()
404
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
405
branch = self.make_branch('branch')
406
checkout = branch.create_checkout('reference',lightweight=True)
407
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
408
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
409
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
410
request.execute('reference'))
412
def test_stacked_branch(self):
413
"""Opening a stacked branch does not open the stacked-on branch."""
414
trunk = self.make_branch('trunk')
415
feature = self.make_branch('feature', format='1.9')
416
feature.set_stacked_on_url(trunk.base)
418
Branch.hooks.install_named_hook('open', opened_branches.append, None)
419
backing = self.get_transport()
420
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
423
response = request.execute('feature')
425
request.teardown_jail()
426
expected_format = feature._format.network_name()
428
SuccessfulSmartServerResponse(('branch', expected_format)),
430
self.assertLength(1, opened_branches)
670
433
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
705
468
def test_branch_reference(self):
706
469
"""When there is a branch reference, NotBranchError is raised."""
707
470
backing = self.get_transport()
708
request = smart_branch.SmartServerBranchRequest(backing)
471
request = smart.branch.SmartServerBranchRequest(backing)
709
472
branch = self.make_branch('branch')
710
473
checkout = branch.create_checkout('reference',lightweight=True)
711
474
self.assertRaises(errors.NotBranchError,
712
475
request.execute, 'checkout')
715
class TestSmartServerBranchRequestLastRevisionInfo(
716
tests.TestCaseWithMemoryTransport):
478
class TestSmartServerBranchRequestLastRevisionInfo(tests.TestCaseWithMemoryTransport):
718
480
def test_empty(self):
719
481
"""For an empty branch, the result is ('ok', '0', 'null:')."""
720
482
backing = self.get_transport()
721
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
483
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
722
484
self.make_branch('.')
723
self.assertEqual(smart_req.SmartServerResponse(('ok', '0', 'null:')),
485
self.assertEqual(SmartServerResponse(('ok', '0', 'null:')),
724
486
request.execute(''))
726
488
def test_not_empty(self):
727
489
"""For a non-empty branch, the result is ('ok', 'revno', 'revid')."""
728
490
backing = self.get_transport()
729
request = smart_branch.SmartServerBranchRequestLastRevisionInfo(backing)
491
request = smart.branch.SmartServerBranchRequestLastRevisionInfo(backing)
730
492
tree = self.make_branch_and_memory_tree('.')
731
493
tree.lock_write()
778
539
def test_value_name(self):
779
540
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
541
request = smart.branch.SmartServerBranchRequestSetConfigOption(
781
542
branch.bzrdir.root_transport)
782
543
branch_token, repo_token = self.get_lock_tokens(branch)
783
544
config = branch._get_config()
784
545
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
547
self.assertEqual(SuccessfulSmartServerResponse(()), result)
787
548
self.assertEqual('bar', config.get_option('foo'))
791
550
def test_value_name_section(self):
792
551
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
552
request = smart.branch.SmartServerBranchRequestSetConfigOption(
794
553
branch.bzrdir.root_transport)
795
554
branch_token, repo_token = self.get_lock_tokens(branch)
796
555
config = branch._get_config()
797
556
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
558
self.assertEqual(SuccessfulSmartServerResponse(()), result)
800
559
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
562
class SetLastRevisionTestBase(TestLockedBranch):
1059
778
def test_get_parent_none(self):
1060
779
base_branch = self.make_branch('base')
1061
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
780
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1062
781
response = request.execute('base')
1063
782
self.assertEquals(
1064
smart_req.SuccessfulSmartServerResponse(('',)), response)
783
SuccessfulSmartServerResponse(('',)), response)
1066
785
def test_get_parent_something(self):
1067
786
base_branch = self.make_branch('base')
1068
787
base_branch.set_parent(self.get_url('foo'))
1069
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
788
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1070
789
response = request.execute('base')
1071
790
self.assertEquals(
1072
smart_req.SuccessfulSmartServerResponse(("../foo",)),
791
SuccessfulSmartServerResponse(("../foo",)),
1076
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
795
class TestSmartServerBranchRequestSetParent(tests.TestCaseWithMemoryTransport):
1078
797
def test_set_parent_none(self):
1079
798
branch = self.make_branch('base', format="1.9")
1080
799
branch.lock_write()
1081
800
branch._set_parent_location('foo')
1083
request = smart_branch.SmartServerBranchRequestSetParentLocation(
802
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1084
803
self.get_transport())
1085
branch_token, repo_token = self.get_lock_tokens(branch)
804
branch_token = branch.lock_write()
805
repo_token = branch.repository.lock_write()
1087
807
response = request.execute('base', branch_token, repo_token, '')
809
branch.repository.unlock()
1090
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
811
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1091
812
self.assertEqual(None, branch.get_parent())
1093
814
def test_set_parent_something(self):
1094
815
branch = self.make_branch('base', format="1.9")
1095
request = smart_branch.SmartServerBranchRequestSetParentLocation(
816
request = smart.branch.SmartServerBranchRequestSetParentLocation(
1096
817
self.get_transport())
1097
branch_token, repo_token = self.get_lock_tokens(branch)
818
branch_token = branch.lock_write()
819
repo_token = branch.repository.lock_write()
1099
821
response = request.execute('base', branch_token, repo_token,
824
branch.repository.unlock()
1103
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
826
self.assertEqual(SuccessfulSmartServerResponse(()), response)
1104
827
self.assertEqual('http://bar/', branch.get_parent())
1107
class TestSmartServerBranchRequestGetTagsBytes(
1108
tests.TestCaseWithMemoryTransport):
1109
# Only called when the branch format and tags match [yay factory
1110
# methods] so only need to test straight forward cases.
830
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
831
# Only called when the branch format and tags match [yay factory
832
# methods] so only need to test straight forward cases.
1112
834
def test_get_bytes(self):
1113
835
base_branch = self.make_branch('base')
1114
request = smart_branch.SmartServerBranchGetTagsBytes(
836
request = smart.branch.SmartServerBranchGetTagsBytes(
1115
837
self.get_transport())
1116
838
response = request.execute('base')
1117
839
self.assertEquals(
1118
smart_req.SuccessfulSmartServerResponse(('',)), response)
840
SuccessfulSmartServerResponse(('',)), response)
1121
843
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1125
847
stacked_branch = self.make_branch('stacked', format='1.6')
1126
848
# typically should be relative
1127
849
stacked_branch.set_stacked_on_url('../base')
1128
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
850
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1129
851
self.get_transport())
1130
852
response = request.execute('stacked')
1131
853
self.assertEquals(
1132
smart_req.SmartServerResponse(('ok', '../base')),
854
SmartServerResponse(('ok', '../base')),
1136
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
858
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1138
860
def setUp(self):
1139
861
tests.TestCaseWithMemoryTransport.setUp(self)
1141
863
def test_lock_write_on_unlocked_branch(self):
1142
864
backing = self.get_transport()
1143
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
865
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1144
866
branch = self.make_branch('.', format='knit')
1145
867
repository = branch.repository
1146
868
response = request.execute('')
1147
869
branch_nonce = branch.control_files._lock.peek().get('nonce')
1148
870
repository_nonce = repository.control_files._lock.peek().get('nonce')
1149
self.assertEqual(smart_req.SmartServerResponse(
1150
('ok', branch_nonce, repository_nonce)),
872
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1152
874
# The branch (and associated repository) is now locked. Verify that
1153
875
# with a new branch object.
1154
876
new_branch = repository.bzrdir.open_branch()
1155
877
self.assertRaises(errors.LockContention, new_branch.lock_write)
1157
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1158
response = request.execute('', branch_nonce, repository_nonce)
1160
879
def test_lock_write_on_locked_branch(self):
1161
880
backing = self.get_transport()
1162
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
881
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1163
882
branch = self.make_branch('.')
1164
branch_token = branch.lock_write().branch_token
1165
884
branch.leave_lock_in_place()
1167
886
response = request.execute('')
1168
887
self.assertEqual(
1169
smart_req.SmartServerResponse(('LockContention',)), response)
1171
branch.lock_write(branch_token)
1172
branch.dont_leave_lock_in_place()
888
SmartServerResponse(('LockContention',)), response)
1175
890
def test_lock_write_with_tokens_on_locked_branch(self):
1176
891
backing = self.get_transport()
1177
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
892
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1178
893
branch = self.make_branch('.', format='knit')
1179
branch_token, repo_token = self.get_lock_tokens(branch)
894
branch_token = branch.lock_write()
895
repo_token = branch.repository.lock_write()
896
branch.repository.unlock()
1180
897
branch.leave_lock_in_place()
1181
898
branch.repository.leave_lock_in_place()
1183
900
response = request.execute('',
1184
901
branch_token, repo_token)
1185
902
self.assertEqual(
1186
smart_req.SmartServerResponse(('ok', branch_token, repo_token)),
1189
branch.repository.lock_write(repo_token)
1190
branch.repository.dont_leave_lock_in_place()
1191
branch.repository.unlock()
1192
branch.lock_write(branch_token)
1193
branch.dont_leave_lock_in_place()
903
SmartServerResponse(('ok', branch_token, repo_token)), response)
1196
905
def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1197
906
backing = self.get_transport()
1198
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
907
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1199
908
branch = self.make_branch('.', format='knit')
1200
branch_token, repo_token = self.get_lock_tokens(branch)
909
branch_token = branch.lock_write()
910
repo_token = branch.repository.lock_write()
911
branch.repository.unlock()
1201
912
branch.leave_lock_in_place()
1202
913
branch.repository.leave_lock_in_place()
1204
915
response = request.execute('',
1205
916
branch_token+'xxx', repo_token)
1206
917
self.assertEqual(
1207
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1209
branch.repository.lock_write(repo_token)
1210
branch.repository.dont_leave_lock_in_place()
1211
branch.repository.unlock()
1212
branch.lock_write(branch_token)
1213
branch.dont_leave_lock_in_place()
918
SmartServerResponse(('TokenMismatch',)), response)
1216
920
def test_lock_write_on_locked_repo(self):
1217
921
backing = self.get_transport()
1218
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
922
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1219
923
branch = self.make_branch('.', format='knit')
1220
repo = branch.repository
1221
repo_token = repo.lock_write().repository_token
1222
repo.leave_lock_in_place()
924
branch.repository.lock_write()
925
branch.repository.leave_lock_in_place()
926
branch.repository.unlock()
1224
927
response = request.execute('')
1225
928
self.assertEqual(
1226
smart_req.SmartServerResponse(('LockContention',)), response)
1228
repo.lock_write(repo_token)
1229
repo.dont_leave_lock_in_place()
929
SmartServerResponse(('LockContention',)), response)
1232
931
def test_lock_write_on_readonly_transport(self):
1233
932
backing = self.get_readonly_transport()
1234
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
933
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1235
934
branch = self.make_branch('.')
1236
935
root = self.get_transport().clone('/')
1237
936
path = urlutils.relative_url(root.base, self.get_transport().base)
1270
971
def test_unlock_on_unlocked_branch_unlocked_repo(self):
1271
972
backing = self.get_transport()
1272
request = smart_branch.SmartServerBranchRequestUnlock(backing)
973
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1273
974
branch = self.make_branch('.', format='knit')
1274
975
response = request.execute(
1275
976
'', 'branch token', 'repo token')
1276
977
self.assertEqual(
1277
smart_req.SmartServerResponse(('TokenMismatch',)), response)
978
SmartServerResponse(('TokenMismatch',)), response)
1279
980
def test_unlock_on_unlocked_branch_locked_repo(self):
1280
981
backing = self.get_transport()
1281
request = smart_branch.SmartServerBranchRequestUnlock(backing)
982
request = smart.branch.SmartServerBranchRequestUnlock(backing)
1282
983
branch = self.make_branch('.', format='knit')
1283
984
# Lock the repository.
1284
repo_token = branch.repository.lock_write().repository_token
985
repo_token = branch.repository.lock_write()
1285
986
branch.repository.leave_lock_in_place()
1286
987
branch.repository.unlock()
1287
988
# Issue branch lock_write request on the unlocked branch (with locked
1289
response = request.execute('', 'branch token', repo_token)
990
response = request.execute(
991
'', 'branch token', repo_token)
1290
992
self.assertEqual(
1291
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1293
branch.repository.lock_write(repo_token)
1294
branch.repository.dont_leave_lock_in_place()
1295
branch.repository.unlock()
993
SmartServerResponse(('TokenMismatch',)), response)
1298
996
class TestSmartServerRepositoryRequest(tests.TestCaseWithMemoryTransport):
1316
1014
def test_trivial_bzipped(self):
1317
1015
# This tests that the wire encoding is actually bzipped
1318
1016
backing = self.get_transport()
1319
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1017
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1320
1018
tree = self.make_branch_and_memory_tree('.')
1322
1020
self.assertEqual(None,
1323
1021
request.execute('', 'missing-id'))
1324
1022
# Note that it returns a body that is bzipped.
1325
1023
self.assertEqual(
1326
smart_req.SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1024
SuccessfulSmartServerResponse(('ok', ), bz2.compress('')),
1327
1025
request.do_body('\n\n0\n'))
1329
1027
def test_trivial_include_missing(self):
1330
1028
backing = self.get_transport()
1331
request = smart_repo.SmartServerRepositoryGetParentMap(backing)
1029
request = smart.repository.SmartServerRepositoryGetParentMap(backing)
1332
1030
tree = self.make_branch_and_memory_tree('.')
1334
1032
self.assertEqual(None,
1335
1033
request.execute('', 'missing-id', 'include-missing:'))
1336
1034
self.assertEqual(
1337
smart_req.SuccessfulSmartServerResponse(('ok', ),
1035
SuccessfulSmartServerResponse(('ok', ),
1338
1036
bz2.compress('missing:missing-id')),
1339
1037
request.do_body('\n\n0\n'))
1342
class TestSmartServerRepositoryGetRevisionGraph(
1343
tests.TestCaseWithMemoryTransport):
1040
class TestSmartServerRepositoryGetRevisionGraph(tests.TestCaseWithMemoryTransport):
1345
1042
def test_none_argument(self):
1346
1043
backing = self.get_transport()
1347
request = smart_repo.SmartServerRepositoryGetRevisionGraph(backing)
1044
request = smart.repository.SmartServerRepositoryGetRevisionGraph(backing)
1348
1045
tree = self.make_branch_and_memory_tree('.')
1349
1046
tree.lock_write()
1387
1084
# Note that it still returns body (of zero bytes).
1388
self.assertEqual(smart_req.SmartServerResponse(
1389
('nosuchrevision', 'missingrevision', ), ''),
1390
request.execute('', 'missingrevision'))
1393
class TestSmartServerRepositoryGetRevIdForRevno(
1394
tests.TestCaseWithMemoryTransport):
1396
def test_revno_found(self):
1397
backing = self.get_transport()
1398
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1399
tree = self.make_branch_and_memory_tree('.')
1402
rev1_id_utf8 = u'\xc8'.encode('utf-8')
1403
rev2_id_utf8 = u'\xc9'.encode('utf-8')
1404
tree.commit('1st commit', rev_id=rev1_id_utf8)
1405
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1408
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1409
request.execute('', 1, (2, rev2_id_utf8)))
1411
def test_known_revid_missing(self):
1412
backing = self.get_transport()
1413
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1414
repo = self.make_repository('.')
1416
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1417
request.execute('', 1, (2, 'ghost')))
1419
def test_history_incomplete(self):
1420
backing = self.get_transport()
1421
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1422
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1424
parent.add([''], ['TREE_ROOT'])
1425
r1 = parent.commit(message='first commit')
1426
r2 = parent.commit(message='second commit')
1428
local = self.make_branch_and_memory_tree('local', format='1.9')
1429
local.branch.pull(parent.branch)
1430
local.set_parent_ids([r2])
1431
r3 = local.commit(message='local commit')
1432
local.branch.create_clone_on_transport(
1433
self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1435
smart_req.SmartServerResponse(('history-incomplete', 2, r2)),
1436
request.execute('stacked', 1, (3, r3)))
1086
SmartServerResponse(('nosuchrevision', 'missingrevision', ), ''),
1087
request.execute('', 'missingrevision'))
1439
1090
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1583
1234
def test_lock_write_on_unlocked_repo(self):
1584
1235
backing = self.get_transport()
1585
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1236
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1586
1237
repository = self.make_repository('.', format='knit')
1587
1238
response = request.execute('')
1588
1239
nonce = repository.control_files._lock.peek().get('nonce')
1589
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
1240
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1590
1241
# The repository is now locked. Verify that with a new repository
1592
1243
new_repo = repository.bzrdir.open_repository()
1593
1244
self.assertRaises(errors.LockContention, new_repo.lock_write)
1595
request = smart_repo.SmartServerRepositoryUnlock(backing)
1596
response = request.execute('', nonce)
1598
1246
def test_lock_write_on_locked_repo(self):
1599
1247
backing = self.get_transport()
1600
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1248
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1601
1249
repository = self.make_repository('.', format='knit')
1602
repo_token = repository.lock_write().repository_token
1250
repository.lock_write()
1603
1251
repository.leave_lock_in_place()
1604
1252
repository.unlock()
1605
1253
response = request.execute('')
1606
1254
self.assertEqual(
1607
smart_req.SmartServerResponse(('LockContention',)), response)
1609
repository.lock_write(repo_token)
1610
repository.dont_leave_lock_in_place()
1255
SmartServerResponse(('LockContention',)), response)
1613
1257
def test_lock_write_on_readonly_transport(self):
1614
1258
backing = self.get_readonly_transport()
1615
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1259
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1616
1260
repository = self.make_repository('.', format='knit')
1617
1261
response = request.execute('')
1618
1262
self.assertFalse(response.is_successful())
1631
1275
def test_insert_stream_empty(self):
1632
1276
backing = self.get_transport()
1633
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1277
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1634
1278
repository = self.make_repository('.')
1635
1279
response = request.execute('', '')
1636
1280
self.assertEqual(None, response)
1637
1281
response = request.do_chunk(self.make_empty_byte_stream(repository))
1638
1282
self.assertEqual(None, response)
1639
1283
response = request.do_end()
1640
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1284
self.assertEqual(SmartServerResponse(('ok', )), response)
1643
1287
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1645
1289
def test_insert_stream_empty(self):
1646
1290
backing = self.get_transport()
1647
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1291
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1649
1293
repository = self.make_repository('.', format='knit')
1650
lock_token = repository.lock_write().repository_token
1294
lock_token = repository.lock_write()
1651
1295
response = request.execute('', '', lock_token)
1652
1296
self.assertEqual(None, response)
1653
1297
response = request.do_chunk(self.make_empty_byte_stream(repository))
1654
1298
self.assertEqual(None, response)
1655
1299
response = request.do_end()
1656
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1300
self.assertEqual(SmartServerResponse(('ok', )), response)
1657
1301
repository.unlock()
1659
1303
def test_insert_stream_with_wrong_lock_token(self):
1660
1304
backing = self.get_transport()
1661
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1305
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1663
1307
repository = self.make_repository('.', format='knit')
1664
lock_token = repository.lock_write().repository_token
1308
lock_token = repository.lock_write()
1665
1309
self.assertRaises(
1666
1310
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1667
1311
repository.unlock()
1691
1335
def test_unlock_on_unlocked_repo(self):
1692
1336
backing = self.get_transport()
1693
request = smart_repo.SmartServerRepositoryUnlock(backing)
1337
request = smart.repository.SmartServerRepositoryUnlock(backing)
1694
1338
repository = self.make_repository('.', format='knit')
1695
1339
response = request.execute('', 'some token')
1696
1340
self.assertEqual(
1697
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1341
SmartServerResponse(('TokenMismatch',)), response)
1700
1344
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1702
1346
def test_is_readonly_no(self):
1703
1347
backing = self.get_transport()
1704
request = smart_req.SmartServerIsReadonly(backing)
1348
request = smart.request.SmartServerIsReadonly(backing)
1705
1349
response = request.execute()
1706
1350
self.assertEqual(
1707
smart_req.SmartServerResponse(('no',)), response)
1351
SmartServerResponse(('no',)), response)
1709
1353
def test_is_readonly_yes(self):
1710
1354
backing = self.get_readonly_transport()
1711
request = smart_req.SmartServerIsReadonly(backing)
1355
request = smart.request.SmartServerIsReadonly(backing)
1712
1356
response = request.execute()
1713
1357
self.assertEqual(
1714
smart_req.SmartServerResponse(('yes',)), response)
1717
class TestSmartServerRepositorySetMakeWorkingTrees(
1718
tests.TestCaseWithMemoryTransport):
1358
SmartServerResponse(('yes',)), response)
1361
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1720
1363
def test_set_false(self):
1721
1364
backing = self.get_transport()
1722
1365
repo = self.make_repository('.', shared=True)
1723
1366
repo.set_make_working_trees(True)
1724
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1367
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1725
1368
request = request_class(backing)
1726
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1369
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1727
1370
request.execute('', 'False'))
1728
1371
repo = repo.bzrdir.open_repository()
1729
1372
self.assertFalse(repo.make_working_trees())
1811
1441
"""All registered request_handlers can be found."""
1812
1442
# If there's a typo in a register_lazy call, this loop will fail with
1813
1443
# an AttributeError.
1814
for key, item in smart_req.request_handlers.iteritems():
1444
for key, item in smart.request.request_handlers.iteritems():
1817
1447
def assertHandlerEqual(self, verb, handler):
1818
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1448
self.assertEqual(smart.request.request_handlers.get(verb), handler)
1820
1450
def test_registered_methods(self):
1821
1451
"""Test that known methods are registered to the correct object."""
1822
1452
self.assertHandlerEqual('Branch.get_config_file',
1823
smart_branch.SmartServerBranchGetConfigFile)
1453
smart.branch.SmartServerBranchGetConfigFile)
1824
1454
self.assertHandlerEqual('Branch.get_parent',
1825
smart_branch.SmartServerBranchGetParent)
1455
smart.branch.SmartServerBranchGetParent)
1826
1456
self.assertHandlerEqual('Branch.get_tags_bytes',
1827
smart_branch.SmartServerBranchGetTagsBytes)
1457
smart.branch.SmartServerBranchGetTagsBytes)
1828
1458
self.assertHandlerEqual('Branch.lock_write',
1829
smart_branch.SmartServerBranchRequestLockWrite)
1459
smart.branch.SmartServerBranchRequestLockWrite)
1830
1460
self.assertHandlerEqual('Branch.last_revision_info',
1831
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1461
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1832
1462
self.assertHandlerEqual('Branch.revision_history',
1833
smart_branch.SmartServerRequestRevisionHistory)
1463
smart.branch.SmartServerRequestRevisionHistory)
1834
1464
self.assertHandlerEqual('Branch.set_config_option',
1835
smart_branch.SmartServerBranchRequestSetConfigOption)
1465
smart.branch.SmartServerBranchRequestSetConfigOption)
1836
1466
self.assertHandlerEqual('Branch.set_last_revision',
1837
smart_branch.SmartServerBranchRequestSetLastRevision)
1467
smart.branch.SmartServerBranchRequestSetLastRevision)
1838
1468
self.assertHandlerEqual('Branch.set_last_revision_info',
1839
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1469
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1840
1470
self.assertHandlerEqual('Branch.set_last_revision_ex',
1841
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1471
smart.branch.SmartServerBranchRequestSetLastRevisionEx)
1842
1472
self.assertHandlerEqual('Branch.set_parent_location',
1843
smart_branch.SmartServerBranchRequestSetParentLocation)
1473
smart.branch.SmartServerBranchRequestSetParentLocation)
1844
1474
self.assertHandlerEqual('Branch.unlock',
1845
smart_branch.SmartServerBranchRequestUnlock)
1475
smart.branch.SmartServerBranchRequestUnlock)
1846
1476
self.assertHandlerEqual('BzrDir.find_repository',
1847
smart_dir.SmartServerRequestFindRepositoryV1)
1477
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1848
1478
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1849
smart_dir.SmartServerRequestFindRepositoryV2)
1479
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1850
1480
self.assertHandlerEqual('BzrDirFormat.initialize',
1851
smart_dir.SmartServerRequestInitializeBzrDir)
1852
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1853
smart_dir.SmartServerRequestBzrDirInitializeEx)
1481
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1854
1482
self.assertHandlerEqual('BzrDir.cloning_metadir',
1855
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1483
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1856
1484
self.assertHandlerEqual('BzrDir.get_config_file',
1857
smart_dir.SmartServerBzrDirRequestConfigFile)
1485
smart.bzrdir.SmartServerBzrDirRequestConfigFile)
1858
1486
self.assertHandlerEqual('BzrDir.open_branch',
1859
smart_dir.SmartServerRequestOpenBranch)
1487
smart.bzrdir.SmartServerRequestOpenBranch)
1860
1488
self.assertHandlerEqual('BzrDir.open_branchV2',
1861
smart_dir.SmartServerRequestOpenBranchV2)
1862
self.assertHandlerEqual('BzrDir.open_branchV3',
1863
smart_dir.SmartServerRequestOpenBranchV3)
1489
smart.bzrdir.SmartServerRequestOpenBranchV2)
1864
1490
self.assertHandlerEqual('PackRepository.autopack',
1865
smart_packrepo.SmartServerPackRepositoryAutopack)
1491
smart.packrepository.SmartServerPackRepositoryAutopack)
1866
1492
self.assertHandlerEqual('Repository.gather_stats',
1867
smart_repo.SmartServerRepositoryGatherStats)
1493
smart.repository.SmartServerRepositoryGatherStats)
1868
1494
self.assertHandlerEqual('Repository.get_parent_map',
1869
smart_repo.SmartServerRepositoryGetParentMap)
1870
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1871
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1495
smart.repository.SmartServerRepositoryGetParentMap)
1872
1496
self.assertHandlerEqual('Repository.get_revision_graph',
1873
smart_repo.SmartServerRepositoryGetRevisionGraph)
1497
smart.repository.SmartServerRepositoryGetRevisionGraph)
1874
1498
self.assertHandlerEqual('Repository.get_stream',
1875
smart_repo.SmartServerRepositoryGetStream)
1499
smart.repository.SmartServerRepositoryGetStream)
1876
1500
self.assertHandlerEqual('Repository.has_revision',
1877
smart_repo.SmartServerRequestHasRevision)
1501
smart.repository.SmartServerRequestHasRevision)
1878
1502
self.assertHandlerEqual('Repository.insert_stream',
1879
smart_repo.SmartServerRepositoryInsertStream)
1503
smart.repository.SmartServerRepositoryInsertStream)
1880
1504
self.assertHandlerEqual('Repository.insert_stream_locked',
1881
smart_repo.SmartServerRepositoryInsertStreamLocked)
1505
smart.repository.SmartServerRepositoryInsertStreamLocked)
1882
1506
self.assertHandlerEqual('Repository.is_shared',
1883
smart_repo.SmartServerRepositoryIsShared)
1507
smart.repository.SmartServerRepositoryIsShared)
1884
1508
self.assertHandlerEqual('Repository.lock_write',
1885
smart_repo.SmartServerRepositoryLockWrite)
1509
smart.repository.SmartServerRepositoryLockWrite)
1886
1510
self.assertHandlerEqual('Repository.tarball',
1887
smart_repo.SmartServerRepositoryTarball)
1511
smart.repository.SmartServerRepositoryTarball)
1888
1512
self.assertHandlerEqual('Repository.unlock',
1889
smart_repo.SmartServerRepositoryUnlock)
1513
smart.repository.SmartServerRepositoryUnlock)
1890
1514
self.assertHandlerEqual('Transport.is_readonly',
1891
smart_req.SmartServerIsReadonly)
1515
smart.request.SmartServerIsReadonly)