277
279
input_test = TestTestScenarioApplication("test_apply_scenario")
278
280
# setup two adapted tests
279
281
adapted_test1 = apply_scenario(input_test,
281
{"bzrdir_format":"bzr_format",
282
"repository_format":"repo_fmt",
283
"transport_server":"transport_server",
284
"transport_readonly_server":"readonly-server"}))
283
{"bzrdir_format": "bzr_format",
284
"repository_format": "repo_fmt",
285
"transport_server": "transport_server",
286
"transport_readonly_server": "readonly-server"}))
285
287
adapted_test2 = apply_scenario(input_test,
286
("new id 2", {"bzrdir_format":None}))
288
("new id 2", {"bzrdir_format": None}))
287
289
# input_test should have been altered.
288
290
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
289
291
# the new tests are mutually incompatible, ensuring it has
427
430
'vfs_transport_factory': mem_server,
428
431
'workingtree_format': wt6_format,
429
432
'_workingtree_to_test_tree': return_parameter,
432
435
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
433
436
'bzrdir_format': default_wt_format._matchingcontroldir,
434
437
'transport_readonly_server': 'b',
435
438
'transport_server': 'a',
436
439
'workingtree_format': default_wt_format,
442
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
443
'bzrdir_format': git_wt_format._matchingcontroldir,
444
'transport_readonly_server': 'b',
445
'transport_server': 'a',
446
'workingtree_format': git_wt_format,
438
449
('DirStateRevisionTree,WT4',
439
450
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
440
451
'bzrdir_format': wt4_format._matchingcontroldir,
441
452
'transport_readonly_server': 'b',
442
453
'transport_server': 'a',
443
454
'workingtree_format': wt4_format,
445
456
('DirStateRevisionTree,WT5',
446
457
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
447
458
'bzrdir_format': wt5_format._matchingcontroldir,
448
459
'transport_readonly_server': 'b',
449
460
'transport_server': 'a',
450
461
'workingtree_format': wt5_format,
453
464
{'_workingtree_to_test_tree': preview_tree_pre,
454
465
'bzrdir_format': default_wt_format._matchingcontroldir,
821
836
# this should appear in the output stream of our test result.
822
837
output = result_stream.getvalue()
823
838
self.assertContainsRe(output,
824
r"LSProf output for <type 'unicode'>\(\('hello',\), {'errors': 'replace'}\)")
825
self.assertContainsRe(output,
826
r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
827
self.assertContainsRe(output,
828
r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
829
self.assertContainsRe(output,
830
r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
839
r"LSProf output for <class 'str'>\(\(b'hello',\), {'errors': 'replace'}\)")
840
self.assertContainsRe(output,
841
r"LSProf output for <class 'str'>\(\(b'world',\), {'errors': 'replace'}\)")
842
self.assertContainsRe(output,
843
r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
844
self.assertContainsRe(output,
845
r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
832
847
def test_uses_time_from_testtools(self):
833
848
"""Test case timings in verbose results should use testtools times"""
835
851
class TimeAddedVerboseTestResult(tests.VerboseTestResult):
836
852
def startTest(self, test):
837
853
self.time(datetime.datetime.utcfromtimestamp(1.145))
838
854
super(TimeAddedVerboseTestResult, self).startTest(test)
839
856
def addSuccess(self, test):
840
857
self.time(datetime.datetime.utcfromtimestamp(51.147))
841
858
super(TimeAddedVerboseTestResult, self).addSuccess(test)
842
860
def report_tests_starting(self): pass
844
862
self.get_passing_test().run(TimeAddedVerboseTestResult(sio, 0, 2))
1034
1067
self.expectFailure('failed', self.assertTrue, False)
1035
1068
test = unittest.TestSuite()
1036
1069
test.addTest(Test("known_failure_test"))
1037
1071
def failing_test():
1038
1072
raise AssertionError('foo')
1039
1073
test.addTest(unittest.FunctionTestCase(failing_test))
1040
1074
stream = StringIO()
1041
1075
runner = tests.TextTestRunner(stream=stream)
1042
result = self.run_test_runner(runner, test)
1043
lines = stream.getvalue().splitlines()
1044
self.assertContainsRe(stream.getvalue(),
1076
self.run_test_runner(runner, test)
1077
self.assertContainsRe(
1045
1079
'(?sm)^brz selftest.*$'
1047
1081
'^======================================================================\n'
1048
1082
'^FAIL: failing_test\n'
1049
1083
'^----------------------------------------------------------------------\n'
1050
1084
'Traceback \\(most recent call last\\):\n'
1051
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1085
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1052
1086
' raise AssertionError\\(\'foo\'\\)\n'
1054
1088
'^----------------------------------------------------------------------\n'
1065
1099
test = Test("known_failure_test")
1066
1100
stream = StringIO()
1067
1101
runner = tests.TextTestRunner(stream=stream)
1068
result = self.run_test_runner(runner, test)
1102
self.run_test_runner(runner, test)
1069
1103
self.assertContainsRe(stream.getvalue(),
1072
'Ran 1 test in .*\n'
1074
'OK \\(known_failures=1\\)\n')
1106
'Ran 1 test in .*\n'
1108
'OK \\(known_failures=1\\)\n')
1076
1110
def test_unexpected_success_bad(self):
1077
1111
class Test(tests.TestCase):
1078
1112
def test_truth(self):
1079
1113
self.expectFailure("No absolute truth", self.assertTrue, True)
1080
1114
runner = tests.TextTestRunner(stream=StringIO())
1081
result = self.run_test_runner(runner, Test("test_truth"))
1115
self.run_test_runner(runner, Test("test_truth"))
1082
1116
self.assertContainsRe(runner.stream.getvalue(),
1084
"FAIL: \\S+\\.test_truth\n"
1087
"\\s*(?:Text attachment: )?reason"
1093
"Ran 1 test in .*\n"
1095
"FAILED \\(failures=1\\)\n\\Z")
1118
"FAIL: \\S+\\.test_truth\n"
1121
"\\s*(?:Text attachment: )?reason"
1127
"Ran 1 test in .*\n"
1129
"FAILED \\(failures=1\\)\n\\Z")
1097
1131
def test_result_decorator(self):
1098
1132
# decorate results
1100
1135
class LoggingDecorator(ExtendedToOriginalDecorator):
1101
1136
def startTest(self, test):
1102
1137
ExtendedToOriginalDecorator.startTest(self, test)
1103
1138
calls.append('start')
1104
test = unittest.FunctionTestCase(lambda:None)
1139
test = unittest.FunctionTestCase(lambda: None)
1105
1140
stream = StringIO()
1106
1141
runner = tests.TextTestRunner(stream=stream,
1107
result_decorators=[LoggingDecorator])
1108
result = self.run_test_runner(runner, test)
1142
result_decorators=[LoggingDecorator])
1143
self.run_test_runner(runner, test)
1109
1144
self.assertLength(1, calls)
1111
1146
def test_skipped_test(self):
1215
1255
stream = StringIO()
1216
1256
runner = tests.TextTestRunner(stream=stream, verbosity=2)
1217
1257
# Need to use the CountingDecorator as that's what sets num_tests
1218
result = self.run_test_runner(runner, tests.CountingDecorator(suite))
1258
self.run_test_runner(runner, tests.CountingDecorator(suite))
1219
1259
self.assertStartsWith(stream.getvalue(), "running 2 tests")
1221
1261
def test_startTestRun(self):
1222
1262
"""run should call result.startTestRun()"""
1224
1265
class LoggingDecorator(ExtendedToOriginalDecorator):
1225
1266
def startTestRun(self):
1226
1267
ExtendedToOriginalDecorator.startTestRun(self)
1227
1268
calls.append('startTestRun')
1228
test = unittest.FunctionTestCase(lambda:None)
1269
test = unittest.FunctionTestCase(lambda: None)
1229
1270
stream = StringIO()
1230
1271
runner = tests.TextTestRunner(stream=stream,
1231
result_decorators=[LoggingDecorator])
1232
result = self.run_test_runner(runner, test)
1272
result_decorators=[LoggingDecorator])
1273
self.run_test_runner(runner, test)
1233
1274
self.assertLength(1, calls)
1235
1276
def test_stopTestRun(self):
1236
1277
"""run should call result.stopTestRun()"""
1238
1280
class LoggingDecorator(ExtendedToOriginalDecorator):
1239
1281
def stopTestRun(self):
1240
1282
ExtendedToOriginalDecorator.stopTestRun(self)
1241
1283
calls.append('stopTestRun')
1242
test = unittest.FunctionTestCase(lambda:None)
1284
test = unittest.FunctionTestCase(lambda: None)
1243
1285
stream = StringIO()
1244
1286
runner = tests.TextTestRunner(stream=stream,
1245
result_decorators=[LoggingDecorator])
1246
result = self.run_test_runner(runner, test)
1287
result_decorators=[LoggingDecorator])
1288
self.run_test_runner(runner, test)
1247
1289
self.assertLength(1, calls)
1249
1291
def test_unicode_test_output_on_ascii_stream(self):
1550
1605
def test_run_disabled_supporting_result(self):
1551
1606
"""Test disabled tests behaviour with support aware results."""
1552
1607
test = SampleTestCase('_test_pass')
1553
1609
class DisabledFeature(object):
1554
1610
def __eq__(self, other):
1555
1611
return isinstance(other, DisabledFeature)
1556
1613
def available(self):
1558
1615
the_feature = DisabledFeature()
1559
1616
test._test_needs_features = [the_feature]
1560
1618
class InstrumentedTestResult(unittest.TestResult):
1561
1619
def __init__(self):
1562
1620
unittest.TestResult.__init__(self)
1563
1621
self.calls = []
1564
1623
def startTest(self, test):
1565
1624
self.calls.append(('startTest', test))
1566
1626
def stopTest(self, test):
1567
1627
self.calls.append(('stopTest', test))
1568
1629
def addNotSupported(self, test, feature):
1569
1630
self.calls.append(('addNotSupported', test, feature))
1570
1631
result = InstrumentedTestResult()
1904
1969
def test_assert_isinstance(self):
1905
1970
self.assertIsInstance(2, int)
1906
self.assertIsInstance(u'', (str, text_type))
1971
self.assertIsInstance(u'', str)
1907
1972
e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1908
self.assertEqual(str(e),
1909
"None is an instance of <type 'NoneType'> rather than <type 'int'>")
1975
["None is an instance of <type 'NoneType'> rather than "
1977
"None is an instance of <class 'NoneType'> rather than "
1910
1979
self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1911
1980
e = self.assertRaises(AssertionError,
1912
self.assertIsInstance, None, int, "it's just not")
1913
self.assertEqual(str(e),
1914
"None is an instance of <type 'NoneType'> rather than <type 'int'>"
1981
self.assertIsInstance, None, int,
1985
"None is an instance of <class 'NoneType'> rather "
1986
"than <class 'int'>: it's just not")
1917
1988
def test_assertEndsWith(self):
1918
1989
self.assertEndsWith('foo', 'oo')
1937
2008
sample_object = ApplyDeprecatedHelper()
1938
2009
# calling an undeprecated callable raises an assertion
1939
2010
self.assertRaises(AssertionError, self.applyDeprecated,
1940
deprecated_in((0, 11, 0)),
1941
sample_object.sample_normal_method)
2011
deprecated_in((0, 11, 0)),
2012
sample_object.sample_normal_method)
1942
2013
self.assertRaises(AssertionError, self.applyDeprecated,
1943
deprecated_in((0, 11, 0)),
1944
sample_undeprecated_function, "a param value")
2014
deprecated_in((0, 11, 0)),
2015
sample_undeprecated_function, "a param value")
1945
2016
# calling a deprecated callable (function or method) with the wrong
1946
2017
# expected deprecation fails.
1947
2018
self.assertRaises(AssertionError, self.applyDeprecated,
1948
deprecated_in((0, 10, 0)),
1949
sample_object.sample_deprecated_method, "a param value")
2019
deprecated_in((0, 10, 0)),
2020
sample_object.sample_deprecated_method,
1950
2022
self.assertRaises(AssertionError, self.applyDeprecated,
1951
deprecated_in((0, 10, 0)),
1952
sample_deprecated_function)
2023
deprecated_in((0, 10, 0)),
2024
sample_deprecated_function)
1953
2025
# calling a deprecated callable (function or method) with the right
1954
2026
# expected deprecation returns the functions result.
1955
self.assertEqual("a param value",
1956
self.applyDeprecated(deprecated_in((0, 11, 0)),
1957
sample_object.sample_deprecated_method, "a param value"))
2029
self.applyDeprecated(
2030
deprecated_in((0, 11, 0)),
2031
sample_object.sample_deprecated_method, "a param value"))
1958
2032
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
1959
sample_deprecated_function))
2033
sample_deprecated_function))
1960
2034
# calling a nested deprecation with the wrong deprecation version
1961
2035
# fails even if a deeper nested function was deprecated with the
1962
2036
# supplied version.
1963
self.assertRaises(AssertionError, self.applyDeprecated,
2038
AssertionError, self.applyDeprecated,
1964
2039
deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
1965
2040
# calling a nested deprecation with the right deprecation value
1966
2041
# returns the calls result.
1967
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1968
sample_object.sample_nested_deprecation))
2043
2, self.applyDeprecated(
2044
deprecated_in((0, 10, 0)),
2045
sample_object.sample_nested_deprecation))
1970
2047
def test_callDeprecated(self):
1971
2048
def testfunc(be_deprecated, result=None):
2041
2120
breezy.tests.default_transport = old_transport
2042
2121
tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
2047
2128
class TestSelftest(tests.TestCase, SelfTestHelper):
2048
2129
"""Tests of breezy.tests.selftest."""
2050
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
2131
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(
2051
2133
factory_called = []
2053
2136
factory_called.append(True)
2054
2137
return TestUtil.TestSuite()
2055
2138
out = StringIO()
2056
2139
err = StringIO()
2057
2140
self.apply_redirected(out, err, None, breezy.tests.selftest,
2058
test_suite_factory=factory)
2141
test_suite_factory=factory)
2059
2142
self.assertEqual([True], factory_called)
2061
2144
def factory(self):
2062
2145
"""A test suite factory."""
2063
2146
class Test(tests.TestCase):
2148
return __name__ + ".Test." + self._testMethodName
2070
2158
return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
2072
2160
def test_list_only(self):
2073
2161
output = self.run_selftest(test_suite_factory=self.factory,
2075
2163
self.assertEqual(3, len(output.readlines()))
2077
2165
def test_list_only_filtered(self):
2078
2166
output = self.run_selftest(test_suite_factory=self.factory,
2079
list_only=True, pattern="Test.b")
2080
self.assertEndsWith(output.getvalue(), "Test.b\n")
2167
list_only=True, pattern="Test.b")
2168
self.assertEndsWith(output.getvalue(), b"Test.b\n")
2081
2169
self.assertLength(1, output.readlines())
2083
2171
def test_list_only_excludes(self):
2084
2172
output = self.run_selftest(test_suite_factory=self.factory,
2085
list_only=True, exclude_pattern="Test.b")
2086
self.assertNotContainsRe("Test.b", output.getvalue())
2173
list_only=True, exclude_pattern="Test.b")
2174
self.assertNotContainsRe(b"Test.b", output.getvalue())
2087
2175
self.assertLength(2, output.readlines())
2089
2177
def test_lsprof_tests(self):
2090
2178
self.requireFeature(features.lsprof_feature)
2092
2181
class Test(object):
2093
2182
def __call__(test, result):
2094
2183
test.run(result)
2095
2185
def run(test, result):
2096
2186
results.append(result)
2097
2188
def countTestCases(self):
2099
2190
self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
2133
2224
def test_starting_with_single_argument(self):
2134
2225
output = self.run_selftest(test_suite_factory=self.factory,
2135
starting_with=['breezy.tests.test_selftest.Test.a'],
2137
self.assertEqual('breezy.tests.test_selftest.Test.a\n',
2227
'breezy.tests.test_selftest.Test.a'],
2229
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n',
2140
2232
def test_starting_with_multiple_argument(self):
2141
output = self.run_selftest(test_suite_factory=self.factory,
2233
output = self.run_selftest(
2234
test_suite_factory=self.factory,
2142
2235
starting_with=['breezy.tests.test_selftest.Test.a',
2143
'breezy.tests.test_selftest.Test.b'],
2236
'breezy.tests.test_selftest.Test.b'],
2144
2237
list_only=True)
2145
self.assertEqual('breezy.tests.test_selftest.Test.a\n'
2146
'breezy.tests.test_selftest.Test.b\n',
2238
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n'
2239
b'breezy.tests.test_selftest.Test.b\n',
2149
2242
def check_transport_set(self, transport_server):
2150
2243
captured_transport = []
2151
2245
def seen_transport(a_transport):
2152
2246
captured_transport.append(a_transport)
2153
2248
class Capture(tests.TestCase):
2155
2250
seen_transport(breezy.tests.default_transport)
2157
2253
return TestUtil.TestSuite([Capture("a")])
2158
self.run_selftest(transport=transport_server, test_suite_factory=factory)
2254
self.run_selftest(transport=transport_server,
2255
test_suite_factory=factory)
2159
2256
self.assertEqual(transport_server, captured_transport[0])
2161
2258
def test_transport_sftp(self):
2205
2303
def test_fail_has_log(self):
2206
2304
content, result = self.run_subunit_stream('test_fail')
2207
2305
self.assertEqual(1, len(result.failures))
2208
self.assertContainsRe(content, '(?m)^log$')
2209
self.assertContainsRe(content, 'this test will fail')
2306
self.assertContainsRe(content, b'(?m)^log$')
2307
self.assertContainsRe(content, b'this test will fail')
2211
2309
def test_error_has_log(self):
2212
2310
content, result = self.run_subunit_stream('test_error')
2213
self.assertContainsRe(content, '(?m)^log$')
2214
self.assertContainsRe(content, 'this test errored')
2311
self.assertContainsRe(content, b'(?m)^log$')
2312
self.assertContainsRe(content, b'this test errored')
2216
2314
def test_skip_has_no_log(self):
2217
2315
content, result = self.run_subunit_stream('test_skip')
2218
self.assertNotContainsRe(content, '(?m)^log$')
2219
self.assertNotContainsRe(content, 'this test will be skipped')
2220
reasons = _get_skip_reasons(result)
2316
self.assertNotContainsRe(content, b'(?m)^log$')
2317
self.assertNotContainsRe(content, b'this test will be skipped')
2318
reasons = result.skip_reasons
2221
2319
self.assertEqual({'reason'}, set(reasons))
2222
2320
skips = reasons['reason']
2223
2321
self.assertEqual(1, len(skips))
2225
2323
# RemotedTestCase doesn't preserve the "details"
2226
## self.assertFalse('log' in test.getDetails())
2324
# self.assertFalse('log' in test.getDetails())
2228
2326
def test_missing_feature_has_no_log(self):
2229
2327
content, result = self.run_subunit_stream('test_missing_feature')
2230
self.assertNotContainsRe(content, '(?m)^log$')
2231
self.assertNotContainsRe(content, 'missing the feature')
2232
reasons = _get_skip_reasons(result)
2328
self.assertNotContainsRe(content, b'(?m)^log$')
2329
self.assertNotContainsRe(content, b'missing the feature')
2330
reasons = result.skip_reasons
2233
2331
self.assertEqual({'_MissingFeature\n'}, set(reasons))
2234
2332
skips = reasons['_MissingFeature\n']
2235
2333
self.assertEqual(1, len(skips))
2237
2335
# RemotedTestCase doesn't preserve the "details"
2238
## self.assertFalse('log' in test.getDetails())
2336
# self.assertFalse('log' in test.getDetails())
2240
2338
def test_xfail_has_no_log(self):
2241
2339
content, result = self.run_subunit_stream('test_xfail')
2242
self.assertNotContainsRe(content, '(?m)^log$')
2243
self.assertNotContainsRe(content, 'test with expected failure')
2340
self.assertNotContainsRe(content, b'(?m)^log$')
2341
self.assertNotContainsRe(content, b'test with expected failure')
2244
2342
self.assertEqual(1, len(result.expectedFailures))
2245
2343
result_content = result.expectedFailures[0][1]
2246
2344
self.assertNotContainsRe(result_content,
2247
'(?m)^(?:Text attachment: )?log(?:$|: )')
2345
'(?m)^(?:Text attachment: )?log(?:$|: )')
2248
2346
self.assertNotContainsRe(result_content, 'test with expected failure')
2250
2348
def test_unexpected_success_has_log(self):
2251
2349
content, result = self.run_subunit_stream('test_unexpected_success')
2252
self.assertContainsRe(content, '(?m)^log$')
2253
self.assertContainsRe(content, 'test with unexpected success')
2254
# GZ 2011-05-18: Old versions of subunit treat unexpected success as a
2255
# success, if a min version check is added remove this
2256
from subunit import TestProtocolClient as _Client
2257
if _Client.addUnexpectedSuccess.__func__ is _Client.addSuccess.__func__:
2258
self.expectFailure('subunit treats "unexpectedSuccess"'
2259
' as a plain success',
2260
self.assertEqual, 1, len(result.unexpectedSuccesses))
2350
self.assertContainsRe(content, b'(?m)^log$')
2351
self.assertContainsRe(content, b'test with unexpected success')
2261
2352
self.assertEqual(1, len(result.unexpectedSuccesses))
2262
test = result.unexpectedSuccesses[0]
2353
# test = result.unexpectedSuccesses[0]
2263
2354
# RemotedTestCase doesn't preserve the "details"
2264
## self.assertTrue('log' in test.getDetails())
2355
# self.assertTrue('log' in test.getDetails())
2266
2357
def test_success_has_no_log(self):
2267
2358
content, result = self.run_subunit_stream('test_success')
2268
2359
self.assertEqual(1, result.testsRun)
2269
self.assertNotContainsRe(content, '(?m)^log$')
2270
self.assertNotContainsRe(content, 'this test succeeds')
2360
self.assertNotContainsRe(content, b'(?m)^log$')
2361
self.assertNotContainsRe(content, b'this test succeeds')
2273
2364
class TestRunBzr(tests.TestCase):
2278
def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
2370
def _run_bzr_core(self, argv, encoding=None, stdin=None,
2371
stdout=None, stderr=None, working_dir=None):
2280
2372
"""Override _run_bzr_core to test how it is invoked by run_bzr.
2282
2374
Attempts to run bzr from inside this class don't actually run it.
2311
2405
def test_encoding(self):
2312
2406
"""Test that run_bzr passes encoding to _run_bzr_core"""
2313
2407
self.run_bzr('foo bar')
2314
self.assertEqual(None, self.encoding)
2408
self.assertEqual(osutils.get_user_encoding(), self.encoding)
2315
2409
self.assertEqual(['foo', 'bar'], self.argv)
2317
2411
self.run_bzr('foo bar', encoding='baz')
2318
2412
self.assertEqual('baz', self.encoding)
2319
2413
self.assertEqual(['foo', 'bar'], self.argv)
2321
def test_retcode(self):
2322
"""Test that run_bzr passes retcode to _run_bzr_core"""
2323
# Default is retcode == 0
2324
self.run_bzr('foo bar')
2325
self.assertEqual(0, self.retcode)
2326
self.assertEqual(['foo', 'bar'], self.argv)
2328
self.run_bzr('foo bar', retcode=1)
2329
self.assertEqual(1, self.retcode)
2330
self.assertEqual(['foo', 'bar'], self.argv)
2332
self.run_bzr('foo bar', retcode=None)
2333
self.assertEqual(None, self.retcode)
2334
self.assertEqual(['foo', 'bar'], self.argv)
2336
self.run_bzr(['foo', 'bar'], retcode=3)
2337
self.assertEqual(3, self.retcode)
2338
self.assertEqual(['foo', 'bar'], self.argv)
2340
2415
def test_stdin(self):
2341
2416
# test that the stdin keyword to run_bzr is passed through to
2342
2417
# _run_bzr_core as-is. We do this by overriding
2486
2562
def test_run_bzr_subprocess(self):
2487
2563
"""The run_bzr_helper_external command behaves nicely."""
2488
self.assertRunBzrSubprocess({'process_args':['--version']},
2489
StubProcess(), '--version')
2490
self.assertRunBzrSubprocess({'process_args':['--version']},
2491
StubProcess(), ['--version'])
2564
self.assertRunBzrSubprocess({'process_args': ['--version']},
2565
StubProcess(), '--version')
2566
self.assertRunBzrSubprocess({'process_args': ['--version']},
2567
StubProcess(), ['--version'])
2492
2568
# retcode=None disables retcode checking
2493
result = self.assertRunBzrSubprocess({},
2494
StubProcess(retcode=3), '--version', retcode=None)
2495
result = self.assertRunBzrSubprocess({},
2496
StubProcess(out="is free software"), '--version')
2569
result = self.assertRunBzrSubprocess(
2570
{}, StubProcess(retcode=3), '--version', retcode=None)
2571
result = self.assertRunBzrSubprocess(
2572
{}, StubProcess(out="is free software"), '--version')
2497
2573
self.assertContainsRe(result[0], 'is free software')
2498
2574
# Running a subcommand that is missing errors
2499
2575
self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2500
{'process_args':['--versionn']}, StubProcess(retcode=3),
2576
{'process_args': ['--versionn']
2577
}, StubProcess(retcode=3),
2502
2579
# Unless it is told to expect the error from the subprocess
2503
result = self.assertRunBzrSubprocess({},
2504
StubProcess(retcode=3), '--versionn', retcode=3)
2580
result = self.assertRunBzrSubprocess(
2581
{}, StubProcess(retcode=3), '--versionn', retcode=3)
2505
2582
# Or to ignore retcode checking
2506
result = self.assertRunBzrSubprocess({},
2507
StubProcess(err="unknown command", retcode=3), '--versionn',
2583
result = self.assertRunBzrSubprocess(
2584
{}, StubProcess(err="unknown command", retcode=3),
2585
'--versionn', retcode=None)
2509
2586
self.assertContainsRe(result[1], 'unknown command')
2511
2588
def test_env_change_passes_through(self):
2512
2589
self.assertRunBzrSubprocess(
2513
{'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2590
{'env_changes': {'new': 'value', 'changed': 'newvalue', 'deleted': None}},
2514
2591
StubProcess(), '',
2515
env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2592
env_changes={'new': 'value', 'changed': 'newvalue', 'deleted': None})
2517
2594
def test_no_working_dir_passed_as_None(self):
2518
2595
self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2520
2597
def test_no_working_dir_passed_through(self):
2521
2598
self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2524
2601
def test_run_bzr_subprocess_no_plugins(self):
2525
2602
self.assertRunBzrSubprocess({'allow_plugins': False},
2528
2605
def test_allow_plugins(self):
2529
2606
self.assertRunBzrSubprocess({'allow_plugins': True},
2530
StubProcess(), '', allow_plugins=True)
2607
StubProcess(), '', allow_plugins=True)
2533
2610
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
2595
2672
def test_set_env(self):
2596
2673
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2597
2674
# set in the child
2598
2676
def check_environment():
2599
2677
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2600
2678
self.check_popen_state = check_environment
2601
2679
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2602
env_changes={'EXISTANT_ENV_VAR':'set variable'})
2680
env_changes={'EXISTANT_ENV_VAR': 'set variable'})
2603
2681
# not set in theparent
2604
2682
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2606
2684
def test_run_bzr_subprocess_env_del(self):
2607
2685
"""run_bzr_subprocess can remove environment variables too."""
2608
2686
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2609
2688
def check_environment():
2610
2689
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2611
2690
os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2612
2691
self.check_popen_state = check_environment
2613
2692
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2614
env_changes={'EXISTANT_ENV_VAR':None})
2693
env_changes={'EXISTANT_ENV_VAR': None})
2615
2694
# Still set in parent
2616
2695
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2617
2696
del os.environ['EXISTANT_ENV_VAR']
2619
2698
def test_env_del_missing(self):
2620
2699
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2621
2701
def check_environment():
2622
2702
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2623
2703
self.check_popen_state = check_environment
2624
2704
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2625
env_changes={'NON_EXISTANT_ENV_VAR':None})
2705
env_changes={'NON_EXISTANT_ENV_VAR': None})
2627
2707
def test_working_dir(self):
2628
2708
"""Test that we can specify the working dir for the child"""
2629
orig_getcwd = osutils.getcwd
2630
orig_chdir = os.chdir
2632
2711
def chdir(path):
2633
2712
chdirs.append(path)
2634
2713
self.overrideAttr(os, 'chdir', chdir)
2636
2716
return 'current'
2637
2717
self.overrideAttr(osutils, 'getcwd', getcwd)
2735
2815
def test_filter_suite_by_condition(self):
2736
2816
test_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2737
'test_filter_suite_by_condition')
2738
filtered_suite = tests.filter_suite_by_condition(self.suite,
2739
lambda x:x.id() == test_name)
2817
'test_filter_suite_by_condition')
2818
filtered_suite = tests.filter_suite_by_condition(
2819
self.suite, lambda x: x.id() == test_name)
2740
2820
self.assertEqual([test_name], _test_ids(filtered_suite))
2742
2822
def test_filter_suite_by_re(self):
2743
2823
filtered_suite = tests.filter_suite_by_re(self.suite,
2744
2824
'test_filter_suite_by_r')
2745
2825
filtered_names = _test_ids(filtered_suite)
2746
self.assertEqual(filtered_names, ['breezy.tests.test_selftest.'
2747
'TestSelftestFiltering.test_filter_suite_by_re'])
2827
filtered_names, ['breezy.tests.test_selftest.'
2828
'TestSelftestFiltering.test_filter_suite_by_re'])
2749
2830
def test_filter_suite_by_id_list(self):
2750
2831
test_list = ['breezy.tests.test_selftest.'
3044
3131
# plugins can't be tested that way since selftest may be run with
3047
if __doc__ is not None:
3048
expected_test_list.extend([
3049
# modules_to_doctest
3050
'breezy.timestamp.format_highres_date',
3052
3134
suite = tests.test_suite()
3053
self.assertEqual({"testmod_names", "modules_to_doctest"},
3135
self.assertEqual({"testmod_names", "modules_to_doctest"}, set(calls))
3055
3136
self.assertSubset(expected_test_list, _test_ids(suite))
3057
3138
def test_test_suite_list_and_start(self):
3058
# We cannot test this at the same time as the main load, because we want
3059
# to know that starting_with == None works. So a second load is
3060
# incurred - note that the starting_with parameter causes a partial load
3061
# rather than a full load so this test should be pretty quick.
3062
test_list = ['breezy.tests.test_selftest.TestTestSuite.test_test_suite']
3139
# We cannot test this at the same time as the main load, because we
3140
# want to know that starting_with == None works. So a second load is
3141
# incurred - note that the starting_with parameter causes a partial
3142
# load rather than a full load so this test should be pretty quick.
3144
'breezy.tests.test_selftest.TestTestSuite.test_test_suite']
3063
3145
suite = tests.test_suite(test_list,
3064
3146
['breezy.tests.test_selftest.TestTestSuite'])
3065
# test_test_suite_list_and_start is not included
3147
# test_test_suite_list_and_start is not included
3066
3148
self.assertEqual(test_list, _test_ids(suite))
3473
3568
def test_pattern(self):
3474
3569
out = self._run_selftest_with_suite(pattern="test_(?:pass|self_ref)$")
3475
self.assertNotContainsRe(out, "test_skip")
3570
self.assertNotContainsRe(out, b"test_skip")
3477
3572
def test_exclude_pattern(self):
3478
3573
out = self._run_selftest_with_suite(exclude_pattern="test_skip$")
3479
self.assertNotContainsRe(out, "test_skip")
3574
self.assertNotContainsRe(out, b"test_skip")
3481
3576
def test_random_seed(self):
3482
3577
self._run_selftest_with_suite(random_seed="now")
3484
3579
def test_matching_tests_first(self):
3485
3580
self._run_selftest_with_suite(matching_tests_first=True,
3486
pattern="test_self_ref$")
3581
pattern="test_self_ref$")
3488
3583
def test_starting_with_and_exclude(self):
3489
3584
out = self._run_selftest_with_suite(starting_with=["bt."],
3490
exclude_pattern="test_skip$")
3491
self.assertNotContainsRe(out, "test_skip")
3585
exclude_pattern="test_skip$")
3586
self.assertNotContainsRe(out, b"test_skip")
3493
3588
def test_additonal_decorator(self):
3494
out = self._run_selftest_with_suite(
3495
suite_decorators=[tests.TestDecorator])
3589
self._run_selftest_with_suite(suite_decorators=[tests.TestDecorator])
3498
3592
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):