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