284
277
input_test = TestTestScenarioApplication("test_apply_scenario")
285
278
# setup two adapted tests
286
279
adapted_test1 = apply_scenario(input_test,
288
{"bzrdir_format": "bzr_format",
289
"repository_format": "repo_fmt",
290
"transport_server": "transport_server",
291
"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"}))
292
285
adapted_test2 = apply_scenario(input_test,
293
("new id 2", {"bzrdir_format": None}))
286
("new id 2", {"bzrdir_format":None}))
294
287
# input_test should have been altered.
295
288
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
296
289
# the new tests are mutually incompatible, ensuring it has
435
427
'vfs_transport_factory': mem_server,
436
428
'workingtree_format': wt6_format,
437
429
'_workingtree_to_test_tree': return_parameter,
440
432
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
441
433
'bzrdir_format': default_wt_format._matchingcontroldir,
442
434
'transport_readonly_server': 'b',
443
435
'transport_server': 'a',
444
436
'workingtree_format': default_wt_format,
447
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
448
'bzrdir_format': git_wt_format._matchingcontroldir,
449
'transport_readonly_server': 'b',
450
'transport_server': 'a',
451
'workingtree_format': git_wt_format,
454
438
('DirStateRevisionTree,WT4',
455
439
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
456
440
'bzrdir_format': wt4_format._matchingcontroldir,
457
441
'transport_readonly_server': 'b',
458
442
'transport_server': 'a',
459
443
'workingtree_format': wt4_format,
461
445
('DirStateRevisionTree,WT5',
462
446
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
463
447
'bzrdir_format': wt5_format._matchingcontroldir,
464
448
'transport_readonly_server': 'b',
465
449
'transport_server': 'a',
466
450
'workingtree_format': wt5_format,
469
453
{'_workingtree_to_test_tree': preview_tree_pre,
470
454
'bzrdir_format': default_wt_format._matchingcontroldir,
840
820
# and then repeated but with 'world', rather than 'hello'.
841
821
# this should appear in the output stream of our test result.
842
822
output = result_stream.getvalue()
844
self.assertContainsRe(output,
845
r"LSProf output for <class 'str'>\(\(b'hello',\), {'errors': 'replace'}\)")
846
self.assertContainsRe(output,
847
r"LSProf output for <class 'str'>\(\(b'world',\), {'errors': 'replace'}\)")
849
self.assertContainsRe(output,
850
r"LSProf output for <type 'unicode'>\(\('hello',\), {'errors': 'replace'}\)")
851
self.assertContainsRe(output,
852
r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
853
self.assertContainsRe(output,
854
r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
855
self.assertContainsRe(output,
856
r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
823
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")
858
832
def test_uses_time_from_testtools(self):
859
833
"""Test case timings in verbose results should use testtools times"""
862
835
class TimeAddedVerboseTestResult(tests.VerboseTestResult):
863
836
def startTest(self, test):
864
837
self.time(datetime.datetime.utcfromtimestamp(1.145))
865
838
super(TimeAddedVerboseTestResult, self).startTest(test)
867
839
def addSuccess(self, test):
868
840
self.time(datetime.datetime.utcfromtimestamp(51.147))
869
841
super(TimeAddedVerboseTestResult, self).addSuccess(test)
871
842
def report_tests_starting(self): pass
873
844
self.get_passing_test().run(TimeAddedVerboseTestResult(sio, 0, 2))
1078
1034
self.expectFailure('failed', self.assertTrue, False)
1079
1035
test = unittest.TestSuite()
1080
1036
test.addTest(Test("known_failure_test"))
1082
1037
def failing_test():
1083
1038
raise AssertionError('foo')
1084
1039
test.addTest(unittest.FunctionTestCase(failing_test))
1085
1040
stream = StringIO()
1086
1041
runner = tests.TextTestRunner(stream=stream)
1087
self.run_test_runner(runner, test)
1088
self.assertContainsRe(
1042
result = self.run_test_runner(runner, test)
1043
lines = stream.getvalue().splitlines()
1044
self.assertContainsRe(stream.getvalue(),
1090
1045
'(?sm)^brz selftest.*$'
1092
1047
'^======================================================================\n'
1093
1048
'^FAIL: failing_test\n'
1094
1049
'^----------------------------------------------------------------------\n'
1095
1050
'Traceback \\(most recent call last\\):\n'
1096
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1051
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1097
1052
' raise AssertionError\\(\'foo\'\\)\n'
1099
1054
'^----------------------------------------------------------------------\n'
1110
1065
test = Test("known_failure_test")
1111
1066
stream = StringIO()
1112
1067
runner = tests.TextTestRunner(stream=stream)
1113
self.run_test_runner(runner, test)
1068
result = self.run_test_runner(runner, test)
1114
1069
self.assertContainsRe(stream.getvalue(),
1117
'Ran 1 test in .*\n'
1119
'OK \\(known_failures=1\\)\n')
1072
'Ran 1 test in .*\n'
1074
'OK \\(known_failures=1\\)\n')
1121
1076
def test_unexpected_success_bad(self):
1122
1077
class Test(tests.TestCase):
1123
1078
def test_truth(self):
1124
1079
self.expectFailure("No absolute truth", self.assertTrue, True)
1125
1080
runner = tests.TextTestRunner(stream=StringIO())
1126
self.run_test_runner(runner, Test("test_truth"))
1081
result = self.run_test_runner(runner, Test("test_truth"))
1127
1082
self.assertContainsRe(runner.stream.getvalue(),
1129
"FAIL: \\S+\\.test_truth\n"
1132
"\\s*(?:Text attachment: )?reason"
1138
"Ran 1 test in .*\n"
1140
"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")
1142
1097
def test_result_decorator(self):
1143
1098
# decorate results
1146
1100
class LoggingDecorator(ExtendedToOriginalDecorator):
1147
1101
def startTest(self, test):
1148
1102
ExtendedToOriginalDecorator.startTest(self, test)
1149
1103
calls.append('start')
1150
test = unittest.FunctionTestCase(lambda: None)
1104
test = unittest.FunctionTestCase(lambda:None)
1151
1105
stream = StringIO()
1152
1106
runner = tests.TextTestRunner(stream=stream,
1153
result_decorators=[LoggingDecorator])
1154
self.run_test_runner(runner, test)
1107
result_decorators=[LoggingDecorator])
1108
result = self.run_test_runner(runner, test)
1155
1109
self.assertLength(1, calls)
1157
1111
def test_skipped_test(self):
1266
1215
stream = StringIO()
1267
1216
runner = tests.TextTestRunner(stream=stream, verbosity=2)
1268
1217
# Need to use the CountingDecorator as that's what sets num_tests
1269
self.run_test_runner(runner, tests.CountingDecorator(suite))
1218
result = self.run_test_runner(runner, tests.CountingDecorator(suite))
1270
1219
self.assertStartsWith(stream.getvalue(), "running 2 tests")
1272
1221
def test_startTestRun(self):
1273
1222
"""run should call result.startTestRun()"""
1276
1224
class LoggingDecorator(ExtendedToOriginalDecorator):
1277
1225
def startTestRun(self):
1278
1226
ExtendedToOriginalDecorator.startTestRun(self)
1279
1227
calls.append('startTestRun')
1280
test = unittest.FunctionTestCase(lambda: None)
1228
test = unittest.FunctionTestCase(lambda:None)
1281
1229
stream = StringIO()
1282
1230
runner = tests.TextTestRunner(stream=stream,
1283
result_decorators=[LoggingDecorator])
1284
self.run_test_runner(runner, test)
1231
result_decorators=[LoggingDecorator])
1232
result = self.run_test_runner(runner, test)
1285
1233
self.assertLength(1, calls)
1287
1235
def test_stopTestRun(self):
1288
1236
"""run should call result.stopTestRun()"""
1291
1238
class LoggingDecorator(ExtendedToOriginalDecorator):
1292
1239
def stopTestRun(self):
1293
1240
ExtendedToOriginalDecorator.stopTestRun(self)
1294
1241
calls.append('stopTestRun')
1295
test = unittest.FunctionTestCase(lambda: None)
1242
test = unittest.FunctionTestCase(lambda:None)
1296
1243
stream = StringIO()
1297
1244
runner = tests.TextTestRunner(stream=stream,
1298
result_decorators=[LoggingDecorator])
1299
self.run_test_runner(runner, test)
1245
result_decorators=[LoggingDecorator])
1246
result = self.run_test_runner(runner, test)
1300
1247
self.assertLength(1, calls)
1302
1249
def test_unicode_test_output_on_ascii_stream(self):
1619
1550
def test_run_disabled_supporting_result(self):
1620
1551
"""Test disabled tests behaviour with support aware results."""
1621
1552
test = SampleTestCase('_test_pass')
1623
1553
class DisabledFeature(object):
1624
1554
def __eq__(self, other):
1625
1555
return isinstance(other, DisabledFeature)
1627
1556
def available(self):
1629
1558
the_feature = DisabledFeature()
1630
1559
test._test_needs_features = [the_feature]
1632
1560
class InstrumentedTestResult(unittest.TestResult):
1633
1561
def __init__(self):
1634
1562
unittest.TestResult.__init__(self)
1635
1563
self.calls = []
1637
1564
def startTest(self, test):
1638
1565
self.calls.append(('startTest', test))
1640
1566
def stopTest(self, test):
1641
1567
self.calls.append(('stopTest', test))
1643
1568
def addNotSupported(self, test, feature):
1644
1569
self.calls.append(('addNotSupported', test, feature))
1645
1570
result = InstrumentedTestResult()
1984
1905
self.assertIsInstance(2, int)
1985
1906
self.assertIsInstance(u'', (str, text_type))
1986
1907
e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1989
["None is an instance of <type 'NoneType'> rather than "
1991
"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'>")
1993
1910
self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1994
1911
e = self.assertRaises(AssertionError,
1995
self.assertIsInstance, None, int,
2000
"None is an instance of <class 'NoneType'> rather "
2001
"than <class 'int'>: it's just not")
2005
"None is an instance of <type 'NoneType'> "
2006
"rather than <type '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'>"
2008
1917
def test_assertEndsWith(self):
2009
1918
self.assertEndsWith('foo', 'oo')
2028
1937
sample_object = ApplyDeprecatedHelper()
2029
1938
# calling an undeprecated callable raises an assertion
2030
1939
self.assertRaises(AssertionError, self.applyDeprecated,
2031
deprecated_in((0, 11, 0)),
2032
sample_object.sample_normal_method)
1940
deprecated_in((0, 11, 0)),
1941
sample_object.sample_normal_method)
2033
1942
self.assertRaises(AssertionError, self.applyDeprecated,
2034
deprecated_in((0, 11, 0)),
2035
sample_undeprecated_function, "a param value")
1943
deprecated_in((0, 11, 0)),
1944
sample_undeprecated_function, "a param value")
2036
1945
# calling a deprecated callable (function or method) with the wrong
2037
1946
# expected deprecation fails.
2038
1947
self.assertRaises(AssertionError, self.applyDeprecated,
2039
deprecated_in((0, 10, 0)),
2040
sample_object.sample_deprecated_method,
1948
deprecated_in((0, 10, 0)),
1949
sample_object.sample_deprecated_method, "a param value")
2042
1950
self.assertRaises(AssertionError, self.applyDeprecated,
2043
deprecated_in((0, 10, 0)),
2044
sample_deprecated_function)
1951
deprecated_in((0, 10, 0)),
1952
sample_deprecated_function)
2045
1953
# calling a deprecated callable (function or method) with the right
2046
1954
# expected deprecation returns the functions result.
2049
self.applyDeprecated(
2050
deprecated_in((0, 11, 0)),
2051
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"))
2052
1958
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
2053
sample_deprecated_function))
1959
sample_deprecated_function))
2054
1960
# calling a nested deprecation with the wrong deprecation version
2055
1961
# fails even if a deeper nested function was deprecated with the
2056
1962
# supplied version.
2058
AssertionError, self.applyDeprecated,
1963
self.assertRaises(AssertionError, self.applyDeprecated,
2059
1964
deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
2060
1965
# calling a nested deprecation with the right deprecation value
2061
1966
# returns the calls result.
2063
2, self.applyDeprecated(
2064
deprecated_in((0, 10, 0)),
2065
sample_object.sample_nested_deprecation))
1967
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1968
sample_object.sample_nested_deprecation))
2067
1970
def test_callDeprecated(self):
2068
1971
def testfunc(be_deprecated, result=None):
2143
2041
breezy.tests.default_transport = old_transport
2144
2042
tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
2152
2047
class TestSelftest(tests.TestCase, SelfTestHelper):
2153
2048
"""Tests of breezy.tests.selftest."""
2155
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(
2050
def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
2157
2051
factory_called = []
2160
2053
factory_called.append(True)
2161
2054
return TestUtil.TestSuite()
2162
2055
out = StringIO()
2163
2056
err = StringIO()
2164
2057
self.apply_redirected(out, err, None, breezy.tests.selftest,
2165
test_suite_factory=factory)
2058
test_suite_factory=factory)
2166
2059
self.assertEqual([True], factory_called)
2168
2061
def factory(self):
2169
2062
"""A test suite factory."""
2170
2063
class Test(tests.TestCase):
2172
return __name__ + ".Test." + self._testMethodName
2182
2070
return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
2184
2072
def test_list_only(self):
2185
2073
output = self.run_selftest(test_suite_factory=self.factory,
2187
2075
self.assertEqual(3, len(output.readlines()))
2189
2077
def test_list_only_filtered(self):
2190
2078
output = self.run_selftest(test_suite_factory=self.factory,
2191
list_only=True, pattern="Test.b")
2192
self.assertEndsWith(output.getvalue(), b"Test.b\n")
2079
list_only=True, pattern="Test.b")
2080
self.assertEndsWith(output.getvalue(), "Test.b\n")
2193
2081
self.assertLength(1, output.readlines())
2195
2083
def test_list_only_excludes(self):
2196
2084
output = self.run_selftest(test_suite_factory=self.factory,
2197
list_only=True, exclude_pattern="Test.b")
2198
self.assertNotContainsRe(b"Test.b", output.getvalue())
2085
list_only=True, exclude_pattern="Test.b")
2086
self.assertNotContainsRe("Test.b", output.getvalue())
2199
2087
self.assertLength(2, output.readlines())
2201
2089
def test_lsprof_tests(self):
2202
2090
self.requireFeature(features.lsprof_feature)
2205
2092
class Test(object):
2206
2093
def __call__(test, result):
2207
2094
test.run(result)
2209
2095
def run(test, result):
2210
2096
results.append(result)
2212
2097
def countTestCases(self):
2214
2099
self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
2248
2133
def test_starting_with_single_argument(self):
2249
2134
output = self.run_selftest(test_suite_factory=self.factory,
2251
'breezy.tests.test_selftest.Test.a'],
2253
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',
2256
2140
def test_starting_with_multiple_argument(self):
2257
output = self.run_selftest(
2258
test_suite_factory=self.factory,
2141
output = self.run_selftest(test_suite_factory=self.factory,
2259
2142
starting_with=['breezy.tests.test_selftest.Test.a',
2260
'breezy.tests.test_selftest.Test.b'],
2143
'breezy.tests.test_selftest.Test.b'],
2261
2144
list_only=True)
2262
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n'
2263
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',
2266
2149
def check_transport_set(self, transport_server):
2267
2150
captured_transport = []
2269
2151
def seen_transport(a_transport):
2270
2152
captured_transport.append(a_transport)
2272
2153
class Capture(tests.TestCase):
2274
2155
seen_transport(breezy.tests.default_transport)
2277
2157
return TestUtil.TestSuite([Capture("a")])
2278
self.run_selftest(transport=transport_server,
2279
test_suite_factory=factory)
2158
self.run_selftest(transport=transport_server, test_suite_factory=factory)
2280
2159
self.assertEqual(transport_server, captured_transport[0])
2282
2161
def test_transport_sftp(self):
2327
2205
def test_fail_has_log(self):
2328
2206
content, result = self.run_subunit_stream('test_fail')
2329
2207
self.assertEqual(1, len(result.failures))
2330
self.assertContainsRe(content, b'(?m)^log$')
2331
self.assertContainsRe(content, b'this test will fail')
2208
self.assertContainsRe(content, '(?m)^log$')
2209
self.assertContainsRe(content, 'this test will fail')
2333
2211
def test_error_has_log(self):
2334
2212
content, result = self.run_subunit_stream('test_error')
2335
self.assertContainsRe(content, b'(?m)^log$')
2336
self.assertContainsRe(content, b'this test errored')
2213
self.assertContainsRe(content, '(?m)^log$')
2214
self.assertContainsRe(content, 'this test errored')
2338
2216
def test_skip_has_no_log(self):
2339
2217
content, result = self.run_subunit_stream('test_skip')
2340
self.assertNotContainsRe(content, b'(?m)^log$')
2341
self.assertNotContainsRe(content, b'this test will be skipped')
2342
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)
2343
2221
self.assertEqual({'reason'}, set(reasons))
2344
2222
skips = reasons['reason']
2345
2223
self.assertEqual(1, len(skips))
2347
2225
# RemotedTestCase doesn't preserve the "details"
2348
# self.assertFalse('log' in test.getDetails())
2226
## self.assertFalse('log' in test.getDetails())
2350
2228
def test_missing_feature_has_no_log(self):
2351
2229
content, result = self.run_subunit_stream('test_missing_feature')
2352
self.assertNotContainsRe(content, b'(?m)^log$')
2353
self.assertNotContainsRe(content, b'missing the feature')
2354
reasons = result.skip_reasons
2230
self.assertNotContainsRe(content, '(?m)^log$')
2231
self.assertNotContainsRe(content, 'missing the feature')
2232
reasons = _get_skip_reasons(result)
2355
2233
self.assertEqual({'_MissingFeature\n'}, set(reasons))
2356
2234
skips = reasons['_MissingFeature\n']
2357
2235
self.assertEqual(1, len(skips))
2359
2237
# RemotedTestCase doesn't preserve the "details"
2360
# self.assertFalse('log' in test.getDetails())
2238
## self.assertFalse('log' in test.getDetails())
2362
2240
def test_xfail_has_no_log(self):
2363
2241
content, result = self.run_subunit_stream('test_xfail')
2364
self.assertNotContainsRe(content, b'(?m)^log$')
2365
self.assertNotContainsRe(content, b'test with expected failure')
2242
self.assertNotContainsRe(content, '(?m)^log$')
2243
self.assertNotContainsRe(content, 'test with expected failure')
2366
2244
self.assertEqual(1, len(result.expectedFailures))
2367
2245
result_content = result.expectedFailures[0][1]
2368
2246
self.assertNotContainsRe(result_content,
2369
'(?m)^(?:Text attachment: )?log(?:$|: )')
2247
'(?m)^(?:Text attachment: )?log(?:$|: )')
2370
2248
self.assertNotContainsRe(result_content, 'test with expected failure')
2372
2250
def test_unexpected_success_has_log(self):
2373
2251
content, result = self.run_subunit_stream('test_unexpected_success')
2374
self.assertContainsRe(content, b'(?m)^log$')
2375
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))
2376
2261
self.assertEqual(1, len(result.unexpectedSuccesses))
2377
# test = result.unexpectedSuccesses[0]
2262
test = result.unexpectedSuccesses[0]
2378
2263
# RemotedTestCase doesn't preserve the "details"
2379
# self.assertTrue('log' in test.getDetails())
2264
## self.assertTrue('log' in test.getDetails())
2381
2266
def test_success_has_no_log(self):
2382
2267
content, result = self.run_subunit_stream('test_success')
2383
2268
self.assertEqual(1, result.testsRun)
2384
self.assertNotContainsRe(content, b'(?m)^log$')
2385
self.assertNotContainsRe(content, b'this test succeeds')
2269
self.assertNotContainsRe(content, '(?m)^log$')
2270
self.assertNotContainsRe(content, 'this test succeeds')
2388
2273
class TestRunBzr(tests.TestCase):
2394
def _run_bzr_core(self, argv, encoding=None, stdin=None,
2395
stdout=None, stderr=None, working_dir=None):
2278
def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
2396
2280
"""Override _run_bzr_core to test how it is invoked by run_bzr.
2398
2282
Attempts to run bzr from inside this class don't actually run it.
2429
2311
def test_encoding(self):
2430
2312
"""Test that run_bzr passes encoding to _run_bzr_core"""
2431
2313
self.run_bzr('foo bar')
2432
self.assertEqual(osutils.get_user_encoding(), self.encoding)
2314
self.assertEqual(None, self.encoding)
2433
2315
self.assertEqual(['foo', 'bar'], self.argv)
2435
2317
self.run_bzr('foo bar', encoding='baz')
2436
2318
self.assertEqual('baz', self.encoding)
2437
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)
2439
2340
def test_stdin(self):
2440
2341
# test that the stdin keyword to run_bzr is passed through to
2441
2342
# _run_bzr_core as-is. We do this by overriding
2586
2486
def test_run_bzr_subprocess(self):
2587
2487
"""The run_bzr_helper_external command behaves nicely."""
2588
self.assertRunBzrSubprocess({'process_args': ['--version']},
2589
StubProcess(), '--version')
2590
self.assertRunBzrSubprocess({'process_args': ['--version']},
2591
StubProcess(), ['--version'])
2488
self.assertRunBzrSubprocess({'process_args':['--version']},
2489
StubProcess(), '--version')
2490
self.assertRunBzrSubprocess({'process_args':['--version']},
2491
StubProcess(), ['--version'])
2592
2492
# retcode=None disables retcode checking
2593
result = self.assertRunBzrSubprocess(
2594
{}, StubProcess(retcode=3), '--version', retcode=None)
2595
result = self.assertRunBzrSubprocess(
2596
{}, 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')
2597
2497
self.assertContainsRe(result[0], 'is free software')
2598
2498
# Running a subcommand that is missing errors
2599
2499
self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2600
{'process_args': ['--versionn']
2601
}, StubProcess(retcode=3),
2500
{'process_args':['--versionn']}, StubProcess(retcode=3),
2603
2502
# Unless it is told to expect the error from the subprocess
2604
result = self.assertRunBzrSubprocess(
2605
{}, StubProcess(retcode=3), '--versionn', retcode=3)
2503
result = self.assertRunBzrSubprocess({},
2504
StubProcess(retcode=3), '--versionn', retcode=3)
2606
2505
# Or to ignore retcode checking
2607
result = self.assertRunBzrSubprocess(
2608
{}, StubProcess(err="unknown command", retcode=3),
2609
'--versionn', retcode=None)
2506
result = self.assertRunBzrSubprocess({},
2507
StubProcess(err="unknown command", retcode=3), '--versionn',
2610
2509
self.assertContainsRe(result[1], 'unknown command')
2612
2511
def test_env_change_passes_through(self):
2613
2512
self.assertRunBzrSubprocess(
2614
{'env_changes': {'new': 'value', 'changed': 'newvalue', 'deleted': None}},
2513
{'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2615
2514
StubProcess(), '',
2616
env_changes={'new': 'value', 'changed': 'newvalue', 'deleted': None})
2515
env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2618
2517
def test_no_working_dir_passed_as_None(self):
2619
2518
self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2621
2520
def test_no_working_dir_passed_through(self):
2622
2521
self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2625
2524
def test_run_bzr_subprocess_no_plugins(self):
2626
2525
self.assertRunBzrSubprocess({'allow_plugins': False},
2629
2528
def test_allow_plugins(self):
2630
2529
self.assertRunBzrSubprocess({'allow_plugins': True},
2631
StubProcess(), '', allow_plugins=True)
2530
StubProcess(), '', allow_plugins=True)
2634
2533
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
2696
2595
def test_set_env(self):
2697
2596
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2698
2597
# set in the child
2700
2598
def check_environment():
2701
2599
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2702
2600
self.check_popen_state = check_environment
2703
2601
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2704
env_changes={'EXISTANT_ENV_VAR': 'set variable'})
2602
env_changes={'EXISTANT_ENV_VAR':'set variable'})
2705
2603
# not set in theparent
2706
2604
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2708
2606
def test_run_bzr_subprocess_env_del(self):
2709
2607
"""run_bzr_subprocess can remove environment variables too."""
2710
2608
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2712
2609
def check_environment():
2713
2610
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2714
2611
os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2715
2612
self.check_popen_state = check_environment
2716
2613
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2717
env_changes={'EXISTANT_ENV_VAR': None})
2614
env_changes={'EXISTANT_ENV_VAR':None})
2718
2615
# Still set in parent
2719
2616
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2720
2617
del os.environ['EXISTANT_ENV_VAR']
2722
2619
def test_env_del_missing(self):
2723
2620
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2725
2621
def check_environment():
2726
2622
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2727
2623
self.check_popen_state = check_environment
2728
2624
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2729
env_changes={'NON_EXISTANT_ENV_VAR': None})
2625
env_changes={'NON_EXISTANT_ENV_VAR':None})
2731
2627
def test_working_dir(self):
2732
2628
"""Test that we can specify the working dir for the child"""
2629
orig_getcwd = osutils.getcwd
2630
orig_chdir = os.chdir
2735
2632
def chdir(path):
2736
2633
chdirs.append(path)
2737
2634
self.overrideAttr(os, 'chdir', chdir)
2740
2636
return 'current'
2741
2637
self.overrideAttr(osutils, 'getcwd', getcwd)
2839
2735
def test_filter_suite_by_condition(self):
2840
2736
test_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2841
'test_filter_suite_by_condition')
2842
filtered_suite = tests.filter_suite_by_condition(
2843
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)
2844
2740
self.assertEqual([test_name], _test_ids(filtered_suite))
2846
2742
def test_filter_suite_by_re(self):
2847
2743
filtered_suite = tests.filter_suite_by_re(self.suite,
2848
2744
'test_filter_suite_by_r')
2849
2745
filtered_names = _test_ids(filtered_suite)
2851
filtered_names, ['breezy.tests.test_selftest.'
2852
'TestSelftestFiltering.test_filter_suite_by_re'])
2746
self.assertEqual(filtered_names, ['breezy.tests.test_selftest.'
2747
'TestSelftestFiltering.test_filter_suite_by_re'])
2854
2749
def test_filter_suite_by_id_list(self):
2855
2750
test_list = ['breezy.tests.test_selftest.'
3155
3044
# plugins can't be tested that way since selftest may be run with
3158
if __doc__ is not None and not PY3:
3047
if __doc__ is not None:
3159
3048
expected_test_list.extend([
3160
3049
# modules_to_doctest
3161
3050
'breezy.timestamp.format_highres_date',
3163
3052
suite = tests.test_suite()
3165
self.assertEqual({"testmod_names"}, set(calls))
3167
self.assertEqual({"testmod_names", "modules_to_doctest"},
3053
self.assertEqual({"testmod_names", "modules_to_doctest"},
3169
3055
self.assertSubset(expected_test_list, _test_ids(suite))
3171
3057
def test_test_suite_list_and_start(self):
3172
# We cannot test this at the same time as the main load, because we
3173
# want to know that starting_with == None works. So a second load is
3174
# incurred - note that the starting_with parameter causes a partial
3175
# load rather than a full load so this test should be pretty quick.
3177
'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']
3178
3063
suite = tests.test_suite(test_list,
3179
3064
['breezy.tests.test_selftest.TestTestSuite'])
3180
# test_test_suite_list_and_start is not included
3065
# test_test_suite_list_and_start is not included
3181
3066
self.assertEqual(test_list, _test_ids(suite))
3604
3473
def test_pattern(self):
3605
3474
out = self._run_selftest_with_suite(pattern="test_(?:pass|self_ref)$")
3606
self.assertNotContainsRe(out, b"test_skip")
3475
self.assertNotContainsRe(out, "test_skip")
3608
3477
def test_exclude_pattern(self):
3609
3478
out = self._run_selftest_with_suite(exclude_pattern="test_skip$")
3610
self.assertNotContainsRe(out, b"test_skip")
3479
self.assertNotContainsRe(out, "test_skip")
3612
3481
def test_random_seed(self):
3613
3482
self._run_selftest_with_suite(random_seed="now")
3615
3484
def test_matching_tests_first(self):
3616
3485
self._run_selftest_with_suite(matching_tests_first=True,
3617
pattern="test_self_ref$")
3486
pattern="test_self_ref$")
3619
3488
def test_starting_with_and_exclude(self):
3620
3489
out = self._run_selftest_with_suite(starting_with=["bt."],
3621
exclude_pattern="test_skip$")
3622
self.assertNotContainsRe(out, b"test_skip")
3490
exclude_pattern="test_skip$")
3491
self.assertNotContainsRe(out, "test_skip")
3624
3493
def test_additonal_decorator(self):
3625
self._run_selftest_with_suite(suite_decorators=[tests.TestDecorator])
3494
out = self._run_selftest_with_suite(
3495
suite_decorators=[tests.TestDecorator])
3628
3498
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):