summaryrefslogtreecommitdiff
path: root/lib/python2.7/test/test_trace.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/test/test_trace.py')
-rw-r--r--lib/python2.7/test/test_trace.py341
1 files changed, 0 insertions, 341 deletions
diff --git a/lib/python2.7/test/test_trace.py b/lib/python2.7/test/test_trace.py
deleted file mode 100644
index 2292ad6..0000000
--- a/lib/python2.7/test/test_trace.py
+++ /dev/null
@@ -1,341 +0,0 @@
-import os
-import sys
-from test.test_support import (run_unittest, TESTFN, rmtree, unlink,
- captured_stdout)
-import unittest
-
-import trace
-from trace import CoverageResults, Trace
-
-from test.tracedmodules import testmod
-
-
-#------------------------------- Utilities -----------------------------------#
-
-def fix_ext_py(filename):
- """Given a .pyc/.pyo filename converts it to the appropriate .py"""
- if filename.endswith(('.pyc', '.pyo')):
- filename = filename[:-1]
- return filename
-
-def my_file_and_modname():
- """The .py file and module name of this file (__file__)"""
- modname = os.path.splitext(os.path.basename(__file__))[0]
- return fix_ext_py(__file__), modname
-
-def get_firstlineno(func):
- return func.__code__.co_firstlineno
-
-#-------------------- Target functions for tracing ---------------------------#
-#
-# The relative line numbers of lines in these functions matter for verifying
-# tracing. Please modify the appropriate tests if you change one of the
-# functions. Absolute line numbers don't matter.
-#
-
-def traced_func_linear(x, y):
- a = x
- b = y
- c = a + b
- return c
-
-def traced_func_loop(x, y):
- c = x
- for i in range(5):
- c += y
- return c
-
-def traced_func_importing(x, y):
- return x + y + testmod.func(1)
-
-def traced_func_simple_caller(x):
- c = traced_func_linear(x, x)
- return c + x
-
-def traced_func_importing_caller(x):
- k = traced_func_simple_caller(x)
- k += traced_func_importing(k, x)
- return k
-
-def traced_func_generator(num):
- c = 5 # executed once
- for i in range(num):
- yield i + c
-
-def traced_func_calling_generator():
- k = 0
- for i in traced_func_generator(10):
- k += i
-
-def traced_doubler(num):
- return num * 2
-
-def traced_caller_list_comprehension():
- k = 10
- mylist = [traced_doubler(i) for i in range(k)]
- return mylist
-
-
-class TracedClass(object):
- def __init__(self, x):
- self.a = x
-
- def inst_method_linear(self, y):
- return self.a + y
-
- def inst_method_calling(self, x):
- c = self.inst_method_linear(x)
- return c + traced_func_linear(x, c)
-
- @classmethod
- def class_method_linear(cls, y):
- return y * 2
-
- @staticmethod
- def static_method_linear(y):
- return y * 2
-
-
-#------------------------------ Test cases -----------------------------------#
-
-
-class TestLineCounts(unittest.TestCase):
- """White-box testing of line-counting, via runfunc"""
- def setUp(self):
- self.tracer = Trace(count=1, trace=0, countfuncs=0, countcallers=0)
- self.my_py_filename = fix_ext_py(__file__)
-
- def test_traced_func_linear(self):
- result = self.tracer.runfunc(traced_func_linear, 2, 5)
- self.assertEqual(result, 7)
-
- # all lines are executed once
- expected = {}
- firstlineno = get_firstlineno(traced_func_linear)
- for i in range(1, 5):
- expected[(self.my_py_filename, firstlineno + i)] = 1
-
- self.assertEqual(self.tracer.results().counts, expected)
-
- def test_traced_func_loop(self):
- self.tracer.runfunc(traced_func_loop, 2, 3)
-
- firstlineno = get_firstlineno(traced_func_loop)
- expected = {
- (self.my_py_filename, firstlineno + 1): 1,
- (self.my_py_filename, firstlineno + 2): 6,
- (self.my_py_filename, firstlineno + 3): 5,
- (self.my_py_filename, firstlineno + 4): 1,
- }
- self.assertEqual(self.tracer.results().counts, expected)
-
- def test_traced_func_importing(self):
- self.tracer.runfunc(traced_func_importing, 2, 5)
-
- firstlineno = get_firstlineno(traced_func_importing)
- expected = {
- (self.my_py_filename, firstlineno + 1): 1,
- (fix_ext_py(testmod.__file__), 2): 1,
- (fix_ext_py(testmod.__file__), 3): 1,
- }
-
- self.assertEqual(self.tracer.results().counts, expected)
-
- def test_trace_func_generator(self):
- self.tracer.runfunc(traced_func_calling_generator)
-
- firstlineno_calling = get_firstlineno(traced_func_calling_generator)
- firstlineno_gen = get_firstlineno(traced_func_generator)
- expected = {
- (self.my_py_filename, firstlineno_calling + 1): 1,
- (self.my_py_filename, firstlineno_calling + 2): 11,
- (self.my_py_filename, firstlineno_calling + 3): 10,
- (self.my_py_filename, firstlineno_gen + 1): 1,
- (self.my_py_filename, firstlineno_gen + 2): 11,
- (self.my_py_filename, firstlineno_gen + 3): 10,
- }
- self.assertEqual(self.tracer.results().counts, expected)
-
- def test_trace_list_comprehension(self):
- self.tracer.runfunc(traced_caller_list_comprehension)
-
- firstlineno_calling = get_firstlineno(traced_caller_list_comprehension)
- firstlineno_called = get_firstlineno(traced_doubler)
- expected = {
- (self.my_py_filename, firstlineno_calling + 1): 1,
- (self.my_py_filename, firstlineno_calling + 2): 11,
- (self.my_py_filename, firstlineno_calling + 3): 1,
- (self.my_py_filename, firstlineno_called + 1): 10,
- }
- self.assertEqual(self.tracer.results().counts, expected)
-
-
- def test_linear_methods(self):
- # XXX todo: later add 'static_method_linear' and 'class_method_linear'
- # here, once issue1764286 is resolved
- #
- for methname in ['inst_method_linear',]:
- tracer = Trace(count=1, trace=0, countfuncs=0, countcallers=0)
- traced_obj = TracedClass(25)
- method = getattr(traced_obj, methname)
- tracer.runfunc(method, 20)
-
- firstlineno = get_firstlineno(method)
- expected = {
- (self.my_py_filename, firstlineno + 1): 1,
- }
- self.assertEqual(tracer.results().counts, expected)
-
-class TestRunExecCounts(unittest.TestCase):
- """A simple sanity test of line-counting, via runctx (exec)"""
- def setUp(self):
- self.my_py_filename = fix_ext_py(__file__)
-
- def test_exec_counts(self):
- self.tracer = Trace(count=1, trace=0, countfuncs=0, countcallers=0)
- code = r'''traced_func_loop(2, 5)'''
- code = compile(code, __file__, 'exec')
- self.tracer.runctx(code, globals(), vars())
-
- firstlineno = get_firstlineno(traced_func_loop)
- expected = {
- (self.my_py_filename, firstlineno + 1): 1,
- (self.my_py_filename, firstlineno + 2): 6,
- (self.my_py_filename, firstlineno + 3): 5,
- (self.my_py_filename, firstlineno + 4): 1,
- }
-
- # When used through 'run', some other spurious counts are produced, like
- # the settrace of threading, which we ignore, just making sure that the
- # counts fo traced_func_loop were right.
- #
- for k in expected.keys():
- self.assertEqual(self.tracer.results().counts[k], expected[k])
-
-
-class TestFuncs(unittest.TestCase):
- """White-box testing of funcs tracing"""
- def setUp(self):
- self.tracer = Trace(count=0, trace=0, countfuncs=1)
- self.filemod = my_file_and_modname()
-
- def test_simple_caller(self):
- self.tracer.runfunc(traced_func_simple_caller, 1)
-
- expected = {
- self.filemod + ('traced_func_simple_caller',): 1,
- self.filemod + ('traced_func_linear',): 1,
- }
- self.assertEqual(self.tracer.results().calledfuncs, expected)
-
- def test_loop_caller_importing(self):
- self.tracer.runfunc(traced_func_importing_caller, 1)
-
- expected = {
- self.filemod + ('traced_func_simple_caller',): 1,
- self.filemod + ('traced_func_linear',): 1,
- self.filemod + ('traced_func_importing_caller',): 1,
- self.filemod + ('traced_func_importing',): 1,
- (fix_ext_py(testmod.__file__), 'testmod', 'func'): 1,
- }
- self.assertEqual(self.tracer.results().calledfuncs, expected)
-
- def test_inst_method_calling(self):
- obj = TracedClass(20)
- self.tracer.runfunc(obj.inst_method_calling, 1)
-
- expected = {
- self.filemod + ('TracedClass.inst_method_calling',): 1,
- self.filemod + ('TracedClass.inst_method_linear',): 1,
- self.filemod + ('traced_func_linear',): 1,
- }
- self.assertEqual(self.tracer.results().calledfuncs, expected)
-
-
-class TestCallers(unittest.TestCase):
- """White-box testing of callers tracing"""
- def setUp(self):
- self.tracer = Trace(count=0, trace=0, countcallers=1)
- self.filemod = my_file_and_modname()
-
- def test_loop_caller_importing(self):
- self.tracer.runfunc(traced_func_importing_caller, 1)
-
- expected = {
- ((os.path.splitext(trace.__file__)[0] + '.py', 'trace', 'Trace.runfunc'),
- (self.filemod + ('traced_func_importing_caller',))): 1,
- ((self.filemod + ('traced_func_simple_caller',)),
- (self.filemod + ('traced_func_linear',))): 1,
- ((self.filemod + ('traced_func_importing_caller',)),
- (self.filemod + ('traced_func_simple_caller',))): 1,
- ((self.filemod + ('traced_func_importing_caller',)),
- (self.filemod + ('traced_func_importing',))): 1,
- ((self.filemod + ('traced_func_importing',)),
- (fix_ext_py(testmod.__file__), 'testmod', 'func')): 1,
- }
- self.assertEqual(self.tracer.results().callers, expected)
-
-
-# Created separately for issue #3821
-class TestCoverage(unittest.TestCase):
- def tearDown(self):
- rmtree(TESTFN)
- unlink(TESTFN)
-
- def _coverage(self, tracer,
- cmd='from test import test_pprint; test_pprint.test_main()'):
- tracer.run(cmd)
- r = tracer.results()
- r.write_results(show_missing=True, summary=True, coverdir=TESTFN)
-
- def test_coverage(self):
- tracer = trace.Trace(trace=0, count=1)
- with captured_stdout() as stdout:
- self._coverage(tracer)
- stdout = stdout.getvalue()
- self.assertTrue("pprint.py" in stdout)
- self.assertTrue("case.py" in stdout) # from unittest
- files = os.listdir(TESTFN)
- self.assertTrue("pprint.cover" in files)
- self.assertTrue("unittest.case.cover" in files)
-
- def test_coverage_ignore(self):
- # Ignore all files, nothing should be traced nor printed
- libpath = os.path.normpath(os.path.dirname(os.__file__))
- # sys.prefix does not work when running from a checkout
- tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix, libpath],
- trace=0, count=1)
- with captured_stdout() as stdout:
- self._coverage(tracer)
- if os.path.exists(TESTFN):
- files = os.listdir(TESTFN)
- self.assertEqual(files, [])
-
- def test_issue9936(self):
- tracer = trace.Trace(trace=0, count=1)
- modname = 'test.tracedmodules.testmod'
- # Ensure that the module is executed in import
- if modname in sys.modules:
- del sys.modules[modname]
- cmd = ("import test.tracedmodules.testmod as t;"
- "t.func(0); t.func2();")
- with captured_stdout() as stdout:
- self._coverage(tracer, cmd)
- stdout.seek(0)
- stdout.readline()
- coverage = {}
- for line in stdout:
- lines, cov, module = line.split()[:3]
- coverage[module] = (int(lines), int(cov[:-1]))
- # XXX This is needed to run regrtest.py as a script
- modname = trace.fullmodname(sys.modules[modname].__file__)
- self.assertIn(modname, coverage)
- self.assertEqual(coverage[modname], (5, 100))
-
-
-def test_main():
- run_unittest(__name__)
-
-
-if __name__ == '__main__':
- test_main()