225
238
'transport_readonly_server': 'b',
226
239
'transport_server': 'a',
227
240
'vfs_transport_factory': 'v'})],
244
class TestRepositoryParameterisation(TestCase):
245
"""A group of tests that test the repository implementation test adapter."""
247
def test_setting_vfs_transport(self):
248
"""The vfs_transport_factory can be set optionally."""
249
from bzrlib.tests.repository_implementations import formats_to_scenarios
250
scenarios = formats_to_scenarios(
251
[("(one)", "a", "b"), ("(two)", "c", "d")],
254
vfs_transport_factory="vfs")
257
{'bzrdir_format': 'b',
258
'repository_format': 'a',
259
'transport_readonly_server': None,
260
'transport_server': None,
261
'vfs_transport_factory': 'vfs'}),
263
{'bzrdir_format': 'd',
264
'repository_format': 'c',
265
'transport_readonly_server': None,
266
'transport_server': None,
267
'vfs_transport_factory': 'vfs'})],
231
class TestRepositoryScenarios(tests.TestCase):
233
270
def test_formats_to_scenarios(self):
234
from bzrlib.tests.per_repository import formats_to_scenarios
235
formats = [("(c)", remote.RemoteRepositoryFormat()),
236
("(d)", repository.format_registry.get(
237
'Bazaar repository format 2a (needs bzr 1.16 or later)\n'))]
271
"""The adapter can generate all the scenarios needed."""
272
from bzrlib.tests.repository_implementations import formats_to_scenarios
273
formats = [("(c)", "c", "C"), ("(d)", 1, "D")]
238
274
no_vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
240
276
vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
241
277
vfs_transport_factory="vfs")
242
# no_vfs generate scenarios without vfs_transport_factory
244
('RemoteRepositoryFormat(c)',
245
{'bzrdir_format': remote.RemoteBzrDirFormat(),
246
'repository_format': remote.RemoteRepositoryFormat(),
278
# no_vfs generate scenarios without vfs_transport_factor
281
{'bzrdir_format': 'C',
282
'repository_format': 'c',
247
283
'transport_readonly_server': 'readonly',
248
284
'transport_server': 'server'}),
249
('RepositoryFormat2a(d)',
250
{'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
251
'repository_format': groupcompress_repo.RepositoryFormat2a(),
286
{'bzrdir_format': 'D',
287
'repository_format': 1,
252
288
'transport_readonly_server': 'readonly',
253
'transport_server': 'server'})]
254
self.assertEqual(expected, no_vfs_scenarios)
289
'transport_server': 'server'})],
255
291
self.assertEqual([
256
('RemoteRepositoryFormat(c)',
257
{'bzrdir_format': remote.RemoteBzrDirFormat(),
258
'repository_format': remote.RemoteRepositoryFormat(),
293
{'bzrdir_format': 'C',
294
'repository_format': 'c',
259
295
'transport_readonly_server': 'readonly',
260
296
'transport_server': 'server',
261
297
'vfs_transport_factory': 'vfs'}),
262
('RepositoryFormat2a(d)',
263
{'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
264
'repository_format': groupcompress_repo.RepositoryFormat2a(),
299
{'bzrdir_format': 'D',
300
'repository_format': 1,
265
301
'transport_readonly_server': 'readonly',
266
302
'transport_server': 'server',
267
303
'vfs_transport_factory': 'vfs'})],
271
class TestTestScenarioApplication(tests.TestCase):
307
class TestTestScenarioApplier(TestCase):
272
308
"""Tests for the test adaption facilities."""
274
def test_apply_scenario(self):
275
from bzrlib.tests import apply_scenario
276
input_test = TestTestScenarioApplication("test_apply_scenario")
310
def test_adapt_applies_scenarios(self):
311
from bzrlib.tests.repository_implementations import TestScenarioApplier
312
input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
313
adapter = TestScenarioApplier()
314
adapter.scenarios = [("1", "dict"), ("2", "settings")]
316
def capture_call(test, scenario):
317
calls.append((test, scenario))
319
adapter.adapt_test_to_scenario = capture_call
320
adapter.adapt(input_test)
321
self.assertEqual([(input_test, ("1", "dict")),
322
(input_test, ("2", "settings"))], calls)
324
def test_adapt_test_to_scenario(self):
325
from bzrlib.tests.repository_implementations import TestScenarioApplier
326
input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
327
adapter = TestScenarioApplier()
277
328
# setup two adapted tests
278
adapted_test1 = apply_scenario(input_test,
329
adapted_test1 = adapter.adapt_test_to_scenario(input_test,
280
331
{"bzrdir_format":"bzr_format",
281
332
"repository_format":"repo_fmt",
282
333
"transport_server":"transport_server",
283
334
"transport_readonly_server":"readonly-server"}))
284
adapted_test2 = apply_scenario(input_test,
335
adapted_test2 = adapter.adapt_test_to_scenario(input_test,
285
336
("new id 2", {"bzrdir_format":None}))
286
337
# input_test should have been altered.
287
338
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
288
# the new tests are mutually incompatible, ensuring it has
339
# the new tests are mutually incompatible, ensuring it has
289
340
# made new ones, and unspecified elements in the scenario
290
341
# should not have been altered.
291
342
self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
294
345
self.assertEqual("readonly-server",
295
346
adapted_test1.transport_readonly_server)
296
347
self.assertEqual(
297
"bzrlib.tests.test_selftest.TestTestScenarioApplication."
298
"test_apply_scenario(new id)",
348
"bzrlib.tests.test_selftest.TestTestScenarioApplier."
349
"test_adapt_test_to_scenario(new id)",
299
350
adapted_test1.id())
300
351
self.assertEqual(None, adapted_test2.bzrdir_format)
301
352
self.assertEqual(
302
"bzrlib.tests.test_selftest.TestTestScenarioApplication."
303
"test_apply_scenario(new id 2)",
353
"bzrlib.tests.test_selftest.TestTestScenarioApplier."
354
"test_adapt_test_to_scenario(new id 2)",
304
355
adapted_test2.id())
307
class TestInterRepositoryScenarios(tests.TestCase):
358
class TestInterRepositoryProviderAdapter(TestCase):
359
"""A group of tests that test the InterRepository test adapter."""
309
def test_scenarios(self):
361
def test_adapted_tests(self):
310
362
# check that constructor parameters are passed through to the adapted
312
from bzrlib.tests.per_interrepository import make_scenarios
364
from bzrlib.tests.interrepository_implementations import \
365
InterRepositoryTestProviderAdapter
315
formats = [("C0", "C1", "C2"), ("D0", "D1", "D2")]
316
scenarios = make_scenarios(server1, server2, formats)
368
formats = [(str, "C1", "C2"), (int, "D1", "D2")]
369
adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
317
370
self.assertEqual([
319
{'repository_format': 'C1',
372
{'interrepo_class': str,
373
'repository_format': 'C1',
320
374
'repository_format_to': 'C2',
321
375
'transport_readonly_server': 'b',
322
376
'transport_server': 'a'}),
324
{'repository_format': 'D1',
378
{'interrepo_class': int,
379
'repository_format': 'D1',
325
380
'repository_format_to': 'D2',
326
381
'transport_readonly_server': 'b',
327
382
'transport_server': 'a'})],
331
class TestWorkingTreeScenarios(tests.TestCase):
383
adapter.formats_to_scenarios(formats))
386
class TestWorkingTreeProviderAdapter(TestCase):
387
"""A group of tests that test the workingtree implementation test adapter."""
333
389
def test_scenarios(self):
334
390
# check that constructor parameters are passed through to the adapted
336
from bzrlib.tests.per_workingtree import make_scenarios
392
from bzrlib.tests.workingtree_implementations \
393
import WorkingTreeTestProviderAdapter
339
formats = [workingtree.WorkingTreeFormat2(),
340
workingtree.WorkingTreeFormat3(),]
341
scenarios = make_scenarios(server1, server2, formats)
396
formats = [("c", "C"), ("d", "D")]
397
adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
342
398
self.assertEqual([
343
('WorkingTreeFormat2',
344
{'bzrdir_format': formats[0]._matchingbzrdir,
345
'transport_readonly_server': 'b',
346
'transport_server': 'a',
347
'workingtree_format': formats[0]}),
348
('WorkingTreeFormat3',
349
{'bzrdir_format': formats[1]._matchingbzrdir,
350
'transport_readonly_server': 'b',
351
'transport_server': 'a',
352
'workingtree_format': formats[1]})],
356
class TestTreeScenarios(tests.TestCase):
358
def test_scenarios(self):
359
# the tree implementation scenario generator is meant to setup one
360
# instance for each working tree format, and one additional instance
361
# that will use the default wt format, but create a revision tree for
362
# the tests. this means that the wt ones should have the
363
# workingtree_to_test_tree attribute set to 'return_parameter' and the
364
# revision one set to revision_tree_from_workingtree.
366
from bzrlib.tests.per_tree import (
367
_dirstate_tree_from_workingtree,
400
{'bzrdir_format': 'C',
401
'transport_readonly_server': 'b',
402
'transport_server': 'a',
403
'workingtree_format': 'c'}),
405
{'bzrdir_format': 'D',
406
'transport_readonly_server': 'b',
407
'transport_server': 'a',
408
'workingtree_format': 'd'})],
412
class TestTreeProviderAdapter(TestCase):
413
"""Test the setup of tree_implementation tests."""
415
def test_adapted_tests(self):
416
# the tree implementation adapter is meant to setup one instance for
417
# each working tree format, and one additional instance that will
418
# use the default wt format, but create a revision tree for the tests.
419
# this means that the wt ones should have the workingtree_to_test_tree
420
# attribute set to 'return_parameter' and the revision one set to
421
# revision_tree_from_workingtree.
423
from bzrlib.tests.tree_implementations import (
424
TreeTestProviderAdapter,
371
425
return_parameter,
372
426
revision_tree_from_workingtree
428
from bzrlib.workingtree import WorkingTreeFormat, WorkingTreeFormat3
429
input_test = TestTreeProviderAdapter(
430
"test_adapted_tests")
376
formats = [workingtree.WorkingTreeFormat2(),
377
workingtree.WorkingTreeFormat3(),]
378
scenarios = make_scenarios(server1, server2, formats)
379
self.assertEqual(7, len(scenarios))
380
default_wt_format = workingtree.WorkingTreeFormat4._default_format
381
wt4_format = workingtree.WorkingTreeFormat4()
382
wt5_format = workingtree.WorkingTreeFormat5()
383
expected_scenarios = [
384
('WorkingTreeFormat2',
385
{'bzrdir_format': formats[0]._matchingbzrdir,
386
'transport_readonly_server': 'b',
387
'transport_server': 'a',
388
'workingtree_format': formats[0],
389
'_workingtree_to_test_tree': return_parameter,
391
('WorkingTreeFormat3',
392
{'bzrdir_format': formats[1]._matchingbzrdir,
393
'transport_readonly_server': 'b',
394
'transport_server': 'a',
395
'workingtree_format': formats[1],
396
'_workingtree_to_test_tree': return_parameter,
399
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
400
'bzrdir_format': default_wt_format._matchingbzrdir,
401
'transport_readonly_server': 'b',
402
'transport_server': 'a',
403
'workingtree_format': default_wt_format,
405
('DirStateRevisionTree,WT4',
406
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
407
'bzrdir_format': wt4_format._matchingbzrdir,
408
'transport_readonly_server': 'b',
409
'transport_server': 'a',
410
'workingtree_format': wt4_format,
412
('DirStateRevisionTree,WT5',
413
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
414
'bzrdir_format': wt5_format._matchingbzrdir,
415
'transport_readonly_server': 'b',
416
'transport_server': 'a',
417
'workingtree_format': wt5_format,
420
{'_workingtree_to_test_tree': preview_tree_pre,
421
'bzrdir_format': default_wt_format._matchingbzrdir,
422
'transport_readonly_server': 'b',
423
'transport_server': 'a',
424
'workingtree_format': default_wt_format}),
426
{'_workingtree_to_test_tree': preview_tree_post,
427
'bzrdir_format': default_wt_format._matchingbzrdir,
428
'transport_readonly_server': 'b',
429
'transport_server': 'a',
430
'workingtree_format': default_wt_format}),
432
self.assertEqual(expected_scenarios, scenarios)
435
class TestInterTreeScenarios(tests.TestCase):
433
formats = [("c", "C"), ("d", "D")]
434
adapter = TreeTestProviderAdapter(server1, server2, formats)
435
suite = adapter.adapt(input_test)
436
tests = list(iter(suite))
437
# XXX We should not have tests fail as we add more scenarios
439
self.assertEqual(5, len(tests))
440
# this must match the default format setp up in
441
# TreeTestProviderAdapter.adapt
442
default_format = WorkingTreeFormat3
443
self.assertEqual(tests[0].workingtree_format, formats[0][0])
444
self.assertEqual(tests[0].bzrdir_format, formats[0][1])
445
self.assertEqual(tests[0].transport_server, server1)
446
self.assertEqual(tests[0].transport_readonly_server, server2)
447
self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
448
self.assertEqual(tests[1].workingtree_format, formats[1][0])
449
self.assertEqual(tests[1].bzrdir_format, formats[1][1])
450
self.assertEqual(tests[1].transport_server, server1)
451
self.assertEqual(tests[1].transport_readonly_server, server2)
452
self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
453
self.assertIsInstance(tests[2].workingtree_format, default_format)
454
#self.assertEqual(tests[2].bzrdir_format,
455
# default_format._matchingbzrdir)
456
self.assertEqual(tests[2].transport_server, server1)
457
self.assertEqual(tests[2].transport_readonly_server, server2)
458
self.assertEqual(tests[2]._workingtree_to_test_tree,
459
revision_tree_from_workingtree)
462
class TestInterTreeProviderAdapter(TestCase):
436
463
"""A group of tests that test the InterTreeTestAdapter."""
438
def test_scenarios(self):
465
def test_adapted_tests(self):
439
466
# check that constructor parameters are passed through to the adapted
441
468
# for InterTree tests we want the machinery to bring up two trees in
1193
def _patch_get_bzr_source_tree(self):
1194
# Reading from the actual source tree breaks isolation, but we don't
1195
# want to assume that thats *all* that would happen.
1196
self._get_source_tree_calls = []
1198
self._get_source_tree_calls.append("called")
1200
self.overrideAttr(bzrlib.version, '_get_bzr_source_tree', new_get)
1202
1159
def test_bench_history(self):
1203
# tests that the running the benchmark passes bench_history into
1204
# the test result object. We can tell that happens if
1205
# _get_bzr_source_tree is called.
1206
self._patch_get_bzr_source_tree()
1160
# tests that the running the benchmark produces a history file
1161
# containing a timestamp and the revision id of the bzrlib source which
1163
workingtree = _get_bzr_source_tree()
1207
1164
test = TestRunner('dummy_test')
1208
1165
output = StringIO()
1209
runner = tests.TextTestRunner(stream=self._log_file,
1210
bench_history=output)
1166
runner = TextTestRunner(stream=self._log_file, bench_history=output)
1211
1167
result = self.run_test_runner(runner, test)
1212
1168
output_string = output.getvalue()
1213
1169
self.assertContainsRe(output_string, "--date [0-9.]+")
1214
self.assertLength(1, self._get_source_tree_calls)
1216
def test_startTestRun(self):
1217
"""run should call result.startTestRun()"""
1219
class LoggingDecorator(tests.ForwardingResult):
1220
def startTestRun(self):
1221
tests.ForwardingResult.startTestRun(self)
1222
calls.append('startTestRun')
1223
test = unittest.FunctionTestCase(lambda:None)
1225
runner = tests.TextTestRunner(stream=stream,
1226
result_decorators=[LoggingDecorator])
1227
result = self.run_test_runner(runner, test)
1228
self.assertLength(1, calls)
1230
def test_stopTestRun(self):
1231
"""run should call result.stopTestRun()"""
1233
class LoggingDecorator(tests.ForwardingResult):
1234
def stopTestRun(self):
1235
tests.ForwardingResult.stopTestRun(self)
1236
calls.append('stopTestRun')
1237
test = unittest.FunctionTestCase(lambda:None)
1239
runner = tests.TextTestRunner(stream=stream,
1240
result_decorators=[LoggingDecorator])
1241
result = self.run_test_runner(runner, test)
1242
self.assertLength(1, calls)
1245
class SampleTestCase(tests.TestCase):
1170
if workingtree is not None:
1171
revision_id = workingtree.get_parent_ids()[0]
1172
self.assertEndsWith(output_string.rstrip(), revision_id)
1174
def assertLogDeleted(self, test):
1175
log = test._get_log()
1176
self.assertEqual("DELETED log file to reduce memory footprint", log)
1177
self.assertEqual('', test._log_contents)
1178
self.assertIs(None, test._log_file_name)
1180
def test_success_log_deleted(self):
1181
"""Successful tests have their log deleted"""
1183
class LogTester(TestCase):
1185
def test_success(self):
1186
self.log('this will be removed\n')
1188
sio = cStringIO.StringIO()
1189
runner = TextTestRunner(stream=sio)
1190
test = LogTester('test_success')
1191
result = self.run_test_runner(runner, test)
1193
self.assertLogDeleted(test)
1195
def test_skipped_log_deleted(self):
1196
"""Skipped tests have their log deleted"""
1198
class LogTester(TestCase):
1200
def test_skipped(self):
1201
self.log('this will be removed\n')
1202
raise tests.TestSkipped()
1204
sio = cStringIO.StringIO()
1205
runner = TextTestRunner(stream=sio)
1206
test = LogTester('test_skipped')
1207
result = self.run_test_runner(runner, test)
1209
self.assertLogDeleted(test)
1211
def test_not_aplicable_log_deleted(self):
1212
"""Not applicable tests have their log deleted"""
1214
class LogTester(TestCase):
1216
def test_not_applicable(self):
1217
self.log('this will be removed\n')
1218
raise tests.TestNotApplicable()
1220
sio = cStringIO.StringIO()
1221
runner = TextTestRunner(stream=sio)
1222
test = LogTester('test_not_applicable')
1223
result = self.run_test_runner(runner, test)
1225
self.assertLogDeleted(test)
1227
def test_known_failure_log_deleted(self):
1228
"""Know failure tests have their log deleted"""
1230
class LogTester(TestCase):
1232
def test_known_failure(self):
1233
self.log('this will be removed\n')
1234
raise tests.KnownFailure()
1236
sio = cStringIO.StringIO()
1237
runner = TextTestRunner(stream=sio)
1238
test = LogTester('test_known_failure')
1239
result = self.run_test_runner(runner, test)
1241
self.assertLogDeleted(test)
1243
def test_fail_log_kept(self):
1244
"""Failed tests have their log kept"""
1246
class LogTester(TestCase):
1248
def test_fail(self):
1249
self.log('this will be kept\n')
1250
self.fail('this test fails')
1252
sio = cStringIO.StringIO()
1253
runner = TextTestRunner(stream=sio)
1254
test = LogTester('test_fail')
1255
result = self.run_test_runner(runner, test)
1257
text = sio.getvalue()
1258
self.assertContainsRe(text, 'this will be kept')
1259
self.assertContainsRe(text, 'this test fails')
1261
log = test._get_log()
1262
self.assertContainsRe(log, 'this will be kept')
1263
self.assertEqual(log, test._log_contents)
1265
def test_error_log_kept(self):
1266
"""Tests with errors have their log kept"""
1268
class LogTester(TestCase):
1270
def test_error(self):
1271
self.log('this will be kept\n')
1272
raise ValueError('random exception raised')
1274
sio = cStringIO.StringIO()
1275
runner = TextTestRunner(stream=sio)
1276
test = LogTester('test_error')
1277
result = self.run_test_runner(runner, test)
1279
text = sio.getvalue()
1280
self.assertContainsRe(text, 'this will be kept')
1281
self.assertContainsRe(text, 'random exception raised')
1283
log = test._get_log()
1284
self.assertContainsRe(log, 'this will be kept')
1285
self.assertEqual(log, test._log_contents)
1288
class SampleTestCase(TestCase):
1247
1290
def _test_pass(self):
1250
1293
class _TestException(Exception):
1254
class TestTestCase(tests.TestCase):
1296
class TestTestCase(TestCase):
1255
1297
"""Tests that test the core bzrlib TestCase."""
1257
def test_assertLength_matches_empty(self):
1259
self.assertLength(0, a_list)
1261
def test_assertLength_matches_nonempty(self):
1263
self.assertLength(3, a_list)
1265
def test_assertLength_fails_different(self):
1267
self.assertRaises(AssertionError, self.assertLength, 1, a_list)
1269
def test_assertLength_shows_sequence_in_failure(self):
1271
exception = self.assertRaises(AssertionError, self.assertLength, 2,
1273
self.assertEqual('Incorrect length: wanted 2, got 3 for [1, 2, 3]',
1276
def test_base_setUp_not_called_causes_failure(self):
1277
class TestCaseWithBrokenSetUp(tests.TestCase):
1279
pass # does not call TestCase.setUp
1282
test = TestCaseWithBrokenSetUp('test_foo')
1283
result = unittest.TestResult()
1285
self.assertFalse(result.wasSuccessful())
1286
self.assertEqual(1, result.testsRun)
1288
def test_base_tearDown_not_called_causes_failure(self):
1289
class TestCaseWithBrokenTearDown(tests.TestCase):
1291
pass # does not call TestCase.tearDown
1294
test = TestCaseWithBrokenTearDown('test_foo')
1295
result = unittest.TestResult()
1297
self.assertFalse(result.wasSuccessful())
1298
self.assertEqual(1, result.testsRun)
1300
1299
def test_debug_flags_sanitised(self):
1301
1300
"""The bzrlib debug flags should be sanitised by setUp."""
1302
if 'allow_debug' in tests.selftest_debug_flags:
1303
raise tests.TestNotApplicable(
1304
'-Eallow_debug option prevents debug flag sanitisation')
1305
1301
# we could set something and run a test that will check
1306
1302
# it gets santised, but this is probably sufficient for now:
1307
1303
# if someone runs the test with -Dsomething it will error.
1309
if self._lock_check_thorough:
1310
flags.add('strict_locks')
1311
self.assertEqual(flags, bzrlib.debug.debug_flags)
1313
def change_selftest_debug_flags(self, new_flags):
1314
self.overrideAttr(tests, 'selftest_debug_flags', set(new_flags))
1316
def test_allow_debug_flag(self):
1317
"""The -Eallow_debug flag prevents bzrlib.debug.debug_flags from being
1318
sanitised (i.e. cleared) before running a test.
1320
self.change_selftest_debug_flags(set(['allow_debug']))
1321
bzrlib.debug.debug_flags = set(['a-flag'])
1322
class TestThatRecordsFlags(tests.TestCase):
1323
def test_foo(nested_self):
1324
self.flags = set(bzrlib.debug.debug_flags)
1325
test = TestThatRecordsFlags('test_foo')
1326
test.run(self.make_test_result())
1327
flags = set(['a-flag'])
1328
if 'disable_lock_checks' not in tests.selftest_debug_flags:
1329
flags.add('strict_locks')
1330
self.assertEqual(flags, self.flags)
1332
def test_disable_lock_checks(self):
1333
"""The -Edisable_lock_checks flag disables thorough checks."""
1334
class TestThatRecordsFlags(tests.TestCase):
1335
def test_foo(nested_self):
1336
self.flags = set(bzrlib.debug.debug_flags)
1337
self.test_lock_check_thorough = nested_self._lock_check_thorough
1338
self.change_selftest_debug_flags(set())
1339
test = TestThatRecordsFlags('test_foo')
1340
test.run(self.make_test_result())
1341
# By default we do strict lock checking and thorough lock/unlock
1343
self.assertTrue(self.test_lock_check_thorough)
1344
self.assertEqual(set(['strict_locks']), self.flags)
1345
# Now set the disable_lock_checks flag, and show that this changed.
1346
self.change_selftest_debug_flags(set(['disable_lock_checks']))
1347
test = TestThatRecordsFlags('test_foo')
1348
test.run(self.make_test_result())
1349
self.assertFalse(self.test_lock_check_thorough)
1350
self.assertEqual(set(), self.flags)
1352
def test_this_fails_strict_lock_check(self):
1353
class TestThatRecordsFlags(tests.TestCase):
1354
def test_foo(nested_self):
1355
self.flags1 = set(bzrlib.debug.debug_flags)
1356
self.thisFailsStrictLockCheck()
1357
self.flags2 = set(bzrlib.debug.debug_flags)
1358
# Make sure lock checking is active
1359
self.change_selftest_debug_flags(set())
1360
test = TestThatRecordsFlags('test_foo')
1361
test.run(self.make_test_result())
1362
self.assertEqual(set(['strict_locks']), self.flags1)
1363
self.assertEqual(set(), self.flags2)
1365
def test_debug_flags_restored(self):
1366
"""The bzrlib debug flags should be restored to their original state
1367
after the test was run, even if allow_debug is set.
1369
self.change_selftest_debug_flags(set(['allow_debug']))
1370
# Now run a test that modifies debug.debug_flags.
1371
bzrlib.debug.debug_flags = set(['original-state'])
1372
class TestThatModifiesFlags(tests.TestCase):
1374
bzrlib.debug.debug_flags = set(['modified'])
1375
test = TestThatModifiesFlags('test_foo')
1376
test.run(self.make_test_result())
1377
self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
1379
def make_test_result(self):
1380
"""Get a test result that writes to the test log file."""
1381
return tests.TextTestResult(self._log_file, descriptions=0, verbosity=1)
1304
self.assertEqual(set(), bzrlib.debug.debug_flags)
1383
1306
def inner_test(self):
1384
1307
# the inner child test
1677
1532
def sample_normal_method(self):
1678
1533
"""A undeprecated method."""
1680
@deprecated_method(deprecated_in((0, 10, 0)))
1535
@symbol_versioning.deprecated_method(zero_ten)
1681
1536
def sample_nested_deprecation(self):
1682
1537
return sample_deprecated_function()
1685
class TestExtraAssertions(tests.TestCase):
1540
class TestExtraAssertions(TestCase):
1686
1541
"""Tests for new test assertions in bzrlib test suite"""
1688
1543
def test_assert_isinstance(self):
1689
1544
self.assertIsInstance(2, int)
1690
1545
self.assertIsInstance(u'', basestring)
1691
e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1692
self.assertEquals(str(e),
1693
"None is an instance of <type 'NoneType'> rather than <type 'int'>")
1546
self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1694
1547
self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1695
e = self.assertRaises(AssertionError,
1696
self.assertIsInstance, None, int, "it's just not")
1697
self.assertEquals(str(e),
1698
"None is an instance of <type 'NoneType'> rather than <type 'int'>"
1701
1549
def test_assertEndsWith(self):
1702
1550
self.assertEndsWith('foo', 'oo')
1703
1551
self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
1705
def test_assertEqualDiff(self):
1706
e = self.assertRaises(AssertionError,
1707
self.assertEqualDiff, '', '\n')
1708
self.assertEquals(str(e),
1709
# Don't blink ! The '+' applies to the second string
1710
'first string is missing a final newline.\n+ \n')
1711
e = self.assertRaises(AssertionError,
1712
self.assertEqualDiff, '\n', '')
1713
self.assertEquals(str(e),
1714
# Don't blink ! The '-' applies to the second string
1715
'second string is missing a final newline.\n- \n')
1718
class TestDeprecations(tests.TestCase):
1720
1553
def test_applyDeprecated_not_deprecated(self):
1721
1554
sample_object = ApplyDeprecatedHelper()
1722
1555
# calling an undeprecated callable raises an assertion
1723
self.assertRaises(AssertionError, self.applyDeprecated,
1724
deprecated_in((0, 11, 0)),
1556
self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
1725
1557
sample_object.sample_normal_method)
1726
self.assertRaises(AssertionError, self.applyDeprecated,
1727
deprecated_in((0, 11, 0)),
1558
self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
1728
1559
sample_undeprecated_function, "a param value")
1729
1560
# calling a deprecated callable (function or method) with the wrong
1730
1561
# expected deprecation fails.
1731
self.assertRaises(AssertionError, self.applyDeprecated,
1732
deprecated_in((0, 10, 0)),
1562
self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
1733
1563
sample_object.sample_deprecated_method, "a param value")
1734
self.assertRaises(AssertionError, self.applyDeprecated,
1735
deprecated_in((0, 10, 0)),
1564
self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
1736
1565
sample_deprecated_function)
1737
1566
# calling a deprecated callable (function or method) with the right
1738
1567
# expected deprecation returns the functions result.
1739
self.assertEqual("a param value",
1740
self.applyDeprecated(deprecated_in((0, 11, 0)),
1568
self.assertEqual("a param value", self.applyDeprecated(zero_eleven,
1741
1569
sample_object.sample_deprecated_method, "a param value"))
1742
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
1570
self.assertEqual(2, self.applyDeprecated(zero_eleven,
1743
1571
sample_deprecated_function))
1744
1572
# calling a nested deprecation with the wrong deprecation version
1745
# fails even if a deeper nested function was deprecated with the
1573
# fails even if a deeper nested function was deprecated with the
1746
1574
# supplied version.
1747
1575
self.assertRaises(AssertionError, self.applyDeprecated,
1748
deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
1576
zero_eleven, sample_object.sample_nested_deprecation)
1749
1577
# calling a nested deprecation with the right deprecation value
1750
1578
# returns the calls result.
1751
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1579
self.assertEqual(2, self.applyDeprecated(zero_ten,
1752
1580
sample_object.sample_nested_deprecation))
1754
1582
def test_callDeprecated(self):
1755
1583
def testfunc(be_deprecated, result=None):
1756
1584
if be_deprecated is True:
1757
symbol_versioning.warn('i am deprecated', DeprecationWarning,
1585
symbol_versioning.warn('i am deprecated', DeprecationWarning,
1760
1588
result = self.callDeprecated(['i am deprecated'], testfunc, True)
1799
1627
tree = self.make_branch_and_memory_tree('a')
1800
1628
self.assertIsInstance(tree, bzrlib.memorytree.MemoryTree)
1802
def test_make_tree_for_local_vfs_backed_transport(self):
1803
# make_branch_and_tree has to use local branch and repositories
1804
# when the vfs transport and local disk are colocated, even if
1805
# a different transport is in use for url generation.
1806
self.transport_server = test_server.FakeVFATServer
1807
self.assertFalse(self.get_url('t1').startswith('file://'))
1631
class TestSFTPMakeBranchAndTree(TestCaseWithSFTPServer):
1633
def test_make_tree_for_sftp_branch(self):
1634
"""Transports backed by local directories create local trees."""
1808
1636
tree = self.make_branch_and_tree('t1')
1809
1637
base = tree.bzrdir.root_transport.base
1810
self.assertStartsWith(base, 'file://')
1638
self.failIf(base.startswith('sftp'),
1639
'base %r is on sftp but should be local' % base)
1811
1640
self.assertEquals(tree.bzrdir.root_transport,
1812
1641
tree.branch.bzrdir.root_transport)
1813
1642
self.assertEquals(tree.bzrdir.root_transport,
1814
1643
tree.branch.repository.bzrdir.root_transport)
1817
class SelfTestHelper:
1819
def run_selftest(self, **kwargs):
1820
"""Run selftest returning its output."""
1822
old_transport = bzrlib.tests.default_transport
1823
old_root = tests.TestCaseWithMemoryTransport.TEST_ROOT
1824
tests.TestCaseWithMemoryTransport.TEST_ROOT = None
1826
self.assertEqual(True, tests.selftest(stream=output, **kwargs))
1828
bzrlib.tests.default_transport = old_transport
1829
tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
1834
class TestSelftest(tests.TestCase, SelfTestHelper):
1646
class TestSelftest(TestCase):
1835
1647
"""Tests of bzrlib.tests.selftest."""
1837
1649
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
1838
1650
factory_called = []
1840
1652
factory_called.append(True)
1841
return TestUtil.TestSuite()
1842
1654
out = StringIO()
1843
1655
err = StringIO()
1844
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1656
self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1845
1657
test_suite_factory=factory)
1846
1658
self.assertEqual([True], factory_called)
1849
"""A test suite factory."""
1850
class Test(tests.TestCase):
1857
return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
1859
def test_list_only(self):
1860
output = self.run_selftest(test_suite_factory=self.factory,
1862
self.assertEqual(3, len(output.readlines()))
1864
def test_list_only_filtered(self):
1865
output = self.run_selftest(test_suite_factory=self.factory,
1866
list_only=True, pattern="Test.b")
1867
self.assertEndsWith(output.getvalue(), "Test.b\n")
1868
self.assertLength(1, output.readlines())
1870
def test_list_only_excludes(self):
1871
output = self.run_selftest(test_suite_factory=self.factory,
1872
list_only=True, exclude_pattern="Test.b")
1873
self.assertNotContainsRe("Test.b", output.getvalue())
1874
self.assertLength(2, output.readlines())
1876
def test_lsprof_tests(self):
1877
self.requireFeature(test_lsprof.LSProfFeature)
1880
def __call__(test, result):
1882
def run(test, result):
1883
self.assertIsInstance(result, tests.ForwardingResult)
1884
calls.append("called")
1885
def countTestCases(self):
1887
self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
1888
self.assertLength(1, calls)
1890
def test_random(self):
1891
# test randomising by listing a number of tests.
1892
output_123 = self.run_selftest(test_suite_factory=self.factory,
1893
list_only=True, random_seed="123")
1894
output_234 = self.run_selftest(test_suite_factory=self.factory,
1895
list_only=True, random_seed="234")
1896
self.assertNotEqual(output_123, output_234)
1897
# "Randominzing test order..\n\n
1898
self.assertLength(5, output_123.readlines())
1899
self.assertLength(5, output_234.readlines())
1901
def test_random_reuse_is_same_order(self):
1902
# test randomising by listing a number of tests.
1903
expected = self.run_selftest(test_suite_factory=self.factory,
1904
list_only=True, random_seed="123")
1905
repeated = self.run_selftest(test_suite_factory=self.factory,
1906
list_only=True, random_seed="123")
1907
self.assertEqual(expected.getvalue(), repeated.getvalue())
1909
def test_runner_class(self):
1910
self.requireFeature(features.subunit)
1911
from subunit import ProtocolTestCase
1912
stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
1913
test_suite_factory=self.factory)
1914
test = ProtocolTestCase(stream)
1915
result = unittest.TestResult()
1917
self.assertEqual(3, result.testsRun)
1919
def test_starting_with_single_argument(self):
1920
output = self.run_selftest(test_suite_factory=self.factory,
1921
starting_with=['bzrlib.tests.test_selftest.Test.a'],
1923
self.assertEqual('bzrlib.tests.test_selftest.Test.a\n',
1926
def test_starting_with_multiple_argument(self):
1927
output = self.run_selftest(test_suite_factory=self.factory,
1928
starting_with=['bzrlib.tests.test_selftest.Test.a',
1929
'bzrlib.tests.test_selftest.Test.b'],
1931
self.assertEqual('bzrlib.tests.test_selftest.Test.a\n'
1932
'bzrlib.tests.test_selftest.Test.b\n',
1935
def check_transport_set(self, transport_server):
1936
captured_transport = []
1937
def seen_transport(a_transport):
1938
captured_transport.append(a_transport)
1939
class Capture(tests.TestCase):
1941
seen_transport(bzrlib.tests.default_transport)
1943
return TestUtil.TestSuite([Capture("a")])
1944
self.run_selftest(transport=transport_server, test_suite_factory=factory)
1945
self.assertEqual(transport_server, captured_transport[0])
1947
def test_transport_sftp(self):
1948
self.requireFeature(features.paramiko)
1949
from bzrlib.tests import stub_sftp
1950
self.check_transport_set(stub_sftp.SFTPAbsoluteServer)
1952
def test_transport_memory(self):
1953
self.check_transport_set(memory.MemoryServer)
1956
class TestSelftestWithIdList(tests.TestCaseInTempDir, SelfTestHelper):
1957
# Does IO: reads test.list
1959
def test_load_list(self):
1960
# Provide a list with one test - this test.
1961
test_id_line = '%s\n' % self.id()
1962
self.build_tree_contents([('test.list', test_id_line)])
1963
# And generate a list of the tests in the suite.
1964
stream = self.run_selftest(load_list='test.list', list_only=True)
1965
self.assertEqual(test_id_line, stream.getvalue())
1967
def test_load_unknown(self):
1968
# Provide a list with one test - this test.
1969
# And generate a list of the tests in the suite.
1970
err = self.assertRaises(errors.NoSuchFile, self.run_selftest,
1971
load_list='missing file name', list_only=True)
1974
class TestRunBzr(tests.TestCase):
1979
def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
1981
"""Override _run_bzr_core to test how it is invoked by run_bzr.
1983
Attempts to run bzr from inside this class don't actually run it.
1985
We test how run_bzr actually invokes bzr in another location. Here we
1986
only need to test that it passes the right parameters to run_bzr.
1988
self.argv = list(argv)
1989
self.retcode = retcode
1990
self.encoding = encoding
1992
self.working_dir = working_dir
1993
return self.retcode, self.out, self.err
1995
def test_run_bzr_error(self):
1996
self.out = "It sure does!\n"
1997
out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=34)
1998
self.assertEqual(['rocks'], self.argv)
1999
self.assertEqual(34, self.retcode)
2000
self.assertEqual('It sure does!\n', out)
2001
self.assertEquals(out, self.out)
2002
self.assertEqual('', err)
2003
self.assertEquals(err, self.err)
2005
def test_run_bzr_error_regexes(self):
2007
self.err = "bzr: ERROR: foobarbaz is not versioned"
2008
out, err = self.run_bzr_error(
2009
["bzr: ERROR: foobarbaz is not versioned"],
2010
['file-id', 'foobarbaz'])
2012
def test_encoding(self):
2013
"""Test that run_bzr passes encoding to _run_bzr_core"""
2014
self.run_bzr('foo bar')
2015
self.assertEqual(None, self.encoding)
2016
self.assertEqual(['foo', 'bar'], self.argv)
2018
self.run_bzr('foo bar', encoding='baz')
2019
self.assertEqual('baz', self.encoding)
2020
self.assertEqual(['foo', 'bar'], self.argv)
2022
def test_retcode(self):
2023
"""Test that run_bzr passes retcode to _run_bzr_core"""
2024
# Default is retcode == 0
2025
self.run_bzr('foo bar')
2026
self.assertEqual(0, self.retcode)
2027
self.assertEqual(['foo', 'bar'], self.argv)
2029
self.run_bzr('foo bar', retcode=1)
2030
self.assertEqual(1, self.retcode)
2031
self.assertEqual(['foo', 'bar'], self.argv)
2033
self.run_bzr('foo bar', retcode=None)
2034
self.assertEqual(None, self.retcode)
2035
self.assertEqual(['foo', 'bar'], self.argv)
2037
self.run_bzr(['foo', 'bar'], retcode=3)
2038
self.assertEqual(3, self.retcode)
2039
self.assertEqual(['foo', 'bar'], self.argv)
2041
def test_stdin(self):
2042
# test that the stdin keyword to run_bzr is passed through to
2043
# _run_bzr_core as-is. We do this by overriding
2044
# _run_bzr_core in this class, and then calling run_bzr,
2045
# which is a convenience function for _run_bzr_core, so
2047
self.run_bzr('foo bar', stdin='gam')
2048
self.assertEqual('gam', self.stdin)
2049
self.assertEqual(['foo', 'bar'], self.argv)
2051
self.run_bzr('foo bar', stdin='zippy')
2052
self.assertEqual('zippy', self.stdin)
2053
self.assertEqual(['foo', 'bar'], self.argv)
2055
def test_working_dir(self):
2056
"""Test that run_bzr passes working_dir to _run_bzr_core"""
2057
self.run_bzr('foo bar')
2058
self.assertEqual(None, self.working_dir)
2059
self.assertEqual(['foo', 'bar'], self.argv)
2061
self.run_bzr('foo bar', working_dir='baz')
2062
self.assertEqual('baz', self.working_dir)
2063
self.assertEqual(['foo', 'bar'], self.argv)
2065
def test_reject_extra_keyword_arguments(self):
2066
self.assertRaises(TypeError, self.run_bzr, "foo bar",
2067
error_regex=['error message'])
2070
class TestRunBzrCaptured(tests.TestCaseWithTransport):
2071
# Does IO when testing the working_dir parameter.
2073
def apply_redirected(self, stdin=None, stdout=None, stderr=None,
2074
a_callable=None, *args, **kwargs):
2076
self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
2077
self.factory = bzrlib.ui.ui_factory
2078
self.working_dir = osutils.getcwd()
2079
stdout.write('foo\n')
2080
stderr.write('bar\n')
2083
def test_stdin(self):
2084
# test that the stdin keyword to _run_bzr_core is passed through to
2085
# apply_redirected as a StringIO. We do this by overriding
2086
# apply_redirected in this class, and then calling _run_bzr_core,
2087
# which calls apply_redirected.
2088
self.run_bzr(['foo', 'bar'], stdin='gam')
2089
self.assertEqual('gam', self.stdin.read())
2090
self.assertTrue(self.stdin is self.factory_stdin)
2091
self.run_bzr(['foo', 'bar'], stdin='zippy')
2092
self.assertEqual('zippy', self.stdin.read())
2093
self.assertTrue(self.stdin is self.factory_stdin)
2095
def test_ui_factory(self):
2096
# each invocation of self.run_bzr should get its
2097
# own UI factory, which is an instance of TestUIFactory,
2098
# with stdin, stdout and stderr attached to the stdin,
2099
# stdout and stderr of the invoked run_bzr
2100
current_factory = bzrlib.ui.ui_factory
2101
self.run_bzr(['foo'])
2102
self.failIf(current_factory is self.factory)
2103
self.assertNotEqual(sys.stdout, self.factory.stdout)
2104
self.assertNotEqual(sys.stderr, self.factory.stderr)
2105
self.assertEqual('foo\n', self.factory.stdout.getvalue())
2106
self.assertEqual('bar\n', self.factory.stderr.getvalue())
2107
self.assertIsInstance(self.factory, tests.TestUIFactory)
2109
def test_working_dir(self):
2110
self.build_tree(['one/', 'two/'])
2111
cwd = osutils.getcwd()
2113
# Default is to work in the current directory
2114
self.run_bzr(['foo', 'bar'])
2115
self.assertEqual(cwd, self.working_dir)
2117
self.run_bzr(['foo', 'bar'], working_dir=None)
2118
self.assertEqual(cwd, self.working_dir)
2120
# The function should be run in the alternative directory
2121
# but afterwards the current working dir shouldn't be changed
2122
self.run_bzr(['foo', 'bar'], working_dir='one')
2123
self.assertNotEqual(cwd, self.working_dir)
2124
self.assertEndsWith(self.working_dir, 'one')
2125
self.assertEqual(cwd, osutils.getcwd())
2127
self.run_bzr(['foo', 'bar'], working_dir='two')
2128
self.assertNotEqual(cwd, self.working_dir)
2129
self.assertEndsWith(self.working_dir, 'two')
2130
self.assertEqual(cwd, osutils.getcwd())
2133
class StubProcess(object):
2134
"""A stub process for testing run_bzr_subprocess."""
2136
def __init__(self, out="", err="", retcode=0):
2139
self.returncode = retcode
2141
def communicate(self):
2142
return self.out, self.err
2145
class TestWithFakedStartBzrSubprocess(tests.TestCaseWithTransport):
2146
"""Base class for tests testing how we might run bzr."""
2149
tests.TestCaseWithTransport.setUp(self)
2150
self.subprocess_calls = []
2152
def start_bzr_subprocess(self, process_args, env_changes=None,
2153
skip_if_plan_to_signal=False,
2155
allow_plugins=False):
2156
"""capture what run_bzr_subprocess tries to do."""
2157
self.subprocess_calls.append({'process_args':process_args,
2158
'env_changes':env_changes,
2159
'skip_if_plan_to_signal':skip_if_plan_to_signal,
2160
'working_dir':working_dir, 'allow_plugins':allow_plugins})
2161
return self.next_subprocess
2164
class TestRunBzrSubprocess(TestWithFakedStartBzrSubprocess):
2166
def assertRunBzrSubprocess(self, expected_args, process, *args, **kwargs):
2167
"""Run run_bzr_subprocess with args and kwargs using a stubbed process.
2169
Inside TestRunBzrSubprocessCommands we use a stub start_bzr_subprocess
2170
that will return static results. This assertion method populates those
2171
results and also checks the arguments run_bzr_subprocess generates.
2173
self.next_subprocess = process
2175
result = self.run_bzr_subprocess(*args, **kwargs)
2177
self.next_subprocess = None
2178
for key, expected in expected_args.iteritems():
2179
self.assertEqual(expected, self.subprocess_calls[-1][key])
1661
class TestKnownFailure(TestCase):
1663
def test_known_failure(self):
1664
"""Check that KnownFailure is defined appropriately."""
1665
# a KnownFailure is an assertion error for compatability with unaware
1667
self.assertIsInstance(KnownFailure(""), AssertionError)
1669
def test_expect_failure(self):
1671
self.expectFailure("Doomed to failure", self.assertTrue, False)
1672
except KnownFailure, e:
1673
self.assertEqual('Doomed to failure', e.args[0])
1675
self.expectFailure("Doomed to failure", self.assertTrue, True)
1676
except AssertionError, e:
1677
self.assertEqual('Unexpected success. Should have failed:'
1678
' Doomed to failure', e.args[0])
2182
self.next_subprocess = None
2183
for key, expected in expected_args.iteritems():
2184
self.assertEqual(expected, self.subprocess_calls[-1][key])
2187
def test_run_bzr_subprocess(self):
2188
"""The run_bzr_helper_external command behaves nicely."""
2189
self.assertRunBzrSubprocess({'process_args':['--version']},
2190
StubProcess(), '--version')
2191
self.assertRunBzrSubprocess({'process_args':['--version']},
2192
StubProcess(), ['--version'])
2193
# retcode=None disables retcode checking
2194
result = self.assertRunBzrSubprocess({},
2195
StubProcess(retcode=3), '--version', retcode=None)
2196
result = self.assertRunBzrSubprocess({},
2197
StubProcess(out="is free software"), '--version')
2198
self.assertContainsRe(result[0], 'is free software')
2199
# Running a subcommand that is missing errors
2200
self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2201
{'process_args':['--versionn']}, StubProcess(retcode=3),
2203
# Unless it is told to expect the error from the subprocess
2204
result = self.assertRunBzrSubprocess({},
2205
StubProcess(retcode=3), '--versionn', retcode=3)
2206
# Or to ignore retcode checking
2207
result = self.assertRunBzrSubprocess({},
2208
StubProcess(err="unknown command", retcode=3), '--versionn',
2210
self.assertContainsRe(result[1], 'unknown command')
2212
def test_env_change_passes_through(self):
2213
self.assertRunBzrSubprocess(
2214
{'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2216
env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2218
def test_no_working_dir_passed_as_None(self):
2219
self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2221
def test_no_working_dir_passed_through(self):
2222
self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2225
def test_run_bzr_subprocess_no_plugins(self):
2226
self.assertRunBzrSubprocess({'allow_plugins': False},
2229
def test_allow_plugins(self):
2230
self.assertRunBzrSubprocess({'allow_plugins': True},
2231
StubProcess(), '', allow_plugins=True)
2234
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
2236
def test_finish_bzr_subprocess_with_error(self):
2237
"""finish_bzr_subprocess allows specification of the desired exit code.
2239
process = StubProcess(err="unknown command", retcode=3)
2240
result = self.finish_bzr_subprocess(process, retcode=3)
2241
self.assertEqual('', result[0])
2242
self.assertContainsRe(result[1], 'unknown command')
2244
def test_finish_bzr_subprocess_ignoring_retcode(self):
2245
"""finish_bzr_subprocess allows the exit code to be ignored."""
2246
process = StubProcess(err="unknown command", retcode=3)
2247
result = self.finish_bzr_subprocess(process, retcode=None)
2248
self.assertEqual('', result[0])
2249
self.assertContainsRe(result[1], 'unknown command')
2251
def test_finish_subprocess_with_unexpected_retcode(self):
2252
"""finish_bzr_subprocess raises self.failureException if the retcode is
2253
not the expected one.
2255
process = StubProcess(err="unknown command", retcode=3)
2256
self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2260
class _DontSpawnProcess(Exception):
2261
"""A simple exception which just allows us to skip unnecessary steps"""
2264
class TestStartBzrSubProcess(tests.TestCase):
2266
def check_popen_state(self):
2267
"""Replace to make assertions when popen is called."""
2269
def _popen(self, *args, **kwargs):
2270
"""Record the command that is run, so that we can ensure it is correct"""
2271
self.check_popen_state()
2272
self._popen_args = args
2273
self._popen_kwargs = kwargs
2274
raise _DontSpawnProcess()
2276
def test_run_bzr_subprocess_no_plugins(self):
2277
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [])
2278
command = self._popen_args[0]
2279
self.assertEqual(sys.executable, command[0])
2280
self.assertEqual(self.get_bzr_path(), command[1])
2281
self.assertEqual(['--no-plugins'], command[2:])
2283
def test_allow_plugins(self):
2284
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2286
command = self._popen_args[0]
2287
self.assertEqual([], command[2:])
2289
def test_set_env(self):
2290
self.failIf('EXISTANT_ENV_VAR' in os.environ)
2292
def check_environment():
2293
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2294
self.check_popen_state = check_environment
2295
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2296
env_changes={'EXISTANT_ENV_VAR':'set variable'})
2297
# not set in theparent
2298
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2300
def test_run_bzr_subprocess_env_del(self):
2301
"""run_bzr_subprocess can remove environment variables too."""
2302
self.failIf('EXISTANT_ENV_VAR' in os.environ)
2303
def check_environment():
2304
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2305
os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2306
self.check_popen_state = check_environment
2307
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2308
env_changes={'EXISTANT_ENV_VAR':None})
2309
# Still set in parent
2310
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2311
del os.environ['EXISTANT_ENV_VAR']
2313
def test_env_del_missing(self):
2314
self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
2315
def check_environment():
2316
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2317
self.check_popen_state = check_environment
2318
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2319
env_changes={'NON_EXISTANT_ENV_VAR':None})
2321
def test_working_dir(self):
2322
"""Test that we can specify the working dir for the child"""
2323
orig_getcwd = osutils.getcwd
2324
orig_chdir = os.chdir
2332
osutils.getcwd = getcwd
2334
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2337
osutils.getcwd = orig_getcwd
2339
os.chdir = orig_chdir
2340
self.assertEqual(['foo', 'current'], chdirs)
2343
class TestActuallyStartBzrSubprocess(tests.TestCaseWithTransport):
2344
"""Tests that really need to do things with an external bzr."""
2346
def test_start_and_stop_bzr_subprocess_send_signal(self):
2347
"""finish_bzr_subprocess raises self.failureException if the retcode is
2348
not the expected one.
2350
self.disable_missing_extensions_warning()
2351
process = self.start_bzr_subprocess(['wait-until-signalled'],
2352
skip_if_plan_to_signal=True)
2353
self.assertEqual('running\n', process.stdout.readline())
2354
result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
2356
self.assertEqual('', result[0])
2357
self.assertEqual('bzr: interrupted\n', result[1])
2360
class TestFeature(tests.TestCase):
1680
self.fail('Assertion not raised')
1683
class TestFeature(TestCase):
2362
1685
def test_caching(self):
2363
1686
"""Feature._probe is called by the feature at most once."""
2364
class InstrumentedFeature(tests.Feature):
1687
class InstrumentedFeature(Feature):
2365
1688
def __init__(self):
2366
super(InstrumentedFeature, self).__init__()
1689
Feature.__init__(self)
2367
1690
self.calls = []
2368
1691
def _probe(self):
2369
1692
self.calls.append('_probe')
2385
1708
def test_default_str(self):
2386
1709
"""Feature.__str__ should default to __class__.__name__."""
2387
class NamedFeature(tests.Feature):
1710
class NamedFeature(Feature):
2389
1712
feature = NamedFeature()
2390
1713
self.assertEqual('NamedFeature', str(feature))
2393
class TestUnavailableFeature(tests.TestCase):
1716
class TestUnavailableFeature(TestCase):
2395
1718
def test_access_feature(self):
2396
feature = tests.Feature()
2397
exception = tests.UnavailableFeature(feature)
1720
exception = UnavailableFeature(feature)
2398
1721
self.assertIs(feature, exception.args[0])
2401
simple_thunk_feature = tests._CompatabilityThunkFeature(
2402
deprecated_in((2, 1, 0)),
2403
'bzrlib.tests.test_selftest',
2404
'simple_thunk_feature','UnicodeFilename',
2405
replacement_module='bzrlib.tests'
2408
class Test_CompatibilityFeature(tests.TestCase):
2410
def test_does_thunk(self):
2411
res = self.callDeprecated(
2412
['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
2413
' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
2414
simple_thunk_feature.available)
2415
self.assertEqual(tests.UnicodeFilename.available(), res)
2418
class TestModuleAvailableFeature(tests.TestCase):
2420
def test_available_module(self):
2421
feature = tests.ModuleAvailableFeature('bzrlib.tests')
2422
self.assertEqual('bzrlib.tests', feature.module_name)
2423
self.assertEqual('bzrlib.tests', str(feature))
2424
self.assertTrue(feature.available())
2425
self.assertIs(tests, feature.module)
2427
def test_unavailable_module(self):
2428
feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
2429
self.assertEqual('bzrlib.no_such_module_exists', str(feature))
2430
self.assertFalse(feature.available())
2431
self.assertIs(None, feature.module)
2434
class TestSelftestFiltering(tests.TestCase):
1724
class TestSelftestFiltering(TestCase):
2436
1726
def setUp(self):
2437
tests.TestCase.setUp(self)
2438
1727
self.suite = TestUtil.TestSuite()
2439
1728
self.loader = TestUtil.TestLoader()
2440
self.suite.addTest(self.loader.loadTestsFromModule(
2441
sys.modules['bzrlib.tests.test_selftest']))
1729
self.suite.addTest(self.loader.loadTestsFromModuleNames([
1730
'bzrlib.tests.test_selftest']))
2442
1731
self.all_names = _test_ids(self.suite)
2444
1733
def test_condition_id_re(self):
2445
1734
test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2446
1735
'test_condition_id_re')
2447
filtered_suite = tests.filter_suite_by_condition(
2448
self.suite, tests.condition_id_re('test_condition_id_re'))
1736
filtered_suite = filter_suite_by_condition(self.suite,
1737
condition_id_re('test_condition_id_re'))
2449
1738
self.assertEqual([test_name], _test_ids(filtered_suite))
2451
1740
def test_condition_id_in_list(self):
2452
1741
test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
2453
1742
'test_condition_id_in_list']
2454
1743
id_list = tests.TestIdList(test_names)
2455
filtered_suite = tests.filter_suite_by_condition(
1744
filtered_suite = filter_suite_by_condition(
2456
1745
self.suite, tests.condition_id_in_list(id_list))
2457
1746
my_pattern = 'TestSelftestFiltering.*test_condition_id_in_list'
2458
re_filtered = tests.filter_suite_by_re(self.suite, my_pattern)
1747
re_filtered = filter_suite_by_re(self.suite, my_pattern)
2459
1748
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2461
1750
def test_condition_id_startswith(self):
2462
1751
klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
2463
start1 = klass + 'test_condition_id_starts'
2464
start2 = klass + 'test_condition_id_in'
2465
test_names = [ klass + 'test_condition_id_in_list',
2466
klass + 'test_condition_id_startswith',
2468
filtered_suite = tests.filter_suite_by_condition(
2469
self.suite, tests.condition_id_startswith([start1, start2]))
2470
self.assertEqual(test_names, _test_ids(filtered_suite))
1752
start = klass + 'test_condition_id_starts'
1753
test_names = [klass + 'test_condition_id_startswith']
1754
filtered_suite = filter_suite_by_condition(
1755
self.suite, tests.condition_id_startswith(start))
1756
my_pattern = 'TestSelftestFiltering.*test_condition_id_startswith'
1757
re_filtered = filter_suite_by_re(self.suite, my_pattern)
1758
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2472
1760
def test_condition_isinstance(self):
2473
filtered_suite = tests.filter_suite_by_condition(
2474
self.suite, tests.condition_isinstance(self.__class__))
1761
filtered_suite = filter_suite_by_condition(self.suite,
1762
condition_isinstance(self.__class__))
2475
1763
class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
2476
re_filtered = tests.filter_suite_by_re(self.suite, class_pattern)
1764
re_filtered = filter_suite_by_re(self.suite, class_pattern)
2477
1765
self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2479
1767
def test_exclude_tests_by_condition(self):
2480
1768
excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2481
1769
'test_exclude_tests_by_condition')
2482
filtered_suite = tests.exclude_tests_by_condition(self.suite,
1770
filtered_suite = exclude_tests_by_condition(self.suite,
2483
1771
lambda x:x.id() == excluded_name)
2484
1772
self.assertEqual(len(self.all_names) - 1,
2485
1773
filtered_suite.countTestCases())