Skip to content

Commit 4114bbe

Browse files
authored
Simplify _stdlib tests (#1631)
* Simplify _stdlib tests * Fix failing tests
1 parent 891a28a commit 4114bbe

33 files changed

Lines changed: 935 additions & 3229 deletions

Src/IronPython/Lib/iptest/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# The .NET Foundation licenses this file to you under the Apache 2.0 License.
33
# See the LICENSE file in the project root for more information.
44

5-
from .ipunittest import IronPythonTestCase, stdout_trapper, stderr_trapper, path_modifier, retryOnFailure, run_test, skipUnlessIronPython, source_root, expectedFailureIf
5+
from .ipunittest import IronPythonTestCase, stdout_trapper, stderr_trapper, path_modifier, retryOnFailure, run_test, skipUnlessIronPython, source_root, expectedFailureIf, generate_suite
66
from .test_env import *
77
from .type_util import *
88
from .misc_util import ip_supported_encodings

Src/IronPython/Lib/iptest/ipunittest.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ def load_ironpython_test(*args):
112112
clr.AddReference("Microsoft.Dynamic")
113113
clr.AddReference("IronPython")
114114

115-
if args:
115+
if args:
116116
return clr.LoadAssemblyFromFileWithPath(_iron_python_test_dll)
117-
else:
117+
else:
118118
clr.AddReferenceToFileAndPath(_iron_python_test_dll)
119119

120120
class IronPythonTestCase(unittest.TestCase, FileUtil, ProcessUtil):
@@ -195,6 +195,36 @@ def run_test(name):
195195
from test import support
196196
support.run_unittest(name)
197197

198+
def _flatten_suite(suite):
199+
tests = []
200+
for t in suite:
201+
if isinstance(t, unittest.BaseTestSuite):
202+
tests.extend(_flatten_suite(t))
203+
else:
204+
tests.append(t)
205+
return tests
206+
207+
def generate_suite(tests, failing_tests, skip_tests=[]):
208+
all_tests = _flatten_suite(tests)
209+
unknown_tests = []
210+
211+
for t in skip_tests:
212+
try:
213+
all_tests.remove(t)
214+
except ValueError:
215+
unknown_tests.append(t)
216+
217+
for t in failing_tests:
218+
try:
219+
all_tests[all_tests.index(t)] = unittest.expectedFailure(t)
220+
except:
221+
unknown_tests.append(t)
222+
223+
if unknown_tests:
224+
raise ValueError("Unknown tests:\n - {}".format('\n - '.join(str(t) for t in unknown_tests)))
225+
226+
return unittest.TestSuite(all_tests)
227+
198228
# class testpath:
199229
# # find the ironpython root directory
200230
# rowan_root = get_environ_variable("dlr_root")
@@ -220,13 +250,13 @@ def run_test(name):
220250
# lib_testdir = path_combine(external_dir, '27/Lib')
221251
# private_testdir = path_combine(external_dir, '27/Lib/test')
222252

223-
# if is_cli:
253+
# if is_cli:
224254
# ipython_executable = sys.executable
225255
# if is_posix:
226256
# cpython_executable = '/usr/bin/python2.7'
227257
# else:
228258
# cpython_executable = path_combine(external_dir, '27/python.exe')
229-
# else:
259+
# else:
230260
# ipython_executable = path_combine(sys.prefix, 'ipy.exe')
231261
# cpython_executable = sys.executable
232262

Src/StdLib/Lib/test/test_socket.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5123,7 +5123,8 @@ def testTypes(self):
51235123
source.close()
51245124

51255125

5126-
def test_main():
5126+
# ironpython: refactored to use load_tests protocol
5127+
def load_tests(*args):
51275128
tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
51285129
TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
51295130

@@ -5177,8 +5178,11 @@ def test_main():
51775178
TestSocketSharing,
51785179
])
51795180

