106
107
self.transport_server = self.make_transport_server
108
109
def make_transport_server(self):
109
return test_server.SmartTCPServer_for_testing('-' + self.id())
110
return smart.server.SmartTCPServer_for_testing('-' + self.id())
111
112
def get_smart_medium(self):
112
113
"""Get a smart medium to use in tests."""
113
114
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
117
class TestSmartServerResponse(tests.TestCase):
137
119
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', )))
120
self.assertEqual(SmartServerResponse(('ok', )),
121
SmartServerResponse(('ok', )))
122
self.assertEqual(SmartServerResponse(('ok', ), 'body'),
123
SmartServerResponse(('ok', ), 'body'))
124
self.assertNotEqual(SmartServerResponse(('ok', )),
125
SmartServerResponse(('notok', )))
126
self.assertNotEqual(SmartServerResponse(('ok', ), 'body'),
127
SmartServerResponse(('ok', )))
146
128
self.assertNotEqual(None,
147
smart_req.SmartServerResponse(('ok', )))
129
SmartServerResponse(('ok', )))
149
131
def test__str__(self):
150
132
"""SmartServerResponses can be stringified."""
151
133
self.assertEqual(
152
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
153
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
134
"<SmartServerResponse status=OK args=('args',) body='body'>",
135
str(SuccessfulSmartServerResponse(('args',), 'body')))
154
136
self.assertEqual(
155
"<FailedSmartServerResponse args=('args',) body='body'>",
156
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
137
"<SmartServerResponse status=ERR args=('args',) body='body'>",
138
str(FailedSmartServerResponse(('args',), 'body')))
159
141
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
161
143
def test_translate_client_path(self):
162
144
transport = self.get_transport()
163
request = smart_req.SmartServerRequest(transport, 'foo/')
145
request = SmartServerRequest(transport, 'foo/')
164
146
self.assertEqual('./', request.translate_client_path('foo/'))
165
147
self.assertRaises(
166
148
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
169
151
self.assertRaises(
170
152
errors.PathNotChild, request.translate_client_path, 'bar/')
171
153
self.assertEqual('./baz', request.translate_client_path('foo/baz'))
172
e_acute = u'\N{LATIN SMALL LETTER E WITH ACUTE}'.encode('utf-8')
173
self.assertEqual('./' + urlutils.escape(e_acute),
174
request.translate_client_path('foo/' + e_acute))
176
def test_translate_client_path_vfs(self):
177
"""VfsRequests receive escaped paths rather than raw UTF-8."""
178
transport = self.get_transport()
179
request = vfs.VfsRequest(transport, 'foo/')
180
e_acute = u'\N{LATIN SMALL LETTER E WITH ACUTE}'.encode('utf-8')
181
escaped = urlutils.escape('foo/' + e_acute)
182
self.assertEqual('./' + urlutils.escape(e_acute),
183
request.translate_client_path(escaped))
185
155
def test_transport_from_client_path(self):
186
156
transport = self.get_transport()
187
request = smart_req.SmartServerRequest(transport, 'foo/')
157
request = SmartServerRequest(transport, 'foo/')
188
158
self.assertEqual(
190
160
request.transport_from_client_path('foo/').base)
193
class TestSmartServerBzrDirRequestCloningMetaDir(
194
tests.TestCaseWithMemoryTransport):
195
"""Tests for BzrDir.cloning_metadir."""
197
def test_cloning_metadir(self):
198
"""When there is a bzrdir present, the call succeeds."""
199
backing = self.get_transport()
200
dir = self.make_bzrdir('.')
201
local_result = dir.cloning_metadir()
202
request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
203
request = request_class(backing)
204
expected = smart_req.SuccessfulSmartServerResponse(
205
(local_result.network_name(),
206
local_result.repository_format.network_name(),
207
('branch', local_result.get_branch_format().network_name())))
208
self.assertEqual(expected, request.execute('', 'False'))
210
def test_cloning_metadir_reference(self):
211
"""The request fails when bzrdir contains a branch reference."""
212
backing = self.get_transport()
213
referenced_branch = self.make_branch('referenced')
214
dir = self.make_bzrdir('.')
215
local_result = dir.cloning_metadir()
216
reference = _mod_branch.BranchReferenceFormat().initialize(
217
dir, target_branch=referenced_branch)
218
reference_url = _mod_branch.BranchReferenceFormat().get_reference(dir)
219
# The server shouldn't try to follow the branch reference, so it's fine
220
# if the referenced branch isn't reachable.
221
backing.rename('referenced', 'moved')
222
request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
223
request = request_class(backing)
224
expected = smart_req.FailedSmartServerResponse(('BranchReference',))
225
self.assertEqual(expected, request.execute('', 'False'))
228
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
229
"""Tests for BzrDir.create_repository."""
231
def test_makes_repository(self):
232
"""When there is a bzrdir present, the call succeeds."""
233
backing = self.get_transport()
234
self.make_bzrdir('.')
235
request_class = smart_dir.SmartServerRequestCreateRepository
236
request = request_class(backing)
237
reference_bzrdir_format = bzrdir.format_registry.get('pack-0.92')()
238
reference_format = reference_bzrdir_format.repository_format
239
network_name = reference_format.network_name()
240
expected = smart_req.SuccessfulSmartServerResponse(
241
('ok', 'no', 'no', 'no', network_name))
242
self.assertEqual(expected, request.execute('', network_name, 'True'))
245
163
class TestSmartServerRequestFindRepository(tests.TestCaseWithMemoryTransport):
246
164
"""Tests for BzrDir.find_repository."""
378
259
def test_missing_dir(self):
379
260
"""Initializing a missing directory should fail like the bzrdir api."""
380
261
backing = self.get_transport()
381
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
262
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
382
263
self.assertRaises(errors.NoSuchFile,
383
264
request.execute, 'subdir')
385
266
def test_initialized_dir(self):
386
267
"""Initializing an extant bzrdir should fail like the bzrdir api."""
387
268
backing = self.get_transport()
388
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
269
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
389
270
self.make_bzrdir('subdir')
390
271
self.assertRaises(errors.FileExists,
391
272
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
275
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
505
277
def test_no_branch(self):
506
278
"""When there is no branch, ('nobranch', ) is returned."""
507
279
backing = self.get_transport()
508
request = smart_dir.SmartServerRequestOpenBranch(backing)
280
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
509
281
self.make_bzrdir('.')
510
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
282
self.assertEqual(SmartServerResponse(('nobranch', )),
511
283
request.execute(''))
513
285
def test_branch(self):
514
286
"""When there is a branch, 'ok' is returned."""
515
287
backing = self.get_transport()
516
request = smart_dir.SmartServerRequestOpenBranch(backing)
288
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
517
289
self.make_branch('.')
518
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
290
self.assertEqual(SmartServerResponse(('ok', '')),
519
291
request.execute(''))
521
293
def test_branch_reference(self):
522
294
"""When there is a branch reference, the reference URL is returned."""
523
self.vfs_transport_factory = test_server.LocalURLServer
524
295
backing = self.get_transport()
525
request = smart_dir.SmartServerRequestOpenBranch(backing)
296
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
526
297
branch = self.make_branch('branch')
527
298
checkout = branch.create_checkout('reference',lightweight=True)
528
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
299
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
530
300
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
531
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
301
self.assertEqual(SmartServerResponse(('ok', reference_url)),
532
302
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
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
545
def test_no_branch(self):
546
"""When there is no branch, ('nobranch', ) is returned."""
547
backing = self.get_transport()
548
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')),
670
305
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
672
307
def test_empty(self):
673
308
"""For an empty branch, the body is empty."""
674
309
backing = self.get_transport()
675
request = smart_branch.SmartServerRequestRevisionHistory(backing)
310
request = smart.branch.SmartServerRequestRevisionHistory(backing)
676
311
self.make_branch('.')
677
self.assertEqual(smart_req.SmartServerResponse(('ok', ), ''),
312
self.assertEqual(SmartServerResponse(('ok', ), ''),
678
313
request.execute(''))
680
315
def test_not_empty(self):
681
316
"""For a non-empty branch, the body is empty."""
682
317
backing = self.get_transport()
683
request = smart_branch.SmartServerRequestRevisionHistory(backing)
318
request = smart.branch.SmartServerRequestRevisionHistory(backing)
684
319
tree = self.make_branch_and_memory_tree('.')
685
320
tree.lock_write()
735
369
r2 = tree.commit('2nd commit', rev_id=rev_id_utf8)
737
371
self.assertEqual(
738
smart_req.SmartServerResponse(('ok', '2', rev_id_utf8)),
372
SmartServerResponse(('ok', '2', rev_id_utf8)),
739
373
request.execute(''))
742
class TestSmartServerBranchRequestGetConfigFile(
743
tests.TestCaseWithMemoryTransport):
376
class TestSmartServerBranchRequestGetConfigFile(tests.TestCaseWithMemoryTransport):
745
378
def test_default(self):
746
379
"""With no file, we get empty content."""
747
380
backing = self.get_transport()
748
request = smart_branch.SmartServerBranchGetConfigFile(backing)
381
request = smart.branch.SmartServerBranchGetConfigFile(backing)
749
382
branch = self.make_branch('.')
750
383
# there should be no file by default
752
self.assertEqual(smart_req.SmartServerResponse(('ok', ), content),
385
self.assertEqual(SmartServerResponse(('ok', ), content),
753
386
request.execute(''))
755
388
def test_with_content(self):
756
389
# SmartServerBranchGetConfigFile should return the content from
757
390
# branch.control_files.get('branch.conf') for now - in the future it may
758
# perform more complex processing.
391
# perform more complex processing.
759
392
backing = self.get_transport()
760
request = smart_branch.SmartServerBranchGetConfigFile(backing)
393
request = smart.branch.SmartServerBranchGetConfigFile(backing)
761
394
branch = self.make_branch('.')
762
395
branch._transport.put_bytes('branch.conf', 'foo bar baz')
763
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'foo bar baz'),
396
self.assertEqual(SmartServerResponse(('ok', ), 'foo bar baz'),
764
397
request.execute(''))
767
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
769
def get_lock_tokens(self, branch):
770
branch_token = branch.lock_write().branch_token
771
repo_token = branch.repository.lock_write().repository_token
772
branch.repository.unlock()
773
return branch_token, repo_token
776
class TestSmartServerBranchRequestSetConfigOption(TestLockedBranch):
778
def test_value_name(self):
779
branch = self.make_branch('.')
780
request = smart_branch.SmartServerBranchRequestSetConfigOption(
781
branch.bzrdir.root_transport)
782
branch_token, repo_token = self.get_lock_tokens(branch)
783
config = branch._get_config()
784
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
786
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
787
self.assertEqual('bar', config.get_option('foo'))
791
def test_value_name_section(self):
792
branch = self.make_branch('.')
793
request = smart_branch.SmartServerBranchRequestSetConfigOption(
794
branch.bzrdir.root_transport)
795
branch_token, repo_token = self.get_lock_tokens(branch)
796
config = branch._get_config()
797
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
799
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
800
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
class SetLastRevisionTestBase(TestLockedBranch):
400
class SetLastRevisionTestBase(tests.TestCaseWithMemoryTransport):
843
401
"""Base test case for verbs that implement set_last_revision."""
1047
594
response = self.request.execute(
1048
595
'', branch_token, repo_token, 'child-1', 1, 0)
1049
596
self.assertEqual(
1050
smart_req.SuccessfulSmartServerResponse(('ok', 2, 'child-1')),
597
SuccessfulSmartServerResponse(('ok', 2, 'child-1')),
1052
599
self.unlock_branch()
1053
600
# The branch tip was changed.
1054
601
self.assertEqual('child-1', self.tree.branch.last_revision())
1057
class TestSmartServerBranchRequestGetParent(tests.TestCaseWithMemoryTransport):
1059
def test_get_parent_none(self):
1060
base_branch = self.make_branch('base')
1061
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
1062
response = request.execute('base')
1064
smart_req.SuccessfulSmartServerResponse(('',)), response)
1066
def test_get_parent_something(self):
1067
base_branch = self.make_branch('base')
1068
base_branch.set_parent(self.get_url('foo'))
1069
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
1070
response = request.execute('base')
1072
smart_req.SuccessfulSmartServerResponse(("../foo",)),
1076
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
1078
def test_set_parent_none(self):
1079
branch = self.make_branch('base', format="1.9")
1081
branch._set_parent_location('foo')
1083
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1084
self.get_transport())
1085
branch_token, repo_token = self.get_lock_tokens(branch)
1087
response = request.execute('base', branch_token, repo_token, '')
1090
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1091
self.assertEqual(None, branch.get_parent())
1093
def test_set_parent_something(self):
1094
branch = self.make_branch('base', format="1.9")
1095
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1096
self.get_transport())
1097
branch_token, repo_token = self.get_lock_tokens(branch)
1099
response = request.execute('base', branch_token, repo_token,
1103
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1104
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.
1112
def test_get_bytes(self):
1113
base_branch = self.make_branch('base')
1114
request = smart_branch.SmartServerBranchGetTagsBytes(
1115
self.get_transport())
1116
response = request.execute('base')
1118
smart_req.SuccessfulSmartServerResponse(('',)), response)
1121
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1123
def test_get_stacked_on_url(self):
1124
base_branch = self.make_branch('base', format='1.6')
1125
stacked_branch = self.make_branch('stacked', format='1.6')
1126
# typically should be relative
1127
stacked_branch.set_stacked_on_url('../base')
1128
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
1129
self.get_transport())
1130
response = request.execute('stacked')
1132
smart_req.SmartServerResponse(('ok', '../base')),
1136
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
604
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1138
606
def setUp(self):
1139
607
tests.TestCaseWithMemoryTransport.setUp(self)
1141
609
def test_lock_write_on_unlocked_branch(self):
1142
610
backing = self.get_transport()
1143
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
611
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1144
612
branch = self.make_branch('.', format='knit')
1145
613
repository = branch.repository
1146
614
response = request.execute('')
1147
615
branch_nonce = branch.control_files._lock.peek().get('nonce')
1148
616
repository_nonce = repository.control_files._lock.peek().get('nonce')
1149
self.assertEqual(smart_req.SmartServerResponse(
1150
('ok', branch_nonce, repository_nonce)),
618
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1152
620
# The branch (and associated repository) is now locked. Verify that
1153
621
# with a new branch object.
1154
622
new_branch = repository.bzrdir.open_branch()
1155
623
self.assertRaises(errors.LockContention, new_branch.lock_write)
1157
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1158
response = request.execute('', branch_nonce, repository_nonce)
1160
625
def test_lock_write_on_locked_branch(self):
1161
626
backing = self.get_transport()
1162
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
627
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1163
628
branch = self.make_branch('.')
1164
branch_token = branch.lock_write().branch_token
1165
630
branch.leave_lock_in_place()
1167
632
response = request.execute('')
1168
633
self.assertEqual(
1169
smart_req.SmartServerResponse(('LockContention',)), response)
1171
branch.lock_write(branch_token)
1172
branch.dont_leave_lock_in_place()
634
SmartServerResponse(('LockContention',)), response)
1175
636
def test_lock_write_with_tokens_on_locked_branch(self):
1176
637
backing = self.get_transport()
1177
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
638
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1178
639
branch = self.make_branch('.', format='knit')
1179
branch_token, repo_token = self.get_lock_tokens(branch)
640
branch_token = branch.lock_write()
641
repo_token = branch.repository.lock_write()
642
branch.repository.unlock()
1180
643
branch.leave_lock_in_place()
1181
644
branch.repository.leave_lock_in_place()
1183
646
response = request.execute('',
1184
647
branch_token, repo_token)
1185
648
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()
649
SmartServerResponse(('ok', branch_token, repo_token)), response)
1196
651
def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1197
652
backing = self.get_transport()
1198
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
653
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1199
654
branch = self.make_branch('.', format='knit')
1200
branch_token, repo_token = self.get_lock_tokens(branch)
655
branch_token = branch.lock_write()
656
repo_token = branch.repository.lock_write()
657
branch.repository.unlock()
1201
658
branch.leave_lock_in_place()
1202
659
branch.repository.leave_lock_in_place()
1204
661
response = request.execute('',
1205
662
branch_token+'xxx', repo_token)
1206
663
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()
664
SmartServerResponse(('TokenMismatch',)), response)
1216
666
def test_lock_write_on_locked_repo(self):
1217
667
backing = self.get_transport()
1218
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
668
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1219
669
branch = self.make_branch('.', format='knit')
1220
repo = branch.repository
1221
repo_token = repo.lock_write().repository_token
1222
repo.leave_lock_in_place()
670
branch.repository.lock_write()
671
branch.repository.leave_lock_in_place()
672
branch.repository.unlock()
1224
673
response = request.execute('')
1225
674
self.assertEqual(
1226
smart_req.SmartServerResponse(('LockContention',)), response)
1228
repo.lock_write(repo_token)
1229
repo.dont_leave_lock_in_place()
675
SmartServerResponse(('LockContention',)), response)
1232
677
def test_lock_write_on_readonly_transport(self):
1233
678
backing = self.get_readonly_transport()
1234
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
679
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1235
680
branch = self.make_branch('.')
1236
681
root = self.get_transport().clone('/')
1237
682
path = urlutils.relative_url(root.base, self.get_transport().base)
1387
818
# 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)))
1439
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1441
def make_two_commit_repo(self):
1442
tree = self.make_branch_and_memory_tree('.')
1445
r1 = tree.commit('1st commit')
1446
r2 = tree.commit('2nd commit', rev_id=u'\xc8'.encode('utf-8'))
1448
repo = tree.branch.repository
1451
def test_ancestry_of(self):
1452
"""The search argument may be a 'ancestry-of' some heads'."""
1453
backing = self.get_transport()
1454
request = smart_repo.SmartServerRepositoryGetStream(backing)
1455
repo, r1, r2 = self.make_two_commit_repo()
1456
fetch_spec = ['ancestry-of', r2]
1457
lines = '\n'.join(fetch_spec)
1458
request.execute('', repo._format.network_name())
1459
response = request.do_body(lines)
1460
self.assertEqual(('ok',), response.args)
1461
stream_bytes = ''.join(response.body_stream)
1462
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1464
def test_search(self):
1465
"""The search argument may be a 'search' of some explicit keys."""
1466
backing = self.get_transport()
1467
request = smart_repo.SmartServerRepositoryGetStream(backing)
1468
repo, r1, r2 = self.make_two_commit_repo()
1469
fetch_spec = ['search', '%s %s' % (r1, r2), 'null:', '2']
1470
lines = '\n'.join(fetch_spec)
1471
request.execute('', repo._format.network_name())
1472
response = request.do_body(lines)
1473
self.assertEqual(('ok',), response.args)
1474
stream_bytes = ''.join(response.body_stream)
1475
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
820
SmartServerResponse(('nosuchrevision', 'missingrevision', ), ''),
821
request.execute('', 'missingrevision'))
1478
824
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
1564
910
def test_is_shared(self):
1565
911
"""For a shared repository, ('yes', ) is returned."""
1566
912
backing = self.get_transport()
1567
request = smart_repo.SmartServerRepositoryIsShared(backing)
913
request = smart.repository.SmartServerRepositoryIsShared(backing)
1568
914
self.make_repository('.', shared=True)
1569
self.assertEqual(smart_req.SmartServerResponse(('yes', )),
915
self.assertEqual(SmartServerResponse(('yes', )),
1570
916
request.execute('', ))
1572
918
def test_is_not_shared(self):
1573
919
"""For a shared repository, ('no', ) is returned."""
1574
920
backing = self.get_transport()
1575
request = smart_repo.SmartServerRepositoryIsShared(backing)
921
request = smart.repository.SmartServerRepositoryIsShared(backing)
1576
922
self.make_repository('.', shared=False)
1577
self.assertEqual(smart_req.SmartServerResponse(('no', )),
923
self.assertEqual(SmartServerResponse(('no', )),
1578
924
request.execute('', ))
1581
927
class TestSmartServerRepositoryLockWrite(tests.TestCaseWithMemoryTransport):
930
tests.TestCaseWithMemoryTransport.setUp(self)
1583
932
def test_lock_write_on_unlocked_repo(self):
1584
933
backing = self.get_transport()
1585
request = smart_repo.SmartServerRepositoryLockWrite(backing)
934
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1586
935
repository = self.make_repository('.', format='knit')
1587
936
response = request.execute('')
1588
937
nonce = repository.control_files._lock.peek().get('nonce')
1589
self.assertEqual(smart_req.SmartServerResponse(('ok', nonce)), response)
938
self.assertEqual(SmartServerResponse(('ok', nonce)), response)
1590
939
# The repository is now locked. Verify that with a new repository
1592
941
new_repo = repository.bzrdir.open_repository()
1593
942
self.assertRaises(errors.LockContention, new_repo.lock_write)
1595
request = smart_repo.SmartServerRepositoryUnlock(backing)
1596
response = request.execute('', nonce)
1598
944
def test_lock_write_on_locked_repo(self):
1599
945
backing = self.get_transport()
1600
request = smart_repo.SmartServerRepositoryLockWrite(backing)
946
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1601
947
repository = self.make_repository('.', format='knit')
1602
repo_token = repository.lock_write().repository_token
948
repository.lock_write()
1603
949
repository.leave_lock_in_place()
1604
950
repository.unlock()
1605
951
response = request.execute('')
1606
952
self.assertEqual(
1607
smart_req.SmartServerResponse(('LockContention',)), response)
1609
repository.lock_write(repo_token)
1610
repository.dont_leave_lock_in_place()
953
SmartServerResponse(('LockContention',)), response)
1613
955
def test_lock_write_on_readonly_transport(self):
1614
956
backing = self.get_readonly_transport()
1615
request = smart_repo.SmartServerRepositoryLockWrite(backing)
957
request = smart.repository.SmartServerRepositoryLockWrite(backing)
1616
958
repository = self.make_repository('.', format='knit')
1617
959
response = request.execute('')
1618
960
self.assertFalse(response.is_successful())
1619
961
self.assertEqual('LockFailed', response.args[0])
1622
class TestInsertStreamBase(tests.TestCaseWithMemoryTransport):
1624
def make_empty_byte_stream(self, repo):
1625
byte_stream = smart_repo._stream_to_byte_stream([], repo._format)
1626
return ''.join(byte_stream)
1629
class TestSmartServerRepositoryInsertStream(TestInsertStreamBase):
1631
def test_insert_stream_empty(self):
1632
backing = self.get_transport()
1633
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1634
repository = self.make_repository('.')
1635
response = request.execute('', '')
1636
self.assertEqual(None, response)
1637
response = request.do_chunk(self.make_empty_byte_stream(repository))
1638
self.assertEqual(None, response)
1639
response = request.do_end()
1640
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1643
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1645
def test_insert_stream_empty(self):
1646
backing = self.get_transport()
1647
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1649
repository = self.make_repository('.', format='knit')
1650
lock_token = repository.lock_write().repository_token
1651
response = request.execute('', '', lock_token)
1652
self.assertEqual(None, response)
1653
response = request.do_chunk(self.make_empty_byte_stream(repository))
1654
self.assertEqual(None, response)
1655
response = request.do_end()
1656
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1659
def test_insert_stream_with_wrong_lock_token(self):
1660
backing = self.get_transport()
1661
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1663
repository = self.make_repository('.', format='knit')
1664
lock_token = repository.lock_write().repository_token
1666
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1670
964
class TestSmartServerRepositoryUnlock(tests.TestCaseWithMemoryTransport):
1672
966
def setUp(self):
1691
985
def test_unlock_on_unlocked_repo(self):
1692
986
backing = self.get_transport()
1693
request = smart_repo.SmartServerRepositoryUnlock(backing)
987
request = smart.repository.SmartServerRepositoryUnlock(backing)
1694
988
repository = self.make_repository('.', format='knit')
1695
989
response = request.execute('', 'some token')
1696
990
self.assertEqual(
1697
smart_req.SmartServerResponse(('TokenMismatch',)), response)
991
SmartServerResponse(('TokenMismatch',)), response)
1700
994
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1702
996
def test_is_readonly_no(self):
1703
997
backing = self.get_transport()
1704
request = smart_req.SmartServerIsReadonly(backing)
998
request = smart.request.SmartServerIsReadonly(backing)
1705
999
response = request.execute()
1706
1000
self.assertEqual(
1707
smart_req.SmartServerResponse(('no',)), response)
1001
SmartServerResponse(('no',)), response)
1709
1003
def test_is_readonly_yes(self):
1710
1004
backing = self.get_readonly_transport()
1711
request = smart_req.SmartServerIsReadonly(backing)
1005
request = smart.request.SmartServerIsReadonly(backing)
1712
1006
response = request.execute()
1713
1007
self.assertEqual(
1714
smart_req.SmartServerResponse(('yes',)), response)
1717
class TestSmartServerRepositorySetMakeWorkingTrees(
1718
tests.TestCaseWithMemoryTransport):
1720
def test_set_false(self):
1721
backing = self.get_transport()
1722
repo = self.make_repository('.', shared=True)
1723
repo.set_make_working_trees(True)
1724
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1725
request = request_class(backing)
1726
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1727
request.execute('', 'False'))
1728
repo = repo.bzrdir.open_repository()
1729
self.assertFalse(repo.make_working_trees())
1731
def test_set_true(self):
1732
backing = self.get_transport()
1733
repo = self.make_repository('.', shared=True)
1734
repo.set_make_working_trees(False)
1735
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1736
request = request_class(backing)
1737
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1738
request.execute('', 'True'))
1739
repo = repo.bzrdir.open_repository()
1740
self.assertTrue(repo.make_working_trees())
1743
class TestSmartServerPackRepositoryAutopack(tests.TestCaseWithTransport):
1745
def make_repo_needing_autopacking(self, path='.'):
1746
# Make a repo in need of autopacking.
1747
tree = self.make_branch_and_tree('.', format='pack-0.92')
1748
repo = tree.branch.repository
1749
# monkey-patch the pack collection to disable autopacking
1750
repo._pack_collection._max_pack_count = lambda count: count
1752
tree.commit('commit %s' % x)
1753
self.assertEqual(10, len(repo._pack_collection.names()))
1754
del repo._pack_collection._max_pack_count
1757
def test_autopack_needed(self):
1758
repo = self.make_repo_needing_autopacking()
1760
self.addCleanup(repo.unlock)
1761
backing = self.get_transport()
1762
request = smart_packrepo.SmartServerPackRepositoryAutopack(
1764
response = request.execute('')
1765
self.assertEqual(smart_req.SmartServerResponse(('ok',)), response)
1766
repo._pack_collection.reload_pack_names()
1767
self.assertEqual(1, len(repo._pack_collection.names()))
1769
def test_autopack_not_needed(self):
1770
tree = self.make_branch_and_tree('.', format='pack-0.92')
1771
repo = tree.branch.repository
1773
self.addCleanup(repo.unlock)
1775
tree.commit('commit %s' % x)
1776
backing = self.get_transport()
1777
request = smart_packrepo.SmartServerPackRepositoryAutopack(
1779
response = request.execute('')
1780
self.assertEqual(smart_req.SmartServerResponse(('ok',)), response)
1781
repo._pack_collection.reload_pack_names()
1782
self.assertEqual(9, len(repo._pack_collection.names()))
1784
def test_autopack_on_nonpack_format(self):
1785
"""A request to autopack a non-pack repo is a no-op."""
1786
repo = self.make_repository('.', format='knit')
1787
backing = self.get_transport()
1788
request = smart_packrepo.SmartServerPackRepositoryAutopack(
1790
response = request.execute('')
1791
self.assertEqual(smart_req.SmartServerResponse(('ok',)), response)
1794
class TestSmartServerVfsGet(tests.TestCaseWithMemoryTransport):
1796
def test_unicode_path(self):
1797
"""VFS requests expect unicode paths to be escaped."""
1798
filename = u'foo\N{INTERROBANG}'
1799
filename_escaped = urlutils.escape(filename)
1800
backing = self.get_transport()
1801
request = vfs.GetRequest(backing)
1802
backing.put_bytes_non_atomic(filename_escaped, 'contents')
1803
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'contents'),
1804
request.execute(filename_escaped))
1008
SmartServerResponse(('yes',)), response)
1807
1011
class TestHandlers(tests.TestCase):
1811
1015
"""All registered request_handlers can be found."""
1812
1016
# If there's a typo in a register_lazy call, this loop will fail with
1813
1017
# an AttributeError.
1814
for key, item in smart_req.request_handlers.iteritems():
1018
for key, item in smart.request.request_handlers.iteritems():
1817
def assertHandlerEqual(self, verb, handler):
1818
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1820
1021
def test_registered_methods(self):
1821
1022
"""Test that known methods are registered to the correct object."""
1822
self.assertHandlerEqual('Branch.get_config_file',
1823
smart_branch.SmartServerBranchGetConfigFile)
1824
self.assertHandlerEqual('Branch.get_parent',
1825
smart_branch.SmartServerBranchGetParent)
1826
self.assertHandlerEqual('Branch.get_tags_bytes',
1827
smart_branch.SmartServerBranchGetTagsBytes)
1828
self.assertHandlerEqual('Branch.lock_write',
1829
smart_branch.SmartServerBranchRequestLockWrite)
1830
self.assertHandlerEqual('Branch.last_revision_info',
1831
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1832
self.assertHandlerEqual('Branch.revision_history',
1833
smart_branch.SmartServerRequestRevisionHistory)
1834
self.assertHandlerEqual('Branch.set_config_option',
1835
smart_branch.SmartServerBranchRequestSetConfigOption)
1836
self.assertHandlerEqual('Branch.set_last_revision',
1837
smart_branch.SmartServerBranchRequestSetLastRevision)
1838
self.assertHandlerEqual('Branch.set_last_revision_info',
1839
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1840
self.assertHandlerEqual('Branch.set_last_revision_ex',
1841
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1842
self.assertHandlerEqual('Branch.set_parent_location',
1843
smart_branch.SmartServerBranchRequestSetParentLocation)
1844
self.assertHandlerEqual('Branch.unlock',
1845
smart_branch.SmartServerBranchRequestUnlock)
1846
self.assertHandlerEqual('BzrDir.find_repository',
1847
smart_dir.SmartServerRequestFindRepositoryV1)
1848
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1849
smart_dir.SmartServerRequestFindRepositoryV2)
1850
self.assertHandlerEqual('BzrDirFormat.initialize',
1851
smart_dir.SmartServerRequestInitializeBzrDir)
1852
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1853
smart_dir.SmartServerRequestBzrDirInitializeEx)
1854
self.assertHandlerEqual('BzrDir.cloning_metadir',
1855
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1856
self.assertHandlerEqual('BzrDir.get_config_file',
1857
smart_dir.SmartServerBzrDirRequestConfigFile)
1858
self.assertHandlerEqual('BzrDir.open_branch',
1859
smart_dir.SmartServerRequestOpenBranch)
1860
self.assertHandlerEqual('BzrDir.open_branchV2',
1861
smart_dir.SmartServerRequestOpenBranchV2)
1862
self.assertHandlerEqual('BzrDir.open_branchV3',
1863
smart_dir.SmartServerRequestOpenBranchV3)
1864
self.assertHandlerEqual('PackRepository.autopack',
1865
smart_packrepo.SmartServerPackRepositoryAutopack)
1866
self.assertHandlerEqual('Repository.gather_stats',
1867
smart_repo.SmartServerRepositoryGatherStats)
1868
self.assertHandlerEqual('Repository.get_parent_map',
1869
smart_repo.SmartServerRepositoryGetParentMap)
1870
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1871
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1872
self.assertHandlerEqual('Repository.get_revision_graph',
1873
smart_repo.SmartServerRepositoryGetRevisionGraph)
1874
self.assertHandlerEqual('Repository.get_stream',
1875
smart_repo.SmartServerRepositoryGetStream)
1876
self.assertHandlerEqual('Repository.has_revision',
1877
smart_repo.SmartServerRequestHasRevision)
1878
self.assertHandlerEqual('Repository.insert_stream',
1879
smart_repo.SmartServerRepositoryInsertStream)
1880
self.assertHandlerEqual('Repository.insert_stream_locked',
1881
smart_repo.SmartServerRepositoryInsertStreamLocked)
1882
self.assertHandlerEqual('Repository.is_shared',
1883
smart_repo.SmartServerRepositoryIsShared)
1884
self.assertHandlerEqual('Repository.lock_write',
1885
smart_repo.SmartServerRepositoryLockWrite)
1886
self.assertHandlerEqual('Repository.tarball',
1887
smart_repo.SmartServerRepositoryTarball)
1888
self.assertHandlerEqual('Repository.unlock',
1889
smart_repo.SmartServerRepositoryUnlock)
1890
self.assertHandlerEqual('Transport.is_readonly',
1891
smart_req.SmartServerIsReadonly)
1024
smart.request.request_handlers.get('Branch.get_config_file'),
1025
smart.branch.SmartServerBranchGetConfigFile)
1027
smart.request.request_handlers.get('Branch.lock_write'),
1028
smart.branch.SmartServerBranchRequestLockWrite)
1030
smart.request.request_handlers.get('Branch.last_revision_info'),
1031
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1033
smart.request.request_handlers.get('Branch.revision_history'),
1034
smart.branch.SmartServerRequestRevisionHistory)
1036
smart.request.request_handlers.get('Branch.set_last_revision'),
1037
smart.branch.SmartServerBranchRequestSetLastRevision)
1039
smart.request.request_handlers.get('Branch.set_last_revision_info'),
1040
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1042
smart.request.request_handlers.get('Branch.unlock'),
1043
smart.branch.SmartServerBranchRequestUnlock)
1045
smart.request.request_handlers.get('BzrDir.find_repository'),
1046
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1048
smart.request.request_handlers.get('BzrDir.find_repositoryV2'),
1049
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1051
smart.request.request_handlers.get('BzrDirFormat.initialize'),
1052
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1054
smart.request.request_handlers.get('BzrDir.open_branch'),
1055
smart.bzrdir.SmartServerRequestOpenBranch)
1057
smart.request.request_handlers.get('Repository.gather_stats'),
1058
smart.repository.SmartServerRepositoryGatherStats)
1060
smart.request.request_handlers.get('Repository.get_parent_map'),
1061
smart.repository.SmartServerRepositoryGetParentMap)
1063
smart.request.request_handlers.get(
1064
'Repository.get_revision_graph'),
1065
smart.repository.SmartServerRepositoryGetRevisionGraph)
1067
smart.request.request_handlers.get('Repository.has_revision'),
1068
smart.repository.SmartServerRequestHasRevision)
1070
smart.request.request_handlers.get('Repository.is_shared'),
1071
smart.repository.SmartServerRepositoryIsShared)
1073
smart.request.request_handlers.get('Repository.lock_write'),
1074
smart.repository.SmartServerRepositoryLockWrite)
1076
smart.request.request_handlers.get('Repository.tarball'),
1077
smart.repository.SmartServerRepositoryTarball)
1079
smart.request.request_handlers.get('Repository.unlock'),
1080
smart.repository.SmartServerRepositoryUnlock)
1082
smart.request.request_handlers.get('Transport.is_readonly'),
1083
smart.request.SmartServerIsReadonly)