28
from cStringIO import StringIO
29
31
from bzrlib import (
30
branch as _mod_branch,
38
from bzrlib.smart import (
39
branch as smart_branch,
41
repository as smart_repo,
42
packrepository as smart_packrepo,
47
from bzrlib.tests import test_server
48
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
54
57
def load_tests(standard_tests, module, loader):
55
58
"""Multiply tests version and protocol consistency."""
56
59
# FindRepository tests.
60
bzrdir_mod = bzrlib.smart.bzrdir
58
62
("find_repository", {
59
"_request_class": smart_dir.SmartServerRequestFindRepositoryV1}),
63
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV1}),
60
64
("find_repositoryV2", {
61
"_request_class": smart_dir.SmartServerRequestFindRepositoryV2}),
65
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV2}),
62
66
("find_repositoryV3", {
63
"_request_class": smart_dir.SmartServerRequestFindRepositoryV3}),
67
"_request_class":bzrdir_mod.SmartServerRequestFindRepositoryV3}),
65
to_adapt, result = tests.split_suite_by_re(standard_tests,
69
to_adapt, result = split_suite_by_re(standard_tests,
66
70
"TestSmartServerRequestFindRepository")
67
v2_only, v1_and_2 = tests.split_suite_by_re(to_adapt,
71
v2_only, v1_and_2 = split_suite_by_re(to_adapt,
69
73
tests.multiply_tests(v1_and_2, scenarios, result)
70
74
# The first scenario is only applicable to v1 protocols, it is deleted
99
103
# the default or a parameterized class, but rather use the
100
104
# TestCaseWithTransport infrastructure to set up a smart server and
102
self.overrideAttr(self, "transport_server", self.make_transport_server)
106
self.transport_server = self.make_transport_server
104
108
def make_transport_server(self):
105
return test_server.SmartTCPServer_for_testing('-' + self.id())
109
return smart.server.SmartTCPServer_for_testing('-' + self.id())
107
111
def get_smart_medium(self):
108
112
"""Get a smart medium to use in tests."""
109
113
return self.get_transport().get_smart_medium()
112
class TestByteStreamToStream(tests.TestCase):
114
def test_repeated_substreams_same_kind_are_one_stream(self):
115
# Make a stream - an iterable of bytestrings.
116
stream = [('text', [versionedfile.FulltextContentFactory(('k1',), None,
117
None, 'foo')]),('text', [
118
versionedfile.FulltextContentFactory(('k2',), None, None, 'bar')])]
119
fmt = bzrdir.format_registry.get('pack-0.92')().repository_format
120
bytes = smart_repo._stream_to_byte_stream(stream, fmt)
122
# Iterate the resulting iterable; checking that we get only one stream
124
fmt, stream = smart_repo._byte_stream_to_stream(bytes)
125
for kind, substream in stream:
126
streams.append((kind, list(substream)))
127
self.assertLength(1, streams)
128
self.assertLength(2, streams[0][1])
131
116
class TestSmartServerResponse(tests.TestCase):
133
118
def test__eq__(self):
134
self.assertEqual(smart_req.SmartServerResponse(('ok', )),
135
smart_req.SmartServerResponse(('ok', )))
136
self.assertEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
137
smart_req.SmartServerResponse(('ok', ), 'body'))
138
self.assertNotEqual(smart_req.SmartServerResponse(('ok', )),
139
smart_req.SmartServerResponse(('notok', )))
140
self.assertNotEqual(smart_req.SmartServerResponse(('ok', ), 'body'),
141
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', )))
142
127
self.assertNotEqual(None,
143
smart_req.SmartServerResponse(('ok', )))
128
SmartServerResponse(('ok', )))
145
130
def test__str__(self):
146
131
"""SmartServerResponses can be stringified."""
147
132
self.assertEqual(
148
133
"<SuccessfulSmartServerResponse args=('args',) body='body'>",
149
str(smart_req.SuccessfulSmartServerResponse(('args',), 'body')))
134
str(SuccessfulSmartServerResponse(('args',), 'body')))
150
135
self.assertEqual(
151
136
"<FailedSmartServerResponse args=('args',) body='body'>",
152
str(smart_req.FailedSmartServerResponse(('args',), 'body')))
137
str(FailedSmartServerResponse(('args',), 'body')))
155
140
class TestSmartServerRequest(tests.TestCaseWithMemoryTransport):
157
142
def test_translate_client_path(self):
158
143
transport = self.get_transport()
159
request = smart_req.SmartServerRequest(transport, 'foo/')
144
request = SmartServerRequest(transport, 'foo/')
160
145
self.assertEqual('./', request.translate_client_path('foo/'))
161
146
self.assertRaises(
162
147
errors.InvalidURLJoin, request.translate_client_path, 'foo/..')
326
290
"""Test for the supports_external_lookups attribute."""
327
291
backing = self.get_transport()
328
292
request = self._request_class(backing)
329
result = self._make_repository_and_result(
330
format='dirstate-with-subtree')
293
result = self._make_repository_and_result(format='dirstate-with-subtree')
331
294
# check the test will be valid
332
295
self.assertEqual('no', result.args[4])
333
296
self.assertEqual(result, request.execute(''))
336
class TestSmartServerBzrDirRequestGetConfigFile(
337
tests.TestCaseWithMemoryTransport):
338
"""Tests for BzrDir.get_config_file."""
340
def test_present(self):
341
backing = self.get_transport()
342
dir = self.make_bzrdir('.')
343
dir.get_config().set_default_stack_on("/")
344
local_result = dir._get_config()._get_config_file().read()
345
request_class = smart_dir.SmartServerBzrDirRequestConfigFile
346
request = request_class(backing)
347
expected = smart_req.SuccessfulSmartServerResponse((), local_result)
348
self.assertEqual(expected, request.execute(''))
350
def test_missing(self):
351
backing = self.get_transport()
352
dir = self.make_bzrdir('.')
353
request_class = smart_dir.SmartServerBzrDirRequestConfigFile
354
request = request_class(backing)
355
expected = smart_req.SuccessfulSmartServerResponse((), '')
356
self.assertEqual(expected, request.execute(''))
359
299
class TestSmartServerRequestInitializeBzrDir(tests.TestCaseWithMemoryTransport):
361
301
def test_empty_dir(self):
362
302
"""Initializing an empty dir should succeed and do it."""
363
303
backing = self.get_transport()
364
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
365
self.assertEqual(smart_req.SmartServerResponse(('ok', )),
304
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
305
self.assertEqual(SmartServerResponse(('ok', )),
366
306
request.execute(''))
367
307
made_dir = bzrdir.BzrDir.open_from_transport(backing)
368
308
# no branch, tree or repository is expected with the current
374
314
def test_missing_dir(self):
375
315
"""Initializing a missing directory should fail like the bzrdir api."""
376
316
backing = self.get_transport()
377
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
317
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
378
318
self.assertRaises(errors.NoSuchFile,
379
319
request.execute, 'subdir')
381
321
def test_initialized_dir(self):
382
322
"""Initializing an extant bzrdir should fail like the bzrdir api."""
383
323
backing = self.get_transport()
384
request = smart_dir.SmartServerRequestInitializeBzrDir(backing)
324
request = smart.bzrdir.SmartServerRequestInitializeBzrDir(backing)
385
325
self.make_bzrdir('subdir')
386
326
self.assertRaises(errors.FileExists,
387
327
request.execute, 'subdir')
390
class TestSmartServerRequestBzrDirInitializeEx(
391
tests.TestCaseWithMemoryTransport):
392
"""Basic tests for BzrDir.initialize_ex_1.16 in the smart server.
394
The main unit tests in test_bzrdir exercise the API comprehensively.
397
def test_empty_dir(self):
398
"""Initializing an empty dir should succeed and do it."""
399
backing = self.get_transport()
400
name = self.make_bzrdir('reference')._format.network_name()
401
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
403
smart_req.SmartServerResponse(('', '', '', '', '', '', name,
404
'False', '', '', '')),
405
request.execute(name, '', 'True', 'False', 'False', '', '', '', '',
407
made_dir = bzrdir.BzrDir.open_from_transport(backing)
408
# no branch, tree or repository is expected with the current
410
self.assertRaises(errors.NoWorkingTree, made_dir.open_workingtree)
411
self.assertRaises(errors.NotBranchError, made_dir.open_branch)
412
self.assertRaises(errors.NoRepositoryPresent, made_dir.open_repository)
414
def test_missing_dir(self):
415
"""Initializing a missing directory should fail like the bzrdir api."""
416
backing = self.get_transport()
417
name = self.make_bzrdir('reference')._format.network_name()
418
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
419
self.assertRaises(errors.NoSuchFile, request.execute, name,
420
'subdir/dir', 'False', 'False', 'False', '', '', '', '', 'False')
422
def test_initialized_dir(self):
423
"""Initializing an extant directory should fail like the bzrdir api."""
424
backing = self.get_transport()
425
name = self.make_bzrdir('reference')._format.network_name()
426
request = smart_dir.SmartServerRequestBzrDirInitializeEx(backing)
427
self.make_bzrdir('subdir')
428
self.assertRaises(errors.FileExists, request.execute, name, 'subdir',
429
'False', 'False', 'False', '', '', '', '', 'False')
432
class TestSmartServerRequestOpenBzrDir(tests.TestCaseWithMemoryTransport):
434
def test_no_directory(self):
435
backing = self.get_transport()
436
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
437
self.assertEqual(smart_req.SmartServerResponse(('no', )),
438
request.execute('does-not-exist'))
440
def test_empty_directory(self):
441
backing = self.get_transport()
442
backing.mkdir('empty')
443
request = smart_dir.SmartServerRequestOpenBzrDir(backing)
444
self.assertEqual(smart_req.SmartServerResponse(('no', )),
445
request.execute('empty'))
447
def test_outside_root_client_path(self):
448
backing = self.get_transport()
449
request = smart_dir.SmartServerRequestOpenBzrDir(backing,
450
root_client_path='root')
451
self.assertEqual(smart_req.SmartServerResponse(('no', )),
452
request.execute('not-root'))
455
class TestSmartServerRequestOpenBzrDir_2_1(tests.TestCaseWithMemoryTransport):
457
def test_no_directory(self):
458
backing = self.get_transport()
459
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
460
self.assertEqual(smart_req.SmartServerResponse(('no', )),
461
request.execute('does-not-exist'))
463
def test_empty_directory(self):
464
backing = self.get_transport()
465
backing.mkdir('empty')
466
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
467
self.assertEqual(smart_req.SmartServerResponse(('no', )),
468
request.execute('empty'))
470
def test_present_without_workingtree(self):
471
backing = self.get_transport()
472
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
473
self.make_bzrdir('.')
474
self.assertEqual(smart_req.SmartServerResponse(('yes', 'no')),
477
def test_outside_root_client_path(self):
478
backing = self.get_transport()
479
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing,
480
root_client_path='root')
481
self.assertEqual(smart_req.SmartServerResponse(('no',)),
482
request.execute('not-root'))
485
class TestSmartServerRequestOpenBzrDir_2_1_disk(TestCaseWithChrootedTransport):
487
def test_present_with_workingtree(self):
488
self.vfs_transport_factory = test_server.LocalURLServer
489
backing = self.get_transport()
490
request = smart_dir.SmartServerRequestOpenBzrDir_2_1(backing)
491
bd = self.make_bzrdir('.')
492
bd.create_repository()
494
bd.create_workingtree()
495
self.assertEqual(smart_req.SmartServerResponse(('yes', 'yes')),
499
330
class TestSmartServerRequestOpenBranch(TestCaseWithChrootedTransport):
501
332
def test_no_branch(self):
502
333
"""When there is no branch, ('nobranch', ) is returned."""
503
334
backing = self.get_transport()
504
request = smart_dir.SmartServerRequestOpenBranch(backing)
335
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
505
336
self.make_bzrdir('.')
506
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
337
self.assertEqual(SmartServerResponse(('nobranch', )),
507
338
request.execute(''))
509
340
def test_branch(self):
510
341
"""When there is a branch, 'ok' is returned."""
511
342
backing = self.get_transport()
512
request = smart_dir.SmartServerRequestOpenBranch(backing)
343
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
513
344
self.make_branch('.')
514
self.assertEqual(smart_req.SmartServerResponse(('ok', '')),
345
self.assertEqual(SmartServerResponse(('ok', '')),
515
346
request.execute(''))
517
348
def test_branch_reference(self):
518
349
"""When there is a branch reference, the reference URL is returned."""
519
self.vfs_transport_factory = test_server.LocalURLServer
520
350
backing = self.get_transport()
521
request = smart_dir.SmartServerRequestOpenBranch(backing)
351
request = smart.bzrdir.SmartServerRequestOpenBranch(backing)
522
352
branch = self.make_branch('branch')
523
353
checkout = branch.create_checkout('reference',lightweight=True)
524
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
354
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
526
355
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
527
self.assertEqual(smart_req.SmartServerResponse(('ok', reference_url)),
356
self.assertEqual(SmartServerResponse(('ok', reference_url)),
528
357
request.execute('reference'))
530
def test_notification_on_branch_from_repository(self):
531
"""When there is a repository, the error should return details."""
532
backing = self.get_transport()
533
request = smart_dir.SmartServerRequestOpenBranch(backing)
534
repo = self.make_repository('.')
535
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
539
360
class TestSmartServerRequestOpenBranchV2(TestCaseWithChrootedTransport):
542
363
"""When there is no branch, ('nobranch', ) is returned."""
543
364
backing = self.get_transport()
544
365
self.make_bzrdir('.')
545
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
546
self.assertEqual(smart_req.SmartServerResponse(('nobranch', )),
549
def test_branch(self):
550
"""When there is a branch, 'ok' is returned."""
551
backing = self.get_transport()
552
expected = self.make_branch('.')._format.network_name()
553
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
554
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
555
('branch', expected)),
558
def test_branch_reference(self):
559
"""When there is a branch reference, the reference URL is returned."""
560
self.vfs_transport_factory = test_server.LocalURLServer
561
backing = self.get_transport()
562
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
563
branch = self.make_branch('branch')
564
checkout = branch.create_checkout('reference',lightweight=True)
565
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
567
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
568
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
569
('ref', reference_url)),
570
request.execute('reference'))
572
def test_stacked_branch(self):
573
"""Opening a stacked branch does not open the stacked-on branch."""
574
trunk = self.make_branch('trunk')
575
feature = self.make_branch('feature')
576
feature.set_stacked_on_url(trunk.base)
578
_mod_branch.Branch.hooks.install_named_hook(
579
'open', opened_branches.append, None)
580
backing = self.get_transport()
581
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
584
response = request.execute('feature')
586
request.teardown_jail()
587
expected_format = feature._format.network_name()
588
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
589
('branch', expected_format)),
591
self.assertLength(1, opened_branches)
593
def test_notification_on_branch_from_repository(self):
594
"""When there is a repository, the error should return details."""
595
backing = self.get_transport()
596
request = smart_dir.SmartServerRequestOpenBranchV2(backing)
597
repo = self.make_repository('.')
598
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
602
class TestSmartServerRequestOpenBranchV3(TestCaseWithChrootedTransport):
604
def test_no_branch(self):
605
"""When there is no branch, ('nobranch', ) is returned."""
606
backing = self.get_transport()
607
self.make_bzrdir('.')
608
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
609
self.assertEqual(smart_req.SmartServerResponse(('nobranch',)),
612
def test_branch(self):
613
"""When there is a branch, 'ok' is returned."""
614
backing = self.get_transport()
615
expected = self.make_branch('.')._format.network_name()
616
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
617
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
618
('branch', expected)),
621
def test_branch_reference(self):
622
"""When there is a branch reference, the reference URL is returned."""
623
self.vfs_transport_factory = test_server.LocalURLServer
624
backing = self.get_transport()
625
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
626
branch = self.make_branch('branch')
627
checkout = branch.create_checkout('reference',lightweight=True)
628
reference_url = _mod_branch.BranchReferenceFormat().get_reference(
630
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
631
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
632
('ref', reference_url)),
633
request.execute('reference'))
635
def test_stacked_branch(self):
636
"""Opening a stacked branch does not open the stacked-on branch."""
637
trunk = self.make_branch('trunk')
638
feature = self.make_branch('feature')
639
feature.set_stacked_on_url(trunk.base)
641
_mod_branch.Branch.hooks.install_named_hook(
642
'open', opened_branches.append, None)
643
backing = self.get_transport()
644
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
647
response = request.execute('feature')
649
request.teardown_jail()
650
expected_format = feature._format.network_name()
651
self.assertEqual(smart_req.SuccessfulSmartServerResponse(
652
('branch', expected_format)),
654
self.assertLength(1, opened_branches)
656
def test_notification_on_branch_from_repository(self):
657
"""When there is a repository, the error should return details."""
658
backing = self.get_transport()
659
request = smart_dir.SmartServerRequestOpenBranchV3(backing)
660
repo = self.make_repository('.')
661
self.assertEqual(smart_req.SmartServerResponse(
662
('nobranch', 'location is a repository')),
366
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
367
self.assertEqual(SmartServerResponse(('nobranch', )),
370
def test_branch(self):
371
"""When there is a branch, 'ok' is returned."""
372
backing = self.get_transport()
373
expected = self.make_branch('.')._format.network_name()
374
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
375
self.assertEqual(SuccessfulSmartServerResponse(('branch', expected)),
378
def test_branch_reference(self):
379
"""When there is a branch reference, the reference URL is returned."""
380
backing = self.get_transport()
381
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
382
branch = self.make_branch('branch')
383
checkout = branch.create_checkout('reference',lightweight=True)
384
reference_url = BranchReferenceFormat().get_reference(checkout.bzrdir)
385
self.assertFileEqual(reference_url, 'reference/.bzr/branch/location')
386
self.assertEqual(SuccessfulSmartServerResponse(('ref', reference_url)),
387
request.execute('reference'))
389
def test_stacked_branch(self):
390
"""Opening a stacked branch does not open the stacked-on branch."""
391
trunk = self.make_branch('trunk')
392
feature = self.make_branch('feature', format='1.9')
393
feature.set_stacked_on_url(trunk.base)
395
Branch.hooks.install_named_hook('open', opened_branches.append, None)
396
backing = self.get_transport()
397
request = smart.bzrdir.SmartServerRequestOpenBranchV2(backing)
400
response = request.execute('feature')
402
request.teardown_jail()
403
expected_format = feature._format.network_name()
405
SuccessfulSmartServerResponse(('branch', expected_format)),
407
self.assertLength(1, opened_branches)
666
410
class TestSmartServerRequestRevisionHistory(tests.TestCaseWithMemoryTransport):
774
516
def test_value_name(self):
775
517
branch = self.make_branch('.')
776
request = smart_branch.SmartServerBranchRequestSetConfigOption(
518
request = smart.branch.SmartServerBranchRequestSetConfigOption(
777
519
branch.bzrdir.root_transport)
778
520
branch_token, repo_token = self.get_lock_tokens(branch)
779
521
config = branch._get_config()
780
522
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
782
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
524
self.assertEqual(SuccessfulSmartServerResponse(()), result)
783
525
self.assertEqual('bar', config.get_option('foo'))
787
527
def test_value_name_section(self):
788
528
branch = self.make_branch('.')
789
request = smart_branch.SmartServerBranchRequestSetConfigOption(
529
request = smart.branch.SmartServerBranchRequestSetConfigOption(
790
530
branch.bzrdir.root_transport)
791
531
branch_token, repo_token = self.get_lock_tokens(branch)
792
532
config = branch._get_config()
793
533
result = request.execute('', branch_token, repo_token, 'bar', 'foo',
795
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
535
self.assertEqual(SuccessfulSmartServerResponse(()), result)
796
536
self.assertEqual('bar', config.get_option('foo', 'gam'))
801
class TestSmartServerBranchRequestSetConfigOptionDict(TestLockedBranch):
804
TestLockedBranch.setUp(self)
805
# A dict with non-ascii keys and values to exercise unicode
807
self.encoded_value_dict = (
808
'd5:ascii1:a11:unicode \xe2\x8c\x9a3:\xe2\x80\xbde')
810
'ascii': 'a', u'unicode \N{WATCH}': u'\N{INTERROBANG}'}
812
def test_value_name(self):
813
branch = self.make_branch('.')
814
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
815
branch.bzrdir.root_transport)
816
branch_token, repo_token = self.get_lock_tokens(branch)
817
config = branch._get_config()
818
result = request.execute('', branch_token, repo_token,
819
self.encoded_value_dict, 'foo', '')
820
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
821
self.assertEqual(self.value_dict, config.get_option('foo'))
825
def test_value_name_section(self):
826
branch = self.make_branch('.')
827
request = smart_branch.SmartServerBranchRequestSetConfigOptionDict(
828
branch.bzrdir.root_transport)
829
branch_token, repo_token = self.get_lock_tokens(branch)
830
config = branch._get_config()
831
result = request.execute('', branch_token, repo_token,
832
self.encoded_value_dict, 'foo', 'gam')
833
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), result)
834
self.assertEqual(self.value_dict, config.get_option('foo', 'gam'))
839
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
840
# Only called when the branch format and tags match [yay factory
841
# methods] so only need to test straight forward cases.
843
def test_set_bytes(self):
844
base_branch = self.make_branch('base')
845
tag_bytes = base_branch._get_tags_bytes()
846
# get_lock_tokens takes out a lock.
847
branch_token, repo_token = self.get_lock_tokens(base_branch)
848
request = smart_branch.SmartServerBranchSetTagsBytes(
849
self.get_transport())
850
response = request.execute('base', branch_token, repo_token)
851
self.assertEqual(None, response)
852
response = request.do_chunk(tag_bytes)
853
self.assertEqual(None, response)
854
response = request.do_end()
856
smart_req.SuccessfulSmartServerResponse(()), response)
859
def test_lock_failed(self):
860
base_branch = self.make_branch('base')
861
base_branch.lock_write()
862
tag_bytes = base_branch._get_tags_bytes()
863
request = smart_branch.SmartServerBranchSetTagsBytes(
864
self.get_transport())
865
self.assertRaises(errors.TokenMismatch, request.execute,
866
'base', 'wrong token', 'wrong token')
867
# The request handler will keep processing the message parts, so even
868
# if the request fails immediately do_chunk and do_end are still
870
request.do_chunk(tag_bytes)
876
539
class SetLastRevisionTestBase(TestLockedBranch):
1093
755
def test_get_parent_none(self):
1094
756
base_branch = self.make_branch('base')
1095
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
757
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1096
758
response = request.execute('base')
1097
759
self.assertEquals(
1098
smart_req.SuccessfulSmartServerResponse(('',)), response)
760
SuccessfulSmartServerResponse(('',)), response)
1100
762
def test_get_parent_something(self):
1101
763
base_branch = self.make_branch('base')
1102
764
base_branch.set_parent(self.get_url('foo'))
1103
request = smart_branch.SmartServerBranchGetParent(self.get_transport())
765
request = smart.branch.SmartServerBranchGetParent(self.get_transport())
1104
766
response = request.execute('base')
1105
767
self.assertEquals(
1106
smart_req.SuccessfulSmartServerResponse(("../foo",)),
768
SuccessfulSmartServerResponse(("../foo",)),
1110
class TestSmartServerBranchRequestSetParent(TestLockedBranch):
1112
def test_set_parent_none(self):
1113
branch = self.make_branch('base', format="1.9")
1115
branch._set_parent_location('foo')
1117
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1118
self.get_transport())
1119
branch_token, repo_token = self.get_lock_tokens(branch)
1121
response = request.execute('base', branch_token, repo_token, '')
1124
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1125
self.assertEqual(None, branch.get_parent())
1127
def test_set_parent_something(self):
1128
branch = self.make_branch('base', format="1.9")
1129
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1130
self.get_transport())
1131
branch_token, repo_token = self.get_lock_tokens(branch)
1133
response = request.execute('base', branch_token, repo_token,
1137
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1138
self.assertEqual('http://bar/', branch.get_parent())
1141
class TestSmartServerBranchRequestGetTagsBytes(
1142
tests.TestCaseWithMemoryTransport):
1143
# Only called when the branch format and tags match [yay factory
1144
# methods] so only need to test straight forward cases.
772
class TestSmartServerBranchRequestGetTagsBytes(tests.TestCaseWithMemoryTransport):
773
# Only called when the branch format and tags match [yay factory
774
# methods] so only need to test straight forward cases.
1146
776
def test_get_bytes(self):
1147
777
base_branch = self.make_branch('base')
1148
request = smart_branch.SmartServerBranchGetTagsBytes(
778
request = smart.branch.SmartServerBranchGetTagsBytes(
1149
779
self.get_transport())
1150
780
response = request.execute('base')
1151
781
self.assertEquals(
1152
smart_req.SuccessfulSmartServerResponse(('',)), response)
782
SuccessfulSmartServerResponse(('',)), response)
1155
785
class TestSmartServerBranchRequestGetStackedOnURL(tests.TestCaseWithMemoryTransport):
1159
789
stacked_branch = self.make_branch('stacked', format='1.6')
1160
790
# typically should be relative
1161
791
stacked_branch.set_stacked_on_url('../base')
1162
request = smart_branch.SmartServerBranchRequestGetStackedOnURL(
792
request = smart.branch.SmartServerBranchRequestGetStackedOnURL(
1163
793
self.get_transport())
1164
794
response = request.execute('stacked')
1165
795
self.assertEquals(
1166
smart_req.SmartServerResponse(('ok', '../base')),
796
SmartServerResponse(('ok', '../base')),
1170
class TestSmartServerBranchRequestLockWrite(TestLockedBranch):
800
class TestSmartServerBranchRequestLockWrite(tests.TestCaseWithMemoryTransport):
1172
802
def setUp(self):
1173
803
tests.TestCaseWithMemoryTransport.setUp(self)
1175
805
def test_lock_write_on_unlocked_branch(self):
1176
806
backing = self.get_transport()
1177
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
807
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1178
808
branch = self.make_branch('.', format='knit')
1179
809
repository = branch.repository
1180
810
response = request.execute('')
1181
811
branch_nonce = branch.control_files._lock.peek().get('nonce')
1182
812
repository_nonce = repository.control_files._lock.peek().get('nonce')
1183
self.assertEqual(smart_req.SmartServerResponse(
1184
('ok', branch_nonce, repository_nonce)),
814
SmartServerResponse(('ok', branch_nonce, repository_nonce)),
1186
816
# The branch (and associated repository) is now locked. Verify that
1187
817
# with a new branch object.
1188
818
new_branch = repository.bzrdir.open_branch()
1189
819
self.assertRaises(errors.LockContention, new_branch.lock_write)
1191
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1192
response = request.execute('', branch_nonce, repository_nonce)
1194
821
def test_lock_write_on_locked_branch(self):
1195
822
backing = self.get_transport()
1196
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
823
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1197
824
branch = self.make_branch('.')
1198
branch_token = branch.lock_write().branch_token
1199
826
branch.leave_lock_in_place()
1201
828
response = request.execute('')
1202
829
self.assertEqual(
1203
smart_req.SmartServerResponse(('LockContention',)), response)
1205
branch.lock_write(branch_token)
1206
branch.dont_leave_lock_in_place()
830
SmartServerResponse(('LockContention',)), response)
1209
832
def test_lock_write_with_tokens_on_locked_branch(self):
1210
833
backing = self.get_transport()
1211
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
834
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1212
835
branch = self.make_branch('.', format='knit')
1213
branch_token, repo_token = self.get_lock_tokens(branch)
836
branch_token = branch.lock_write()
837
repo_token = branch.repository.lock_write()
838
branch.repository.unlock()
1214
839
branch.leave_lock_in_place()
1215
840
branch.repository.leave_lock_in_place()
1217
842
response = request.execute('',
1218
843
branch_token, repo_token)
1219
844
self.assertEqual(
1220
smart_req.SmartServerResponse(('ok', branch_token, repo_token)),
1223
branch.repository.lock_write(repo_token)
1224
branch.repository.dont_leave_lock_in_place()
1225
branch.repository.unlock()
1226
branch.lock_write(branch_token)
1227
branch.dont_leave_lock_in_place()
845
SmartServerResponse(('ok', branch_token, repo_token)), response)
1230
847
def test_lock_write_with_mismatched_tokens_on_locked_branch(self):
1231
848
backing = self.get_transport()
1232
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
849
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1233
850
branch = self.make_branch('.', format='knit')
1234
branch_token, repo_token = self.get_lock_tokens(branch)
851
branch_token = branch.lock_write()
852
repo_token = branch.repository.lock_write()
853
branch.repository.unlock()
1235
854
branch.leave_lock_in_place()
1236
855
branch.repository.leave_lock_in_place()
1238
857
response = request.execute('',
1239
858
branch_token+'xxx', repo_token)
1240
859
self.assertEqual(
1241
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1243
branch.repository.lock_write(repo_token)
1244
branch.repository.dont_leave_lock_in_place()
1245
branch.repository.unlock()
1246
branch.lock_write(branch_token)
1247
branch.dont_leave_lock_in_place()
860
SmartServerResponse(('TokenMismatch',)), response)
1250
862
def test_lock_write_on_locked_repo(self):
1251
863
backing = self.get_transport()
1252
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
864
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1253
865
branch = self.make_branch('.', format='knit')
1254
repo = branch.repository
1255
repo_token = repo.lock_write().repository_token
1256
repo.leave_lock_in_place()
866
branch.repository.lock_write()
867
branch.repository.leave_lock_in_place()
868
branch.repository.unlock()
1258
869
response = request.execute('')
1259
870
self.assertEqual(
1260
smart_req.SmartServerResponse(('LockContention',)), response)
1262
repo.lock_write(repo_token)
1263
repo.dont_leave_lock_in_place()
871
SmartServerResponse(('LockContention',)), response)
1266
873
def test_lock_write_on_readonly_transport(self):
1267
874
backing = self.get_readonly_transport()
1268
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
875
request = smart.branch.SmartServerBranchRequestLockWrite(backing)
1269
876
branch = self.make_branch('.')
1270
877
root = self.get_transport().clone('/')
1271
878
path = urlutils.relative_url(root.base, self.get_transport().base)
1421
1026
# Note that it still returns body (of zero bytes).
1422
self.assertEqual(smart_req.SmartServerResponse(
1423
('nosuchrevision', 'missingrevision', ), ''),
1424
request.execute('', 'missingrevision'))
1427
class TestSmartServerRepositoryGetRevIdForRevno(
1428
tests.TestCaseWithMemoryTransport):
1430
def test_revno_found(self):
1431
backing = self.get_transport()
1432
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1433
tree = self.make_branch_and_memory_tree('.')
1436
rev1_id_utf8 = u'\xc8'.encode('utf-8')
1437
rev2_id_utf8 = u'\xc9'.encode('utf-8')
1438
tree.commit('1st commit', rev_id=rev1_id_utf8)
1439
tree.commit('2nd commit', rev_id=rev2_id_utf8)
1442
self.assertEqual(smart_req.SmartServerResponse(('ok', rev1_id_utf8)),
1443
request.execute('', 1, (2, rev2_id_utf8)))
1445
def test_known_revid_missing(self):
1446
backing = self.get_transport()
1447
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1448
repo = self.make_repository('.')
1450
smart_req.FailedSmartServerResponse(('nosuchrevision', 'ghost')),
1451
request.execute('', 1, (2, 'ghost')))
1453
def test_history_incomplete(self):
1454
backing = self.get_transport()
1455
request = smart_repo.SmartServerRepositoryGetRevIdForRevno(backing)
1456
parent = self.make_branch_and_memory_tree('parent', format='1.9')
1458
parent.add([''], ['TREE_ROOT'])
1459
r1 = parent.commit(message='first commit')
1460
r2 = parent.commit(message='second commit')
1462
local = self.make_branch_and_memory_tree('local', format='1.9')
1463
local.branch.pull(parent.branch)
1464
local.set_parent_ids([r2])
1465
r3 = local.commit(message='local commit')
1466
local.branch.create_clone_on_transport(
1467
self.get_transport('stacked'), stacked_on=self.get_url('parent'))
1469
smart_req.SmartServerResponse(('history-incomplete', 2, r2)),
1470
request.execute('stacked', 1, (3, r3)))
1473
class GetStreamTestBase(tests.TestCaseWithMemoryTransport):
1028
SmartServerResponse(('nosuchrevision', 'missingrevision', ), ''),
1029
request.execute('', 'missingrevision'))
1032
class TestSmartServerRepositoryGetStream(tests.TestCaseWithMemoryTransport):
1475
1034
def make_two_commit_repo(self):
1476
1035
tree = self.make_branch_and_memory_tree('.')
1680
1217
def test_insert_stream_empty(self):
1681
1218
backing = self.get_transport()
1682
request = smart_repo.SmartServerRepositoryInsertStream(backing)
1219
request = smart.repository.SmartServerRepositoryInsertStream(backing)
1683
1220
repository = self.make_repository('.')
1684
1221
response = request.execute('', '')
1685
1222
self.assertEqual(None, response)
1686
1223
response = request.do_chunk(self.make_empty_byte_stream(repository))
1687
1224
self.assertEqual(None, response)
1688
1225
response = request.do_end()
1689
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1226
self.assertEqual(SmartServerResponse(('ok', )), response)
1692
1229
class TestSmartServerRepositoryInsertStreamLocked(TestInsertStreamBase):
1694
1231
def test_insert_stream_empty(self):
1695
1232
backing = self.get_transport()
1696
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1233
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1698
1235
repository = self.make_repository('.', format='knit')
1699
lock_token = repository.lock_write().repository_token
1236
lock_token = repository.lock_write()
1700
1237
response = request.execute('', '', lock_token)
1701
1238
self.assertEqual(None, response)
1702
1239
response = request.do_chunk(self.make_empty_byte_stream(repository))
1703
1240
self.assertEqual(None, response)
1704
1241
response = request.do_end()
1705
self.assertEqual(smart_req.SmartServerResponse(('ok', )), response)
1242
self.assertEqual(SmartServerResponse(('ok', )), response)
1706
1243
repository.unlock()
1708
1245
def test_insert_stream_with_wrong_lock_token(self):
1709
1246
backing = self.get_transport()
1710
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1247
request = smart.repository.SmartServerRepositoryInsertStreamLocked(
1712
1249
repository = self.make_repository('.', format='knit')
1713
lock_token = repository.lock_write().repository_token
1250
lock_token = repository.lock_write()
1714
1251
self.assertRaises(
1715
1252
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1716
1253
repository.unlock()
1740
1277
def test_unlock_on_unlocked_repo(self):
1741
1278
backing = self.get_transport()
1742
request = smart_repo.SmartServerRepositoryUnlock(backing)
1279
request = smart.repository.SmartServerRepositoryUnlock(backing)
1743
1280
repository = self.make_repository('.', format='knit')
1744
1281
response = request.execute('', 'some token')
1745
1282
self.assertEqual(
1746
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1283
SmartServerResponse(('TokenMismatch',)), response)
1749
1286
class TestSmartServerIsReadonly(tests.TestCaseWithMemoryTransport):
1751
1288
def test_is_readonly_no(self):
1752
1289
backing = self.get_transport()
1753
request = smart_req.SmartServerIsReadonly(backing)
1290
request = smart.request.SmartServerIsReadonly(backing)
1754
1291
response = request.execute()
1755
1292
self.assertEqual(
1756
smart_req.SmartServerResponse(('no',)), response)
1293
SmartServerResponse(('no',)), response)
1758
1295
def test_is_readonly_yes(self):
1759
1296
backing = self.get_readonly_transport()
1760
request = smart_req.SmartServerIsReadonly(backing)
1297
request = smart.request.SmartServerIsReadonly(backing)
1761
1298
response = request.execute()
1762
1299
self.assertEqual(
1763
smart_req.SmartServerResponse(('yes',)), response)
1766
class TestSmartServerRepositorySetMakeWorkingTrees(
1767
tests.TestCaseWithMemoryTransport):
1300
SmartServerResponse(('yes',)), response)
1303
class TestSmartServerRepositorySetMakeWorkingTrees(tests.TestCaseWithMemoryTransport):
1769
1305
def test_set_false(self):
1770
1306
backing = self.get_transport()
1771
1307
repo = self.make_repository('.', shared=True)
1772
1308
repo.set_make_working_trees(True)
1773
request_class = smart_repo.SmartServerRepositorySetMakeWorkingTrees
1309
request_class = smart.repository.SmartServerRepositorySetMakeWorkingTrees
1774
1310
request = request_class(backing)
1775
self.assertEqual(smart_req.SuccessfulSmartServerResponse(('ok',)),
1311
self.assertEqual(SuccessfulSmartServerResponse(('ok',)),
1776
1312
request.execute('', 'False'))
1777
1313
repo = repo.bzrdir.open_repository()
1778
1314
self.assertFalse(repo.make_working_trees())
1860
1383
"""All registered request_handlers can be found."""
1861
1384
# If there's a typo in a register_lazy call, this loop will fail with
1862
1385
# an AttributeError.
1863
for key, item in smart_req.request_handlers.iteritems():
1386
for key, item in smart.request.request_handlers.iteritems():
1866
def assertHandlerEqual(self, verb, handler):
1867
self.assertEqual(smart_req.request_handlers.get(verb), handler)
1869
1389
def test_registered_methods(self):
1870
1390
"""Test that known methods are registered to the correct object."""
1871
self.assertHandlerEqual('Branch.get_config_file',
1872
smart_branch.SmartServerBranchGetConfigFile)
1873
self.assertHandlerEqual('Branch.get_parent',
1874
smart_branch.SmartServerBranchGetParent)
1875
self.assertHandlerEqual('Branch.get_tags_bytes',
1876
smart_branch.SmartServerBranchGetTagsBytes)
1877
self.assertHandlerEqual('Branch.lock_write',
1878
smart_branch.SmartServerBranchRequestLockWrite)
1879
self.assertHandlerEqual('Branch.last_revision_info',
1880
smart_branch.SmartServerBranchRequestLastRevisionInfo)
1881
self.assertHandlerEqual('Branch.revision_history',
1882
smart_branch.SmartServerRequestRevisionHistory)
1883
self.assertHandlerEqual('Branch.set_config_option',
1884
smart_branch.SmartServerBranchRequestSetConfigOption)
1885
self.assertHandlerEqual('Branch.set_last_revision',
1886
smart_branch.SmartServerBranchRequestSetLastRevision)
1887
self.assertHandlerEqual('Branch.set_last_revision_info',
1888
smart_branch.SmartServerBranchRequestSetLastRevisionInfo)
1889
self.assertHandlerEqual('Branch.set_last_revision_ex',
1890
smart_branch.SmartServerBranchRequestSetLastRevisionEx)
1891
self.assertHandlerEqual('Branch.set_parent_location',
1892
smart_branch.SmartServerBranchRequestSetParentLocation)
1893
self.assertHandlerEqual('Branch.unlock',
1894
smart_branch.SmartServerBranchRequestUnlock)
1895
self.assertHandlerEqual('BzrDir.find_repository',
1896
smart_dir.SmartServerRequestFindRepositoryV1)
1897
self.assertHandlerEqual('BzrDir.find_repositoryV2',
1898
smart_dir.SmartServerRequestFindRepositoryV2)
1899
self.assertHandlerEqual('BzrDirFormat.initialize',
1900
smart_dir.SmartServerRequestInitializeBzrDir)
1901
self.assertHandlerEqual('BzrDirFormat.initialize_ex_1.16',
1902
smart_dir.SmartServerRequestBzrDirInitializeEx)
1903
self.assertHandlerEqual('BzrDir.cloning_metadir',
1904
smart_dir.SmartServerBzrDirRequestCloningMetaDir)
1905
self.assertHandlerEqual('BzrDir.get_config_file',
1906
smart_dir.SmartServerBzrDirRequestConfigFile)
1907
self.assertHandlerEqual('BzrDir.open_branch',
1908
smart_dir.SmartServerRequestOpenBranch)
1909
self.assertHandlerEqual('BzrDir.open_branchV2',
1910
smart_dir.SmartServerRequestOpenBranchV2)
1911
self.assertHandlerEqual('BzrDir.open_branchV3',
1912
smart_dir.SmartServerRequestOpenBranchV3)
1913
self.assertHandlerEqual('PackRepository.autopack',
1914
smart_packrepo.SmartServerPackRepositoryAutopack)
1915
self.assertHandlerEqual('Repository.gather_stats',
1916
smart_repo.SmartServerRepositoryGatherStats)
1917
self.assertHandlerEqual('Repository.get_parent_map',
1918
smart_repo.SmartServerRepositoryGetParentMap)
1919
self.assertHandlerEqual('Repository.get_rev_id_for_revno',
1920
smart_repo.SmartServerRepositoryGetRevIdForRevno)
1921
self.assertHandlerEqual('Repository.get_revision_graph',
1922
smart_repo.SmartServerRepositoryGetRevisionGraph)
1923
self.assertHandlerEqual('Repository.get_stream',
1924
smart_repo.SmartServerRepositoryGetStream)
1925
self.assertHandlerEqual('Repository.get_stream_1.19',
1926
smart_repo.SmartServerRepositoryGetStream_1_19)
1927
self.assertHandlerEqual('Repository.has_revision',
1928
smart_repo.SmartServerRequestHasRevision)
1929
self.assertHandlerEqual('Repository.insert_stream',
1930
smart_repo.SmartServerRepositoryInsertStream)
1931
self.assertHandlerEqual('Repository.insert_stream_locked',
1932
smart_repo.SmartServerRepositoryInsertStreamLocked)
1933
self.assertHandlerEqual('Repository.is_shared',
1934
smart_repo.SmartServerRepositoryIsShared)
1935
self.assertHandlerEqual('Repository.lock_write',
1936
smart_repo.SmartServerRepositoryLockWrite)
1937
self.assertHandlerEqual('Repository.tarball',
1938
smart_repo.SmartServerRepositoryTarball)
1939
self.assertHandlerEqual('Repository.unlock',
1940
smart_repo.SmartServerRepositoryUnlock)
1941
self.assertHandlerEqual('Transport.is_readonly',
1942
smart_req.SmartServerIsReadonly)
1945
class SmartTCPServerHookTests(tests.TestCaseWithMemoryTransport):
1946
"""Tests for SmartTCPServer hooks."""
1949
super(SmartTCPServerHookTests, self).setUp()
1950
self.server = server.SmartTCPServer(self.get_transport())
1952
def test_run_server_started_hooks(self):
1953
"""Test the server started hooks get fired properly."""
1955
server.SmartTCPServer.hooks.install_named_hook('server_started',
1956
lambda backing_urls, url: started_calls.append((backing_urls, url)),
1958
started_ex_calls = []
1959
server.SmartTCPServer.hooks.install_named_hook('server_started_ex',
1960
lambda backing_urls, url: started_ex_calls.append((backing_urls, url)),
1962
self.server._sockname = ('example.com', 42)
1963
self.server.run_server_started_hooks()
1964
self.assertEquals(started_calls,
1965
[([self.get_transport().base], 'bzr://example.com:42/')])
1966
self.assertEquals(started_ex_calls,
1967
[([self.get_transport().base], self.server)])
1969
def test_run_server_started_hooks_ipv6(self):
1970
"""Test that socknames can contain 4-tuples."""
1971
self.server._sockname = ('::', 42, 0, 0)
1973
server.SmartTCPServer.hooks.install_named_hook('server_started',
1974
lambda backing_urls, url: started_calls.append((backing_urls, url)),
1976
self.server.run_server_started_hooks()
1977
self.assertEquals(started_calls,
1978
[([self.get_transport().base], 'bzr://:::42/')])
1980
def test_run_server_stopped_hooks(self):
1981
"""Test the server stopped hooks."""
1982
self.server._sockname = ('example.com', 42)
1984
server.SmartTCPServer.hooks.install_named_hook('server_stopped',
1985
lambda backing_urls, url: stopped_calls.append((backing_urls, url)),
1987
self.server.run_server_stopped_hooks()
1988
self.assertEquals(stopped_calls,
1989
[([self.get_transport().base], 'bzr://example.com:42/')])
1392
smart.request.request_handlers.get('Branch.get_config_file'),
1393
smart.branch.SmartServerBranchGetConfigFile)
1395
smart.request.request_handlers.get('Branch.get_parent'),
1396
smart.branch.SmartServerBranchGetParent)
1398
smart.request.request_handlers.get('Branch.get_tags_bytes'),
1399
smart.branch.SmartServerBranchGetTagsBytes)
1401
smart.request.request_handlers.get('Branch.lock_write'),
1402
smart.branch.SmartServerBranchRequestLockWrite)
1404
smart.request.request_handlers.get('Branch.last_revision_info'),
1405
smart.branch.SmartServerBranchRequestLastRevisionInfo)
1407
smart.request.request_handlers.get('Branch.revision_history'),
1408
smart.branch.SmartServerRequestRevisionHistory)
1410
smart.request.request_handlers.get('Branch.set_config_option'),
1411
smart.branch.SmartServerBranchRequestSetConfigOption)
1413
smart.request.request_handlers.get('Branch.set_last_revision'),
1414
smart.branch.SmartServerBranchRequestSetLastRevision)
1416
smart.request.request_handlers.get('Branch.set_last_revision_info'),
1417
smart.branch.SmartServerBranchRequestSetLastRevisionInfo)
1419
smart.request.request_handlers.get('Branch.unlock'),
1420
smart.branch.SmartServerBranchRequestUnlock)
1422
smart.request.request_handlers.get('BzrDir.find_repository'),
1423
smart.bzrdir.SmartServerRequestFindRepositoryV1)
1425
smart.request.request_handlers.get('BzrDir.find_repositoryV2'),
1426
smart.bzrdir.SmartServerRequestFindRepositoryV2)
1428
smart.request.request_handlers.get('BzrDirFormat.initialize'),
1429
smart.bzrdir.SmartServerRequestInitializeBzrDir)
1431
smart.request.request_handlers.get('BzrDir.cloning_metadir'),
1432
smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
1434
smart.request.request_handlers.get('BzrDir.open_branch'),
1435
smart.bzrdir.SmartServerRequestOpenBranch)
1437
smart.request.request_handlers.get('BzrDir.open_branchV2'),
1438
smart.bzrdir.SmartServerRequestOpenBranchV2)
1440
smart.request.request_handlers.get('PackRepository.autopack'),
1441
smart.packrepository.SmartServerPackRepositoryAutopack)
1443
smart.request.request_handlers.get('Repository.gather_stats'),
1444
smart.repository.SmartServerRepositoryGatherStats)
1446
smart.request.request_handlers.get('Repository.get_parent_map'),
1447
smart.repository.SmartServerRepositoryGetParentMap)
1449
smart.request.request_handlers.get(
1450
'Repository.get_revision_graph'),
1451
smart.repository.SmartServerRepositoryGetRevisionGraph)
1453
smart.request.request_handlers.get('Repository.get_stream'),
1454
smart.repository.SmartServerRepositoryGetStream)
1456
smart.request.request_handlers.get('Repository.has_revision'),
1457
smart.repository.SmartServerRequestHasRevision)
1459
smart.request.request_handlers.get('Repository.insert_stream'),
1460
smart.repository.SmartServerRepositoryInsertStream)
1462
smart.request.request_handlers.get('Repository.insert_stream_locked'),
1463
smart.repository.SmartServerRepositoryInsertStreamLocked)
1465
smart.request.request_handlers.get('Repository.is_shared'),
1466
smart.repository.SmartServerRepositoryIsShared)
1468
smart.request.request_handlers.get('Repository.lock_write'),
1469
smart.repository.SmartServerRepositoryLockWrite)
1471
smart.request.request_handlers.get('Repository.tarball'),
1472
smart.repository.SmartServerRepositoryTarball)
1474
smart.request.request_handlers.get('Repository.unlock'),
1475
smart.repository.SmartServerRepositoryUnlock)
1477
smart.request.request_handlers.get('Transport.is_readonly'),
1478
smart.request.SmartServerIsReadonly)