767
763
class TestLockedBranch(tests.TestCaseWithMemoryTransport):
769
765
def get_lock_tokens(self, branch):
770
branch_token = branch.lock_write()
771
repo_token = branch.repository.lock_write()
766
branch_token = branch.lock_write().branch_token
767
repo_token = branch.repository.lock_write().repository_token
772
768
branch.repository.unlock()
773
769
return branch_token, repo_token
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'))
805
839
class TestSmartServerBranchRequestSetTagsBytes(TestLockedBranch):
806
840
# Only called when the branch format and tags match [yay factory
807
841
# methods] so only need to test straight forward cases.
1082
1116
branch.unlock()
1083
1117
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1084
1118
self.get_transport())
1085
branch_token = branch.lock_write()
1086
repo_token = branch.repository.lock_write()
1119
branch_token, repo_token = self.get_lock_tokens(branch)
1088
1121
response = request.execute('base', branch_token, repo_token, '')
1090
branch.repository.unlock()
1091
1123
branch.unlock()
1092
1124
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1093
1125
self.assertEqual(None, branch.get_parent())
1096
1128
branch = self.make_branch('base', format="1.9")
1097
1129
request = smart_branch.SmartServerBranchRequestSetParentLocation(
1098
1130
self.get_transport())
1099
branch_token = branch.lock_write()
1100
repo_token = branch.repository.lock_write()
1131
branch_token, repo_token = self.get_lock_tokens(branch)
1102
1133
response = request.execute('base', branch_token, repo_token,
1105
branch.repository.unlock()
1106
1136
branch.unlock()
1107
1137
self.assertEqual(smart_req.SuccessfulSmartServerResponse(()), response)
1108
1138
self.assertEqual('http://bar/', branch.get_parent())
1165
1195
backing = self.get_transport()
1166
1196
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1167
1197
branch = self.make_branch('.')
1168
branch_token = branch.lock_write()
1198
branch_token = branch.lock_write().branch_token
1169
1199
branch.leave_lock_in_place()
1170
1200
branch.unlock()
1171
1201
response = request.execute('')
1180
1210
backing = self.get_transport()
1181
1211
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1182
1212
branch = self.make_branch('.', format='knit')
1183
branch_token = branch.lock_write()
1184
repo_token = branch.repository.lock_write()
1185
branch.repository.unlock()
1213
branch_token, repo_token = self.get_lock_tokens(branch)
1186
1214
branch.leave_lock_in_place()
1187
1215
branch.repository.leave_lock_in_place()
1188
1216
branch.unlock()
1203
1231
backing = self.get_transport()
1204
1232
request = smart_branch.SmartServerBranchRequestLockWrite(backing)
1205
1233
branch = self.make_branch('.', format='knit')
1206
branch_token = branch.lock_write()
1207
repo_token = branch.repository.lock_write()
1208
branch.repository.unlock()
1234
branch_token, repo_token = self.get_lock_tokens(branch)
1209
1235
branch.leave_lock_in_place()
1210
1236
branch.repository.leave_lock_in_place()
1211
1237
branch.unlock()
1259
1285
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1260
1286
branch = self.make_branch('.', format='knit')
1261
1287
# Lock the branch
1262
branch_token = branch.lock_write()
1263
repo_token = branch.repository.lock_write()
1264
branch.repository.unlock()
1288
branch_token, repo_token = self.get_lock_tokens(branch)
1265
1289
# Unlock the branch (and repo) object, leaving the physical locks
1267
1291
branch.leave_lock_in_place()
1291
1315
request = smart_branch.SmartServerBranchRequestUnlock(backing)
1292
1316
branch = self.make_branch('.', format='knit')
1293
1317
# Lock the repository.
1294
repo_token = branch.repository.lock_write()
1318
repo_token = branch.repository.lock_write().repository_token
1295
1319
branch.repository.leave_lock_in_place()
1296
1320
branch.repository.unlock()
1297
1321
# Issue branch lock_write request on the unlocked branch (with locked
1299
response = request.execute(
1300
'', 'branch token', repo_token)
1323
response = request.execute('', 'branch token', repo_token)
1301
1324
self.assertEqual(
1302
1325
smart_req.SmartServerResponse(('TokenMismatch',)), response)
1485
1511
stream_bytes = ''.join(response.body_stream)
1486
1512
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1514
def test_search_everything(self):
1515
"""A search of 'everything' returns a stream."""
1516
backing = self.get_transport()
1517
request = smart_repo.SmartServerRepositoryGetStream_1_19(backing)
1518
repo, r1, r2 = self.make_two_commit_repo()
1519
serialised_fetch_spec = 'everything'
1520
request.execute('', repo._format.network_name())
1521
response = request.do_body(serialised_fetch_spec)
1522
self.assertEqual(('ok',), response.args)
1523
stream_bytes = ''.join(response.body_stream)
1524
self.assertStartsWith(stream_bytes, 'Bazaar pack format 1')
1489
1527
class TestSmartServerRequestHasRevision(tests.TestCaseWithMemoryTransport):
1610
1648
backing = self.get_transport()
1611
1649
request = smart_repo.SmartServerRepositoryLockWrite(backing)
1612
1650
repository = self.make_repository('.', format='knit')
1613
repo_token = repository.lock_write()
1651
repo_token = repository.lock_write().repository_token
1614
1652
repository.leave_lock_in_place()
1615
1653
repository.unlock()
1616
1654
response = request.execute('')
1658
1696
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1660
1698
repository = self.make_repository('.', format='knit')
1661
lock_token = repository.lock_write()
1699
lock_token = repository.lock_write().repository_token
1662
1700
response = request.execute('', '', lock_token)
1663
1701
self.assertEqual(None, response)
1664
1702
response = request.do_chunk(self.make_empty_byte_stream(repository))
1672
1710
request = smart_repo.SmartServerRepositoryInsertStreamLocked(
1674
1712
repository = self.make_repository('.', format='knit')
1675
lock_token = repository.lock_write()
1713
lock_token = repository.lock_write().repository_token
1676
1714
self.assertRaises(
1677
1715
errors.TokenMismatch, request.execute, '', '', 'wrong-token')
1678
1716
repository.unlock()
1687
1725
backing = self.get_transport()
1688
1726
request = smart_repo.SmartServerRepositoryUnlock(backing)
1689
1727
repository = self.make_repository('.', format='knit')
1690
token = repository.lock_write()
1728
token = repository.lock_write().repository_token
1691
1729
repository.leave_lock_in_place()
1692
1730
repository.unlock()
1693
1731
response = request.execute('', token)
1884
1922
smart_repo.SmartServerRepositoryGetRevisionGraph)
1885
1923
self.assertHandlerEqual('Repository.get_stream',
1886
1924
smart_repo.SmartServerRepositoryGetStream)
1925
self.assertHandlerEqual('Repository.get_stream_1.19',
1926
smart_repo.SmartServerRepositoryGetStream_1_19)
1887
1927
self.assertHandlerEqual('Repository.has_revision',
1888
1928
smart_repo.SmartServerRequestHasRevision)
1889
1929
self.assertHandlerEqual('Repository.insert_stream',
1900
1940
smart_repo.SmartServerRepositoryUnlock)
1901
1941
self.assertHandlerEqual('Transport.is_readonly',
1902
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/')])