)
-def test_open():
+def test_open(testfn):
# SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open()
try:
import ssl
# All of them should fail
with TestHook(raise_on_events={"open"}) as hook:
for fn, *args in [
- (open, sys.argv[2], "r"),
+ (open, testfn, "r"),
(open, sys.executable, "rb"),
(open, 3, "wb"),
- (open, sys.argv[2], "w", -1, None, None, None, False, lambda *a: 1),
- (load_dh_params, sys.argv[2]),
+ (open, testfn, "w", -1, None, None, None, False, lambda *a: 1),
+ (load_dh_params, testfn),
]:
if not fn:
continue
[
i
for i in [
- (sys.argv[2], "r"),
+ (testfn, "r"),
(sys.executable, "r"),
(3, "w"),
- (sys.argv[2], "w"),
- (sys.argv[2], "rb") if load_dh_params else None,
+ (testfn, "w"),
+ (testfn, "rb") if load_dh_params else None,
]
if i is not None
],
assert hook not in o
-def test_time():
+def test_time(mode):
import time
def hook(event, args):
if event.startswith("time."):
- print(event, *args)
+ if mode == 'print':
+ print(event, *args)
+ elif mode == 'fail':
+ raise AssertionError('hook failed')
sys.addaudithook(hook)
time.sleep(0)
suppress_msvcrt_asserts()
test = sys.argv[1]
- globals()[test]()
+ globals()[test](*sys.argv[2:])
maxDiff = None
@support.requires_subprocess()
- def do_test(self, *args):
+ def run_test_in_subprocess(self, *args):
with subprocess.Popen(
[sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
encoding="utf-8",
stderr=subprocess.PIPE,
) as p:
p.wait()
- sys.stdout.writelines(p.stdout)
- sys.stderr.writelines(p.stderr)
- if p.returncode:
- self.fail("".join(p.stderr))
+ return p, p.stdout.read(), p.stderr.read()
- @support.requires_subprocess()
- def run_python(self, *args):
+ def do_test(self, *args):
+ proc, stdout, stderr = self.run_test_in_subprocess(*args)
+
+ sys.stdout.write(stdout)
+ sys.stderr.write(stderr)
+ if proc.returncode:
+ self.fail(stderr)
+
+ def run_python(self, *args, expect_stderr=False):
events = []
- with subprocess.Popen(
- [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
- encoding="utf-8",
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- ) as p:
- p.wait()
- sys.stderr.writelines(p.stderr)
- return (
- p.returncode,
- [line.strip().partition(" ") for line in p.stdout],
- "".join(p.stderr),
- )
+ proc, stdout, stderr = self.run_test_in_subprocess(*args)
+ if not expect_stderr or support.verbose:
+ sys.stderr.write(stderr)
+ return (
+ proc.returncode,
+ [line.strip().partition(" ") for line in stdout.splitlines()],
+ stderr,
+ )
def test_basic(self):
self.do_test("test_basic")
self.fail(stderr)
def test_time(self):
- returncode, events, stderr = self.run_python("test_time")
+ returncode, events, stderr = self.run_python("test_time", "print")
if returncode:
self.fail(stderr)
self.assertEqual(actual, expected)
+ def test_time_fail(self):
+ returncode, events, stderr = self.run_python("test_time", "fail",
+ expect_stderr=True)
+ self.assertNotEqual(returncode, 0)
+ self.assertIn('hook failed', stderr.splitlines()[-1])
def test_sys_monitoring_register_callback(self):
returncode, events, stderr = self.run_python("test_sys_monitoring_register_callback")