aboutsummaryrefslogtreecommitdiff
path: root/tests/misc
diff options
context:
space:
mode:
authorMilan Rossa2019-08-14 16:11:25 +0200
committerDamien George2019-08-30 16:48:22 +1000
commit498e35219e1f54243ff6d650781c525e20cad9b1 (patch)
treed028a0679913355853958a0a5ddc9f09796b6b56 /tests/misc
parent310b3d1b81d561e19d719acd89ee47b759e3795c (diff)
tests: Add tests for sys.settrace feature.
Diffstat (limited to 'tests/misc')
-rw-r--r--tests/misc/sys_settrace_features.py91
-rw-r--r--tests/misc/sys_settrace_generator.py62
-rw-r--r--tests/misc/sys_settrace_generator.py.exp195
-rw-r--r--tests/misc/sys_settrace_loop.py51
-rw-r--r--tests/misc/sys_settrace_loop.py.exp72
-rw-r--r--tests/misc/sys_settrace_subdir/trace_generic.py82
-rw-r--r--tests/misc/sys_settrace_subdir/trace_importme.py24
7 files changed, 577 insertions, 0 deletions
diff --git a/tests/misc/sys_settrace_features.py b/tests/misc/sys_settrace_features.py
new file mode 100644
index 000000000..932e430de
--- /dev/null
+++ b/tests/misc/sys_settrace_features.py
@@ -0,0 +1,91 @@
+import sys
+
+try:
+ sys.settrace
+except AttributeError:
+ print("SKIP")
+ raise SystemExit
+
+def print_stacktrace(frame, level=0):
+ # Ignore CPython specific helpers.
+ if frame.f_globals['__name__'].find('importlib') != -1:
+ print_stacktrace(frame.f_back, level)
+ return
+
+ print("%2d: %s@%s:%s => %s:%d" % (
+ level, " ",
+ frame.f_globals['__name__'],
+ frame.f_code.co_name,
+ # reduce full path to some pseudo-relative
+ 'misc' + ''.join(frame.f_code.co_filename.split('tests/misc')[-1:]),
+ frame.f_lineno,
+ ))
+
+ if frame.f_back:
+ print_stacktrace(frame.f_back, level + 1)
+
+class _Prof:
+ trace_count = 0;
+
+ def trace_tick(self, frame, event, arg):
+ self.trace_count += 1
+ print_stacktrace(frame)
+
+__prof__ = _Prof()
+
+alice_handler_set = False
+def trace_tick_handler_alice(frame, event, arg):
+ print("### trace_handler::Alice event:", event)
+ __prof__.trace_tick(frame, event, arg)
+ return trace_tick_handler_alice
+
+bob_handler_set = False
+def trace_tick_handler_bob(frame, event, arg):
+ print("### trace_handler::Bob event:", event)
+ __prof__.trace_tick(frame, event, arg)
+ return trace_tick_handler_bob
+
+def trace_tick_handler(frame, event, arg):
+ # Ignore CPython specific helpers.
+ if frame.f_globals['__name__'].find('importlib') != -1:
+ return
+
+ print("### trace_handler::main event:", event)
+ __prof__.trace_tick(frame, event, arg)
+
+ if frame.f_code.co_name != 'factorial':
+ return trace_tick_handler
+
+ global alice_handler_set
+ if event == 'call' and not alice_handler_set:
+ alice_handler_set = True
+ return trace_tick_handler_alice
+
+ global bob_handler_set
+ if event == 'call' and not bob_handler_set:
+ bob_handler_set = True
+ return trace_tick_handler_bob
+
+ return trace_tick_handler
+
+def factorial(n):
+ if n == 0:
+ return 1
+ else:
+ return n * factorial(n - 1)
+
+def do_tests():
+ # These commands are here to demonstrate some execution being traced.
+ print("Who loves the sun?")
+ print("Not every-", factorial(3))
+
+ from sys_settrace_subdir import trace_generic
+ trace_generic.run_tests()
+ return
+
+sys.settrace(trace_tick_handler)
+do_tests()
+sys.settrace(None)
+
+print("\n------------------ script exited ------------------")
+print("Total traces executed: ", __prof__.trace_count)
diff --git a/tests/misc/sys_settrace_generator.py b/tests/misc/sys_settrace_generator.py
new file mode 100644
index 000000000..e955d6b62
--- /dev/null
+++ b/tests/misc/sys_settrace_generator.py
@@ -0,0 +1,62 @@
+# test sys.settrace with generators
+
+import sys
+
+try:
+ sys.settrace
+except AttributeError:
+ print("SKIP")
+ raise SystemExit
+
+def print_stacktrace(frame, level=0):
+ print("%2d: %s@%s:%s => %s:%d" % (
+ level, " ",
+ frame.f_globals['__name__'],
+ frame.f_code.co_name,
+ # reduce full path to some pseudo-relative
+ 'misc' + ''.join(frame.f_code.co_filename.split('tests/misc')[-1:]),
+ frame.f_lineno,
+ ))
+
+ if frame.f_back:
+ print_stacktrace(frame.f_back, level + 1)
+
+trace_count = 0
+
+def trace_tick_handler(frame, event, arg):
+ global trace_count
+ print("### trace_handler::main event:", event)
+ trace_count += 1
+ print_stacktrace(frame)
+ return trace_tick_handler
+
+def test_generator():
+ def make_gen():
+ yield 1<<0
+ yield 1<<1
+ yield 1<<2
+ return 1<<3
+
+ gen = make_gen()
+ r = 0
+ try:
+
+ r += gen.send(None)
+
+ while True:
+
+ r += gen.send(None)
+
+ except StopIteration as e:
+ print("test_generator", r, e)
+
+ gen = make_gen()
+ r = 0
+ for i in gen:
+ r += i
+ print(r)
+
+sys.settrace(trace_tick_handler)
+test_generator()
+sys.settrace(None)
+print("Total traces executed: ", trace_count)
diff --git a/tests/misc/sys_settrace_generator.py.exp b/tests/misc/sys_settrace_generator.py.exp
new file mode 100644
index 000000000..5329cdfe7
--- /dev/null
+++ b/tests/misc/sys_settrace_generator.py.exp
@@ -0,0 +1,195 @@
+### trace_handler::main event: call
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:33
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:34
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:40
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:41
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:42
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:34
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:44
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: exception
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:48
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:50
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:51
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+test_generator 7 8
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:53
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:54
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:34
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:56
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:35
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:56
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:36
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:56
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: call
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:37
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: return
+ 0: @__main__:make_gen => miscmisc/sys_settrace_generator.py:38
+ 1: @__main__:test_generator => miscmisc/sys_settrace_generator.py:55
+ 2: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+### trace_handler::main event: line
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:57
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+7
+### trace_handler::main event: return
+ 0: @__main__:test_generator => miscmisc/sys_settrace_generator.py:57
+ 1: @__main__:<module> => miscmisc/sys_settrace_generator.py:60
+Total traces executed: 54
diff --git a/tests/misc/sys_settrace_loop.py b/tests/misc/sys_settrace_loop.py
new file mode 100644
index 000000000..9ae0f41a1
--- /dev/null
+++ b/tests/misc/sys_settrace_loop.py
@@ -0,0 +1,51 @@
+# test sys.settrace with while and for loops
+
+import sys
+
+try:
+ sys.settrace
+except AttributeError:
+ print("SKIP")
+ raise SystemExit
+
+def print_stacktrace(frame, level=0):
+ print("%2d: %s@%s:%s => %s:%d" % (
+ level, " ",
+ frame.f_globals['__name__'],
+ frame.f_code.co_name,
+ # reduce full path to some pseudo-relative
+ 'misc' + ''.join(frame.f_code.co_filename.split('tests/misc')[-1:]),
+ frame.f_lineno,
+ ))
+
+ if frame.f_back:
+ print_stacktrace(frame.f_back, level + 1)
+
+trace_count = 0
+
+def trace_tick_handler(frame, event, arg):
+ global trace_count
+ print("### trace_handler::main event:", event)
+ trace_count += 1
+ print_stacktrace(frame)
+ return trace_tick_handler
+
+def test_loop():
+ # for loop
+ r = 0
+ for i in range(3):
+ r += i
+ print("test_for_loop", r)
+
+ # while loop
+ r = 0
+ i = 0
+ while i < 3:
+ r += i
+ i += 1
+ print("test_while_loop", i)
+
+sys.settrace(trace_tick_handler)
+test_loop()
+sys.settrace(None)
+print("Total traces executed: ", trace_count)
diff --git a/tests/misc/sys_settrace_loop.py.exp b/tests/misc/sys_settrace_loop.py.exp
new file mode 100644
index 000000000..3d3da5b6f
--- /dev/null
+++ b/tests/misc/sys_settrace_loop.py.exp
@@ -0,0 +1,72 @@
+### trace_handler::main event: call
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:33
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:35
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:36
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:37
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:36
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:37
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:36
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:37
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:36
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:37
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:38
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+test_for_loop 3
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:41
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:42
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:43
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:45
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:44
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:45
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:44
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:45
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:44
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:45
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+### trace_handler::main event: line
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:46
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+test_while_loop 3
+### trace_handler::main event: return
+ 0: @__main__:test_loop => miscmisc/sys_settrace_loop.py:46
+ 1: @__main__:<module> => miscmisc/sys_settrace_loop.py:49
+Total traces executed: 23
diff --git a/tests/misc/sys_settrace_subdir/trace_generic.py b/tests/misc/sys_settrace_subdir/trace_generic.py
new file mode 100644
index 000000000..3239a019c
--- /dev/null
+++ b/tests/misc/sys_settrace_subdir/trace_generic.py
@@ -0,0 +1,82 @@
+print("Now comes the language constructions tests.")
+
+# function
+def test_func():
+ def test_sub_func():
+ print("test_function")
+
+ test_sub_func()
+
+# closure
+def test_closure(msg):
+
+ def make_closure():
+ print(msg)
+
+ return make_closure
+
+# exception
+def test_exception():
+ try:
+ raise Exception("test_exception")
+
+ except Exception:
+ pass
+
+ finally:
+ pass
+
+# listcomp
+def test_listcomp():
+ print("test_listcomp", [x for x in range(3)])
+
+# lambda
+def test_lambda():
+ func_obj_1 = lambda a, b: a + b
+ print(func_obj_1(10, 20))
+
+# import
+def test_import():
+ from sys_settrace_subdir import trace_importme
+ trace_importme.dummy()
+ trace_importme.saysomething()
+
+# class
+class TLClass():
+ def method():
+ pass
+ pass
+
+def test_class():
+ class TestClass:
+ __anynum = -9
+ def method(self):
+ print("test_class_method")
+ self.__anynum += 1
+
+ def prprty_getter(self):
+ return self.__anynum
+
+ def prprty_setter(self, what):
+ self.__anynum = what
+
+ prprty = property(prprty_getter, prprty_setter)
+
+ cls = TestClass()
+ cls.method()
+ print("test_class_property", cls.prprty)
+ cls.prprty = 12
+ print("test_class_property", cls.prprty)
+
+
+def run_tests():
+ test_func()
+ test_closure_inst = test_closure("test_closure")
+ test_closure_inst()
+ test_exception()
+ test_listcomp()
+ test_lambda()
+ test_class()
+ test_import()
+
+print("And it's done!")
diff --git a/tests/misc/sys_settrace_subdir/trace_importme.py b/tests/misc/sys_settrace_subdir/trace_importme.py
new file mode 100644
index 000000000..0ff7c6d5b
--- /dev/null
+++ b/tests/misc/sys_settrace_subdir/trace_importme.py
@@ -0,0 +1,24 @@
+print("Yep, I got imported.")
+
+try:
+ x = const(1)
+except NameError:
+ print('const not defined')
+
+const = lambda x: x
+
+_CNT01 = "CONST01"
+_CNT02 = const(123)
+A123 = const(123)
+a123 = const(123)
+
+def dummy():
+ return False
+
+def saysomething():
+ print("There, I said it.")
+
+def neverexecuted():
+ print("Never got here!")
+
+print("Yep, got here")