283
284
input_test = TestTestScenarioApplication("test_apply_scenario")
284
285
# setup two adapted tests
285
286
adapted_test1 = apply_scenario(input_test,
287
{"bzrdir_format":"bzr_format",
288
"repository_format":"repo_fmt",
289
"transport_server":"transport_server",
290
"transport_readonly_server":"readonly-server"}))
288
{"bzrdir_format": "bzr_format",
289
"repository_format": "repo_fmt",
290
"transport_server": "transport_server",
291
"transport_readonly_server": "readonly-server"}))
291
292
adapted_test2 = apply_scenario(input_test,
292
("new id 2", {"bzrdir_format":None}))
293
("new id 2", {"bzrdir_format": None}))
293
294
# input_test should have been altered.
294
295
self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
295
296
# the new tests are mutually incompatible, ensuring it has
434
435
'vfs_transport_factory': mem_server,
435
436
'workingtree_format': wt6_format,
436
437
'_workingtree_to_test_tree': return_parameter,
439
440
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
440
441
'bzrdir_format': default_wt_format._matchingcontroldir,
441
442
'transport_readonly_server': 'b',
442
443
'transport_server': 'a',
443
444
'workingtree_format': default_wt_format,
446
{'_workingtree_to_test_tree': revision_tree_from_workingtree,
447
'bzrdir_format': git_wt_format._matchingcontroldir,
448
'transport_readonly_server': 'b',
449
'transport_server': 'a',
450
'workingtree_format': git_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,
453
454
('DirStateRevisionTree,WT4',
454
455
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
455
456
'bzrdir_format': wt4_format._matchingcontroldir,
456
457
'transport_readonly_server': 'b',
457
458
'transport_server': 'a',
458
459
'workingtree_format': wt4_format,
460
461
('DirStateRevisionTree,WT5',
461
462
{'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
462
463
'bzrdir_format': wt5_format._matchingcontroldir,
463
464
'transport_readonly_server': 'b',
464
465
'transport_server': 'a',
465
466
'workingtree_format': wt5_format,
468
469
{'_workingtree_to_test_tree': preview_tree_pre,
469
470
'bzrdir_format': default_wt_format._matchingcontroldir,
508
509
format1 = WorkingTreeFormat4()
509
510
format2 = WorkingTreeFormat3()
510
511
formats = [("1", str, format1, format2, "converter1"),
511
("2", int, format2, format1, "converter2")]
512
("2", int, format2, format1, "converter2")]
512
513
scenarios = make_scenarios(server1, server2, formats)
513
514
self.assertEqual(2, len(scenarios))
514
515
expected_scenarios = [
549
550
self.build_tree(["foo"])
550
551
real = os.lstat("foo")
551
552
fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
552
real.st_dev, real.st_ino, real.st_mode)
553
real.st_dev, real.st_ino, real.st_mode)
553
554
self.assertEqualStat(real, fake)
555
556
def test_assertEqualStat_notequal(self):
556
557
self.build_tree(["foo", "longname"])
557
558
self.assertRaises(AssertionError, self.assertEqualStat,
558
os.lstat("foo"), os.lstat("longname"))
559
os.lstat("foo"), os.lstat("longname"))
560
561
def test_assertPathExists(self):
561
562
self.assertPathExists('.')
837
842
output = result_stream.getvalue()
839
844
self.assertContainsRe(output,
840
r"LSProf output for <class 'str'>\(\(b'hello',\), {'errors': 'replace'}\)")
845
r"LSProf output for <class 'str'>\(\(b'hello',\), {'errors': 'replace'}\)")
841
846
self.assertContainsRe(output,
842
r"LSProf output for <class 'str'>\(\(b'world',\), {'errors': 'replace'}\)")
847
r"LSProf output for <class 'str'>\(\(b'world',\), {'errors': 'replace'}\)")
844
849
self.assertContainsRe(output,
845
r"LSProf output for <type 'unicode'>\(\('hello',\), {'errors': 'replace'}\)")
850
r"LSProf output for <type 'unicode'>\(\('hello',\), {'errors': 'replace'}\)")
846
851
self.assertContainsRe(output,
847
r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
848
self.assertContainsRe(output,
849
r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
850
self.assertContainsRe(output,
851
r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
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)?")
853
858
def test_uses_time_from_testtools(self):
854
859
"""Test case timings in verbose results should use testtools times"""
856
862
class TimeAddedVerboseTestResult(tests.VerboseTestResult):
857
863
def startTest(self, test):
858
864
self.time(datetime.datetime.utcfromtimestamp(1.145))
859
865
super(TimeAddedVerboseTestResult, self).startTest(test)
860
867
def addSuccess(self, test):
861
868
self.time(datetime.datetime.utcfromtimestamp(51.147))
862
869
super(TimeAddedVerboseTestResult, self).addSuccess(test)
863
871
def report_tests_starting(self): pass
865
873
self.get_passing_test().run(TimeAddedVerboseTestResult(sio, 0, 2))
959
972
def test_unavailable_exception(self):
960
973
"""An UnavailableFeature being raised should invoke addNotSupported."""
961
974
class InstrumentedTestResult(tests.ExtendedTestResult):
962
def stopTestRun(self): pass
963
def report_tests_starting(self): pass
975
def stopTestRun(self):
978
def report_tests_starting(self):
964
981
def addNotSupported(self, test, feature):
965
982
self._call = test, feature
966
983
result = InstrumentedTestResult(None, None, None, None)
967
984
feature = features.Feature()
968
986
class Test(tests.TestCase):
969
987
def test_function(self):
970
988
raise tests.UnavailableFeature(feature)
1055
1078
self.expectFailure('failed', self.assertTrue, False)
1056
1079
test = unittest.TestSuite()
1057
1080
test.addTest(Test("known_failure_test"))
1058
1082
def failing_test():
1059
1083
raise AssertionError('foo')
1060
1084
test.addTest(unittest.FunctionTestCase(failing_test))
1061
1085
stream = StringIO()
1062
1086
runner = tests.TextTestRunner(stream=stream)
1063
result = self.run_test_runner(runner, test)
1064
lines = stream.getvalue().splitlines()
1065
self.assertContainsRe(stream.getvalue(),
1087
self.run_test_runner(runner, test)
1088
self.assertContainsRe(
1066
1090
'(?sm)^brz selftest.*$'
1068
1092
'^======================================================================\n'
1069
1093
'^FAIL: failing_test\n'
1070
1094
'^----------------------------------------------------------------------\n'
1071
1095
'Traceback \\(most recent call last\\):\n'
1072
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1096
' .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
1073
1097
' raise AssertionError\\(\'foo\'\\)\n'
1075
1099
'^----------------------------------------------------------------------\n'
1086
1110
test = Test("known_failure_test")
1087
1111
stream = StringIO()
1088
1112
runner = tests.TextTestRunner(stream=stream)
1089
result = self.run_test_runner(runner, test)
1113
self.run_test_runner(runner, test)
1090
1114
self.assertContainsRe(stream.getvalue(),
1093
'Ran 1 test in .*\n'
1095
'OK \\(known_failures=1\\)\n')
1117
'Ran 1 test in .*\n'
1119
'OK \\(known_failures=1\\)\n')
1097
1121
def test_unexpected_success_bad(self):
1098
1122
class Test(tests.TestCase):
1099
1123
def test_truth(self):
1100
1124
self.expectFailure("No absolute truth", self.assertTrue, True)
1101
1125
runner = tests.TextTestRunner(stream=StringIO())
1102
result = self.run_test_runner(runner, Test("test_truth"))
1126
self.run_test_runner(runner, Test("test_truth"))
1103
1127
self.assertContainsRe(runner.stream.getvalue(),
1105
"FAIL: \\S+\\.test_truth\n"
1108
"\\s*(?:Text attachment: )?reason"
1114
"Ran 1 test in .*\n"
1116
"FAILED \\(failures=1\\)\n\\Z")
1129
"FAIL: \\S+\\.test_truth\n"
1132
"\\s*(?:Text attachment: )?reason"
1138
"Ran 1 test in .*\n"
1140
"FAILED \\(failures=1\\)\n\\Z")
1118
1142
def test_result_decorator(self):
1119
1143
# decorate results
1121
1146
class LoggingDecorator(ExtendedToOriginalDecorator):
1122
1147
def startTest(self, test):
1123
1148
ExtendedToOriginalDecorator.startTest(self, test)
1124
1149
calls.append('start')
1125
test = unittest.FunctionTestCase(lambda:None)
1150
test = unittest.FunctionTestCase(lambda: None)
1126
1151
stream = StringIO()
1127
1152
runner = tests.TextTestRunner(stream=stream,
1128
result_decorators=[LoggingDecorator])
1129
result = self.run_test_runner(runner, test)
1153
result_decorators=[LoggingDecorator])
1154
self.run_test_runner(runner, test)
1130
1155
self.assertLength(1, calls)
1132
1157
def test_skipped_test(self):
1198
1225
self.assertTrue(result.wasSuccessful())
1199
1226
self.assertTrue(result.wasStrictlySuccessful())
1200
1227
self.assertContainsRe(out.getvalue(),
1201
r'(?m)not_applicable_test * N/A')
1228
r'(?m)not_applicable_test * N/A')
1202
1229
self.assertContainsRe(out.getvalue(),
1203
r'(?m)^ this test never runs')
1230
r'(?m)^ this test never runs')
1205
1232
def test_unsupported_features_listed(self):
1206
1233
"""When unsupported features are encountered they are detailed."""
1207
1234
class Feature1(features.Feature):
1208
def _probe(self): return False
1209
1238
class Feature2(features.Feature):
1210
def _probe(self): return False
1211
1241
# create sample tests
1212
1242
test1 = SampleTestCase('_test_pass')
1213
1243
test1._test_needs_features = [Feature1()]
1236
1266
stream = StringIO()
1237
1267
runner = tests.TextTestRunner(stream=stream, verbosity=2)
1238
1268
# Need to use the CountingDecorator as that's what sets num_tests
1239
result = self.run_test_runner(runner, tests.CountingDecorator(suite))
1269
self.run_test_runner(runner, tests.CountingDecorator(suite))
1240
1270
self.assertStartsWith(stream.getvalue(), "running 2 tests")
1242
1272
def test_startTestRun(self):
1243
1273
"""run should call result.startTestRun()"""
1245
1276
class LoggingDecorator(ExtendedToOriginalDecorator):
1246
1277
def startTestRun(self):
1247
1278
ExtendedToOriginalDecorator.startTestRun(self)
1248
1279
calls.append('startTestRun')
1249
test = unittest.FunctionTestCase(lambda:None)
1280
test = unittest.FunctionTestCase(lambda: None)
1250
1281
stream = StringIO()
1251
1282
runner = tests.TextTestRunner(stream=stream,
1252
result_decorators=[LoggingDecorator])
1253
result = self.run_test_runner(runner, test)
1283
result_decorators=[LoggingDecorator])
1284
self.run_test_runner(runner, test)
1254
1285
self.assertLength(1, calls)
1256
1287
def test_stopTestRun(self):
1257
1288
"""run should call result.stopTestRun()"""
1259
1291
class LoggingDecorator(ExtendedToOriginalDecorator):
1260
1292
def stopTestRun(self):
1261
1293
ExtendedToOriginalDecorator.stopTestRun(self)
1262
1294
calls.append('stopTestRun')
1263
test = unittest.FunctionTestCase(lambda:None)
1295
test = unittest.FunctionTestCase(lambda: None)
1264
1296
stream = StringIO()
1265
1297
runner = tests.TextTestRunner(stream=stream,
1266
result_decorators=[LoggingDecorator])
1267
result = self.run_test_runner(runner, test)
1298
result_decorators=[LoggingDecorator])
1299
self.run_test_runner(runner, test)
1268
1300
self.assertLength(1, calls)
1270
1302
def test_unicode_test_output_on_ascii_stream(self):
1576
1619
def test_run_disabled_supporting_result(self):
1577
1620
"""Test disabled tests behaviour with support aware results."""
1578
1621
test = SampleTestCase('_test_pass')
1579
1623
class DisabledFeature(object):
1580
1624
def __eq__(self, other):
1581
1625
return isinstance(other, DisabledFeature)
1582
1627
def available(self):
1584
1629
the_feature = DisabledFeature()
1585
1630
test._test_needs_features = [the_feature]
1586
1632
class InstrumentedTestResult(unittest.TestResult):
1587
1633
def __init__(self):
1588
1634
unittest.TestResult.__init__(self)
1589
1635
self.calls = []
1590
1637
def startTest(self, test):
1591
1638
self.calls.append(('startTest', test))
1592
1640
def stopTest(self, test):
1593
1641
self.calls.append(('stopTest', test))
1594
1643
def addNotSupported(self, test, feature):
1595
1644
self.calls.append(('addNotSupported', test, feature))
1596
1645
result = InstrumentedTestResult()
1926
1984
self.assertIsInstance(2, int)
1927
1985
self.assertIsInstance(u'', (str, text_type))
1928
1986
e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1929
self.assertIn(str(e),
1930
["None is an instance of <type 'NoneType'> rather than <type 'int'>",
1931
"None is an instance of <class 'NoneType'> rather than <class 'int'>"])
1989
["None is an instance of <type 'NoneType'> rather than "
1991
"None is an instance of <class 'NoneType'> rather than "
1932
1993
self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1933
1994
e = self.assertRaises(AssertionError,
1934
self.assertIsInstance, None, int, "it's just not")
1995
self.assertIsInstance, None, int,
1936
self.assertEqual(str(e),
1937
"None is an instance of <class 'NoneType'> rather than <class 'int'>: it's "
2000
"None is an instance of <class 'NoneType'> rather "
2001
"than <class 'int'>: it's just not")
1940
self.assertEqual(str(e),
1941
"None is an instance of <type 'NoneType'> rather than <type 'int'>"
2005
"None is an instance of <type 'NoneType'> "
2006
"rather than <type 'int'>: it's just not")
1944
2008
def test_assertEndsWith(self):
1945
2009
self.assertEndsWith('foo', 'oo')
1949
2013
e = self.assertRaises(AssertionError,
1950
2014
self.assertEqualDiff, '', '\n')
1951
2015
self.assertEqual(str(e),
1952
# Don't blink ! The '+' applies to the second string
1953
'first string is missing a final newline.\n+ \n')
2016
# Don't blink ! The '+' applies to the second string
2017
'first string is missing a final newline.\n+ \n')
1954
2018
e = self.assertRaises(AssertionError,
1955
2019
self.assertEqualDiff, '\n', '')
1956
2020
self.assertEqual(str(e),
1957
# Don't blink ! The '-' applies to the second string
1958
'second string is missing a final newline.\n- \n')
2021
# Don't blink ! The '-' applies to the second string
2022
'second string is missing a final newline.\n- \n')
1961
2025
class TestDeprecations(tests.TestCase):
1964
2028
sample_object = ApplyDeprecatedHelper()
1965
2029
# calling an undeprecated callable raises an assertion
1966
2030
self.assertRaises(AssertionError, self.applyDeprecated,
1967
deprecated_in((0, 11, 0)),
1968
sample_object.sample_normal_method)
2031
deprecated_in((0, 11, 0)),
2032
sample_object.sample_normal_method)
1969
2033
self.assertRaises(AssertionError, self.applyDeprecated,
1970
deprecated_in((0, 11, 0)),
1971
sample_undeprecated_function, "a param value")
2034
deprecated_in((0, 11, 0)),
2035
sample_undeprecated_function, "a param value")
1972
2036
# calling a deprecated callable (function or method) with the wrong
1973
2037
# expected deprecation fails.
1974
2038
self.assertRaises(AssertionError, self.applyDeprecated,
1975
deprecated_in((0, 10, 0)),
1976
sample_object.sample_deprecated_method, "a param value")
2039
deprecated_in((0, 10, 0)),
2040
sample_object.sample_deprecated_method,
1977
2042
self.assertRaises(AssertionError, self.applyDeprecated,
1978
deprecated_in((0, 10, 0)),
1979
sample_deprecated_function)
2043
deprecated_in((0, 10, 0)),
2044
sample_deprecated_function)
1980
2045
# calling a deprecated callable (function or method) with the right
1981
2046
# expected deprecation returns the functions result.
1982
self.assertEqual("a param value",
1983
self.applyDeprecated(deprecated_in((0, 11, 0)),
1984
sample_object.sample_deprecated_method, "a param value"))
2049
self.applyDeprecated(
2050
deprecated_in((0, 11, 0)),
2051
sample_object.sample_deprecated_method, "a param value"))
1985
2052
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
1986
sample_deprecated_function))
2053
sample_deprecated_function))
1987
2054
# calling a nested deprecation with the wrong deprecation version
1988
2055
# fails even if a deeper nested function was deprecated with the
1989
2056
# supplied version.
1990
self.assertRaises(AssertionError, self.applyDeprecated,
2058
AssertionError, self.applyDeprecated,
1991
2059
deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
1992
2060
# calling a nested deprecation with the right deprecation value
1993
2061
# returns the calls result.
1994
self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1995
sample_object.sample_nested_deprecation))
2063
2, self.applyDeprecated(
2064
deprecated_in((0, 10, 0)),
2065
sample_object.sample_nested_deprecation))
1997
2067
def test_callDeprecated(self):
1998
2068
def testfunc(be_deprecated, result=None):
2097
2170
class Test(tests.TestCase):
2099
2172
return __name__ + ".Test." + self._testMethodName
2106
2182
return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
2108
2184
def test_list_only(self):
2109
2185
output = self.run_selftest(test_suite_factory=self.factory,
2111
2187
self.assertEqual(3, len(output.readlines()))
2113
2189
def test_list_only_filtered(self):
2114
2190
output = self.run_selftest(test_suite_factory=self.factory,
2115
list_only=True, pattern="Test.b")
2191
list_only=True, pattern="Test.b")
2116
2192
self.assertEndsWith(output.getvalue(), b"Test.b\n")
2117
2193
self.assertLength(1, output.readlines())
2119
2195
def test_list_only_excludes(self):
2120
2196
output = self.run_selftest(test_suite_factory=self.factory,
2121
list_only=True, exclude_pattern="Test.b")
2197
list_only=True, exclude_pattern="Test.b")
2122
2198
self.assertNotContainsRe(b"Test.b", output.getvalue())
2123
2199
self.assertLength(2, output.readlines())
2125
2201
def test_lsprof_tests(self):
2126
2202
self.requireFeature(features.lsprof_feature)
2128
2205
class Test(object):
2129
2206
def __call__(test, result):
2130
2207
test.run(result)
2131
2209
def run(test, result):
2132
2210
results.append(result)
2133
2212
def countTestCases(self):
2135
2214
self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
2139
2218
def test_random(self):
2140
2219
# test randomising by listing a number of tests.
2141
2220
output_123 = self.run_selftest(test_suite_factory=self.factory,
2142
list_only=True, random_seed="123")
2221
list_only=True, random_seed="123")
2143
2222
output_234 = self.run_selftest(test_suite_factory=self.factory,
2144
list_only=True, random_seed="234")
2223
list_only=True, random_seed="234")
2145
2224
self.assertNotEqual(output_123, output_234)
2146
2225
# "Randominzing test order..\n\n
2147
2226
self.assertLength(5, output_123.readlines())
2150
2229
def test_random_reuse_is_same_order(self):
2151
2230
# test randomising by listing a number of tests.
2152
2231
expected = self.run_selftest(test_suite_factory=self.factory,
2153
list_only=True, random_seed="123")
2232
list_only=True, random_seed="123")
2154
2233
repeated = self.run_selftest(test_suite_factory=self.factory,
2155
list_only=True, random_seed="123")
2234
list_only=True, random_seed="123")
2156
2235
self.assertEqual(expected.getvalue(), repeated.getvalue())
2158
2237
def test_runner_class(self):
2169
2248
def test_starting_with_single_argument(self):
2170
2249
output = self.run_selftest(test_suite_factory=self.factory,
2171
starting_with=['breezy.tests.test_selftest.Test.a'],
2251
'breezy.tests.test_selftest.Test.a'],
2173
2253
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n',
2176
2256
def test_starting_with_multiple_argument(self):
2177
output = self.run_selftest(test_suite_factory=self.factory,
2257
output = self.run_selftest(
2258
test_suite_factory=self.factory,
2178
2259
starting_with=['breezy.tests.test_selftest.Test.a',
2179
'breezy.tests.test_selftest.Test.b'],
2260
'breezy.tests.test_selftest.Test.b'],
2180
2261
list_only=True)
2181
2262
self.assertEqual(b'breezy.tests.test_selftest.Test.a\n'
2182
b'breezy.tests.test_selftest.Test.b\n',
2263
b'breezy.tests.test_selftest.Test.b\n',
2185
2266
def check_transport_set(self, transport_server):
2186
2267
captured_transport = []
2187
2269
def seen_transport(a_transport):
2188
2270
captured_transport.append(a_transport)
2189
2272
class Capture(tests.TestCase):
2191
2274
seen_transport(breezy.tests.default_transport)
2193
2277
return TestUtil.TestSuite([Capture("a")])
2194
self.run_selftest(transport=transport_server, test_suite_factory=factory)
2278
self.run_selftest(transport=transport_server,
2279
test_suite_factory=factory)
2195
2280
self.assertEqual(transport_server, captured_transport[0])
2197
2282
def test_transport_sftp(self):
2466
2552
working_dir=None,
2467
2553
allow_plugins=False):
2468
2554
"""capture what run_bzr_subprocess tries to do."""
2469
self.subprocess_calls.append({'process_args':process_args,
2470
'env_changes':env_changes,
2471
'skip_if_plan_to_signal':skip_if_plan_to_signal,
2472
'working_dir':working_dir, 'allow_plugins':allow_plugins})
2555
self.subprocess_calls.append(
2556
{'process_args': process_args,
2557
'env_changes': env_changes,
2558
'skip_if_plan_to_signal': skip_if_plan_to_signal,
2559
'working_dir': working_dir, 'allow_plugins': allow_plugins})
2473
2560
return self.next_subprocess
2499
2586
def test_run_bzr_subprocess(self):
2500
2587
"""The run_bzr_helper_external command behaves nicely."""
2501
self.assertRunBzrSubprocess({'process_args':['--version']},
2502
StubProcess(), '--version')
2503
self.assertRunBzrSubprocess({'process_args':['--version']},
2504
StubProcess(), ['--version'])
2588
self.assertRunBzrSubprocess({'process_args': ['--version']},
2589
StubProcess(), '--version')
2590
self.assertRunBzrSubprocess({'process_args': ['--version']},
2591
StubProcess(), ['--version'])
2505
2592
# retcode=None disables retcode checking
2506
result = self.assertRunBzrSubprocess({},
2507
StubProcess(retcode=3), '--version', retcode=None)
2508
result = self.assertRunBzrSubprocess({},
2509
StubProcess(out="is free software"), '--version')
2593
result = self.assertRunBzrSubprocess(
2594
{}, StubProcess(retcode=3), '--version', retcode=None)
2595
result = self.assertRunBzrSubprocess(
2596
{}, StubProcess(out="is free software"), '--version')
2510
2597
self.assertContainsRe(result[0], 'is free software')
2511
2598
# Running a subcommand that is missing errors
2512
2599
self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2513
{'process_args':['--versionn']}, StubProcess(retcode=3),
2600
{'process_args': ['--versionn']
2601
}, StubProcess(retcode=3),
2515
2603
# Unless it is told to expect the error from the subprocess
2516
result = self.assertRunBzrSubprocess({},
2517
StubProcess(retcode=3), '--versionn', retcode=3)
2604
result = self.assertRunBzrSubprocess(
2605
{}, StubProcess(retcode=3), '--versionn', retcode=3)
2518
2606
# Or to ignore retcode checking
2519
result = self.assertRunBzrSubprocess({},
2520
StubProcess(err="unknown command", retcode=3), '--versionn',
2607
result = self.assertRunBzrSubprocess(
2608
{}, StubProcess(err="unknown command", retcode=3),
2609
'--versionn', retcode=None)
2522
2610
self.assertContainsRe(result[1], 'unknown command')
2524
2612
def test_env_change_passes_through(self):
2525
2613
self.assertRunBzrSubprocess(
2526
{'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2614
{'env_changes': {'new': 'value', 'changed': 'newvalue', 'deleted': None}},
2527
2615
StubProcess(), '',
2528
env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2616
env_changes={'new': 'value', 'changed': 'newvalue', 'deleted': None})
2530
2618
def test_no_working_dir_passed_as_None(self):
2531
2619
self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2533
2621
def test_no_working_dir_passed_through(self):
2534
2622
self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2537
2625
def test_run_bzr_subprocess_no_plugins(self):
2538
2626
self.assertRunBzrSubprocess({'allow_plugins': False},
2541
2629
def test_allow_plugins(self):
2542
2630
self.assertRunBzrSubprocess({'allow_plugins': True},
2543
StubProcess(), '', allow_plugins=True)
2631
StubProcess(), '', allow_plugins=True)
2546
2634
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
2608
2696
def test_set_env(self):
2609
2697
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2610
2698
# set in the child
2611
2700
def check_environment():
2612
2701
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2613
2702
self.check_popen_state = check_environment
2614
2703
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2615
env_changes={'EXISTANT_ENV_VAR':'set variable'})
2704
env_changes={'EXISTANT_ENV_VAR': 'set variable'})
2616
2705
# not set in theparent
2617
2706
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2619
2708
def test_run_bzr_subprocess_env_del(self):
2620
2709
"""run_bzr_subprocess can remove environment variables too."""
2621
2710
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2622
2712
def check_environment():
2623
2713
self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2624
2714
os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2625
2715
self.check_popen_state = check_environment
2626
2716
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2627
env_changes={'EXISTANT_ENV_VAR':None})
2717
env_changes={'EXISTANT_ENV_VAR': None})
2628
2718
# Still set in parent
2629
2719
self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2630
2720
del os.environ['EXISTANT_ENV_VAR']
2632
2722
def test_env_del_missing(self):
2633
2723
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2634
2725
def check_environment():
2635
2726
self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2636
2727
self.check_popen_state = check_environment
2637
2728
self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2638
env_changes={'NON_EXISTANT_ENV_VAR':None})
2729
env_changes={'NON_EXISTANT_ENV_VAR': None})
2640
2731
def test_working_dir(self):
2641
2732
"""Test that we can specify the working dir for the child"""
2642
orig_getcwd = osutils.getcwd
2643
orig_chdir = os.chdir
2645
2735
def chdir(path):
2646
2736
chdirs.append(path)
2647
2737
self.overrideAttr(os, 'chdir', chdir)
2649
2740
return 'current'
2650
2741
self.overrideAttr(osutils, 'getcwd', getcwd)
2723
2814
def test_exclude_tests_by_condition(self):
2724
2815
excluded_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2725
'test_exclude_tests_by_condition')
2726
filtered_suite = tests.exclude_tests_by_condition(self.suite,
2727
lambda x:x.id() == excluded_name)
2816
'test_exclude_tests_by_condition')
2817
filtered_suite = tests.exclude_tests_by_condition(
2818
self.suite, lambda x: x.id() == excluded_name)
2728
2819
self.assertEqual(len(self.all_names) - 1,
2729
filtered_suite.countTestCases())
2820
filtered_suite.countTestCases())
2730
2821
self.assertFalse(excluded_name in _test_ids(filtered_suite))
2731
2822
remaining_names = list(self.all_names)
2732
2823
remaining_names.remove(excluded_name)
2748
2839
def test_filter_suite_by_condition(self):
2749
2840
test_name = ('breezy.tests.test_selftest.TestSelftestFiltering.'
2750
'test_filter_suite_by_condition')
2751
filtered_suite = tests.filter_suite_by_condition(self.suite,
2752
lambda x:x.id() == test_name)
2841
'test_filter_suite_by_condition')
2842
filtered_suite = tests.filter_suite_by_condition(
2843
self.suite, lambda x: x.id() == test_name)
2753
2844
self.assertEqual([test_name], _test_ids(filtered_suite))
2755
2846
def test_filter_suite_by_re(self):
2756
2847
filtered_suite = tests.filter_suite_by_re(self.suite,
2757
2848
'test_filter_suite_by_r')
2758
2849
filtered_names = _test_ids(filtered_suite)
2759
self.assertEqual(filtered_names, ['breezy.tests.test_selftest.'
2760
'TestSelftestFiltering.test_filter_suite_by_re'])
2851
filtered_names, ['breezy.tests.test_selftest.'
2852
'TestSelftestFiltering.test_filter_suite_by_re'])
2762
2854
def test_filter_suite_by_id_list(self):
2763
2855
test_list = ['breezy.tests.test_selftest.'
3067
3165
self.assertEqual({"testmod_names"}, set(calls))
3069
3167
self.assertEqual({"testmod_names", "modules_to_doctest"},
3071
3169
self.assertSubset(expected_test_list, _test_ids(suite))
3073
3171
def test_test_suite_list_and_start(self):
3074
# We cannot test this at the same time as the main load, because we want
3075
# to know that starting_with == None works. So a second load is
3076
# incurred - note that the starting_with parameter causes a partial load
3077
# rather than a full load so this test should be pretty quick.
3078
test_list = ['breezy.tests.test_selftest.TestTestSuite.test_test_suite']
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']
3079
3178
suite = tests.test_suite(test_list,
3080
3179
['breezy.tests.test_selftest.TestTestSuite'])
3081
# test_test_suite_list_and_start is not included
3180
# test_test_suite_list_and_start is not included
3082
3181
self.assertEqual(test_list, _test_ids(suite))
3505
3615
def test_matching_tests_first(self):
3506
3616
self._run_selftest_with_suite(matching_tests_first=True,
3507
pattern="test_self_ref$")
3617
pattern="test_self_ref$")
3509
3619
def test_starting_with_and_exclude(self):
3510
3620
out = self._run_selftest_with_suite(starting_with=["bt."],
3511
exclude_pattern="test_skip$")
3621
exclude_pattern="test_skip$")
3512
3622
self.assertNotContainsRe(out, b"test_skip")
3514
3624
def test_additonal_decorator(self):
3515
out = self._run_selftest_with_suite(
3516
suite_decorators=[tests.TestDecorator])
3625
self._run_selftest_with_suite(suite_decorators=[tests.TestDecorator])
3519
3628
class TestUncollectedWarningsSubunit(TestUncollectedWarnings):