5181+
return unittest.TestSuite([unittest.makeSuite(test) for test in tests])
5182+
5183+
def test_main():
51805184
thread_info = support.threading_setup()
5181-
support.run_unittest(*tests)
5185+
support.run_unittest(__name__)
51825186
support.threading_cleanup(*thread_info)
51835187

51845188
if __name__ == "__main__":

Tests/gen_stdlib_test.py

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,24 @@
2222
## Run selected tests from {name} from StdLib
2323
##
2424
25-
import unittest
26-
import sys
27-
28-
from iptest import run_test
25+
from iptest import is_ironpython, generate_suite, run_test
2926
3027
import {package}test.{name}
3128
3229
def load_tests(loader, standard_tests, pattern):
33-
if sys.implementation.name == 'ironpython':
34-
suite = unittest.TestSuite()
35-
{tests}
36-
return suite
30+
tests = loader.loadTestsFromModule({package}test.{name})
31+
32+
if is_ironpython:
33+
{tests}
34+
35+
failing_tests = []
36+
37+
skip_tests = []
38+
39+
return generate_suite(tests, failing_tests, skip_tests)
3740
3841
else:
39-
return loader.loadTestsFromModule({package}test.{name}, pattern)
42+
return tests
4043
4144
run_test(__name__)
4245
"""
@@ -51,24 +54,34 @@ def load_tests(loader, standard_tests, pattern):
5154
sys.path.insert(0, os.path.abspath(os.path.join(__file__, "../../Src/StdLib/Lib")))
5255
module = importlib.import_module("{package}test.{name}".format(name=name, package=package + "." if package else ""))
5356

54-
existing_tests = {}
55-
try:
56-
re_failure = re.compile(r'^\s*suite\.addTest\(unittest\.expectedFailure\((.*)\)\)( #.*)?$')
57-
re_ok = re.compile(r'^\s*suite\.addTest\((.*)\)( #.*)?$')
58-
with open(filepath, "r", encoding="utf-8") as f:
59-
for line in f:
60-
match = re_failure.match(line) or re_ok.match(line)
61-
if match:
62-
existing_tests[match.group(1)] = match.group(0)
63-
except FileNotFoundError:
64-
pass
65-
6657
tests = []
6758
for suite in unittest.defaultTestLoader.loadTestsFromModule(module):
6859
for test in suite:
6960
tests.append("{}('{}')".format(unittest.util.strclass(test.__class__), test._testMethodName))
7061

71-
tests = [existing_tests.get(t, " suite.addTest({})".format(t)) for t in tests]
62+
if os.path.exists(filepath):
63+
with open(filepath, "r", encoding="utf-8") as f:
64+
lines = list(f)
65+
66+
existing_tests = set()
67+
68+
first = 0
69+
for i, line in enumerate(lines):
70+
if "{" in line: raise NotImplementedError
71+
72+
if not first:
73+
if line.startswith(" if is_ironpython:"):
74+
first = i + 1
75+
else:
76+
if line.startswith(" return generate_suite("):
77+
break
78+
existing_tests.add(line.split("#")[0].strip().rstrip(","))
79+
80+
tests = [t for t in tests if t not in existing_tests]
81+
82+
if tests:
83+
lines.insert(first, " {tests}\n")
84+
template = "".join(lines)
7285

7386
with open(filepath, "w", encoding="utf-8") as f:
74-
f.write(template.format(name=name, package=package + "." if package else "", tests="\n".join(tests)))
87+
f.write(template.format(name=name, package=package + "." if package else "", tests="\n ".join(tests)))

Tests/modules/system_related/test_resource_stdlib.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,23 @@
66
## Run selected tests from test_resource from StdLib
77
##
88

9-
import unittest
10-
import sys
11-
12-
from iptest import run_test
9+
from iptest import is_ironpython, generate_suite, run_test
1310

1411
import test.test_resource
1512

1613
def load_tests(loader, standard_tests, pattern):
17-
if sys.implementation.name == 'ironpython':
18-
suite = unittest.TestSuite()
19-
suite.addTest(test.test_resource.ResourceTest('test_args'))
20-
suite.addTest(test.test_resource.ResourceTest('test_freebsd_contants'))
21-
#suite.addTest(test.test_resource.ResourceTest('test_fsize_enforced')) # TODO: handle SIGXFSZ
22-
suite.addTest(test.test_resource.ResourceTest('test_fsize_ismax'))
23-
suite.addTest(test.test_resource.ResourceTest('test_fsize_toobig'))
24-
suite.addTest(test.test_resource.ResourceTest('test_getrusage'))
25-
suite.addTest(test.test_resource.ResourceTest('test_linux_constants'))
26-
suite.addTest(test.test_resource.ResourceTest('test_pagesize'))
27-
suite.addTest(test.test_resource.ResourceTest('test_prlimit'))
28-
suite.addTest(test.test_resource.ResourceTest('test_setrusage_refcount'))
29-
return suite
14+
tests = loader.loadTestsFromModule(test.test_resource)
15+
16+
if is_ironpython:
17+
failing_tests = []
18+
19+
skip_tests = [
20+
test.test_resource.ResourceTest('test_fsize_enforced') # TODO: handle SIGXFSZ
21+
]
22+
23+
return generate_suite(tests, failing_tests, skip_tests)
3024

3125
else:
32-
return loader.loadTestsFromModule(test.test_resource, pattern)
26+
return tests
3327

3428
run_test(__name__)

Tests/modules/type_related/test_bitfields_ctypes_stdlib.py

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,25 @@
66
## Run selected tests from test_bitfields from StdLib
77
##
88

9-
import unittest
10-
import sys
11-
12-
from iptest import run_test
9+
from iptest import is_ironpython, generate_suite, run_test, is_windows
1310

1411
import ctypes.test.test_bitfields
1512

1613
def load_tests(loader, standard_tests, pattern):
17-
if sys.implementation.name == 'ironpython':
18-
suite = unittest.TestSuite()
19-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_anon_bitfields'))
20-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_c_wchar'))
21-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_longlong'))
22-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_mixed_2'))
23-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_mixed_3'))
24-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_multi_bitfields_size'))
25-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_nonint_types'))
26-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_signed'))
27-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_single_bitfield_size'))
28-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_uint32'))
29-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_uint32_swap_big_endian'))
30-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_uint32_swap_little_endian'))
31-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_uint64'))
32-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_ulonglong'))
33-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_unsigned'))
34-
suite.addTest(ctypes.test.test_bitfields.C_Test('test_ints'))
35-
if sys.platform.startswith('win'):
36-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_mixed_1'))
37-
suite.addTest(ctypes.test.test_bitfields.BitFieldTest('test_mixed_4'))
38-
suite.addTest(ctypes.test.test_bitfields.C_Test('test_shorts'))
39-
else: # https://github.com/IronLanguages/ironpython3/issues/1442
40-
suite.addTest(unittest.expectedFailure(ctypes.test.test_bitfields.BitFieldTest('test_mixed_1')))
41-
suite.addTest(unittest.expectedFailure(ctypes.test.test_bitfields.BitFieldTest('test_mixed_4')))
42-
suite.addTest(unittest.expectedFailure(ctypes.test.test_bitfields.C_Test('test_shorts')))
43-
return suite
14+
tests = loader.loadTestsFromModule(ctypes.test.test_bitfields)
15+
16+
if is_ironpython:
17+
failing_tests = []
18+
if not is_windows: # https://github.com/IronLanguages/ironpython3/issues/1442
19+
failing_tests += [
20+
ctypes.test.test_bitfields.BitFieldTest('test_mixed_1'),
21+
ctypes.test.test_bitfields.BitFieldTest('test_mixed_4'),
22+
ctypes.test.test_bitfields.C_Test('test_shorts'),
23+
]
24+
25+
return generate_suite(tests, failing_tests)
4426

4527
else:
46-
return loader.loadTestsFromModule(ctypes.test.test_bitfields, pattern)
28+
return tests
4729

4830
run_test(__name__)

Tests/test_builtin_stdlib.py

Lines changed: 25 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -6,85 +6,36 @@
66
## Run selected tests from test_builtin from StdLib
77
##
88

9-
import unittest
10-
import sys
9+
from iptest import is_ironpython, generate_suite, run_test, is_netcoreapp
1110

12-
from iptest import run_test, is_netcoreapp
13-
14-
import builtins
15-
import doctest
1611
import test.test_builtin
1712

1813
def load_tests(loader, standard_tests, pattern):
19-
if sys.implementation.name == 'ironpython':
20-
suite = unittest.TestSuite()
21-
suite.addTest(test.test_builtin.BuiltinTest('test_abs'))
22-
suite.addTest(test.test_builtin.BuiltinTest('test_all'))
23-
suite.addTest(test.test_builtin.BuiltinTest('test_any'))
24-
suite.addTest(test.test_builtin.BuiltinTest('test_ascii'))
25-
suite.addTest(test.test_builtin.BuiltinTest('test_bin'))
26-
suite.addTest(test.test_builtin.BuiltinTest('test_bytearray_translate'))
27-
suite.addTest(test.test_builtin.BuiltinTest('test_callable'))
28-
suite.addTest(test.test_builtin.BuiltinTest('test_chr'))
29-
suite.addTest(test.test_builtin.BuiltinTest('test_cmp'))
30-
suite.addTest(unittest.expectedFailure(test.test_builtin.BuiltinTest('test_compile')))
31-
suite.addTest(test.test_builtin.BuiltinTest('test_construct_singletons'))
32-
suite.addTest(test.test_builtin.BuiltinTest('test_delattr'))
33-
suite.addTest(unittest.expectedFailure(test.test_builtin.BuiltinTest('test_dir')))
34-
suite.addTest(test.test_builtin.BuiltinTest('test_divmod'))
35-
suite.addTest(test.test_builtin.BuiltinTest('test_eval'))
36-
suite.addTest(test.test_builtin.BuiltinTest('test_exec'))
37-
suite.addTest(unittest.expectedFailure(test.test_builtin.BuiltinTest('test_exec_globals')))
38-
suite.addTest(test.test_builtin.BuiltinTest('test_exec_redirected'))
39-
suite.addTest(test.test_builtin.BuiltinTest('test_filter'))
40-
suite.addTest(test.test_builtin.BuiltinTest('test_filter_pickle'))
41-
suite.addTest(test.test_builtin.BuiltinTest('test_format'))
42-
suite.addTest(test.test_builtin.BuiltinTest('test_general_eval'))
43-
suite.addTest(test.test_builtin.BuiltinTest('test_getattr'))
44-
suite.addTest(test.test_builtin.BuiltinTest('test_hasattr'))
45-
suite.addTest(test.test_builtin.BuiltinTest('test_hash'))
46-
suite.addTest(test.test_builtin.BuiltinTest('test_hex'))
47-
suite.addTest(test.test_builtin.BuiltinTest('test_id'))
48-
suite.addTest(test.test_builtin.BuiltinTest('test_import'))
49-
suite.addTest(unittest.expectedFailure(test.test_builtin.BuiltinTest('test_input')))
50-
suite.addTest(test.test_builtin.BuiltinTest('test_isinstance'))
51-
suite.addTest(test.test_builtin.BuiltinTest('test_issubclass'))
52-
suite.addTest(test.test_builtin.BuiltinTest('test_iter'))
53-
suite.addTest(unittest.expectedFailure(test.test_builtin.BuiltinTest('test_len')))
54-
suite.addTest(test.test_builtin.BuiltinTest('test_map'))
55-
suite.addTest(test.test_builtin.BuiltinTest('test_map_pickle'))
56-
suite.addTest(test.test_builtin.BuiltinTest('test_max'))
57-
suite.addTest(test.test_builtin.BuiltinTest('test_min'))
58-
suite.addTest(test.test_builtin.BuiltinTest('test_neg'))
59-
suite.addTest(test.test_builtin.BuiltinTest('test_next'))
60-
suite.addTest(test.test_builtin.BuiltinTest('test_oct'))
61-
suite.addTest(test.test_builtin.BuiltinTest('test_open'))
62-
suite.addTest(test.test_builtin.BuiltinTest('test_open_default_encoding'))
63-
suite.addTest(unittest.expectedFailure(test.test_builtin.BuiltinTest('test_open_non_inheritable'))) # https://github.com/IronLanguages/ironpython3/issues/1225
64-
suite.addTest(test.test_builtin.BuiltinTest('test_ord'))
65-
suite.addTest(test.test_builtin.BuiltinTest('test_pow'))
66-
suite.addTest(test.test_builtin.BuiltinTest('test_repr'))
67-
suite.addTest(test.test_builtin.BuiltinTest('test_round'))
68-
suite.addTest(test.test_builtin.BuiltinTest('test_round_large'))
69-
suite.addTest(test.test_builtin.BuiltinTest('test_setattr'))
70-
suite.addTest(test.test_builtin.BuiltinTest('test_sum'))
71-
suite.addTest(test.test_builtin.BuiltinTest('test_type'))
72-
suite.addTest(test.test_builtin.BuiltinTest('test_vars'))
73-
suite.addTest(test.test_builtin.BuiltinTest('test_zip'))
74-
suite.addTest(test.test_builtin.BuiltinTest('test_zip_pickle'))
75-
suite.addTest(unittest.expectedFailure(test.test_builtin.PtyTests('test_input_no_stdout_fileno')))
76-
suite.addTest(unittest.expectedFailure(test.test_builtin.PtyTests('test_input_tty')))
77-
suite.addTest(unittest.expectedFailure(test.test_builtin.PtyTests('test_input_tty_non_ascii')))
78-
suite.addTest(unittest.expectedFailure(test.test_builtin.PtyTests('test_input_tty_non_ascii_unicode_errors')))
79-
if not is_netcoreapp:
80-
suite.addTest(test.test_builtin.ShutdownTest('test_cleanup'))
81-
suite.addTest(test.test_builtin.TestSorted('test_baddecorator'))
82-
suite.addTest(test.test_builtin.TestSorted('test_basic'))
83-
suite.addTest(test.test_builtin.TestSorted('test_inputtypes'))
84-
suite.addTest(doctest.DocTestSuite(builtins))
85-
return suite
14+
tests = loader.loadTestsFromModule(test.test_builtin)
15+
16+
if is_ironpython:
17+
failing_tests = [
18+
test.test_builtin.BuiltinTest('test_compile'),
19+
test.test_builtin.BuiltinTest('test_dir'),
20+
test.test_builtin.BuiltinTest('test_exec_globals'),
21+
test.test_builtin.BuiltinTest('test_input'),
22+
test.test_builtin.BuiltinTest('test_len'),
23+
test.test_builtin.BuiltinTest('test_open_non_inheritable'), # https://github.com/IronLanguages/ironpython3/issues/1225
24+
test.test_builtin.PtyTests('test_input_no_stdout_fileno'),
25+
test.test_builtin.PtyTests('test_input_tty'),
26+
test.test_builtin.PtyTests('test_input_tty_non_ascii'),
27+
test.test_builtin.PtyTests('test_input_tty_non_ascii_unicode_errors'),
28+
]
29+
30+
skip_tests = []
31+
if is_netcoreapp:
32+
skip_tests += [
33+
test.test_builtin.ShutdownTest('test_cleanup'),
34+
]
35+
36+
return generate_suite(tests, failing_tests, skip_tests)
8637

8738
else:
88-
return loader.loadTestsFromModule(test.test_builtin, pattern)
39+
return tests
8940

9041
run_test(__name__)

0 commit comments

Comments
 (0)